Google Autocomplete Scraper: Keyword Suggestions avatar

Google Autocomplete Scraper: Keyword Suggestions

Pricing

from $0.03 / 1,000 saved suggestions

Go to Apify Store
Google Autocomplete Scraper: Keyword Suggestions

Google Autocomplete Scraper: Keyword Suggestions

Google Autocomplete suggestions for keyword research: find the phrases and questions people type for your seed keywords, by language and country. Expand with letters, question words or deeper levels and export each suggestion with its query and position.

Pricing

from $0.03 / 1,000 saved suggestions

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

11 days ago

Last modified

Security

Limited permissions

Share

Find keyword ideas and the questions people type into Google: enter seed keywords and get live Google Autocomplete suggestions for your language and country. Use them to plan articles, product pages and SEO keyword lists. Each saved row shows the suggestion, the Google query that returned it and its position in that response.

No Google account, API key or proxy is needed. A one-keyword run takes a few seconds and costs about $0.002: $0.001 per start + $0.05 per 1,000 saved suggestions (lower on higher Apify plans). Google can return an empty list. Requests can also fail or stop at a limit; check RUN_SUMMARY to see the reason.

Google Autocomplete Scraper: seed keywords to live suggestions and JSON or CSV export

Table of contents

What it does

The Actor sends direct HTTPS requests to Google's public Autocomplete endpoint. No Google login, Google API key, browser or proxy setup is needed. This endpoint is not an official bulk API and may change.

Choose exact to send each seed as entered after space cleanup. You can also add letters, numbers or question prefixes. The Actor saves unique suggestions and keeps the first query that returned each one. Set maxDepth to 2 or 3 to search the returned suggestions again and collect long-tail phrases. Use languages and countries to search several locales in one run. Each row also shows how many of your queries returned it (surfaceCount).

Good fit

  • Find phrases to review when you plan an article or product page.
  • Compare suggestion lists for the same seed with different language and country preferences.
  • Export suggestions with their seed and query for your own search interface research.

👉 Try it now: open the input form

How it works

  1. You enter seed keywords and choose a language, a country and how to expand each seed (as is, with letters, numbers or question words).
  2. The Actor builds a bounded list of queries and asks Google Autocomplete for suggestions for each one. It does not open a browser. With maxDepth 2 or 3, each saved suggestion becomes a new query, one level at a time.
  3. It removes duplicates and saves each unique suggestion as one Dataset row with its seed, query and position. A RUN_SUMMARY record explains empty responses, errors and limits.

👉 Try it now: open the input form

Quick start

Input form: seed keywords (box 1), language and country (box 2), Google client and expansion mode (box 3)

  1. Open the Input tab. Keep the prefilled seed coffee or add your own keywords (box 1 in the picture).

  2. Keep language: "en" and country: "us", or add up to 5 values to languages and countries to compare markets (box 2).

  3. Keep client: "chrome" and expansionModes: ["exact"] (box 3). Keep the prefill maxResults: 100 for the demo. Set a maximum cost per run in Apify if you need a platform charge cap.

  4. Click Start.

  5. Open Output → Suggestions or the default Dataset. Check suggestion, seed, generatedQuery and expansionMode, then googleRank, surfaceCount (Found by queries), relevance and suggestType (box 5). Open Run summary for empty responses, errors and limits.

    Output table: suggestions for coffee with Google rank, Found by queries, Google relevance and Type

The form prefill is a demo. The runtime maxResults default is 500. An API input {} has no demo seed and fails validation. Console may restore your previously saved input; check it before starting.

👉 Try it now: open the input form

Use cases

JobSettingsFields to useNext step
Keyword research for SEOkeywords, expansionModes: ["exact", "alphabet"]suggestion, googleRank, surfaceCount, relevanceSort by surfaceCount to see the phrases Google offers most often, then check volume in your SEO tool.
Find questions for blog posts and FAQsexpansionModes: ["exact", "questions"]suggestion, generatedQuery, expansionTokenTurn the questions into article headings or FAQ entries.
Long-tail keyword ideasmaxDepth: 2 or 3suggestion, depth, parentSuggestionGroup phrases by the suggestion they grew from.
Compare searches by country and languagelanguages: ["en", "de"], countries: ["us", "de"] in one runseed, language, country, googleRank, fetchedAtCompare locales side by side; differences are not search-volume measurements.
Track how suggestions for your brand changeSchedule the same keywordssuggestion, googleRank, fetchedAtCompare exports from different dates.

👉 Try it now: open the input form

Input

All input fields

There are no nested input objects. All fields except keywords are optional.

FieldTypeRuntime defaultNew form prefillAllowed values and effect
keywordsarray of strings; requiredNone["coffee"]1–100 seeds, each up to 120 Unicode characters. Trim spaces and join repeated whitespace. Keep punctuation and Unicode.
languagestring"en""en"Lowercase language code such as en, fr, ru, ja, pt-br. Two or three letters with an optional 2–8 character subtag. Sent as hl.
countrystring"us""us"Two-letter code such as us, gb, fr, ru, jp. Lowercased and sent as gl.
languagesarray of stringsNoneNoneOptional, up to 5 language codes. When set, it replaces language. Each seed is searched for every languages × countries pair.
countriesarray of stringsNoneNoneOptional, up to 5 two-letter codes. When set, it replaces country. Sent as gl; it does not change IP location.
clientstring"chrome""chrome"chrome or firefox. Lists and metadata can differ. No browser is launched.
expansionModesarray of strings["exact"]["exact"]At least one of exact, alphabet, numbers, questions. Repeated modes are used once.
questionPrefixesarray of strings["how", "what", "where", "why", "when", "which"]None1–20 nonempty prefixes, each up to 40 characters. Trimmed and lowercased. Used by questions. Validation still applies when that mode is off.
maxGeneratedQueriesinteger50501–500 planned Google queries. Retries are extra HTTP attempts.
maxDepthinteger111–3. 1: suggestions for your queries only. 2: also search each saved suggestion. 3: one more level. All levels share maxGeneratedQueries and maxResults.
maxResultsinteger5001001–5,000 saved unique rows. Stops additional row writes at the cap.
maxRowsPerSeedinteger0None0–5,000. Stop saving new rows for one seed after this many, counted over all its languages and countries, in query order (not the strongest first); other seeds continue. 0 = no per-seed limit. Reported once per seed in outcomes; it does not change the run status.
maxSuggestionsPerQueryinteger0None0–15. Keep only the first N suggestions of each Google response. 0 keeps all (Google sends up to about 10–15).
maxConcurrencyinteger441–8 simultaneous requests. Does not change row order.
requestTimeoutMillisinteger8,000None1,000–30,000 ms per request attempt, also bounded by the remaining source deadline.
maxRetriesinteger1None0–2 retries for network, timeout and transient server errors. Blocks, redirects, rate limits and invalid payloads are not retried.
maxResponseBytesinteger65,536None1,024–262,144 bytes per response. An oversized response is a technical failure.
maxRunTimeSecondsinteger240None5–300 seconds for source work. A shorter platform deadline also applies, with time reserved for saving output. A larger platform timeout does not extend this input limit.
includeRawMetadatabooleantrueNoneKeep Google metadata when available. false saves {} in metadata.
maxChargeUsdnumberNoneNoneForm range: 0.00005–1.50 USD. Optional estimate cap for saved suggestion events. It does not cap platform usage or source requests.

For older API callers, seedKeywords remains an alias when keywords is absent. Runtime also accepts a comma- or newline-separated string for either seed field. The form uses an array. API numeric settings also accept numeric strings. Unknown extra keys have no runtime effect; the form schema disallows them.

Missing seeds, an empty array, a batch over 100 entries, non-string seeds or invalid settings produce a failed summary before any Google request. Empty-after-trimming or overlong seeds are recorded individually as invalid_input. Valid seeds in that batch can still run; invalid-only batches save no suggestion rows. Blank language/country/client values use their defaults. Optional numeric null values use their defaults.

Interacting settings

SettingBehavior
Expansionexact: the seed; alphabet: seed + space + a–z; numbers: seed + space + 0–9; questions: prefix + space + seed. Queries over 150 characters are skipped and reported.
Query capSeeds take turns: the first query of every seed, then the second of every seed, and so on; within a seed, modes follow the selected order. Each query is planned for every language and country pair before the next query. Keep at most maxGeneratedQueries, so a small cap still reaches every seed. A query-plan limit gives stopped, even if all retained requests succeed.
DepthLevel 0 is your planned queries. Each new suggestion saved at one level is sent as an exact query at the next level, in save order. A query already sent for the same seed is not sent again. Deeper levels use what is left of maxGeneratedQueries, shared between seeds in turn (one query per seed per round), so every seed gets deeper queries before the budget runs out. Within one seed, deeper queries follow save order, so with several locales and a small budget the first locale can get more of them; when it runs out, the summary is stopped. A row or charge cap ends recursion. A suggestion longer than 150 characters is not sent as a next-level query; it is skipped, reported in outcomes and does not change the run status.
Row / charge capRequests are fetched before rows are saved. A low maxResults or maxChargeUsd does not reduce that query plan. Keep the query cap small too.
Several languages / countriesEvery pair is a separate set of requests, so 2 languages × 2 countries uses 4 times the queries of one locale. All pairs share maxGeneratedQueries. Rows are kept per locale.
Duplicate seeds or expansion pathsDedupe suggestions within the same normalized seed, language, country, client and surface. Keep the first query's provenance; later queries that return the same suggestion add to surfacedByQueries, surfaceCount and bestGoogleRank of that row at no extra charge. Repeats are still counted after maxResults or maxChargeUsd stops saving new rows. The same suggestion under another seed can be a separate row.
Request completionSave rows in query-plan order, then Google response order. Concurrent completion order does not change grouping.

Example: three seed keywords

This input produced the output example below in a live Cloud run:

{
"keywords": ["coffee", "café & bakery", "кофе"],
"language": "en",
"country": "us",
"client": "firefox",
"expansionModes": ["exact"],
"maxResults": 30,
"maxConcurrency": 2,
"maxRetries": 1
}

The observed run saved 30 rows. That count is an example, not a promise for another run. Each row's seed and generatedQuery identify its input.

Example: bounded question expansion

{
"keywords": ["coffee"],
"expansionModes": ["exact", "questions"],
"questionPrefixes": ["how", "what"],
"maxGeneratedQueries": 3,
"maxResults": 100
}

This plans coffee, how coffee and what coffee. It does not expand their results again. More queries can add source work and saved-row charges.

👉 Try it now: open the input form

Output

Dataset fields

Each row is a saved useful suggestion. Error and empty outcomes are in RUN_SUMMARY, not extra Dataset rows. The runtime emits all fields below.

FieldTypeMeaning / empty values
idstringSynthetic sug_ ID from normalized suggestion and first saved query/context. Google supplies no suggestion ID. Stable for the same text and path; a different first path can change it.
suggestionstringGoogle suggestion text after JSON decoding. No HTML extraction, translation or scoring is applied.
normalizedSuggestionstringTrimmed text with joined whitespace and lowercase letters, used for dedupe.
seedstringAccepted seed after whitespace cleanup.
normalizedSeedstringSeed used for planning; same whitespace cleanup, not lowercased.
generatedQuerystringExact query sent to Google.
expansionModestringexact, alphabet, numbers or questions.
expansionTokenstring or nullAdded letter, number or question prefix. null for exact.
depthinteger0 for your planned queries, 1–2 for recursive levels (maxDepth 2–3).
parentSuggestionstring or nullSuggestion that was searched to get this row; equals generatedQuery on recursive levels. null at depth 0.
languagestringRequested hl; not detected result language.
countrystringRequested gl; not a measured user or IP location.
clientstringchrome or firefox.
surfacestringAlways web.
googleRankintegerOne-based position in this query's suggestion response. It is not a website search ranking. Dedupe can leave gaps.
bestGoogleRankintegerBest (lowest) position of this suggestion across all queries that returned it.
surfaceCountintegerNumber of different queries of this seed and locale whose response contained this suggestion. Higher means Google offers it more often; it is not search volume.
surfacedByQueriesarray of stringsThose queries, first one first, up to 20.
relevancenumber or nullGoogle relevance score from the chrome response (suggestrelevance). Undocumented, compare only within one response. null for firefox.
suggestTypestring or nullGoogle suggestion type such as QUERY (suggesttype). null for firefox.
sourceUrlstringFixed Google HTTPS origin and parameters. q is <redacted>; use generatedQuery for your query provenance.
sourceRequestIdstringSynthetic req_ ID for seed index, query and context. Moving a seed in the input can change it.
fetchedAtISO UTC stringTime the row was assembled after source work; not the time a suggestion was first created by Google.
metadataobjectPer-suggestion google: metadata with the prefix removed. Keys/values can change; missing values can be null. {} when unavailable or disabled. Relevance/type/subtype values are undocumented, not search volume.
duplicateOfstring or nullnull in current output. Duplicate rows are skipped.

Output surfaces and run summary

SurfaceWhat it contains
Default DatasetFull suggestion rows. The Suggestions view shows selected columns. Use the full Dataset API/export for all fields.
Output → suggestionsA generated link to the Dataset Suggestions view.
Output → runSummaryA generated link to the KVS RUN_SUMMARY JSON record.
KVS INPUTThe input saved for the run.
KVS RUN_SUMMARYFinal input, status, limits, counters, timing, event estimate and non-row outcomes.

The output schema generates the two links. The Actor does not write a separate OUTPUT record. An absent OUTPUT record is expected.

RUN_SUMMARY has these fields:

Field / groupContents
schemaVersion, status, verdictVersion 1, status succeeded / partial / stopped / failed, and a short explanation.
startedAt, finishedAt, durationMs, inputISO UTC times, milliseconds and normalized input fields listed above.
limitsBooleans: maxGeneratedQueriesReached, maxResultsReached, maxChargeReached, maxRunTimeReached. Query-length skips share the generated-query limit flag.
countsreceivedSeeds, validSeeds, invalidInputs, generatedQueriesPlanned, generatedQueriesSkipped, attemptedRequests, savedSuggestions, duplicatesSkipped, emptyResponses, technicalFailures, retries, bytesDownloaded. Logical requests and retries are separate; bytes include retry response bodies.
performancetimeToFirstUsefulRowMs is time to the first assembled row after fetching the plan, not first persisted output. Source latency: p50SourceLatencyMs, p95SourceLatencyMs; usefulSuggestionsPerMinute uses core duration. Values can be null when no row/request exists.
pricingSuggestion-event fields: eventName, pricePerSuggestionUsd, chargeableEvents, row-only estimatedChargeUsd, maxChargeUsd (number or null), chargingApplied (boolean). When the standard start event is active, platformStart reports its automatic estimate and estimatedTotalChargeUsd includes start plus rows. These are estimates, not a customer invoice.
sourcehost, transport, client, language and country (first values), languages, countries (all values), parserVersion.
outcomesNon-row outcomes with kind, message, and optional seed, generatedQuery, sourceRequestId, count, statusCode. Optional fields can be absent. Your queries are kept here for your own run analysis.
warningsCompleteness, affiliation and charging notices.

Output example

This is one full row from a Cloud run with languages: ["en", "de"], countries: ["us", "de"] and expansionModes: ["exact", "alphabet"]. Two queries returned it, so surfaceCount is 2. Suggestions and their positions may change.

{
"id": "sug_4e317e5fb04b2cef1e19ba897d3de863",
"suggestion": "running shoes adidas",
"normalizedSuggestion": "running shoes adidas",
"seed": "running shoes",
"normalizedSeed": "running shoes",
"generatedQuery": "running shoes",
"expansionMode": "exact",
"expansionToken": null,
"depth": 0,
"parentSuggestion": null,
"language": "en",
"country": "de",
"client": "chrome",
"surface": "web",
"googleRank": 5,
"bestGoogleRank": 1,
"surfaceCount": 2,
"surfacedByQueries": [
"running shoes",
"running shoes a"
],
"relevance": 560,
"suggestType": "QUERY",
"sourceUrl": "https://suggestqueries.google.com/complete/search?client=chrome&q=%3Credacted%3E&hl=en&gl=de",
"sourceRequestId": "req_5c14dece7a859a6ce3c3bcc866cd6c03",
"fetchedAt": "2026-10-27T04:37:02.674Z",
"metadata": {
"clientdata": {
"bpc": false,
"tlw": false
},
"suggestrelevance": 560,
"suggestsubtypes": [
512
],
"suggesttype": "QUERY",
"verbatimrelevance": 1300
},
"duplicateOf": null
}

Empty, partial and failed output

  • succeeded: all retained planned requests completed. An empty Dataset with emptyResponses > 0 can be a valid result.
  • partial: some seeds or source requests failed. Useful rows from other queries remain available.
  • stopped: a query, length, row, charge or time limit prevented further work or writes. Already fetched requests remain in the counters.
  • failed: invalid-only input, resource error, technical failure or internal error prevented useful output. Check outcomes.

The Apify run status and RUN_SUMMARY.status are separate. A completed process can be SUCCEEDED while the summary reports failed or stopped. Check the Dataset and the summary.

👉 Try it now: open the input form

Pricing

The price is $0.001 per Actor start + $0.00005 per saved unique suggestion: $0.05 per 1,000 rows. Higher Apify plans pay less per row:

Apify planPrice per saved suggestionPer 1,000 rows
Free$0.00005$0.050
Bronze$0.000045$0.045
Silver$0.00004$0.040
Gold and higher$0.000035$0.035

Apify charges the standard start event automatically. The start fee scales with run memory: one start event per GB, minimum one. With the default 256 MB, and anywhere in this Actor's 256–1,024 MB range, that is one start event ($0.001). Empty and invalid-only runs still have the start charge. Duplicates, invalid seeds, empty lists and failed requests have no suggestion-event charge. Partial runs pay the start charge plus only the rows saved before completion or a cap. You do not pay platform usage separately.

Cost examples at the Free plan price:

ScenarioSaved suggestion eventsActor event charge
Three-seed exact run with 30 rows30$0.00250
Example one-seed run with 15 saved rows15$0.00175
Valid empty or invalid-only run0$0.00100
Partial/limited run with 2 saved rows2$0.00110
1,000 saved rows in one run1,000$0.05100
Maximum 5,000 saved rows in one run5,000$0.25100
coffee with maxDepth: 3 and 500 queries (about 2,800 rows)2,783$0.14015

These amounts include one start and the saved suggestion events. Check Console's cost details for the applied price and plan rules.

For a cap on total Actor charges, use Apify's maximum cost per run (maxTotalChargeUsd in API calls); the minimum is $0.00105 for one start and one suggestion. maxChargeUsd is a separate estimate for suggestion events only, excluding the start; it uses the per-row price of your Apify plan. RUN_SUMMARY.pricing.estimatedChargeUsd preserves that row-only meaning; when the start event is active, platformStart and estimatedTotalChargeUsd show the additional start estimate and total. These estimates are not a customer invoice. Neither limit guarantees every planned query will run or every returned suggestion will be saved.

👉 Try it now: open the input form

Limits

  • Returns Google Search suggestions only. No search results, website rankings, search volume, CPC, Google Ads data or AI-generated keywords. No YouTube, Amazon, Places or Maps. Recursion goes at most 3 levels deep.
  • Suggestions change with time, location, language and Google's filters. Country and language are request preferences: they do not set the request's IP location or guarantee a language for every result. Google explains how Autocomplete works.
  • No complete keyword list and no SEO ranking prediction. The Google endpoint is public but not an official bulk API and may change.
  • Hard limits: 100 seeds, 120 characters per seed, 150 per generated query, 500 planned queries, 5,000 saved rows, concurrency 8, two retries and 262,144 bytes per response.
  • Default memory is 256 MB; 256–1,024 MB is supported. A larger platform timeout keeps the internal source limit unchanged.
  • No output-text filter and no stateful unchanged/delta mode.

👉 Try it now: open the input form

API, export and integrations

  • API: use the Actor's API tab to start a run with the same input fields and read its default Dataset after it finishes. Keep your Apify API token in a private credential store, not in shared links or input examples.
  • Export: JSON or CSV from Console. Use suggestion, seed and generatedQuery as the next step's text fields. Keep id, locale and fetchedAt when comparing snapshots.
  • Scheduling: Apify can schedule runs. Each run creates a fresh snapshot; this Actor does not keep a change baseline, so repeated runs can return and charge the same current suggestions. No schedule is enabled by using this Actor.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/google-autocomplete-scraper.
  • Smallest useful input: {"keywords": ["coffee"], "language": "en", "country": "us"}.
  • For long-tail phrases add "maxDepth": 2 (or 3) and raise maxGeneratedQueries and maxResults; one seed at depth 3 can return about 2,800 rows.
  • Several locales in one run: "languages": ["en", "de"], "countries": ["us", "de"]. Keep a keyword list short with maxRowsPerSeed.
  • Key output fields: suggestion (the suggested phrase), seed (your keyword), generatedQuery (the exact query sent), googleRank (position in that response), surfaceCount (how many queries returned it), depth, parentSuggestion and RUN_SUMMARY.status (succeeded, partial, stopped or failed).
  • A one-keyword exact run usually finishes in a few seconds with about 15 rows and costs about $0.002. Respect the hard limits above; keep maxGeneratedQueries small when you need few requests.

👉 Try it now: open the input form

Troubleshooting

SymptomWhat to checkSafe next action
Empty Datasetstatus, emptyResponses, technicalFailures, outcomesTry a clear public seed only when the summary confirms a valid empty response.
invalid_inputSeed count/length and allowed settingsCorrect the input; do not add a login or token.
blocked_or_consent, rate_limitedAccess denial, HTML or redirectsStop repeated runs. Retry later with a small query plan and lower concurrency.
malformed_responseUnexpected JSON, suggestion types or a different echoed queryShare the run ID with support. Do not treat it as an empty suggestion list.
retry_exhaustedTimeout/network/server failure after bounded attemptsUse fewer queries or lower concurrency; check the summary before retrying.
response_too_largeResponse size exceeded maxResponseBytesCheck for source drift; increase the byte cap only within the documented range.
stopped with useful rowslimits and outcomesExport the rows already saved. Increase only the specific limit you need.
resource_errorMemory outside 256–1,024 MBChoose supported memory. This is separate from invalid input.
Different suggestions on repeatTime, locale, client and query pathsCompare snapshots, not a promised permanent keyword set.

👉 Try it now: open the input form

FAQ

Do I need a Google account or Google API key?

No. An Apify account is needed to run the Actor. No Google credentials are used.

Are these search volumes or Google Search rankings?

No. googleRank is a position inside an Autocomplete response. Metadata does not provide verified search volume, CPC or competition.

Can I use non-English keywords?

Yes. Unicode is kept, including Cyrillic and accented text. Set the requested language and country. Google can still return suggestions in another language.

Are country results exact local results?

No. country and countries send gl; they do not change IP location, so two countries can return the same list. Results can also depend on Google's current behavior.

Will a repeat run have the same IDs and order?

The same saved text and first query/context have the same synthetic ID. Query-plan grouping is deterministic. Google's suggestion text and order can change, and a different first expansion path can change an ID.

Why did a low row limit still make several requests?

The Actor fetches its bounded query plan before saving rows. Lower maxGeneratedQueries when you also need fewer source requests.

Do empty runs cost nothing?

No. The $0.001 start event still applies. There is no suggestion event when no useful row is saved. Check the actual cost breakdown in Console.

Can it expand suggestions recursively?

Yes. Set maxDepth to 2 or 3. Each saved suggestion is searched again, and new rows show depth and parentSuggestion. Raise maxGeneratedQueries and maxResults for deeper runs: every level shares those limits.

Can it monitor changes?

It can export repeated snapshots, but it has no built-in delta state or unchanged-result filter. Compare exported snapshots in your own workflow.

👉 Try it now: open the input form

👉 Try it now: open the input form

Support

Open an issue in this Actor's Apify Issues tab. Include the run ID, selected mode, non-sensitive input settings and the relevant RUN_SUMMARY outcome. Remove private keywords if needed. Never share API tokens, cookies, account or billing details.

This project is not affiliated with, endorsed by, or sponsored by Google. The Google name identifies the source.

👉 Try it now: open the input form