Keyword Metrics — Google + Bing Volume, CPC & Difficulty
Pricing
from $0.50 / google keyword batch
Keyword Metrics — Google + Bing Volume, CPC & Difficulty
Bulk keyword research: Google + Bing search volume, CPC, competition, top-of-page bids, keyword difficulty and search intent, with ~93 months of history. 1000 keywords in one run at one flat price, or expand 20 seeds into 20,000 ideas. 111 countries, 46 languages.
Pricing
from $0.50 / google keyword batch
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
10 minutes ago
Last modified
Categories
Share

Bulk keyword research that returns Google Ads and Microsoft/Bing Ads metrics side by side on the same row: average monthly search volume, CPC, competition, top-of-page bid ranges, keyword difficulty, search intent, and up to ~7 years of monthly history, plus a computed trend flag and month-over-month change.
Three modes: measure up to 1000 keywords you already have, expand 20 seeds into thousands of related keywords, or take a competitor's domain and get every keyword it ranks for. 111 countries, 46 languages, one flat price per batch.
Why this one
Search-volume actors bill in ways that punish you for using them properly. This one does not.
| This actor | Typical competitor | |
|---|---|---|
| 1000 keywords, Google + Bing | $0.95 | $2.70 |
| 1000 keywords, Google only | $0.55 | $1.00 – $5.02 |
| Cost of 10 keywords vs 1000 | Identical | Often per-keyword |
| Keyword ideas from a seed | Up to 20,000, one fee | Capped, or a separate actor |
| Competitor's ranked keywords | ✅ same actor | Usually a separate purchase |
| Countries | 111 | 14 – 53 |
| Monthly history | ~93 months | 12 |
| Keyword difficulty | ✅ | rarely |
| Search intent | ✅ | rarely |
| Languages | 46 | 9 – 47 |
| Free-plan keyword cap | None | 200 |
| Free-plan engine restriction | None | Google only |
The upstream API bills per batch, not per keyword, so a run of 1000 keywords costs exactly what a run of 1 costs. This actor passes that structure through instead of inventing per-keyword or per-chunk fees on top of it. Send your whole keyword list — splitting it up only costs you more.
The same holds in ideas mode: one expansion can return up to 20,000 keywords for a single fee, so maxIdeas trims your dataset, never your bill.
Bing coverage, stated plainly: Microsoft sells keyword data in six countries — US, UK, Canada, Australia, Germany, France — and three languages (English, French, German). That is Microsoft's limit, not this actor's. Anywhere else the row still arrives with a
bing_statustelling you why, and the Bing batch is never charged. Google covers all 111.
How it works

Your keywords are deduplicated and normalised, checked against the 24h cache, and screened for engine coverage and your own charge limit — all before anything is billed. Then one batch call per engine, one row per keyword, and the dataset is yours.
Three modes
metrics — you have the keywords, you want the numbers. Up to 1000 per run, Google and Bing side by side.
ideas — you have a topic, you want the keywords. Up to 20 seeds in, related keywords out, each carrying the same volume/CPC/competition/history. Google-only: Microsoft has no keyword-expansion endpoint.
{ "mode": "ideas", "keywords": ["wireless headphones"], "maxIdeas": 500, "minVolume": 100, "sortBy": "search_volume" }
competitors — you have a rival, you want their keywords. Give it a domain and it returns every term that site ranks for in Google organic, highest traffic value first, with position, the URL holding it, estimated monthly traffic and what that traffic would cost to buy through Ads.
{ "mode": "competitors", "domain": "ahrefs.com", "country": "us", "maxDomainKeywords": 500 }
Competitors mode is the one mode billed per row, not per batch. Ranked keywords cost us per result, so
maxDomainKeywordsgenuinely changes your bill here — unlikemaxIdeas, which does not. Rows come back sorted by traffic value, so a small cap still returns the keywords that matter. Ceiling 3000.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
mode | string | metrics | metrics measures your list; ideas expands your seeds; competitors reads a domain's rankings. |
keywords | array of strings | — | Required in metrics and ideas modes (ignored in competitors). Up to 1000 in metrics mode, 20 seeds in ideas mode. Lowercased, whitespace-collapsed and deduplicated before the lookup, so casing and accidental duplicates cost you nothing. |
country | string | us | ISO-3166 alpha-2, lowercase. 111 supported. Unrecognised codes fall back to us with a note in the log. |
language | string | auto | 46 supported — exactly the set Google Ads accepts (note iw for Hebrew, no for Norwegian, zh_CN/zh_TW for Chinese). Left on Auto it follows the country — Germany queries German, Japan queries Japanese. |
includeGoogle | boolean | true | Google Ads metrics. One batch fee. |
includeBing | boolean | true | Microsoft Ads metrics. One batch fee. Ignored in ideas mode. |
domain | string | — | Competitors mode only, required. Bare host — ahrefs.com, not https://ahrefs.com/blog. Scheme, path and www. are stripped. |
maxDomainKeywords | integer | 1000 | Competitors mode only. How many ranked keywords to return, highest traffic value first. The one limit that changes your bill. Ceiling 3000. |
maxIdeas | integer | 1000 | Ideas mode only. Caps the dataset, not the charge — one expansion returns up to 20,000 for the same fee. |
minVolume | integer | 0 | Drop rows below this volume on both engines. Applied after the lookup. |
sortBy | string | relevance | Upstream ordering. Decides which keywords survive the maxIdeas trim. |
searchPartners | boolean | false | Count each engine's partner network in the volumes. Off by default, matching both Keyword Planners. |
includeAdultKeywords | boolean | false | Let adult keywords through. Google-side only. |
dateFrom / dateTo | string | — | History window as yyyy-mm-dd. Setting either switches the run to the Ads endpoint, which caps history at 12 months. Leave both empty for the default ~93-month series. |
bypassRunCache | boolean | false | Force a live lookup instead of reusing a cached result. Charges full batch fees. |
{"keywords": ["wireless headphones", "noise cancelling headphones", "bluetooth earbuds"],"country": "us","includeGoogle": true,"includeBing": true}
Output
One row per keyword you asked for — including keywords neither engine has data for, so you can join results back onto your input list without missing rows shifting everything out of alignment.
{"keyword": "wireless headphones","country": "us","language": "en","google_search_volume": 165000,"google_cpc": 0.78,"google_competition": "HIGH","google_competition_index": 87,"google_low_top_of_page_bid": 0.42,"google_high_top_of_page_bid": 1.18,"google_monthly_searches": [{ "year": 2025, "month": 11, "search_volume": 201000 }],"bing_search_volume": 14800,"bing_cpc": 0.51,"bing_competition": 0.84,"bing_low_top_of_page_bid": 0.31,"bing_high_top_of_page_bid": 0.92,"bing_monthly_searches": [{ "year": 2025, "month": 11, "search_volume": 17500 }],"bing_status": "ok","google_status": "ok","keyword_difficulty": 50,"search_intent": "commercial","search_volume_trend": { "monthly": -63, "quarterly": 122, "yearly": 172 },"trend": "rising","mom_change_pct": 22.4,"source": "live"}
In competitors mode every row is a keyword the domain ranks for, and carries domain, rank_absolute, rank_group, ranking_url, ranking_title, estimated_traffic and estimated_traffic_cost alongside the usual metrics. Bing columns are null: this is Google organic ranking data and Microsoft publishes no equivalent.
In ideas mode every row is a keyword Google returned rather than one you asked for, the Bing columns are null with bing_status: "skipped", and each row carries is_seed so you can tell your own seeds apart from what was discovered.
Field notes
google_competitionisLOW/MEDIUM/HIGH;google_competition_indexis the same thing 0–100.bing_competitionis a float — the two networks report competition differently and neither is converted to match the other.trendcompares the mean of the last three months against the three before. Rising or falling needs a move of more than 10%; anything smaller isflat. Null when there is under six months of history. Averaging each side stops one spiky month from flipping the flag.mom_change_pctis the change between the two most recent months with data. Null when the earlier month was zero.bing_status—ok,no_data(Bing ran but knows nothing about this keyword),skipped(you turned Bing off, or you are in ideas mode),unsupported_location(Microsoft does not sell ads in this country),unsupported_language(Microsoft supports English, French and German only),too_long(the keyword is over Bing's 100-character limit),error.google_status—ok,no_data,skipped,too_long(over Google's 80-character / 10-word limit),error.keyword_difficulty— 0-100, how hard the organic top 10 is to break into. Metrics mode only.search_intent—informational,navigational,commercialortransactional. Metrics mode only.search_volume_trend— upstream's own percentage deltas over 1, 3 and 12 months, alongside our computedtrend. Metrics mode only.source—liveorcache.- Both networks quantize volumes into broad bands. Those bands are returned unchanged rather than smoothed into a fake-precise number.
Pricing
| Event | Price | When |
|---|---|---|
actor-start | $0.05 | Once per run. Covers validation, dedup and the cache lookup. Always charges. |
google-batch | $0.50 | Once, after a successful Google call in metrics mode. Covers the whole keyword list. |
bing-batch | $0.40 | Once, after a successful Bing call. Covers the whole keyword list. |
google-ideas | $0.75 | Once, after a successful expansion in ideas mode. Covers every keyword returned, up to 20,000. |
domain-keywords | $0.90 | Once, after a successful competitors run. Covers every ranked keyword returned, up to 3,000. |
A full 1000-keyword Google + Bing scan is $0.95. So is a 3-keyword scan — which is why you should send full lists. A 20,000-keyword idea expansion is $0.80.
Metrics runs are served from Google's Labs keyword_overview endpoint, which is billed per keyword rather than per task and is cheaper than the flat-rate Ads endpoint below ~650 keywords — while returning more: ~93 months of history instead of 12, plus difficulty and intent. Past that size, or when you set a custom date window, search partners or adult keywords, the run falls back to the Ads endpoint automatically. Your price does not change either way; only our cost does.
Failed calls never charge. Each batch event fires only after the upstream call returns data. If Microsoft has no coverage for your country, the Google half still ships and the Bing batch is not billed.
The 24h cache
Identical scans inside 24 hours are served from cache for the start fee alone — no batch fees. Search volumes are monthly rolling averages; they do not change between two runs on the same afternoon. Set bypassRunCache to force a live lookup.
FAQ
Where does the data come from? Google Ads and Microsoft Ads keyword-planning endpoints — the same source their own Keyword Planners read from. Not scraped SERPs, not modelled estimates.
Why is Bing volume so much lower than Google? Because it is. Microsoft's network is a fraction of Google's in most markets. That gap is the useful signal: a keyword where Bing's share is unusually high often has cheaper clicks and less competition.
A keyword came back with nulls. Was I charged for it? Yes — billing is per batch, not per keyword, so an empty result costs the same as a full one. The row is still returned with nulls so your joins stay aligned.
Why did Bing return nothing for my country?
Microsoft sells ads in fewer countries than Google. The row arrives with bing_status: "unsupported_location" and you are not charged the Bing batch.
Why was Bing skipped for my language?
Microsoft's keyword endpoint accepts English, French and German only. Any other language is skipped before the call is made, so you see bing_status: "unsupported_language" and pay nothing for it — rather than paying for a rejection.
I don't know which keywords to research yet.
Set mode to ideas and give it up to 20 seeds. You get back the related keywords Google associates with them, each with the same volume, CPC and competition data. Use minVolume and sortBy to keep the useful end of the list.
Can I get more than 1000 keywords? Not in one metrics run — that is the upstream task limit. Split into runs of 1000; each is billed as its own batch. Ideas mode is different: one run can return up to 20,000 keywords for a single fee.
Is this safe to run from an AI agent? Yes. It runs under limited permissions — it reaches the keyword-data API and its own storage, nothing else in your account — so there is no broad-access approval step. It is callable over the Apify MCP server like any other actor.
Does this pair with the Google Trends scraper? Yes, and they answer different questions. Trends gives relative interest on a 0–100 scale with no absolute numbers. This gives absolute monthly volume and what advertisers pay. Use Trends to spot a rising shape, this to size it.
Setup (operator notes — not for the Store listing)
Before this actor can run, fill in the credentials at the top of src/lib/dataforseo.ts:
const DFS_LOGIN = 'REPLACE_ME__DATAFORSEO_LOGIN';const DFS_PASSWORD = 'REPLACE_ME__DATAFORSEO_PASSWORD';
The actor fails fast with a clear message while these are placeholders, so it cannot silently run up charges against a broken account.
Every customer run spends our upstream balance. Three guards exist for that:
- Pre-flight balance check — reads the upstream balance before the first paid call. Under $10 it fires a Telegram alert; at zero it refuses the run.
- Budget guard — if the caller's own
ACTOR_MAX_TOTAL_CHARGE_USDcannot cover both engines, Bing is dropped; if it cannot cover even one batch, the run is refused before spending anything. - Automated-test pinning — Apify's
public-actors-automated-testsaccount is pinned to a fixed keyword set so the first scheduled test fills the cache and every later one is served free.
Because the credentials live in source, this repo must stay on a private remote.
Pay-per-event pricing is applied through the Apify API, not this repo — use the apify-set-pricing skill with the schedule in the Pricing table above. Note the schedule now has four events, not three: google-ideas covers ideas mode.
Verified against the live API (2026-07-28)
All four open questions are closed. What the checks found:
- Country codes — all 111 validated clean against
keywords_data/google_ads/locations. - Language codes — eight were wrong, three of them from the original build. Google uses
iwfor Hebrew,nofor Norwegian, and only regional Chinese (zh_CN/zh_TW);ml,kn,mr,gu,paare not supported at all. The list is now exactly the 46 codes the API returns, asserted in the offline suite. - Bing coverage — six countries, not 111. Guarded before the call.
- Ideas-mode shape — confirmed; every field
buildIdeaRowsexpects is present.
Both reference endpoints are free (.../google_ads/locations, .../google_ads/languages, and the Bing equivalents, cost 0). Re-run the validation any time upstream changes its lists — it costs nothing:
npx tsx scripts/verify-live.ts # ~$0.25, exercises the paid pathsnpx tsx scripts/verify-labs.ts # ~$0.03, checks the Labs metrics path
Upstream cost, measured
| Call | Cost | Covers |
|---|---|---|
Labs keyword_overview | $0.012 + $0.00012/kw | metrics mode under ~650 keywords |
Ads search_volume | $0.09 flat | metrics mode above that, or Ads-only options |
keywords_for_keywords | $0.09 flat | one ideas run, up to 20,000 keywords |
Bing search_volume | $0.09 flat | the Bing half |
| Locations / languages | free | code validation |
A typical 20-keyword Google-only run costs $0.0144 upstream against a $0.55 charge. The 1000-keyword worst case is $0.18 against $0.95.
Permissions
New actors default to limited permissions, which is what this one wants — it only calls the keyword API and writes its own dataset. There is no actor.json field for this; confirm it in the Console's Settings tab after the first push, and leave it alone.
Verify without credentials
$npx tsx scripts/verify-logic.ts
Covers keyword normalization, trend maths, country/language fallbacks, row joining and cache-key stability against mock payloads in the documented upstream response shape. The upstream calls themselves are not covered — those need a funded account.
Explore more scrapers
Keyword Metrics answers "is this keyword worth it?". These answer the rest of the question:
- Ubersuggest Scraper — keyword volume, CPC and difficulty plus per-domain ranking keywords, backlinks and top pages. No account needed.
- Ahrefs Scraper — Domain Rating, backlinks, referring domains, organic traffic and AI-visibility citations.
- Semrush Scraper — authority score, traffic, ranks, backlinks, competitors and AI traffic for any domain.
- Moz Scraper — Domain Authority, spam score, linking root domains and ranking keywords.
- Similarweb Scraper — traffic, rank, visits and audience for a domain list.
- Google Trends Scraper — relative interest over time and the live Trending Now feed. Trends spots a rising shape; this actor sizes it in absolute volume.
- SEO Intelligence Suite — DR, traffic, AI-search visibility and Google presence for a domain in one call.
- AI Visibility Tracker — whether ChatGPT, Gemini and Perplexity cite your brand.
A typical pipeline: Google Trends to spot a rising topic → Keyword Metrics in ideas mode to expand it into a keyword set with real volume → Ahrefs or Moz to check whether you can realistically rank.
🤖 For AI Agents & LLM Apps
What it does: returns Google Ads and Microsoft Ads keyword metrics for a keyword list, or expands seed keywords into related ones. Not a SERP scraper — it tells you which keywords are worth ranking for, not who currently ranks.
Minimal input (tested):
{ "keywords": ["running shoes", "seo tools"], "country": "us" }
Discovery input:
{ "mode": "ideas", "keywords": ["vegan protein powder"], "maxIdeas": 250, "minVolume": 100, "sortBy": "search_volume" }
Output fields (flat, one row per keyword):
keyword, country, language, google_search_volume, google_cpc, google_competition, google_competition_index, google_low_top_of_page_bid, google_high_top_of_page_bid, google_monthly_searches[], google_status, bing_search_volume, bing_cpc, bing_competition, bing_low_top_of_page_bid, bing_high_top_of_page_bid, bing_monthly_searches[], bing_status, keyword_difficulty, search_intent, search_volume_trend, trend, mom_change_pct, source, is_seed (ideas mode only).
Behaviours that matter to an agent:
- Billing is per batch, not per keyword. One keyword and 1000 cost the same. Batch aggressively; never loop one keyword per run.
- Every requested keyword returns a row, even when no engine has data —
nullmetrics with a status field. Joins stay aligned; row count always equals input count in metrics mode. - Failed upstream calls are never charged. Only
actor-startalways bills. - Identical input inside 24h is served from cache for the start fee alone. Set
bypassRunCache: trueonly when you deliberately need fresh numbers. - Bing is Google-only outside 6 countries. Check
bing_statusbefore treating anullBing volume as zero demand. - Ideas mode is Google-only and caps at 20 seeds;
maxIdeastrims the dataset, not the bill. - Runs under limited permissions — it reaches the keyword API and its own storage, nothing else in your account. No broad-access approval step.
⚠️ Disclaimer
This Actor retrieves keyword-planning data from Google Ads and Microsoft Ads through a licensed third-party data provider. It does not scrape private, personal, or authenticated content, and it collects no personal data.
Search volumes are quantized into broad bands by Google and Microsoft themselves and are returned unchanged — they are planning estimates, not exact counts, and should be treated as directional. Figures can differ from what you see in the Keyword Planner UI, which applies its own account-level filtering.
You are responsible for using the output in line with Google's and Microsoft's terms and any applicable law in your jurisdiction. This Actor is not affiliated with, endorsed by, or sponsored by Google LLC or Microsoft Corporation. Google Ads and Microsoft Ads are trademarks of their respective owners.
SEO Keywords
keyword research tool, google keyword planner api, search volume api, bulk keyword metrics, keyword search volume scraper, cpc data api, keyword difficulty checker, search intent analysis, bing keyword volume, microsoft ads keyword data, google ads keyword data, seo keyword api, keyword ideas generator, related keywords api, long tail keyword finder, keyword volume checker bulk, ahrefs alternative, semrush alternative, ubersuggest alternative, moz alternative, keyword planner alternative, ppc keyword research, competition index keywords, top of page bid data, monthly search trend, keyword seasonality data, seo dashboard data source, n8n keyword research, make.com seo automation, zapier keyword data, apify seo actor, mcp keyword tool, ai agent keyword research, keyword clustering input, content gap keywords, multi country keyword research, international seo keywords