# Google Autocomplete Suggestions Scraper – Keyword Ideas (`rowcraft/google-autocomplete-suggestions-scraper`) Actor

Get Google search suggestions for a list of keywords in bulk: a-z, question and preposition expansion, any language and country. Pay only per distinct suggestion delivered; no API key, no proxy, no personal data.

- **URL**: https://apify.com/rowcraft/google-autocomplete-suggestions-scraper.md
- **Developed by:** [Rowcraft](https://apify.com/rowcraft) (community)
- **Categories:** SEO tools, Marketing, Developer tools
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 search suggestions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Autocomplete Suggestions Scraper: Keyword Ideas in Bulk

Get the **Google** search suggestions that appear while someone types, for a whole list of keywords at once, in the language and country you choose. Add the expansions you want (a to z after the keyword, question words in front, prepositions after, a letter in front) and one keyword turns into hundreds of real search phrases, delivered as JSON, CSV or Excel with the exact text that produced each one.

You pay per distinct suggestion delivered. There is no API key, no login, no proxy and no browser: the actor sends plain requests, one at a time, to the public suggestion endpoint, after reading its robots.txt.

Three facts before you start, because they decide whether this is the right tool:

- **It gives phrases, not numbers.** The suggestion list does not carry search volumes, competition or trends, and the actor does not invent them. Use it to find what people type; use another source to measure how often.
- **One request returns about ten suggestions.** More suggestions come from more requests: the plain keyword is 1 request, the a to z expansion is 26 more, and all expansions together are 92 more per keyword. At the default pace of one request every 700 ms that is about 80 requests a minute.
- **Expansions go one level deep.** A suggestion is never expanded again, so a run is predictable in size and time and cannot grow without limit.

![Results of Google Autocomplete Suggestions Scraper – Keyword Ideas in the Apify dataset view](https://api.apify.com/v2/key-value-stores/7hbQFQdGq61v2OZ2h/records/google-autocomplete-suggestions-scraper-results.png)

### What you get

Price: $0.60 per 1,000 suggestions on the Free plan, $0.40 on the Business plan, paid per row delivered; the $5 monthly credit of a free Apify account covers about 8,300 suggestions. Details in Pricing below.

One row per distinct suggestion:

- **The suggestion** itself, as Google wrote it, with spaces cleaned
- **The keyword** you gave (`query`) and **the text that was sent** to Google when the suggestion first appeared (`expandedQuery`, for example `standing desk c` or `how meal prep`)
- **How that text was made** (`expansionType`): `base` for your keyword, `alphabet` for a letter or digit after it, `question` for a question word in front, `preposition` for a preposition after it, `prefix` for a letter in front
- **The position** of the suggestion in the list Google returned for that text, counting from 1
- **Language and country** used, and the time the suggestion was read
- **A stable `id`** made of language, country and the suggestion in lower case, which is what **Only new rows** remembers between runs

The run also writes a `COVERAGE` record with one line per keyword (ok, empty, partial, error, blocked, not_checked or robots_disallowed, with the reason and the number of requests and rows) and a `RUN_SUMMARY` with the counts: requests sent, suggestions read, duplicates skipped, suggestions dropped by the privacy filter, and why the run stopped.

### Why this actor

- **You pay for suggestions, not for requests.** A suggestion that already appeared under an earlier request of the same run is delivered once and charged once. Suggestions equal to the text you typed, failed requests and refused requests are never charged.
- **Every row says where it came from.** `expandedQuery` and `expansionType` tell you which expansion found the phrase, so you can keep only the questions, only the "keyword for ..." phrases, or only what the plain keyword returned.
- **Language and country are separate settings.** The same keyword gives different suggestions in different markets, and 39 languages and 60 countries are in the lists, so you can compare markets in one schedule.
- **Polite and honest by design.** The actor identifies itself, reads robots.txt first, sends one request at a time with a pause between them, uses no proxy and does not try to get around a block. When Google answers with a rate limit, a refusal or the CAPTCHA page, the run stops cleanly, tells you in the summary, and keeps what it already delivered.
- **Built for schedules.** Turn on **Only new rows** and a weekly run costs only the suggestions you did not have last week, which is a simple way to watch a market for new search phrases.
- **Small and cheap to run.** The actor runs in 256 MB, and the platform usage of a run is included in the price per suggestion.

### How to use it

1. Open the Actor and fill in **Keywords** (the other fields are optional filters).
2. Set **Maximum suggestions** to a small number for a first try (the default is a safe start).
3. Click **Start**. The status line shows progress; the run stops cleanly at your limit or at the charge limit you set in the run options.
4. Open the **Dataset** tab and download JSON, CSV, Excel, XML or HTML, or send the rows to Google Sheets, Slack, Make, n8n or Zapier with the Integrations tab.
5. To run it on a schedule, use **Schedules** in Apify Console and turn on **Only new rows since the last run** below: every run then costs only the new rows, and a webhook URL tells you when something new came in.

A first run that costs next to nothing: keep **Keywords** as it is, pick **Alphabet** under **Expansions**, and leave **Maximum suggestions delivered** at 100. It sends about eleven requests and finishes in under a minute.

### Input

**Quick start.** This input is ready to run (it is also the example in the API tab):

```json
{
  "queries": [
    "standing desk"
  ],
  "language": "en",
  "country": "us",
  "expansions": [
    "alphabet"
  ],
  "maxItems": 100
}
```

One real row it returns (long texts shortened here):

```json
{
  "id": "en|us|standing desk converter",
  "query": "standing desk",
  "expandedQuery": "standing desk",
  "expansionType": "base",
  "suggestion": "standing desk converter",
  "position": 2,
  "language": "en",
  "country": "us",
  "scrapedAt": "2026-10-22T10:10:25.794Z"
}
```

| Field | What it does |
|---|---|
| `queries` | Keywords or phrases, one per line. Spaces are cleaned, duplicates are skipped, and a keyword is cut at 200 characters. Up to 10,000 per run. |
| `language` | The language of the suggestions (`hl`), default `en`. A list of 39 languages. |
| `country` | The country the suggestions are for (`gl`), default `us`. A list of 60 countries. |
| `expansions` | Any of `alphabet` (keyword + a to z), `digits` (keyword + 0 to 9), `questions` (14 question words in front), `prepositions` (16 prepositions after), `prefixAlphabet` (a letter in front). Empty = only the plain keyword. |
| `maxItems` | Stop after this many delivered suggestions. 0 = no limit. |
| `onlyNew`, `stateName` | Deliver only suggestions that were not delivered to you in an earlier run with the same state name |
| `notifyUrl`, `notifyWhenEmpty` | A webhook that receives one message when the run ends; see **Automation** below |
| `requestIntervalMs` | Pause between requests, default 700 ms, minimum 500 ms |

How many requests an expansion sends for each keyword:

| Expansion | Text sent | Requests |
|---|---|---|
| none | `standing desk` | 1 |
| `alphabet` | `standing desk a` ... `standing desk z` | 26 |
| `digits` | `standing desk 0` ... `standing desk 9` | 10 |
| `questions` | `what standing desk`, `why standing desk`, `how standing desk` ... | 14 |
| `prepositions` | `standing desk for`, `standing desk with`, `standing desk near` ... | 16 |
| `prefixAlphabet` | `a standing desk` ... `z standing desk` | 26 |

Example: one keyword with the a to z expansion, 100 suggestions at most.

```json
{
  "queries": ["standing desk"],
  "language": "en",
  "country": "us",
  "expansions": ["alphabet"],
  "maxItems": 100
}
```

Example: questions and prepositions for two keywords in German, for Germany.

```json
{
  "queries": ["küche planen", "arbeitsplatte"],
  "language": "de",
  "country": "de",
  "expansions": ["questions", "prepositions"],
  "maxItems": 0
}
```

Example: a weekly check of new search phrases around a brand, with a Slack message when something new appears.

```json
{
  "queries": ["your brand", "your product category"],
  "expansions": ["alphabet", "questions"],
  "onlyNew": true,
  "stateName": "weekly-brand-watch",
  "notifyUrl": "https://hooks.slack.com/services/..."
}
```

### Output

9 fields per row. Empty values are `null`, never missing, so CSV and Excel columns are stable.

| Field | Type | Example |
|---|---|---|
| `id` | string | en|us|standing desk converter |
| `query` | string | standing desk |
| `expandedQuery` | string | standing desk c |
| `expansionType` | string | alphabet |
| `suggestion` | string | standing desk converter |
| `position` | integer | 2 |
| `language` | string | en |
| `country` | string | us |
| `scrapedAt` | string | 2026-10-22T10:21:05.310Z |

#### Example rows

Two real rows from a run (long texts shortened here, complete in the dataset):

```json
[
  {
    "id": "en|us|standing desk converter",
    "query": "standing desk",
    "expandedQuery": "standing desk",
    "expansionType": "base",
    "suggestion": "standing desk converter",
    "position": 2,
    "language": "en",
    "country": "us",
    "scrapedAt": "2026-10-22T10:10:25.794Z"
  },
  {
    "id": "en|us|how meal prep for weight loss",
    "query": "meal prep",
    "expandedQuery": "how meal prep",
    "expansionType": "question",
    "suggestion": "how meal prep for weight loss",
    "position": 4,
    "language": "en",
    "country": "us",
    "scrapedAt": "2026-10-22T10:11:02.121Z"
  }
]
```

Results can be downloaded as JSON, CSV, Excel, XML or HTML from the Dataset tab, or read through the Apify API.

`position` is the place in the list Google returned for `expandedQuery`. When a suggestion is identical to the text that was sent (Google sometimes returns the typed text itself, first in the list), it is skipped, so the first delivered row of such a keyword has position 2. Because each suggestion is delivered once, the position and the `expandedQuery` are those of the first request that returned it. `expandedQuery` is shown without the space that questions and prepositions end with.

![Input form of Google Autocomplete Suggestions Scraper – Keyword Ideas](https://api.apify.com/v2/key-value-stores/7hbQFQdGq61v2OZ2h/records/google-autocomplete-suggestions-scraper-input.png)

### Pricing

**Pay per result.** You pay for each suggestion delivered to your dataset, nothing else: no subscription, no minimum, no charge for rows your filters drop or for the requests behind them.

| Your Apify plan | Price per 1,000 rows | Price per row |
|---|---|---|
| Free plan | **$0.60** | $0.0006 |
| Starter plan | **$0.55** | $0.00055 |
| Scale plan | **$0.48** | $0.00048 |
| Business plan and above | **$0.40** | $0.0004 |

Example: 1,000 suggestions cost $0.60 on the Free plan and $0.40 on the Business plan. Platform usage of the run (compute, storage) is included in that price and is not billed to you separately (pay per event: the actor covers it).
A start event of $0.00005 is charged once per run (Apify default).
**Cap your spend:** set *Maximum total charge* in the run options. The actor stops cleanly when the cap is reached and you keep everything delivered until then. The run summary (`RUN_SUMMARY` in the key-value store) says why a run stopped.

### Automation: only new rows, notifications, schedules

**Only new rows** has a clear meaning here. The actor remembers the `id` of every suggestion it delivered to you (language, country and suggestion in lower case). The next run with the same `stateName` skips those and charges only suggestions that are new for you. The first run delivers everything it finds. Use a different `stateName` for each keyword list, language or country that you want to track separately.

**Only new rows since the last run.** Turn on `onlyNew` and the actor remembers every suggestion it delivered to you (in a key-value store named `rowcraft-google-autocomplete-suggestions-scraper-state` in your Apify account). The next run with the same `stateName` skips what you already have and you pay only for new rows. The first run delivers everything that matches. Use a different `stateName` for each schedule or search so they keep separate memories.

**Notification when the run ends.** Put a webhook address in `notifyUrl` and the actor sends one JSON POST with the number of new rows, links to the dataset (JSON and CSV) and the run. It works out of the box with Slack and Discord incoming webhooks (the message is in `text` and `content`), with Make, n8n and Zapier catch hooks, and with your own endpoint. By default it is sent only when there is at least one new row; `notifyWhenEmpty` sends it every time.

**Schedules.** Create a schedule in Apify Console (hourly, daily, weekly or cron) with `onlyNew` on. A daily schedule gives you a feed of new suggestions for the price of the new rows only.

**Integrations.** Send the results to Make, n8n, Zapier, Google Sheets, Slack, Google Drive, Airtable or any webhooks from the Integrations tab of the Actor, with no code. Apify also offers native actions for Make, n8n and Zapier.

**API, SDKs and AI agents.** Every run is available through the Apify API and the official JavaScript and Python clients; the Actor can also be called by AI agents through the Apify MCP server. The example input in the API tab is a working call.

**Use with AI agents (MCP).** Add the Apify MCP server to Claude, Cursor, VS Code or any MCP client and the agent can run this Actor as a tool:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=rowcraft/google-autocomplete-suggestions-scraper",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

**Call it from a shell or any language.** One request runs the Actor with the input below and returns the rows as JSON:

```bash
curl -X POST "https://api.apify.com/v2/acts/rowcraft~google-autocomplete-suggestions-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["standing desk"], "language": "en", "country": "us", "expansions": ["alphabet"], "maxItems": 100}'
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("rowcraft/google-autocomplete-suggestions-scraper").call(run_input={'queries': ['standing desk'], 'language': 'en', 'country': 'us', 'expansions': ['alphabet'], 'maxItems': 100})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript / Node.js** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('rowcraft/google-autocomplete-suggestions-scraper').call({"queries": ["standing desk"], "language": "en", "country": "us", "expansions": ["alphabet"], "maxItems": 100});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **Keyword research for SEO and content:** start from a seed keyword and collect hundreds of phrases people actually type, grouped by the expansion that found them.
- **FAQ sections and article outlines:** run the `questions` expansion and keep the rows whose `expansionType` is `question`; each one is a question in the words searchers use.
- **Product and category naming:** the `prepositions` expansion shows the uses and comparisons attached to a product ("for", "vs", "without"), which helps with titles and filters in a shop.
- **Market comparison:** run the same keywords for several languages and countries and compare what each market adds after the keyword.
- **Ad keyword and negative keyword lists:** the `alphabet` expansion surfaces brand names, accessories and unrelated meanings next to your keyword, useful when you build match lists.
- **Trend watching:** a schedule with **Only new rows** tells you when a new phrase starts to appear around your brand, product or topic.
- **Training data for your own tools:** a clean list of short real queries per topic and language, with no personal data.

Ready-made examples, each with the input filled in (open one and press Start, or save it as your own task):

- [Keyword ideas for three US search topics, A to Z](https://apify.com/rowcraft/google-autocomplete-suggestions-scraper/examples/seo-keyword-ideas-us)

### What this actor does not do

- Give search volumes, competition, cost per click, trends or rankings. The suggestion endpoint does not provide them, and the actor does not estimate them.
- Return search results, "People also ask" boxes, "Related searches" or any page of Google Search. Only the suggestion list is read.
- Read suggestions of YouTube, Amazon, Bing or any other service. This actor reads one endpoint, the one behind Google Search suggestions.
- Expand suggestions again. The depth is always one level: your keyword, then its expansions.
- Use proxies, solve CAPTCHAs or get around a block. When Google refuses a request, the run stops and says so.
- Look at who typed what. The endpoint returns aggregated phrases without any information about people, and so does this actor.

### Limits and fair use

- **About ten suggestions per request.** Google decides the number; the actor reports what comes back. The distinct suggestions per keyword depend on the keyword: in our test runs 11 requests of the a to z expansion gave 100 distinct suggestions for a product keyword, and 15 question requests gave 111 for a food keyword. Obscure keywords can give few or none, and then `COVERAGE` marks the keyword `empty`.
- **One request at a time, 700 ms apart by default** (minimum 500 ms), after one robots.txt request per run. A keyword with every expansion is 93 requests, about a minute and a half. 1,000 keywords with the a to z expansion are 27,000 requests, five to six hours: raise the run timeout or split the list.
- **A refusal ends the run.** If Google answers with HTTP 429, 503 or 403, with an anti-bot page, or with a redirect to its CAPTCHA page, the actor stops at once, does not retry, writes the reason into `RUN_SUMMARY` and `COVERAGE`, and marks the keywords it did not reach as `not_checked`. Suggestions delivered before the refusal stay in the dataset. Try again later, with a longer pause or with fewer expansions. Ten failed requests in a row (for example answers that are not a suggestion list) stop the run in the same way.
- **The endpoint is not a documented product.** It is the address the Google Search box uses and it answers without a key today, but it can change its answer, add limits or disappear without notice. If that happens the actor reports it; it does not look for another way in.
- **Suggestions vary.** They change with time, with language and country, and a little between two identical requests. A second run can return a phrase the first did not.
- **Keywords are cut at 200 characters** and cleaned of repeated spaces. Up to 10,000 keywords per run.
- **The run stops 60 seconds before its timeout** with the summary, the coverage and the **Only new rows** memory saved.

### Data source and licence

The data is the list of search suggestions that the Google Search box shows while a person types. The actor asks for it the way a browser does, with the `suggestqueries.google.com` suggestion endpoint, a keyword, a language (`hl`) and a country (`gl`). No key, cookie or login is used.

Before the first request the actor reads the robots.txt of that host and applies it. On 22 October 2026 the host returned "not found" for robots.txt, which means no restrictions, and the robots.txt of the main Google site had no rule for the suggestion path. The Google Terms of Service (`https://policies.google.com/terms`) forbid using automated means to access its services in violation of the machine-readable instructions on its web pages, such as robots.txt files; the actor reads and obeys those instructions on every run, and stops if they change.

The suggestions are short search phrases shaped by many people's searches. They stay subject to the terms of the service that produces them: Rowcraft claims no rights over them, and you are responsible for how you use the results under the law and the terms that apply to you.

This actor is independent and not affiliated with or endorsed by Google. Google and the names of its services are trademarks of their owner and are used only to say which suggestions the actor reads. How the suggestions are created is explained in the help page at https://support.google.com/websearch/answer/7368877.

### Privacy: no personal data

Rowcraft actors are built not to collect personal data:

- The endpoint returns aggregated search phrases, not the searches of individuals, and the actor sends no cookies, no account and no identifier of yours.
- A suggestion that contains an `@`, a run of seven or more digits, or a text that looks like an e-mail address or a phone number is dropped before it reaches the dataset, and counted in the summary as `personalLookingSkipped`.
- A phrase can still name a public figure or a business when many people search for it. The actor cannot tell a name from other words and does not try to; the rows hold the phrase, nothing about anyone who typed it.
- The keywords you give are stored only in the input and in the `query` field of your own dataset.

You are responsible for using the data in line with the law that applies to you.

### Other Rowcraft actors

Related Rowcraft actors. All of them read official or public sources, deliver flat rows without private contact details and support only-new runs and notifications; the full list is on the [Rowcraft profile](https://apify.com/rowcraft):

- [Broken Link Checker: Find 404s](https://apify.com/rowcraft/broken-link-checker) — Pay per crawled page, not per link: crawl a site within robots.txt and check every link on each page for 404s, 5xx errors, DNS and TLS failures and redirects.
- [Lighthouse Audit API: Core Web Vitals and Performance Scores](https://apify.com/rowcraft/lighthouse-performance-audit) — Run Lighthouse on any public page and get Performance, Accessibility, Best Practices and SEO scores, lab Core Web Vitals and the biggest savings.
- [Robots.txt and AI Crawler Access Checker API](https://apify.com/rowcraft/robots-ai-crawler-checker) — Check which AI and search crawlers a website lets in: GPTBot, ClaudeBot, PerplexityBot, Google-Extended and more, read from robots.txt by the RFC 9309 rules.
- [SEO Audit Tool for Any Website](https://apify.com/rowcraft/seo-audit-tool) — Audit the on-page SEO of any list of pages or websites: titles, meta descriptions, headings, canonicals, indexing, links, images and structured data, with a score and the issues found per page.
- [Sitemap URL Extractor: Every Page with Last-Modified Dates](https://apify.com/rowcraft/sitemap-url-extractor) — Get every page a site lists in its sitemaps, with last-modified dates, from robots.txt through sitemap indexes and .gz files.
- [Structured Data Extractor: JSON-LD, Schema.org, Open Graph](https://apify.com/rowcraft/structured-data-extractor) — Pull the schema.org JSON-LD, Microdata, RDFa and Open Graph of any page list into flat rows: types, product price, availability, ratings, organization, breadcrumbs, with validation issues.

### FAQ

**Is it legal to scrape Google autocomplete?** The actor reads a public suggestion endpoint without a login, after checking and obeying its robots.txt, and the Google Terms of Service forbid automated access only when it violates the machine-readable instructions of the site. We read the page of the terms on 22 October 2026 and describe it in the Data source section. This is not legal advice: whether and how you may use the phrases, for example in a commercial product, depends on the law and on the terms that apply to you.

**Does it collect personal data?** No personal data. The endpoint returns aggregated search phrases, suggestions with an `@` or a long number are dropped, and nothing about the people who typed is available or stored. See the Privacy section.

**Why is the result empty or smaller than I expected?** Open the `COVERAGE` and `RUN_SUMMARY` records. A keyword marked `empty` got no suggestions from Google, which happens with rare or misspelled keywords. `blocked` or a warning in the summary means Google refused a request and the run stopped; try again later. `robots_disallowed` means robots.txt changed. With **Only new rows** on, suggestions you already received are skipped and not charged. With **Maximum suggestions delivered** set low, the run stops as soon as the number is reached.

**Does it show search volume?** No. The suggestion endpoint returns only phrases, and this actor does not estimate volumes or competition. Combine the phrases with a volume source of your choice.

**How many suggestions do I get for one keyword?** The plain keyword gives about ten. Each expansion request adds up to ten more, and duplicates are removed: in our test runs the first 11 requests of the a to z expansion gave 100 distinct suggestions and 15 question requests gave 111. All expansions together send 93 requests per keyword. Rare keywords give far fewer, and the last requests of an expansion add fewer new phrases than the first ones.

**What do the expansion types mean?** `base` is your keyword as typed. `alphabet` adds a letter or a digit after it ("standing desk c"). `question` puts a question word in front ("how standing desk"), `preposition` adds a preposition after it ("standing desk for"), and `prefix` puts a letter in front ("c standing desk"). Google often completes an expansion into a more natural phrase, so a suggestion may not start with the text that was sent.

**Why does the same keyword give different suggestions in two countries?** Google tailors suggestions to the country (`gl`) and the language (`hl`). Set both so that the answer matches the market you are studying.

**Do I pay for duplicates or for blocked requests?** No. A suggestion that appeared in an earlier request of the same run is skipped, suggestions equal to the typed text are skipped, and failed or refused requests produce no rows. Only distinct suggestions delivered to your dataset are charged, plus the small start event.

**What happens if Google blocks the run?** The actor stops at once: no retries, no proxy, no CAPTCHA solving. You keep the suggestions already delivered and pay only for them. The summary says which request was refused and how, and `COVERAGE` lists the keywords that were not reached.

**Can I get more than ten suggestions per request?** No, the endpoint returns about ten at most. The way to get more is more requests with small changes, which is what the expansions do.

**Which languages and countries can I use?** The 39 languages and 60 countries in the lists of the input form, with the codes shown there (`hl` and `gl` of the endpoint). Choose the pair that matches the market you study.

**How do I run it every week and only pay for new phrases?** Turn on **Only new rows since the last run**, give the run a `stateName`, and create a schedule in Apify Console. A webhook in `notifyUrl` tells you when new phrases arrived.

### Support and reviews

**Problems, missing fields, questions:** open an issue on the **Issues** tab of this Actor. We answer within one working day and fix confirmed bugs in the next release; the changelog lists every change.

If this Actor saved you time, a short review on its page helps other users find it and helps us keep improving it.

# Changelog

This Actor's version history is a separate document: https://apify.com/rowcraft/google-autocomplete-suggestions-scraper/changelog.md

# Actor input Schema

## `queries` (type: `array`):

Words or phrases to get suggestions for, one per line, for example "standing desk" or "how to learn". Each keyword is sent as you type it; the expansions below add more requests per keyword. Duplicates are skipped.

## `language` (type: `string`):

The interface language of the suggestions (the hl parameter). Suggestions are written in this language when the keyword allows it.

## `country` (type: `string`):

The country the suggestions are for (the gl parameter). The same keyword gives different suggestions in different countries.

## `expansions` (type: `array`):

Each expansion sends extra requests for every keyword and returns the suggestions they bring: letters a to z after the keyword (26 requests), digits 0 to 9 (10), question words in front (14), prepositions after (16), a letter in front (26). Expansions go one level deep; suggestions are not expanded again. Leave empty for the plain suggestions of the keyword (1 request).

## `maxItems` (type: `integer`):

Stop after this many suggestions are delivered. 0 = no limit (the run ends when all requests are sent).

## `onlyNew` (type: `boolean`):

Remember the rows already delivered to you (in a key-value store in your Apify account) and deliver only rows that appeared since the last run with the same state key. The first run delivers everything that matches; later runs cost only the new rows. Ideal for schedules.

## `stateName` (type: `string`):

Name of the memory used by "Only new rows". Use a different name for each schedule or search (for example `stockholm-python`) so they do not share one memory.

## `notifyUrl` (type: `string`):

A webhook address that receives one JSON POST with the number of new rows and links to the dataset: a Slack or Discord incoming webhook, a Make, n8n or Zapier catch hook, or your own endpoint. The message is also in the `text` (Slack) and `content` (Discord) fields.

## `notifyWhenEmpty` (type: `boolean`):

By default the notification is sent only when at least one row was delivered.

## `requestIntervalMs` (type: `integer`):

Default 700 ms. One request at a time. Minimum 500. Raise it if you run long expansions and want an even gentler pace.

## Actor input object example

```json
{
  "queries": [
    "standing desk"
  ],
  "language": "en",
  "country": "us",
  "expansions": [
    "alphabet"
  ],
  "maxItems": 500,
  "onlyNew": false,
  "stateName": "default",
  "notifyWhenEmpty": false,
  "requestIntervalMs": 700
}
```

# Actor output Schema

## `results` (type: `string`):

All delivered rows in the default dataset (JSON, CSV, Excel and other formats via the dataset API).

## `runSummary` (type: `string`):

Counts, warnings and why the run stopped (RUN_SUMMARY record in the default key-value store).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "standing desk"
    ],
    "expansions": [
        "alphabet"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rowcraft/google-autocomplete-suggestions-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["standing desk"],
    "expansions": ["alphabet"],
}

# Run the Actor and wait for it to finish
run = client.actor("rowcraft/google-autocomplete-suggestions-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "standing desk"
  ],
  "expansions": [
    "alphabet"
  ]
}' |
apify call rowcraft/google-autocomplete-suggestions-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rowcraft/google-autocomplete-suggestions-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/B7uFTaJeMrmbCgujw/builds/BgrzELcVatpgXe2fd/openapi.json
