Keyword Suggest API - Google, YouTube, Bing, DDG Autocomplete avatar

Keyword Suggest API - Google, YouTube, Bing, DDG Autocomplete

Pricing

from $1.00 / 1,000 keyword expansions

Go to Apify Store
Keyword Suggest API - Google, YouTube, Bing, DDG Autocomplete

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

Heim AI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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 idkaz_kakyo/keyword-suggest-api
Minimal input{ "keywords": ["best crm"] }
Cost$0.005 per run start + $0.001 per keyword×source expansion that returns suggestions
OutputDataset 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

typeCharged?Meaning
expansionYes, if suggestionCount > 0Successful autocomplete fetch
errorNoBad input, fetch failure, or unknown source
noticeNoCap or billing stop (max_expansions_reached, keywords_capped, charge_limit_reached, billing_state_unknown, queue_limit_reached, run_interrupted)
source_degradedNoSource 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

FieldDefaultDescription
keywords(required)Seed keywords (stringList)
sourcesall fourgoogle, youtube, bing, duckduckgo
languageenISO 639-1 (2 letters)
countryusISO 3166-1 alpha-2 (2 letters)
expandAlphabetfalseAlso fetch {seed} a{seed} z
expandNumbersfalseAlso fetch {seed} 0{seed} 9
maxDepth1Recurse into suggestions on the same source (max 3)
maxExpansions200Global 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

EventPrice
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)

  1. Open the actor in Apify Console.
  2. Leave the prefill keywords: ["best crm"] (or add your seeds).
  3. Click Start. Expect four expansion rows (one per source) with suggestionCount > 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_capped notice).
  • Default run timeout is 3600s. maxExpansions: 5000 on 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 (in query, 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.