Dataspryva

Google Autocomplete Keyword Expansion Scraper

Expand seed keywords into long-tail suggestions using Google's autocomplete, with question-word, preposition, comparison, and A-to-Z expansion modes across any country and language.

Input schema

Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.

FieldTypeRequiredDescription
keywordsarrayrequiredOne or more seeds. 1-3 word seeds return the most suggestions. Each seed is expanded according to `mode`.
modestringoptionalHow each seed is expanded. `all` runs every strategy; `exact` queries only the seed; `alphabet` adds a-z and 0-9 before and after; `questions` uses locale question words; `modifiers` adds prepositions and buyer-intent words; `related` adds trailing-space, wildcard, local, review and price variants.
countrystringoptionalGoogle market used for the `gl` parameter. Changes ranking and local phrasing. 134 markets were verified against the live endpoint; the legacy `ALL` value maps to US.
Show all input fields
FieldTypeRequiredDescription
keywordsarrayrequiredOne or more seeds. 1-3 word seeds return the most suggestions. Each seed is expanded according to `mode`.
modestringoptionalHow each seed is expanded. `all` runs every strategy; `exact` queries only the seed; `alphabet` adds a-z and 0-9 before and after; `questions` uses locale question words; `modifiers` adds prepositions and buyer-intent words; `related` adds trailing-space, wildcard, local, review and price variants.
countrystringoptionalGoogle market used for the `gl` parameter. Changes ranking and local phrasing. 134 markets were verified against the live endpoint; the legacy `ALL` value maps to US.
languagestringoptionalLanguage used for the `hl` parameter and for the locale-aware question and modifier words. 19 languages have native expansion vocabularies; the rest fall back to English modifiers.
sourcestringoptionalWhich Google autocomplete surface to query: web, YouTube or Shopping. `all` runs all three and multiplies the request count.
maxItemsintegeroptionalHard cap on dataset records across all seeds and sources. Flat mode counts suggestions; tree mode counts one record per seed/source.
maxSuggestionsPerSeedintegeroptionalCap on suggestions collected for one seed, applied after all expansion queries have run. Defaults to 2,000 when omitted (legacy maxItemsPerKeyword is honoured).
minLengthintegeroptionalDrop suggestions shorter than this many characters.
maxLengthintegeroptionalDrop suggestions longer than this many characters.
containsKeywordstringoptionalKeep only suggestions containing this substring (case-insensitive). Prefix with `!` to exclude matches instead.
outputFormatstringoptional`flat` emits one row per suggestion. `tree` emits one row per seed and source with a nested suggestions array (the legacy shape).
expansionDepthstringoptionalRe-query the first 15 discovered suggestions to go one or two levels deeper. Off for the cheapest run.
dedupeAcrossSeedsbooleanoptionalEmit a phrase only once per run. Off keeps every seed complete; on removes overlaps between seeds.
includeIntentbooleanoptionalAdd a deterministic intent tag (question, comparison, local, transactional, commercial, informational) where a language vocabulary matches.

Download the published input schema

View complete JSON
{
  "description": "Expand seed keywords into long-tail Google autocomplete suggestions with eight expansion modes, 134 markets, 78 languages and optional recursion.",
  "properties": {
    "containsKeyword": {
      "description": "Keep only suggestions containing this substring (case-insensitive). Prefix with `!` to exclude matches instead.",
      "editor": "textfield",
      "title": "Must contain",
      "type": "string"
    },
    "country": {
      "default": "US",
      "description": "Google market used for the `gl` parameter. Changes ranking and local phrasing. 134 markets were verified against the live endpoint; the legacy `ALL` value maps to US.",
      "editor": "select",
      "enum": [
        "US",
        "GB",
        "CA",
        "AU",
        "NZ",
        "IE",
        "DE",
        "FR",
        "ES",
        "IT",
        "NL",
        "BE",
        "AT",
        "CH",
        "PT",
        "GR",
        "CZ",
        "PL",
        "SE",
        "NO",
        "DK",
        "FI",
        "HU",
        "RO",
        "BG",
        "HR",
        "SK",
        "SI",
        "EE",
        "LV",
        "LT",
        "LU",
        "MT",
        "CY",
        "IS",
        "LI",
        "MC",
        "AD",
        "SM",
        "JP",
        "KR",
        "CN",
        "TW",
        "HK",
        "MO",
        "IN",
        "PK",
        "BD",
        "LK",
        "NP",
        "AF",
        "ID",
        "TH",
        "VN",
        "PH",
        "MY",
        "SG",
        "BN",
        "MM",
        "KH",
        "LA",
        "TL",
        "BR",
        "MX",
        "AR",
        "CL",
        "CO",
        "PE",
        "VE",
        "EC",
        "BO",
        "PY",
        "UY",
        "GT",
        "CR",
        "PA",
        "DO",
        "PR",
        "CU",
        "SV",
        "HN",
        "NI",
        "JM",
        "TT",
        "BB",
        "RU",
        "TR",
        "UA",
        "BY",
        "KZ",
        "UZ",
        "AZ",
        "AM",
        "GE",
        "MD",
        "RS",
        "BA",
        "MK",
        "AL",
        "ME",
        "XK",
        "ZA",
        "NG",
        "EG",
        "MA",
        "DZ",
        "TN",
        "KE",
        "GH",
        "ET",
        "UG",
        "TZ",
        "RW",
        "ZW",
        "SN",
        "CI",
        "CM",
        "MZ",
        "AO",
        "ZM",
        "AE",
        "SA",
        "IL",
        "QA",
        "KW",
        "BH",
        "OM",
        "JO",
        "LB",
        "SY",
        "IQ",
        "IR",
        "YE",
        "PS",
        "ALL"
      ],
      "enumTitles": [
        "United States",
        "United Kingdom",
        "Canada",
        "Australia",
        "New Zealand",
        "Ireland",
        "Germany",
        "France",
        "Spain",
        "Italy",
        "Netherlands",
        "Belgium",
        "Austria",
        "Switzerland",
        "Portugal",
        "Greece",
        "Czechia",
        "Poland",
        "Sweden",
        "Norway",
        "Denmark",
        "Finland",
        "Hungary",
        "Romania",
        "Bulgaria",
        "Croatia",
        "Slovakia",
        "Slovenia",
        "Estonia",
        "Latvia",
        "Lithuania",
        "Luxembourg",
        "Malta",
        "Cyprus",
        "Iceland",
        "Liechtenstein",
        "Monaco",
        "Andorra",
        "San Marino",
        "Japan",
        "South Korea",
        "China",
        "Taiwan",
        "Hong Kong",
        "Macao",
        "India",
        "Pakistan",
        "Bangladesh",
        "Sri Lanka",
        "Nepal",
        "Afghanistan",
        "Indonesia",
        "Thailand",
        "Vietnam",
        "Philippines",
        "Malaysia",
        "Singapore",
        "Brunei",
        "Myanmar",
        "Cambodia",
        "Laos",
        "Timor-Leste",
        "Brazil",
        "Mexico",
        "Argentina",
        "Chile",
        "Colombia",
        "Peru",
        "Venezuela",
        "Ecuador",
        "Bolivia",
        "Paraguay",
        "Uruguay",
        "Guatemala",
        "Costa Rica",
        "Panama",
        "Dominican Republic",
        "Puerto Rico",
        "Cuba",
        "El Salvador",
        "Honduras",
        "Nicaragua",
        "Jamaica",
        "Trinidad and Tobago",
        "Barbados",
        "Russia",
        "Turkey",
        "Ukraine",
        "Belarus",
        "Kazakhstan",
        "Uzbekistan",
        "Azerbaijan",
        "Armenia",
        "Georgia",
        "Moldova",
        "Serbia",
        "Bosnia and Herzegovina",
        "North Macedonia",
        "Albania",
        "Montenegro",
        "Kosovo",
        "South Africa",
        "Nigeria",
        "Egypt",
        "Morocco",
        "Algeria",
        "Tunisia",
        "Kenya",
        "Ghana",
        "Ethiopia",
        "Uganda",
        "Tanzania",
        "Rwanda",
        "Zimbabwe",
        "Senegal",
        "Cote d'Ivoire",
        "Cameroon",
        "Mozambique",
        "Angola",
        "Zambia",
        "United Arab Emirates",
        "Saudi Arabia",
        "Israel",
        "Qatar",
        "Kuwait",
        "Bahrain",
        "Oman",
        "Jordan",
        "Lebanon",
        "Syria",
        "Iraq",
        "Iran",
        "Yemen",
        "Palestine",
        "All markets (legacy — maps to US)"
      ],
      "prefill": "US",
      "title": "Country (gl)",
      "type": "string"
    },
    "dedupeAcrossSeeds": {
      "default": false,
      "description": "Emit a phrase only once per run. Off keeps every seed complete; on removes overlaps between seeds.",
      "prefill": false,
      "title": "Dedupe across seeds",
      "type": "boolean"
    },
    "expansionDepth": {
      "default": "0",
      "description": "Re-query the first 15 discovered suggestions to go one or two levels deeper. Off for the cheapest run.",
      "editor": "select",
      "enum": [
        "0",
        "1",
        "2"
      ],
      "enumTitles": [
        "Off (mode only)",
        "One extra level (top 15 suggestions)",
        "Two extra levels"
      ],
      "prefill": "0",
      "title": "Recursion depth",
      "type": "string"
    },
    "includeIntent": {
      "default": true,
      "description": "Add a deterministic intent tag (question, comparison, local, transactional, commercial, informational) where a language vocabulary matches.",
      "prefill": false,
      "title": "Add intent tags",
      "type": "boolean"
    },
    "keywords": {
      "default": [
        "python tutorial"
      ],
      "description": "One or more seeds. 1-3 word seeds return the most suggestions. Each seed is expanded according to `mode`.",
      "editor": "stringList",
      "prefill": [
        "python tutorial"
      ],
      "title": "Seed keywords",
      "type": "array"
    },
    "language": {
      "default": "en",
      "description": "Language used for the `hl` parameter and for the locale-aware question and modifier words. 19 languages have native expansion vocabularies; the rest fall back to English modifiers.",
      "editor": "select",
      "enum": [
        "en",
        "es",
        "fr",
        "de",
        "it",
        "pt",
        "nl",
        "pl",
        "sv",
        "no",
        "da",
        "fi",
        "cs",
        "el",
        "hu",
        "ro",
        "bg",
        "hr",
        "sk",
        "sl",
        "et",
        "lv",
        "lt",
        "ga",
        "is",
        "mt",
        "ru",
        "uk",
        "be",
        "sr",
        "bs",
        "mk",
        "sq",
        "ar",
        "tr",
        "he",
        "fa",
        "ur",
        "ku",
        "ja",
        "ko",
        "zh-CN",
        "zh-TW",
        "hi",
        "bn",
        "ta",
        "te",
        "ml",
        "mr",
        "gu",
        "kn",
        "pa",
        "ne",
        "si",
        "my",
        "id",
        "th",
        "vi",
        "ms",
        "tl",
        "km",
        "lo",
        "sw",
        "am",
        "ha",
        "yo",
        "ig",
        "zu",
        "xh",
        "af",
        "az",
        "kk",
        "uz",
        "ky",
        "tg",
        "mn",
        "ka",
        "hy"
      ],
      "enumTitles": [
        "English",
        "Spanish",
        "French",
        "German",
        "Italian",
        "Portuguese",
        "Dutch",
        "Polish",
        "Swedish",
        "Norwegian",
        "Danish",
        "Finnish",
        "Czech",
        "Greek",
        "Hungarian",
        "Romanian",
        "Bulgarian",
        "Croatian",
        "Slovak",
        "Slovenian",
        "Estonian",
        "Latvian",
        "Lithuanian",
        "Irish",
        "Icelandic",
        "Maltese",
        "Russian",
        "Ukrainian",
        "Belarusian",
        "Serbian",
        "Bosnian",
        "Macedonian",
        "Albanian",
        "Arabic",
        "Turkish",
        "Hebrew",
        "Persian",
        "Urdu",
        "Kurdish",
        "Japanese",
        "Korean",
        "Chinese (Simplified)",
        "Chinese (Traditional)",
        "Hindi",
        "Bengali",
        "Tamil",
        "Telugu",
        "Malayalam",
        "Marathi",
        "Gujarati",
        "Kannada",
        "Punjabi",
        "Nepali",
        "Sinhala",
        "Burmese",
        "Indonesian",
        "Thai",
        "Vietnamese",
        "Malay",
        "Tagalog",
        "Khmer",
        "Lao",
        "Swahili",
        "Amharic",
        "Hausa",
        "Yoruba",
        "Igbo",
        "Zulu",
        "Xhosa",
        "Afrikaans",
        "Azerbaijani",
        "Kazakh",
        "Uzbek",
        "Kyrgyz",
        "Tajik",
        "Mongolian",
        "Georgian",
        "Armenian"
      ],
      "prefill": "en",
      "title": "Language (hl)",
      "type": "string"
    },
    "maxItems": {
      "default": 5000,
      "description": "Hard cap on dataset records across all seeds and sources. Flat mode counts suggestions; tree mode counts one record per seed/source.",
      "maximum": 50000,
      "minimum": 1,
      "prefill": 3,
      "title": "Max records",
      "type": "integer"
    },
    "maxLength": {
      "description": "Drop suggestions longer than this many characters.",
      "maximum": 500,
      "minimum": 1,
      "title": "Max characters",
      "type": "integer"
    },
    "maxSuggestionsPerSeed": {
      "description": "Cap on suggestions collected for one seed, applied after all expansion queries have run. Defaults to 2,000 when omitted (legacy maxItemsPerKeyword is honoured).",
      "maximum": 10000,
      "minimum": 1,
      "prefill": 3,
      "title": "Max suggestions per seed",
      "type": "integer"
    },
    "minLength": {
      "description": "Drop suggestions shorter than this many characters.",
      "maximum": 200,
      "minimum": 1,
      "title": "Min characters",
      "type": "integer"
    },
    "mode": {
      "default": "all",
      "description": "How each seed is expanded. `all` runs every strategy; `exact` queries only the seed; `alphabet` adds a-z and 0-9 before and after; `questions` uses locale question words; `modifiers` adds prepositions and buyer-intent words; `related` adds trailing-space, wildcard, local, review and price variants.",
      "editor": "select",
      "enum": [
        "all",
        "exact",
        "alphabet",
        "questions",
        "modifiers",
        "prepositions",
        "comparisons",
        "related"
      ],
      "enumTitles": [
        "All strategies (deepest)",
        "Exact seed only",
        "Alphabet + digits (a-z, 0-9, prefix and suffix)",
        "Question words (locale-aware)",
        "Modifiers (prepositions + buyer intent)",
        "Prepositions only",
        "Comparisons (vs / or / versus)",
        "Related (wildcard, near me, review, price)"
      ],
      "prefill": "exact",
      "title": "Expansion mode",
      "type": "string"
    },
    "outputFormat": {
      "default": "flat",
      "description": "`flat` emits one row per suggestion. `tree` emits one row per seed and source with a nested suggestions array (the legacy shape).",
      "editor": "select",
      "enum": [
        "flat",
        "tree"
      ],
      "enumTitles": [
        "Flat (one row per suggestion)",
        "Tree (nested per seed)"
      ],
      "prefill": "flat",
      "title": "Output shape",
      "type": "string"
    },
    "source": {
      "default": "web",
      "description": "Which Google autocomplete surface to query: web, YouTube or Shopping. `all` runs all three and multiplies the request count.",
      "editor": "select",
      "enum": [
        "web",
        "youtube",
        "shopping",
        "all"
      ],
      "enumTitles": [
        "Google web",
        "YouTube",
        "Google Shopping",
        "All three surfaces"
      ],
      "prefill": "web",
      "title": "Google surface",
      "type": "string"
    }
  },
  "required": [
    "keywords"
  ],
  "schemaVersion": 1,
  "title": "Google Autocomplete Keyword Expansion Scraper Input",
  "type": "object"
}

Output schema

Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.

FieldTypeRequiredDescription
suggestionsstringoptionalDataset containing all scraped Google autocomplete keyword suggestions.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "Keyword suggestions with seed, expansion type, position, locale, source URL, Google relevance and optional recursion depth.",
  "properties": {
    "suggestions": {
      "description": "Dataset containing all scraped Google autocomplete keyword suggestions.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "Keyword suggestions",
      "type": "string"
    }
  },
  "title": "Google Autocomplete Keyword Expansion Scraper Output"
}

Dataset schema

Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.

Download the published dataset schema

View complete JSON
{
  "actorSpecification": 1,
  "views": {
    "overview": {
      "display": {
        "component": "table",
        "properties": {}
      },
      "title": "Keyword suggestions",
      "transformation": {
        "fields": [
          "keyword",
          "seed",
          "type",
          "position",
          "locale",
          "relevance",
          "source"
        ]
      }
    }
  }
}

Key-value schema

Published key-value store definitions, when provided by this build.

This definition is not present in the default published build. See the published README for available documentation.

Published README

Read the full published documentation

Google Autocomplete Keyword Expansion Scraper

Turn a short seed keyword into the long-tail phrases people actually type into Google — then keep the provenance that makes the list usable: which query surfaced each phrase, where it ranked, which market and language it came from, and Google's own relevance score.

Suggestions come straight from Google's public autocomplete endpoint. No login, no API key, no browser, no cookies.

What it does

  • Runs one of eight expansion modes per seed, from a single exact query to a full sweep that combines alphabet, digits, questions, modifiers, comparisons and related variants.
  • Adds letters and numbers before and after the seed (coffee a, coffee 1, a coffee, 1 coffee), not just the usual A–Z suffix.
  • Uses native question and modifier vocabularies for 19 languages, so Spanish and Japanese seeds are expanded with Spanish and Japanese words instead of English ones.
  • Can query Google web, YouTube and Shopping in one run.
  • Optionally re-queries the first 15 discoveries one or two levels deeper.
  • Targets 134 verified Google markets and 78 verified interface languages.
  • Caps the run with a global record limit and a per-seed suggestion limit. The per-seed cap limits collected rows rather than aborting the A–Z sweep, so a full alphabet sweep is never silently cut short.
  • Keeps the old flat and tree record shapes, so existing tasks and integrations keep working.

Modes

Mode What it sends Typical unique phrases per seed
exact The seed only. 10–15
alphabet seed a … seed z, seed 0 … seed 9, and the same tokens before the seed. ~1,000
questions Native question words before and after the seed. ~300–450
prepositions Native prepositions after the seed. ~50–150
comparisons vs, or, versus after the seed and vs seed. ~15–50
modifiers Prepositions plus buyer-intent words before and after the seed. ~300–470
related Trailing-space, wildcard, near-me, review and price variants. ~30–70
all The deduplicated union of every strategy. ~1,100–2,000

Counts are for mainstream 1–3 word seeds. Obscure or long seeds return far fewer suggestions because Google completes prefixes, not topics.

Output

One flat row per suggestion (default):

Field Meaning
keyword / text The suggested phrase. text is the legacy alias.
seed / source_keyword The seed this phrase came from. source_keyword is the legacy alias.
type Which expansion produced it: suggestion, alphabet, question, modifier, preposition, comparison, related or recursive.
position Its 1-based rank in Google's response to that query.
expansion_query The exact query sent to Google, when different from the seed.
locale, country, language The market and interface language used.
source web, youtube or shopping.
sourceUrl The exact Suggest request URL, for traceability.
relevance Google's own ranking score for the phrase, when the chrome dialect returns it.
suggestion_type, sub_types Google's raw suggestion tag and numeric sub-type codes.
verbatim_relevance Google's query-level verbatim score.
depth, parent_keyword Recursion level and the query that produced a deeper suggestion.
is_question, word_count, intent Deterministic local tags. intent is added when a language vocabulary matches.
mode, recordType, scrapedAt Run metadata and the legacy record marker.

tree mode emits one record per seed and source with a nested suggestions[] array and a type_counts summary. Its legacy keys (source_keyword, mode, country, language, suggestion_count, suggestions, scrapedAt) are unchanged.

Input

Field Default Notes
keywords ["python tutorial"] Required. One or more seeds; 1–3 words work best.
mode all One of the eight modes above.
country US 134 verified Google markets, plus a legacy ALL value that maps to US.
language en 78 verified Google languages.
source web web, youtube, shopping or all.
maxItems 5000 Global record cap. Flat counts suggestions; tree counts seed/source records.
maxSuggestionsPerSeed – Cap on collected suggestions per seed; the depth-0 query plan still runs.
minLength, maxLength unset Drop suggestions outside the character range.
containsKeyword unset Keep suggestions containing a substring; prefix with ! to exclude.
outputFormat flat flat or legacy tree.
expansionDepth 0 0, 1 or 2: re-query the first 15 discoveries.
dedupeAcrossSeeds false Emit a phrase only once per run.
includeIntent true Add the deterministic intent tag.

Old tasks that send maxItemsPerKeyword still work: it maps to maxSuggestionsPerSeed. country: "ALL" is mapped to US with a warning because Google has no ALL market.

The input prefill is one python tutorial seed in exact mode, capped at 3 records.

Examples

Exact, cheapest run:

{"keywords": ["coffee"], "mode": "exact", "maxItems": 3}

Full English sweep with one extra recursion level:

{"keywords": ["running shoes"], "mode": "all", "country": "US", "language": "en", "expansionDepth": 1, "maxItems": 5000}

Spanish market with native question words on the web and YouTube:

{"keywords": ["café"], "mode": "questions", "country": "ES", "language": "es", "source": "all"}

Legacy nested output:

{"keywords": ["coffee"], "mode": "all", "outputFormat": "tree", "maxSuggestionsPerKeyword": 100}

How it works

Each mode turns the seed into a fixed, deduplicated list of Suggest queries. The actor sends them with a browser-like client, reads the JSON array Google returns, and normalises four response dialects (chrome, firefox, safari, and the JSONP variants). It detects a block from the status code, an HTML content type, a /sorry URL or the "unusual traffic" page, and switches from a direct connection to its included Apify datacenter proxy. If the automatic proxy cannot be created, it retries with the lighter firefox dialect. There is no proxy setting to configure, no login and no API key.

FAQ

Do I need a proxy or a Google account? No. The actor starts with a direct connection and uses its included Apify proxy only after Google blocks the direct one. There is nothing to configure and no credential to supply.

How many suggestions will one seed return? It depends on the seed and mode. A mainstream 1–3 word seed with all typically returns 1,100–2,000 unique phrases. A long or obscure seed can return fewer than 100 because autocomplete only completes prefixes.

Why are there no search-volume numbers? Google autocomplete does not expose search volume. relevance is Google's internal ranking score for the phrase, and it is useful for ordering, not for estimating monthly searches. Use a separate keyword-volume source if you need exact demand.

What is the difference between country and language? country (gl) changes which suggestions Google considers locally relevant. language (hl) changes the interface language and the native question/modifier words the actor uses. Setting both gives the most authentic local list.

Can I get the same phrase from two seeds? By default yes, because each seed stays complete. Turn on dedupeAcrossSeeds to emit each phrase once per run.

What does recursion do? expansionDepth 1 re-queries the first 15 suggestions, and depth 2 re-queries the first 15 results of that pass. It costs about 15 extra requests per level and can add hundreds of phrases, especially with exact.

Why is a phrase I know missing? Google filters some commercial, medical and political suggestions, and it varies results by market and time. The actor reports what Google returns; it does not invent missing phrases.

Does the actor work with non-Latin scripts? Yes. It preserves the original script and corrects the response charset, including Japanese, Korean, Chinese, Russian, Arabic, Hebrew, Greek, Polish, Turkish, Thai, Vietnamese and the Indic languages.

Is this affiliated with Google? No. It reads Google's public autocomplete endpoint and is not operated by or affiliated with Google. You are responsible for how you use the output.

Limits

  • Google's autocomplete endpoint is undocumented and can change or throttle without notice.
  • Heavy direct traffic can be blocked; the actor then switches to its included Apify datacenter proxy automatically. No residential proxy is used.
  • Autocomplete completes prefixes, so very long seeds return little.
  • There is no pagination: each query returns at most 15 suggestions (10 on the fallback dialect). Coverage comes from more queries, not more pages.
  • Google may omit suggestions for sensitive or highly commercial queries.
  • No search volume, CPC, difficulty, People Also Ask or entity metadata is fabricated.

Python quickstart

Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.

Open the step-by-step Python guide →

Source build 9hAh7UqGFMaiIDlEq. Documentation is regenerated from the default published build; private drafts are not included.