Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow API Call

Ubersuggest

Connect FlutterFlow to Ubersuggest using the FlutterFlow API Call method via a backend proxy. The Ubersuggest API requires a paid plan and uses a header-based API key that must never be embedded in your compiled Flutter app. A Firebase Cloud Function holds the key and forwards keyword and domain queries; FlutterFlow binds the numeric results to tables and charts inside your marketing-tools app.

What you'll learn

  • Why Ubersuggest's API is paid-only and how to confirm your plan has API access before building
  • How to deploy a Firebase Cloud Function that holds the Ubersuggest API key and proxies keyword queries
  • How to create a FlutterFlow API Call group that sends keyword searches to the proxy and parses the response
  • How to bind the returned search volume, difficulty, and CPC metrics to a FlutterFlow DataTable or ListView
  • How to optionally visualise search volume data in a FlutterFlow Chart widget
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate16 min read35 minutesMarketingLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Ubersuggest using the FlutterFlow API Call method via a backend proxy. The Ubersuggest API requires a paid plan and uses a header-based API key that must never be embedded in your compiled Flutter app. A Firebase Cloud Function holds the key and forwards keyword and domain queries; FlutterFlow binds the numeric results to tables and charts inside your marketing-tools app.

Quick facts about this guide
FactValue
ToolUbersuggest
CategoryMarketing
MethodFlutterFlow API Call
DifficultyIntermediate
Time required35 minutes
Last updatedJuly 2026

Why Connect FlutterFlow to Ubersuggest?

Ubersuggest (by Neil Patel) gives you keyword search volume, SEO difficulty scores, cost-per-click data, and competitor domain metrics. Building a FlutterFlow app that surfaces these numbers lets marketing teams access SEO insights from their phones, run keyword research on the go, or embed a simple SEO dashboard inside a broader marketing app. The integration is straightforward REST: send a keyword, receive numeric metrics, bind them to a table or chart.

The first thing to communicate clearly: Ubersuggest has no free API tier. API access is a feature of paid Ubersuggest plans (Individual, Business, and Enterprise). If you are on the free Ubersuggest web plan, you cannot access the API regardless of what code you write. Confirm your plan includes API access before starting, and verify endpoint availability in the documentation you receive once you have an account with access.

The API key authenticates via an Authorization header to `https://app.neilpatel.com/api`. Because FlutterFlow compiles to a native Flutter app running on the user's device, any value in a FlutterFlow API Call header is embedded in the app binary and can be extracted by anyone who installs your app. The solution is a backend proxy — a Firebase Cloud Function or Supabase Edge Function — that holds the key in an environment variable and forwards your keyword queries to Ubersuggest. FlutterFlow calls the proxy with just the search keyword; the proxy enriches the request with the Authorization header and returns the clean SEO JSON.

Integration method

FlutterFlow API Call

FlutterFlow connects to the Ubersuggest REST API via a FlutterFlow API Call group, but because the API key is a paid-account credential that must not ship in the compiled Flutter binary, a Firebase Cloud Function or Supabase Edge Function acts as a proxy. FlutterFlow sends only the keyword or domain query; the backend function injects the Authorization header and forwards the request to app.neilpatel.com/api. The numeric SEO metrics returned are bound to FlutterFlow tables and optionally charts.

Prerequisites

  • A paid Ubersuggest account with API access confirmed for your plan tier (no free API tier exists)
  • Your Ubersuggest API key, available in your account settings once API access is enabled
  • A Firebase project on the Blaze (pay-as-you-go) plan for Cloud Functions with outbound HTTP enabled
  • A FlutterFlow project where you want to display SEO keyword metrics
  • Familiarity with FlutterFlow's API Calls panel and DataTable or ListView widget setup

Step-by-step guide

1

Confirm API access on your Ubersuggest plan and retrieve your API key

Log in to your Ubersuggest account at app.neilpatel.com and navigate to your account settings or profile section. Look for an API section or developer credentials area — the exact location may vary depending on your plan. If you do not see an API key option, your current plan may not include API access. In that case, review Ubersuggest's current pricing page (neilpatel.com/ubersuggest/pricing) to determine which plan tier includes the API and consider upgrading before proceeding. Once you locate the API key, copy it immediately. This key authenticates every request you send to the Ubersuggest API at `https://app.neilpatel.com/api`. Do not paste it anywhere in FlutterFlow — not in an API Call header, not in App Values, and not in the code of a Custom Action. It belongs only in your Firebase Cloud Function's environment configuration or in Firebase Secret Manager. While you are in the Ubersuggest dashboard, spend a few minutes exploring the tool manually and noting the specific endpoints and data fields you want to surface in your FlutterFlow app. Ubersuggest's public API documentation is not as exhaustive as some other tools — the field names and endpoint paths you see in the API documentation may differ by plan tier. Write down the exact field names (for example, `search_volume`, `seo_difficulty`, `cpc`) as they appear in a live API response, because you will need these exact names when configuring JSON Paths in FlutterFlow.

Pro tip: Before building any FlutterFlow screens, test the Ubersuggest API directly using a REST client like Postman with your API key in the Authorization header. Confirm which endpoints work on your plan and what the exact JSON response structure looks like — this prevents wasted time configuring JSON Paths against a response shape that does not match reality.

Expected result: You have a confirmed Ubersuggest API key stored securely, you know which endpoints are available on your plan, and you have seen a sample API response to understand the JSON field names.

2

Deploy a Firebase Cloud Function as a proxy for Ubersuggest API requests

Your Firebase Cloud Function will receive keyword or domain queries from FlutterFlow and forward them to the Ubersuggest API with the Authorization header injected server-side. Navigate to the Firebase console, confirm your project is on the Blaze plan (Functions require Blaze for outbound HTTP), and either write the function inline in the console or deploy it via the Firebase CLI. The function accepts two query parameters: `keyword` (the search term) and `country` (typically 'us'). It reads the `UBERSUGGEST_API_KEY` from Firebase Secret Manager or environment config, constructs the request to the Ubersuggest endpoint, adds the Authorization header, and returns the JSON response directly to the FlutterFlow caller. No Ubersuggest credential ever leaves the Cloud Function's server environment. The Ubersuggest API's exact endpoint paths and parameter names should be verified against the documentation provided with your account since the API is lightly documented publicly. A common pattern is a keyword suggestions endpoint accepting a keyword and locale — but confirm the exact path from your account's developer documentation. Once deployed, the Cloud Function's HTTPS trigger URL is what you will use as the Base URL in the FlutterFlow API Call group. The URL itself is not a secret; the value of the proxy is that it prevents the API key from shipping in the app.

index.js
1const functions = require('firebase-functions');
2const { defineSecret } = require('firebase-functions/params');
3
4// Set this secret with: firebase functions:secrets:set UBERSUGGEST_API_KEY
5exports.ubersuggestProxy = functions
6 .runWith({ secrets: ['UBERSUGGEST_API_KEY'] })
7 .https.onRequest(async (req, res) => {
8 // CORS headers for FlutterFlow web builds
9 res.set('Access-Control-Allow-Origin', '*');
10 if (req.method === 'OPTIONS') {
11 res.set('Access-Control-Allow-Methods', 'GET');
12 res.set('Access-Control-Allow-Headers', 'Content-Type');
13 return res.status(204).send('');
14 }
15
16 const apiKey = process.env.UBERSUGGEST_API_KEY;
17 if (!apiKey) {
18 return res.status(500).json({ error: 'API key not configured' });
19 }
20
21 // Determine the type of query
22 const keyword = req.query.keyword;
23 const domain = req.query.domain;
24 const country = req.query.country || 'us';
25 const lang = req.query.lang || 'en';
26
27 if (!keyword && !domain) {
28 return res.status(400).json({ error: 'keyword or domain is required' });
29 }
30
31 // Verify these endpoint paths against your Ubersuggest account's API docs
32 let ubersuggestUrl;
33 if (keyword) {
34 ubersuggestUrl =
35 `https://app.neilpatel.com/api/keyword_ideas?keyword=${encodeURIComponent(keyword)}&country=${country}&lang=${lang}`;
36 } else {
37 ubersuggestUrl =
38 `https://app.neilpatel.com/api/domain_metrics?domain=${encodeURIComponent(domain)}&country=${country}`;
39 }
40
41 try {
42 const response = await fetch(ubersuggestUrl, {
43 headers: {
44 Authorization: `Bearer ${apiKey}`,
45 'Content-Type': 'application/json',
46 },
47 });
48
49 const data = await response.json();
50 return res.status(response.ok ? 200 : response.status).json(data);
51 } catch (err) {
52 console.error('Ubersuggest proxy error:', err);
53 return res.status(500).json({ error: 'Failed to fetch from Ubersuggest' });
54 }
55 });

Pro tip: Comment your Cloud Function source file with a note to verify endpoint paths from your Ubersuggest account's API documentation — the paths in the example code above may need adjusting based on your specific plan and the version of the API active on your account.

Expected result: The Cloud Function is deployed, its HTTPS URL is copied, and a direct test request (using Postman or curl with a keyword parameter) returns real Ubersuggest JSON data.

3

Create a FlutterFlow API Call group connected to your Cloud Function proxy

In FlutterFlow, click API Calls in the left navigation panel and click + Add → Create API Group. Name it UbersuggestProxy. In the Base URL field paste your Cloud Function's HTTPS trigger URL (found in the Firebase console under Functions → your function name → Trigger). Do not add an Authorization header here — no secret should appear anywhere in the FlutterFlow project. Click + Add inside the group to create your first API Call. Name it GetKeywordIdeas and set the method to GET. Leave the endpoint path empty (the Cloud Function URL is the complete endpoint). In the Variables tab, add a variable named `keyword` (String, required) and optionally `country` (String, default 'us'). In the URL Parameters section, map `keyword` to `{{keyword}}` and `country` to `{{country}}` — these will become query parameters appended to the Cloud Function URL. Click Response & Test. Enter a real keyword (for example, 'flutterflow tutorial') and your country code, then click Test API Call. When the response loads, you will see the Ubersuggest JSON structure. Click Generate JSON Paths and select the numeric fields you want to use: typically `$.keywords[0].search_volume`, `$.keywords[0].seo_difficulty`, `$.keywords[0].cpc`, and `$.keywords` (the full array for a ListView). Select all relevant paths and save. If you also want domain-level metrics, create a second API Call in the same group named GetDomainMetrics, following the same pattern but with a `domain` variable instead of `keyword`. The same Cloud Function handles both query types based on which parameter is present.

api_call_config.json
1{
2 "api_group": "UbersuggestProxy",
3 "base_url": "https://us-central1-YOUR_PROJECT.cloudfunctions.net/ubersuggestProxy",
4 "calls": [
5 {
6 "name": "GetKeywordIdeas",
7 "method": "GET",
8 "variables": [
9 { "name": "keyword", "type": "String", "required": true },
10 { "name": "country", "type": "String", "default": "us" }
11 ],
12 "url_params": {
13 "keyword": "{{keyword}}",
14 "country": "{{country}}"
15 },
16 "json_paths": [
17 { "name": "keywordsList", "path": "$.keywords" },
18 { "name": "firstVolume", "path": "$.keywords[0].search_volume" },
19 { "name": "firstDifficulty", "path": "$.keywords[0].seo_difficulty" },
20 { "name": "firstCpc", "path": "$.keywords[0].cpc" }
21 ]
22 }
23 ]
24}

Pro tip: If the JSON Paths panel shows fewer fields than you expected, paste the full API response JSON into a JSON path tester (like jsonpath.com) and manually find the paths before entering them into FlutterFlow — this is faster than iterating through FlutterFlow's UI.

Expected result: The UbersuggestProxy API Group is created, the keyword test call returns real SEO metric data, and JSON Paths are generated for the fields you want to display.

4

Bind keyword results to a DataTable and optionally a Bar Chart

With the API Call configured, build the search results screen in FlutterFlow. Add a Text Field widget at the top of the page for the keyword input, and a Button widget labelled 'Search' or 'Analyse'. Add the UbersuggestProxy → GetKeywordIdeas action to the button: click the button → Actions → + Add Action → Backend/Database → API Request → select GetKeywordIdeas. Bind the `keyword` variable to the Text Field's value. For displaying results, use FlutterFlow's DataTable widget if you want a traditional spreadsheet-style view of multiple keywords. Alternatively, use a ListView with a custom Row template for each keyword result. In either case, set the data source to the API Call response (select Dynamic from API Response → your call → `keywordsList` JSON path which returns the full array). Map each column or row field to the corresponding JSON path variable (search_volume, seo_difficulty, cpc). For visualising search volume across multiple keyword results, add a Bar Chart widget below the table. Set its data source to the same `keywordsList` array, map the X-axis to the keyword name string and the Y-axis to the `search_volume` numeric field. FlutterFlow's chart widget handles array data bindings natively when the data source is a JSON array from an API response. Store a Page State Boolean variable named `isLoading` and set it to true when the search action starts and false when it completes. Bind the Button's loading state and any loading spinners to this variable so the UI reflects the network call in progress. Ubersuggest API response times can vary by endpoint and plan, so a loading indicator significantly improves the user experience.

Pro tip: Add a secondary sort button that lets the user sort the keyword results by search volume or difficulty — FlutterFlow supports in-memory sorting on a List variable, which avoids making a second API call and feels instant to the user.

Expected result: Typing a keyword and tapping Search populates the DataTable or ListView with Ubersuggest metrics including search volume, difficulty, and CPC, and optionally renders a bar chart of the results.

5

Handle API errors and set honest user expectations about the paid requirement

Three realities about the Ubersuggest API need to be handled in your FlutterFlow app to avoid confusing your users: the paid-only access gate, the lightly documented API (which means endpoint errors can be unexpected), and plan-dependent rate limits. For the paid-only gate: if a user tries to use the app before the API key is configured in your Cloud Function, they will see a generic error. Build a clear error state in the FlutterFlow search screen — check the API response status code and, if the result is a 401 or 403, show a friendly message explaining that the feature requires an active Ubersuggest paid account. This prevents the common frustration of founders who build the entire UI and only discover the paywall when testing. For unexpected API errors: add a conditional check after the GetKeywordIdeas action in the Action Flow Editor. If the API Call status is not 200, store the error message in a Page State variable and display it in a visible Text widget on the screen. Log the error details to a Firestore collection so you can debug production issues without needing users to describe what they saw. For rate limits: Ubersuggest's API rate limits are plan-dependent and not comprehensively documented in public resources — check the documentation available with your paid account. A safe default is to disable the Search button for 2-3 seconds after each call completes (use a timer-based Page State boolean) to prevent rapid-fire requests. Display a friendly 'Rate limit reached' message if the Cloud Function returns a 429 status from Ubersuggest.

Pro tip: Consider caching keyword results in Firestore for 24 hours — if a team member already searched for 'email marketing', save the result locally. This reduces API call volume, stays within rate limits, and makes the app feel faster for repeat searches.

Expected result: The search screen shows appropriate error states for 401/403 (API key or plan issue), 429 (rate limit), and 500 (server error) responses, and includes a clear note about the paid API requirement.

Common use cases

Internal SEO keyword research tool for a marketing team

A marketing team builds a FlutterFlow app where team members type a keyword into a search field and instantly see search volume, SEO difficulty, and CPC data pulled from Ubersuggest. Results are displayed in a sortable DataTable. The app stores recent searches in Firestore so the team can review past keyword research sessions offline.

FlutterFlow Prompt

I want my marketing team to be able to type any keyword into our app and see its monthly search volume, SEO difficulty score, and estimated cost-per-click. The results should show in a table format and we should be able to save keywords we like to a favourites list.

Copy this prompt to try it in FlutterFlow

Competitor domain SEO dashboard for founders

A founder builds a FlutterFlow screen where they enter a competitor's domain and see its estimated monthly organic traffic, number of keywords ranking, and domain authority score from Ubersuggest's domain-analysis endpoint. A bar chart visualises traffic trends over time. The dashboard refreshes on demand rather than polling continuously.

FlutterFlow Prompt

I want to enter a competitor's website URL and see their estimated monthly organic search traffic, how many keywords they rank for, and a chart showing how their traffic has changed over the last 12 months.

Copy this prompt to try it in FlutterFlow

Keyword ideas generator for a content planning app

A content planning FlutterFlow app calls Ubersuggest's keyword suggestions endpoint with a seed keyword and returns 20 related keyword ideas with their search volumes. The user can tap any keyword to add it to a content calendar collection in Firestore, creating a lightweight keyword-to-content planning workflow entirely on mobile.

FlutterFlow Prompt

I want to type a seed keyword and get a list of 20 related keyword ideas with their search volumes. I should be able to tap any keyword to add it to my content calendar with a planned publish date.

Copy this prompt to try it in FlutterFlow

Troubleshooting

Cloud Function returns 401 Unauthorized or 'API key not configured'

Cause: The Ubersuggest API key is missing from the Cloud Function's environment, or the key has been revoked or is incorrect.

Solution: In the Firebase console go to Functions → your function → Configuration and verify the UBERSUGGEST_API_KEY secret is set and accessible. If using Firebase Secret Manager, confirm the function's service account has the Secret Accessor IAM role. Regenerate the API key in your Ubersuggest account settings and update the secret if the key may have changed.

API returns 403 Forbidden even with a valid API key

Cause: Your Ubersuggest plan may not include API access, or the specific endpoint you are calling is not available on your current plan tier.

Solution: Log in to your Ubersuggest account and verify that your plan explicitly includes API access. If uncertain, contact Ubersuggest support. Also check whether the endpoint path you are using (e.g. `/api/keyword_ideas`) is documented in the API documentation available to your account — some endpoints may be restricted to higher plan tiers.

FlutterFlow API Call returns XMLHttpRequest error when testing in the web Run Mode preview

Cause: CORS headers are missing from the Cloud Function response, so the browser blocks the request from FlutterFlow's web preview origin.

Solution: Ensure your Cloud Function sets `Access-Control-Allow-Origin: *` on all responses and handles the OPTIONS preflight request before executing the main logic. The proxy code example in Step 2 includes the correct CORS handling — verify it is present and that the function has been redeployed after any edits.

JSON Paths in FlutterFlow return empty or null values even though the API response looks correct

Cause: The JSON Path expressions do not match the actual field names or nesting structure in the Ubersuggest response. Field names may differ between Ubersuggest plan tiers or endpoint versions.

Solution: Copy the raw JSON from the FlutterFlow Response & Test panel and paste it into a JSON path tester (jsonpath.com or similar). Manually test your path expressions against the real response. Update the JSON Path variables in the API Call with the corrected expressions that match your specific API response structure.

Best practices

  • Confirm API access is included in your Ubersuggest plan before writing any FlutterFlow code — there is no free API tier and the paywall can only be discovered by attempting an actual API call.
  • Never place the Ubersuggest API key in a FlutterFlow API Call header — it will be embedded in the compiled app binary and can be extracted from any installed APK or IPA.
  • Verify endpoint paths and field names against a live response from your own Ubersuggest account before mapping JSON Paths in FlutterFlow — the public documentation is sparse and may not reflect your plan tier's available endpoints.
  • Cache keyword lookup results in Firestore for 24 hours to reduce API call volume, stay within rate limits, and make repeat searches feel instant.
  • Add CORS headers to your Cloud Function so that FlutterFlow web builds can call it from the browser without XMLHttpRequest errors.
  • Display clear error states for 401 (key issue), 403 (plan access), and 429 (rate limit) responses rather than showing a blank screen — helps founders debug problems without guessing.
  • Mark numeric SEO metrics (search volume, difficulty) with appropriate context labels in your UI — a search volume of 1200 looks meaningless without the label 'monthly searches'.

Alternatives

Frequently asked questions

Is there a free tier for the Ubersuggest API?

No. Unlike many SaaS tools that offer a free API tier or sandbox environment, Ubersuggest requires a paid account to access the API. There is no trial API key or free usage quota. You need to be on a paid Ubersuggest Individual, Business, or Enterprise plan with API access included. Confirm this directly with your account or Ubersuggest support before starting development.

Why do I need a Cloud Function — can't I just call the Ubersuggest API directly from FlutterFlow?

You can configure a FlutterFlow API Call that calls the Ubersuggest API directly with the key in the Authorization header, but this embeds the key in your compiled Flutter app binary. Anyone who installs your app can extract the binary and retrieve the key using freely available reverse-engineering tools. Since the Ubersuggest API key grants access to your paid account and its quotas, this is a meaningful security and cost risk. The Cloud Function proxy keeps the key on Google's servers where it cannot be accessed from the app.

What does 'verify' mean next to some of the API details like rate limits?

Ubersuggest's public API documentation does not fully disclose rate limits, exact endpoint paths, or field names for all plan tiers. The 'verify' flag in this guide means you should check these details against the API documentation available through your paid account before building — do not rely on any specific numbers stated here. Testing with a real API request (Step 1's tip recommends doing this with Postman) before building your FlutterFlow UI is the safest approach.

Can FlutterFlow display the SEO metrics in a chart, or only a table?

FlutterFlow includes a built-in Chart widget that supports Bar, Line, and Pie chart types. Search volume data from Ubersuggest is a good fit for a Bar Chart — bind the keyword names to the X axis and search volume numbers to the Y axis from the same JSON array returned by the API Call. The chart works in both Test Mode and on device, and data bindings from API responses work the same way as data bindings from Firestore collections.

What if I need help setting up the Cloud Function and FlutterFlow bindings?

If the proxy architecture and JSON path configuration feels like too much to handle on your own, RapidDev's team builds FlutterFlow integrations like this regularly and can set up the full stack — Cloud Function, API Call group, and widget bindings — with a free scoping call available at rapidevelopers.com/contact.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire FlutterFlow integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.