What it does
Autocomplete is one of the most direct signals of what people search for: every suggestion is a query real users type. Collecting it by hand means typing a seed, then the seed plus each letter of the alphabet, in every search engine you care about. The Keyword Suggestions actor does that in bulk.
Give it seed keywords and pick engines: Google, YouTube, Bing and Baidu. With a-z expansion (the default) each seed is also sent as "seed a" to "seed z", which usually returns a few hundred unique long-tail keywords per seed and engine. questions expansion adds who, what, why, how, can, is and similar words in front of the seed; prepositions adds for, with, vs, near and others after it. Results are deduplicated across the expansion.
You get one row per seed and engine with each suggestion's text, position and the exact query that produced it, or a flat row per keyword for spreadsheets. It costs $0.30 per 1,000 seeds per engine without expansion and $1 per 1,000 with expansion, billed per seed and engine rather than per keyword. Empty and rate-limited rows are free.
How it works
- You provide
seeds, chooseenginesand anexpansionmode, and setcountryandlanguagefor the market. - Each seed is expanded into its query set (1 request with none, 27 with a-z, 14 with questions, 13 with prepositions) and sent to each engine's public suggest endpoint.
- Requests are paced politely: at most 2 in flight and at least 350 ms apart per host, with back-off on HTTP 429.
- Suggestions are deduplicated per seed and engine (case- and whitespace-insensitive) and capped at
maxSuggestionsPerSeed. - Each complete seed and engine row is charged once; rows with no suggestions, partial failures or rate limits are free.
Input example
A typical run input (JSON). Every field is also available as a form in the Apify console.
{
"seeds": [
"coffee maker",
"running shoes"
],
"engines": [
"google",
"youtube",
"bing"
],
"expansion": "a-z",
"country": "us",
"language": "en",
"dedupe": true,
"outputMode": "grouped"
}All input fields
| Field | Type | Required | Default | What it does |
|---|---|---|---|---|
seeds | array | yes | Keywords to get suggestions for, e.g. coffee maker. Each seed is sent to every selected engine. Duplicates (case-insensitive) are removed. | |
engines | array | no | ["google", "youtube", "bing"] | Autocomplete sources. google and youtube use Google's public suggest endpoint (suggestqueries.google.com; youtube = YouTube search suggestions). bing uses Bing's OpenSearch suggestion feed. baidu uses Baidu's suggest… |
expansion | string | no | "a-z" | How each seed is expanded. none: the seed only (1 request, about 10 suggestions; $0.0003 per seed x engine). a-z: the seed plus 'seed a' … 'seed z' (27 requests, up to ~270 long-tail suggestions). questions… |
country | string | no | "us" | Two-letter country code (us, gb, de, fr, in …). Sent to Google/YouTube as gl and to Bing as the market (language-COUNTRY, e.g. en-US). |
language | string | no | "en" | Two-letter language code (en, de, fr, es …). Sent to Google/YouTube as hl and to Bing as part of the market. |
maxSuggestionsPerSeed | integer | no | 500 | Cap on the suggestions kept in one seed x engine row (after dedupe). Same price whatever the cap. |
dedupe | boolean | no | true | Drop a suggestion already returned by an earlier expansion query for the same seed and engine (case- and whitespace-insensitive; first occurrence wins). |
outputMode | string | no | "grouped" | grouped: one row per seed x engine with suggestions[] (text, position, query, modifier) and count. flat: one row per suggestion, ready for a spreadsheet. Billing is the same in both modes: per seed x engine, never per… |
Output example
In the sample each row is one seed on one engine, with the suggestion count and the keywords found by the a-z expansion.
| seed | engine | country | expansion | count | keywords |
|---|---|---|---|---|---|
| coffee maker | us | a-z | 263 | coffee maker, coffee maker with grinder, coffee maker walmart, … coffee maker zojirushi review | |
| coffee maker | youtube | us | a-z | 254 | coffee maker, coffee maker machine, coffee maker review, … zojirushi coffee maker cleaning |
| coffee maker | bing | us | a-z | 349 | coffee maker, coffee makers on sale, coffee maker with grinder, … coffee maker zojirushi |
| running shoes | us | a-z | 250 | running shoes, running shoes for women, running shoes for men, … running shoes zurich |
Pricing
Pay per event: you are charged only for the results you receive, with no subscription. Set a maximum total charge on any run and it stops cleanly at the cap.
| Charged for | When | Price | Per 1,000 | Worked example |
|---|---|---|---|---|
| Seed expanded | Charged per seed x engine row with suggestions, expansion none (1 request) | $0.0003 | $0.30 | 1,000 seeds on Google = $0.30; on Google + YouTube + Bing = $0.90 |
| Seed expanded full | Charged per seed x engine row with suggestions, expansion a-z (27 requests), questions (14) or prepositions (13) | $0.001 | $1 | 100 seeds with a-z on Google + YouTube + Bing = $0.30 for ~75,000 keywords |
| Actor Start (platform start fee) | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.00005 | — | One run at 128 MB = $0.00000625 |
Prices are read from the live Apify Store listing when this page is built. The listing is always authoritative.
Try Keyword Suggestions on Apify. Pay only for the results you get.
Run on Apify →Use cases
Long-tail keyword research
Expand a list of head terms with a-z to see the specific variants people search, such as brands, sizes and use cases, then group them into content topics.
FAQ and blog topic ideas
Use questions expansion to collect how, why and can questions around a topic. They map well to FAQ sections and article headings.
YouTube titles and tags
Select the youtube engine to see what viewers type into YouTube search, which often differs from web search, and use it when writing video titles and tags.
Comparison and buying intent
prepositions expansion surfaces queries like "seed vs", "seed for" and "seed near", which point to comparison pages and local or purchase intent. Check rising terms with Google Trends.
How it compares
| ActorForge Keyword Suggestions | Typing into search boxes manually | Paid keyword research suites | |
|---|---|---|---|
| Bulk seeds and engines in one run | Yes | No | Yes |
| Google, YouTube, Bing and Baidu | Yes | Yes, one at a time | Varies |
| Search volume | No, suggestions only | No | Usually yes |
| Keyword difficulty and CPC | No | No | Usually yes |
| Country and language targeting | Yes | Partial | Yes |
| Cost | $0.30-$1 per 1,000 seeds per engine | Free, but slow | Subscription |
Autocomplete tells you what people type, not how often. If you need search volumes, difficulty or CPC, a paid keyword suite is the right tool; this actor is a cheap way to generate the candidate list to feed into one.
Limits and honest notes
- Sources: Google and YouTube suggestions come from Google's public suggest endpoint (suggestqueries.google.com, which has no robots.txt), Bing from its OpenSearch suggestion feed (api.bing.com/osjson.aspx, not disallowed by robots), Baidu from suggestion.baidu.com. Re-checked 2026-10-20.
- Not included, on purpose: Amazon, DuckDuckGo and Naver (their robots.txt disallows it), eBay (robots plus an explicit ban on automated access), Yahoo (its terms ban automated access without permission) and Yandex (its search terms ban automated requests outside its paid API).
- Polite by design: an honest user agent (ActorForge-KeywordSuggestions/1.0), at most 2 requests in flight and at least 350 ms between requests per host, no proxies and no proxy rotation. So an a-z seed takes about 10 seconds per engine; Google and YouTube share one host, Bing and Baidu run in parallel with it.
- Rate limits: on HTTP 429 (or Google's "sorry" page) the actor waits 5 s, then 20 s. If the host keeps answering 429, or answers 401/403 even once, that engine is stopped for the rest of the run and its remaining rows come back as status rate-limited, free. Google can rate-limit shared cloud IPs; just re-run later.
- Billing is per seed x engine, never per keyword: flat mode (one row per suggestion) costs exactly the same as grouped mode. Only complete rows with at least one suggestion (status ok) are charged; no-suggestions, partial (some queries failed), rate-limited and error rows are free.
- Suggestions are what each engine shows for that query, country and language at run time. They are not search volumes. Google partly localises by the requester's IP as well as gl, so a few results can reflect the data-centre location.
- Each response has up to about 10 suggestions (Bing up to ~20, Baidu ~10, often fewer for long-tail or non-Chinese seeds). Dedupe (on by default) keeps the first occurrence across the expansion; maxSuggestionsPerSeed caps a row.
- The run's spend limit is respected: each seed x engine is reserved before its requests start and charged before its row is saved, and the run stops cleanly at the cap.
FAQ
How do I scrape Google autocomplete suggestions in bulk?
Put your keywords in seeds, keep google in engines and choose an expansion. With a-z, each seed sends 27 queries and the suggestions are deduplicated into one row per seed. Suggestions come from Google's public suggest endpoint.
Does it give search volume?
No. Suggestions are what each engine shows for that query, country and language at run time. They indicate what people type but are not search volumes.
Why is flat mode not more expensive?
Billing is per seed and engine, never per keyword. Flat mode (one row per suggestion) costs exactly the same as grouped mode: $0.0003 per seed and engine without expansion, $0.001 with a-z, questions or prepositions.
Why don't you support Amazon or DuckDuckGo suggestions?
They are left out on purpose: Amazon, DuckDuckGo and Naver disallow it in robots.txt, eBay bans automated access, and Yahoo and Yandex restrict it in their terms.
What happens if Google rate-limits the run?
The actor waits 5 seconds, then 20. If the engine keeps answering 429, or answers 401/403 once, that engine stops for the rest of the run and its remaining rows come back as rate-limited, free. Re-run later to fill them in.
Use it from code
Run the actor through the Apify API with the input above.
cURL
curl -X POST "https://api.apify.com/v2/acts/actor-forge~keyword-suggestions/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"seeds": ["coffee maker", "running shoes"], "engines": ["google", "youtube", "bing"], "expansion": "a-z", "country": "us", "language": "en", "dedupe": true, "outputMode": "grouped"}'JavaScript (Node.js)
// Node.js 18+ (built-in fetch). Set APIFY_TOKEN in your environment.
const input = {
"seeds": [
"coffee maker",
"running shoes"
],
"engines": [
"google",
"youtube",
"bing"
],
"expansion": "a-z",
"country": "us",
"language": "en",
"dedupe": true,
"outputMode": "grouped"
};
const res = await fetch(
"https://api.apify.com/v2/acts/actor-forge~keyword-suggestions/run-sync-get-dataset-items",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify(input),
}
);
const items = await res.json();
console.log(items.length, items[0]);Python
# pip install apify-client (set APIFY_TOKEN in your environment)
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"seeds": [
"coffee maker",
"running shoes"
],
"engines": [
"google",
"youtube",
"bing"
],
"expansion": "a-z",
"country": "us",
"language": "en",
"dedupe": True,
"outputMode": "grouped"
}
run = client.actor("actor-forge/keyword-suggestions").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)The run-sync-get-dataset-items endpoint waits for the run (up to 5 minutes) and returns the dataset rows directly. For longer runs, start the run asynchronously and read the dataset when it finishes, as the Python example does. Replace APIFY_TOKEN with your own token from the Apify console.
Related actors
Google Trends Scraper — Trending Now & Interest Over Time
Google Trends scraper and API: Trending Now searches for 125 countries from the official feed (traffic, start time, picture, news articles), plus…
$0.50 per 1,000 · trend resultSEO Audit Crawler — On-Page SEO Checker for Whole Sites
Crawl a whole website and audit every page for technical and on-page SEO: titles, meta descriptions, H1s, canonicals, noindex, duplicates, broken…
$6 per 1,000 · page auditedGoogle Ads Transparency Scraper — Competitor Ads | $0.60/1K
Scrape competitor ads from the Google Ads Transparency Center by domain, advertiser name or ID: format, first/last shown, regions, impressions, ad…
$0.60 per 1,000 · ad resultYouTube Search Scraper (Official API) — Videos by Keyword
Bring your own free YouTube API key. YouTube search by keyword with sort, date, region, language and length filters — every result enriched with…
$0.30 per 1,000 · video resultTry Keyword Suggestions on Apify. Pay only for the results you get.
Run on Apify →