Keyword Search Volume & Ideas: Google Ads Data, Pay per Keyword
Pricing
from $2.00 / 1,000 keyword with data
Keyword Search Volume & Ideas: Google Ads Data, Pay per Keyword
Google Ads search volume, CPC, competition and 12-month trend for up to 10,000 keywords, plus keyword ideas from seeds or a URL, for any country and language. $0.002 per keyword with data + $0.12 per 1,000-keyword batch; empty results are free.
Pricing
from $2.00 / 1,000 keyword with data
Rating
0.0
(0)
Developer
Stubborn Otter Software
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
Get Google Ads Keyword Planner metrics for up to 10,000 keywords per run, for any country and language: average monthly searches, CPC, competition (LOW / MEDIUM / HIGH and 0–100), top-of-page bid range, the 12-month trend and the month-by-month breakdown. Or expand a few seed keywords, or a website, into related keyword ideas with the same metrics.
You don't need a Google Ads account, a developer token or OAuth. You pay only for keywords that come back with data.
What it costs
| Event | Price | When |
|---|---|---|
| Keyword with data | $0.002 | each keyword that comes back with a search volume |
| Batch | $0.12 | each batch of up to 1,000 keywords sent to the data provider, and only when the batch returns at least one keyword with data |
| Actor start | $0.0003 | once per run |
Worked examples (metrics mode, every keyword has data):
| Keywords | Batches | Total |
|---|---|---|
| 5 | 1 | $0.13 |
| 50 | 1 | $0.22 |
| 1,000 | 1 | $2.12 |
| 2,500 | 3 | $5.36 |
Free of charge:
- keywords Google reports no volume for;
- keywords rejected before sending (too long, or containing emoji);
- duplicates;
- batches that failed;
- keywords skipped because of your cost limit.
Rerunning a list: a keyword you checked in the last 7 days comes from your cache. It costs $0.002 and needs no batch fee.
Your cost limit: set a maximum cost per run and the Actor plans the run to fit it before sending anything. With a $0.25 limit, for example, it checks the first 64 keywords and lists the rest as skipped_budget. Below about $0.13 nothing fits, because one batch plus one keyword costs $0.1223.
With your own DataForSEO login, the batch fee disappears: DataForSEO bills you directly, about $0.09 per batch. You pay this Actor only $0.002 per keyword with data.
Modes
- Metrics for my keywords (
metrics): exactly the keywords you list, in your order. Up to 10,000 per run, sent in batches of 1,000. - Keyword ideas from seed keywords (
ideas): up to 20 seeds, expanded into related keywords. Max ideas (default 100) and Sort ideas by control which ideas you keep, and you pay only for those. - Keyword ideas from a website or page (
ideasFromUrl): the keywords Google Ads associates with a domain (site) or with one URL (page).
Input example
{"mode": "metrics","keywords": ["web scraping", "google sheets api", "keyword research tool"],"location": "United States","language": "English"}
Location accepts any of these, and a typo lists the closest matches:
- a country name or ISO code (
Germany,DE,DEU); - a DataForSEO location code for a region or city (
1023191= New York); worldwide.
Language accepts a name or code (German, de), or any.
Output
One row per keyword (table view Keywords; full JSON in the dataset):
{"keyword": "web scraping", "status": "ok", "search_volume": 33100, "cpc": 3.12,"competition": "LOW", "competition_index": 24, "low_top_of_page_bid": 1.04, "high_top_of_page_bid": 5.9,"trend_12m_pct": 18.4,"monthly_searches": [{"year": 2026, "month": 9, "search_volume": 40500}, "… 12 months, newest first"],"spell": null, "location": "United States", "location_code": 2840, "language": "English","language_code": "en", "search_partners": false, "mode": "metrics", "seed": null,"source": "dataforseo_google_ads", "cached_at": null, "charged": true, "reason": null}
status:ok: has data, charged.no_data: Google reports no volume; free.rejected: not sent, with the reason; free.skipped_budget: over your cost limit; free.skipped_cap: over the run's batch limit; free.failed: the data provider failed after retries, with the reason; free.
trend_12m_pct: the change from the average of the oldest 3 months to the average of the newest 3 months in the 12-month window.spell: Google's spelling correction, when it measured a corrected form of your keyword.cached_at: set when the row came from your 7-day cache.reason: says why a row has no data or wasn't charged.
The run summary is in the OUTPUT record of the run's key-value store:
- keywords in, valid, rejected (with reasons), and duplicates removed;
- rows with data, and rows from cache;
- batches sent, and charged events;
- the location and language as resolved.
To also add the summary as the last dataset row, turn on Add a summary row.
Keyword rules
Google Ads accepts at most 80 characters and 10 words per keyword, with no emoji and no symbols such as ! @ % * ? , | ; ~ < > = ( ) { } [ ]. The Actor checks every keyword before sending. A keyword that breaks a rule gets a rejected row with the reason, and the rest of the run continues. Case and extra spaces don't matter: SEO Tools and seo tools count as one keyword. Match-type wrappers ("…" and […]) are removed.
Data source and freshness
- Source: Google Ads keyword data from the DataForSEO Keywords Data API (Google Ads endpoints). This is the same data Google Ads Keyword Planner shows.
- Freshness: Google publishes search volumes once a month, around mid-month. Each row covers the latest 12 months Google has published; the current month is never included. A 7-day cache therefore doesn't make results stale.
- How Google reports volumes:
- Volumes are averages, and Google rounds them into buckets (10, 20, 30, 40, 50, 70, 90, 110, 140, 170, 210, 260, 320, 390, 480, 590, 720, 880, 1,000, 1,300, …).
- Google combines close variants into one figure, so
web scrapingandwebscrapingmay show the same number. - Google gives no data for very rare keywords, or for restricted topics (weapons, tobacco, drugs and similar). Those rows are
no_dataand free.
Free Apify plans
Free Apify plans need their own DataForSEO API login and password, entered under Your own DataForSEO account. New DataForSEO accounts get a small trial credit. On free plans each batch is paid by the user's own DataForSEO balance; without your own login, the run stops before anything is sent. Paid Apify plans can use either. The example input (the three prefilled keywords) runs on any plan, so you can see the output first.
Errors are plain English
Every DataForSEO status code is translated into one sentence that says what to do. For example:
- "The DataForSEO balance is too low for this request. Top up at app.dataforseo.com."
- "Contains '🙂', which Google Ads doesn't accept in keywords."
Temporary errors (timeouts, rate limits, server errors) are retried up to 4 times. If a whole run returns no data at all, it fails with the reason, instead of succeeding with an empty table, and nothing is charged.
Limits
| Keywords per run (metrics) | 10,000 (10 batches) |
| Seed keywords (ideas) | 20 |
| Ideas kept per run | 1–10,000 (Max ideas) |
| Speed | about 6–10 seconds per batch. The data provider allows 12 requests per minute per account, so a run with 10 batches takes 1–2 minutes |
| Memory | 256 MB is enough for 10,000 keywords |
Use it from code, Make, n8n or an AI agent
Call it through the Apify API like any Actor, for example POST https://api.apify.com/v2/acts/stubborn_otter~keyword-search-volume/run-sync-get-dataset-items?token=… with the input above. Through Apify's MCP server, AI agents can call it as a tool ("get search volumes for these keywords").
Privacy
- Where your keywords go: only to DataForSEO, which fetches the Google Ads data.
- The cache: it is a key-value store named
keyword-metrics-cachein your own Apify account, so other users never see your keywords or results. Delete that store to clear it. - Your DataForSEO login: it is an encrypted secret input. It is used only for that run's requests.
Made by Stubborn Otter Software. Questions or a keyword that looks wrong? Open an issue on the Actor's Issues tab, with the run link.