Keyword Suggest API - Google, YouTube, Bing, DDG Autocomplete
Pricing
from $1.00 / 1,000 keyword expansions
Keyword Suggest API - Google, YouTube, Bing, DDG Autocomplete
Autocomplete keyword suggestions from Google, YouTube, Bing, and DuckDuckGo in one call. A-Z/0-9 and recursive expansion, locale targeting, parent-child keyword tree. No API key, no browser.
Pricing
from $1.00 / 1,000 keyword expansions
Rating
0.0
(0)
Developer
Heim AI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Keyword Suggest API — Google, YouTube, Bing, DuckDuckGo Autocomplete
Seed keywords in → autocomplete suggestions out. Expand one or more keywords into normalized suggestion lists from Google, YouTube, Bing, and DuckDuckGo autocomplete APIs in a single run. Optional a–z / 0–9 suffix expansion and recursive depth-limited re-expansion with parent-child lineage. No API key, no browser.
| Actor id | kaz_kakyo/keyword-suggest-api |
| Minimal input | { "keywords": ["best crm"] } |
| Cost | $0.005 per run start + $0.001 per keyword×source expansion that returns suggestions |
| Output | Dataset rows with type: "expansion" (plus free error / notice / source_degraded rows) |
What it does
This actor is a keyword suggestions / autocomplete API wrapper: it calls the public suggest endpoints for Google, YouTube, Bing, and DuckDuckGo, normalizes the results, and writes one dataset row per (query × source) expansion. Use it for SEO keyword research, content ideation, PPC expansion, and agent-driven keyword discovery pipelines.
Output
type | Charged? | Meaning |
|---|---|---|
expansion | Yes, if suggestionCount > 0 | Successful autocomplete fetch |
error | No | Bad input, fetch failure, or unknown source |
notice | No | Cap or billing stop (max_expansions_reached, keywords_capped, charge_limit_reached, billing_state_unknown, queue_limit_reached, run_interrupted) |
source_degraded | No | Source stopped after 5 consecutive hard failures |
Success shape:
{"type": "expansion","query": "best crm a","seedKeyword": "best crm","parentKeyword": "best crm","variant": "a","depth": 1,"source": "google","language": "en","country": "us","suggestions": ["best crm apps", "best crm software"],"suggestionCount": 2,"fetchedAt": "2026-08-01T00:00:00.000Z"}
Empty-result expansions (suggestionCount: 0), errors, notices, and degraded-source rows are never billed.
Input
| Field | Default | Description |
|---|---|---|
keywords | (required) | Seed keywords (stringList) |
sources | all four | google, youtube, bing, duckduckgo |
language | en | ISO 639-1 (2 letters) |
country | us | ISO 3166-1 alpha-2 (2 letters) |
expandAlphabet | false | Also fetch {seed} a … {seed} z |
expandNumbers | false | Also fetch {seed} 0 … {seed} 9 |
maxDepth | 1 | Recurse into suggestions on the same source (max 3) |
maxExpansions | 200 | Global fetch cap (max 5000) |
Two validation layers. The input schema rejects malformed input before a run starts — HTTP 400 from the API, Console, a task or MCP, with no run created and nothing charged. That covers non-string keywords items, sources values outside the four names, and language/country values that are not exactly 2 letters; on the platform these never reach the actor, so they never appear as dataset rows. Input that passes the schema but is still unusable (empty keywords, keywords over 200 characters, more than 100 seeds) becomes uncharged type: "error" or type: "notice" rows and the run still SUCCEEDS. The runtime keeps its own copy of the schema checks purely as a defensive fallback for unvalidated local invocation (node src/main.js), where the same problems produce those uncharged rows instead of a 400.
Pricing
| Event | Price |
|---|---|
Run start (apify-actor-start) | $0.005 |
Expansion with ≥1 suggestion (expansion) | $0.001 per keyword×source expansion that returns suggestions |
Worked examples (totals assume nonempty results):
- 1 seed × 4 sources → 4 expansions ≈ $0.009 ($0.005 + 4×$0.001)
- 1 seed × Google only, a–z on → 27 expansions ≈ $0.032 ($0.005 + 27×$0.001)
- Empty results, errors, notices, and degraded rows are free
Cap spend with maxTotalChargeUsd on the run. When the charge budget is exhausted (including a budget too small for the run-start fee), remaining work stops and a charge_limit_reached notice is written. If the actor cannot read its own billing state at run time, it stops instead of delivering unbilled data and writes a billing_state_unknown notice (fail-closed).
Quick start (Console)
- Open the actor in Apify Console.
- Leave the prefill
keywords: ["best crm"](or add your seeds). - Click Start. Expect four
expansionrows (one per source) withsuggestionCount > 0.
API
curl -X POST \"https://api.apify.com/v2/acts/kaz_kakyo~keyword-suggest-api/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords":["best crm"],"sources":["google","bing"],"language":"en","country":"us"}'
Or with apify-client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('kaz_kakyo/keyword-suggest-api').call({ keywords: ['best crm'], maxDepth: 1 },{ maxTotalChargeUsd: 1.0 },);const { items } = await client.dataset(run.defaultDatasetId).listItems();const expansions = items.filter((i) => i.type === 'expansion');
MCP / agents
Callable via the Apify MCP server. Pass keywords (and optional sources, locale, expansion flags). Filter dataset items on type === "expansion". Input that violates the schema (unknown source, non-string keyword items, locale not exactly 2 letters) is rejected with HTTP 400 before a run is created — no dataset, no charge. Input that passes the schema but is unusable (empty keywords, oversize keywords) produces uncharged error rows without failing the run.
Scheduling
Use Apify Schedules (or a saved Task + schedule) for recurring keyword monitoring — e.g. daily expansion of a seed list to detect new autocomplete phrases. Attach a webhook on SUCCEEDED and process only expansion rows.
Locales
language and country are validated for format only (exactly 2 letters). Unassigned codes (e.g. zz) are passed through; endpoints fall back server-side (best-effort). Values are forwarded per source (hl/gl for Google/YouTube, market for Bing, kl for DuckDuckGo). DuckDuckGo region mapping: kl is {country}-{language} with gb remapped to uk.
Limits (honest)
- Endpoints are unofficial public autocomplete APIs — they may change or rate-limit without notice.
- This actor does not return search-volume, CPC, or competition data — suggestions only.
- Suggestion lists vary by locale and time.
- Recursion re-expands on the same source only (a Google suggestion is not re-queried on Bing).
- Suffix expansion is Latin a–z and digits 0–9 only.
- Typical response size is about 8–14 suggestions per call.
- Queue is hard-bounded at 20,000 jobs; seeds are capped at 100 per run (excess →
keywords_cappednotice). - Default run timeout is 3600s.
maxExpansions: 5000on a single source can take ~35–40 minutes (per-source throttling ~150–350ms + network). - The actor collects no personal data of its own: rows contain only your input keywords, query variants derived from them, and the public autocomplete strings the engines return. Output echoes whatever you supply as
keywords(inquery,seedKeyword,parentKeyword) — do not submit personal data (names, emails, phone numbers) as seed keywords if your dataset must stay PII-free. Your keywords are sent to the public suggest endpoints (Google, YouTube, Bing, DuckDuckGo) as queries.