A keyword we got no answer for is no longer reported as a keyword with no volume.
- A keyword missing from an otherwise successful lookup is now a temporary, retryable row. A volume lookup can succeed and still come back short — truncated, or listing a phrase in a slightly different form. Every keyword it did not carry used to be reported as "too rare to report or grouped under a similar phrase", which is a verdict about your keyword and reads as final. Such a keyword now says the source was unavailable for it and asks you to re-run, and it is listed in the run's errors so a short lookup is visible instead of passing for a list of rare keywords. A keyword the lookup did answer for, with no volume, keeps the "too rare to report" wording exactly as before. Neither kind of row has ever carried a made-up zero, and neither is charged.
A typo in an input field name now gets a helpful pointer instead of sample rows.
- A misspelled or unrecognised input field is named back to you. Apify ignores any field
an actor does not declare, so an input like
{"keyword": [...]} used to look exactly like an
empty run and came back with uncharged US sample rows — reading as if the typo had worked.
Now the run returns one uncharged row that names the field it did not recognise, names
keywords (or keywordsText) as the field you meant, and shows the shape. Sending only
settings — a country, a limit — with no keywords gets the same pointer. A run that does carry
keywords is unchanged, unknown field beside it or not, and a genuinely empty run still returns
the sample rows.
- A country or language we cannot look up is now always reported. If you sent an
unrecognised market and no keywords, that run used to return sample rows and never mention it;
it now returns the uncharged row naming the value it could not read, with valid examples.
Large runs finish faster — same rows, same prices.
- Results are now written to your dataset a page at a time instead of one row at a time,
and each page is billed in one step. A run of a few thousand keywords spends its time on
lookups now, not on bookkeeping. Nothing about the output changed: same rows, same
fields, same order, same prices, and interrupted or moved runs still resume without
repeating or double-charging anything.
Review-fix build: the time limit you set bounds the run, not each server the run lives on.
maxRunSeconds is measured from the moment your run started. Apify can move a run
to another server mid-flight; until now the new server started the clock again from zero,
so a run you capped at ten minutes could keep working for ten more after every move. The
cap now covers the whole run, however many times it is moved, and the run still stops
cleanly with a summary row and a resume cursor.
Keyword search volume, CPC, competition and 12-month trend direction for any keyword list,
in any country and language Google Ads reports on.
- Paste keywords as a list or as one block of text; duplicates and case or spacing variants
are charged once. The same rule now holds across the whole run: in
ideas or both mode,
a suggestion repeating a keyword already delivered — including your own seed handed back
as one of its ideas — is skipped, never charged a second time, and counted in the run
message.
- A run that is moved to another server, or that you resurrect from the console, picks up
exactly where it stopped. Every row carries a hidden delivery key, so a resumed run
never repeats a row you already have, never looks a keyword up twice, and never charges
twice for it. If the first attempt delivered a row without billing it, the resumed run
settles that one charge and nothing more.
maxItems is now a cap on the run, not on the attempt: a run that is moved mid-way
can no longer deliver more rows than the limit you set.
mode picks metrics for your own keywords, keyword ideas expanded from them, or both.
Every idea row names the keyword it came from.
- Real Google Ads Keyword Planner figures through a licensed data provider —
isEstimated
is false on every row and you never supply a Google Ads login.
- 30-day cache: Google refreshes these volumes monthly, so a repeat lookup inside that
window is served instantly from the same figures, marked
servedFromCache.
- Keywords with no data, keywords Google Ads will not accept, rate limits and source
outages all ship as uncharged rows with a reason — the run still succeeds. A figure that
arrives unusable counts as no data on the same terms, so it can never be billed as a
result with an empty search volume.
maxItems, maxIdeasPerSeed, maxIdeaSeeds and maxRunSeconds are hard limits that
stop the run cleanly and report what is left.
- Running with no input returns uncharged sample rows showing the exact output shape.