Keyword Research API: Search Volume, CPC, Difficulty, Intent avatar

Keyword Research API: Search Volume, CPC, Difficulty, Intent

Pricing

from $2.40 / 1,000 keyword with data

Go to Apify Store
Keyword Research API: Search Volume, CPC, Difficulty, Intent

Keyword Research API: Search Volume, CPC, Difficulty, Intent

Keyword research tool and API: bulk search volume, AI search volume, CPC, keyword difficulty, search intent and SERP features, plus keyword ideas, related keywords, long tail keywords and competitor keywords. Bing volume on 300+ keywords. Keyword Planner and Semrush alternative. $3 per 1,000.

Pricing

from $2.40 / 1,000 keyword with data

Rating

5.0

(1)

Developer

Gaël GERARD

Gaël GERARD

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

5

Monthly active users

11 days ago

Last modified

Features

Limited permissions

Share

Get keyword search volume in bulk, with the rest of Google's keyword data in the same row: cost per click (CPC), competition, top-of-page bids, keyword difficulty, search intent, a 12-month trend, AI search volume and the SERP features on Google's first page, plus Bing search volume on runs of 300 keywords or more. Paste up to 10,000 keywords per run, grow a few seeds into up to 5,000 keyword ideas, keyword suggestions, long tail keywords or related searches, or enter up to 10 competitor websites and see every keyword they rank for. Works in every country Google Ads serves.

Every run also tells you what to target first: low-difficulty keywords, buying-intent keywords, questions to answer, rising keywords and, for a website, the keywords ranking 4 to 20. See keyword opportunities.

A Google Keyword Planner alternative built for SEO teams, agencies and AI agents: no Google Ads account, no data-provider account, one flat typed row per keyword and a price you can compute in advance. $3 per 1,000 keywords with data, plus $0.01 per run that returns data. Keywords without data are free. Free Apify plans get the same data for 20 keywords per run.

Real output for 8 running shoe keywords in the US: Google, Bing and AI search volume, 12-month trend, CPC, keyword difficulty, search intent and SERP features

What does Keyword Research API do?

You send keywords and a country. For each keyword you get:

FieldWhat it tells you
search_volumeAverage monthly Google searches over the last 12 months
monthly_searchesSearches for each of the last 12 months, newest first
cpcAverage cost per click in USD (Google Ads)
competition, competition_levelPaid search competition, from 0 to 1 and as LOW, MEDIUM or HIGH
low_top_of_page_bid, high_top_of_page_bidBid range for the top of the results page, in USD
keyword_difficultyHow hard it is to rank in the organic top 10, from 0 to 100. An estimate: 0 means few strong pages compete, not a guaranteed top 10
search_intent, secondary_intentsInformational, navigational, commercial or transactional
trendChange in search volume over the last month, quarter and year, in %
serp_featuresResult types on Google's first page: AI Overview, featured snippet, People Also Ask, local pack, video, shopping and more
serp_urlThe Google search DataForSEO checked, to see the results yourself
core_keywordThe main form of a group of close variants (plurals, word order), to cluster keywords that share one volume
bing_search_volume, bing_cpc, bing_competition, bing_monthly_searchesBing Ads volume, CPC and competition next to Google's, on runs of 300 keywords or more. Included at no extra cost
ai_search_volume, ai_monthly_searchesHow often the keyword comes up in AI assistants such as ChatGPT, estimated by DataForSEO from People Also Ask questions: last month, and each of the 12 months before. Included at no extra cost
data_statusok (every metric the source has), partial (Google Ads metrics only) or no_data (free row)
missing_metricsThe metrics the source has no value for on this keyword, for example ["keyword_difficulty"] for a rare brand keyword. Empty when every metric is filled

The data comes from DataForSEO: Google Ads keyword data plus the DataForSEO Labs keyword database, which adds difficulty, intent and trend, and DataForSEO's AI keyword data for the AI search volume. A value the source does not have is null. It is never replaced by 0.

Three modes

  • Metrics (default): one row per keyword you send. Up to 10,000 keywords per run. Duplicates, extra spaces and capital letters are cleaned up first, so the same keyword is never looked up or charged twice.
  • Ideas: send 1 to 20 seed keywords and get up to 5,000 keywords with the same metrics, with three methods (ideasMethod):
    • ideas (default): broad ideas from the same topics;
    • suggestions: long-tail phrases that contain your seed, such as "best running shoes for flat feet";
    • related: Google's related searches, up to four levels deep. Suggestions and related searches run once per seed and say which seed each row came from (seed_keyword).
  • Domain (competitor keywords): enter one website, or up to 10 to compare competitors in one run. You get the keywords each ranks for on Google, best traffic first, with its position (rank_position), the ranking page (ranking_url) and an estimate of the monthly visits each keyword brings (estimated_traffic), plus the usual metrics. Keep only positions 4 to 20 to find striking-distance keywords. Up to 5,000 keywords per website, same price per row.

In ideas and domain modes, includeTerms keeps only keywords that contain a word ("best", "near me"), excludeTerms leaves out brand names or "free" before anything is charged, and sortBy fetches the highest volume, the highest CPC or the easiest keywords first.

What can you use it for?

  • Bulk search volume checker: average monthly Google searches and the last 12 months, for up to 10,000 keywords per run.
  • Keyword difficulty checker: how hard each keyword is to rank for in the organic top 10, from 0 to 100.
  • Search intent checker: informational, navigational, commercial or transactional.
  • CPC checker: cost per click, paid competition and the top-of-page bid range from Google Ads.
  • Keyword ideas and long-tail keywords: up to 5,000 related keywords from 1 to 20 seeds, filtered by minimum volume.
  • Competitor keyword research: the keywords any website or page ranks for, with position, ranking URL and estimated traffic.
  • AI search volume checker: how often each keyword comes up in AI assistants, with its 12-month history.
  • Google vs Bing: Bing searches and CPC next to Google's, on runs of 300 keywords or more.
  • SERP features checker: which keywords show an AI Overview, a featured snippet, People Also Ask or a local pack.
  • Long-tail keyword suggestions: phrases that contain your seed, with volume, CPC and difficulty, easiest first if you like.
  • Striking distance keywords: the keywords your site ranks for in positions 4 to 20, the quickest wins.
  • Competitor comparison: the keywords of up to 10 websites in one run, each row tagged with its website.
  • Keyword data for AI agents: call it as an MCP tool or through the API and get the same typed rows.

How to use it

  1. Paste your keywords, one per line. Google Ads match-type notation such as "phrase" or [exact] is removed.
  2. Pick a country. The language defaults to the country's main language, for example German for Switzerland; change it if you need French or Italian.
  3. Optional: set a minimum search volume or a maximum number of keywords.
  4. Set a maximum cost per run that covers your list (see the price table below), then start.
  5. Open the Output tab: the Keyword metrics view, a Google Ads bids and competition view and a 12-month history view. Export JSON, CSV or Excel, or use the Main columns for spreadsheets (CSV) link, which leaves out the monthly columns.

Input examples

Metrics for your own list:

{
"keywords": ["running shoes", "trail running shoes", "best running shoes for flat feet"],
"location": "US"
}

Keyword ideas from a seed, only ideas with at least 100 searches a month:

{
"mode": "ideas",
"keywords": ["running shoes"],
"location": "GB",
"maxIdeas": 500,
"minSearchVolume": 100
}

Keywords a competitor ranks for in the US, best traffic first:

{
"mode": "domain",
"domain": "competitor.com",
"location": "US",
"maxIdeas": 1000
}

Long-tail suggestions that contain the seed, without brand names, easiest first:

{
"mode": "ideas",
"ideasMethod": "suggestions",
"keywords": ["coffee grinder"],
"excludeTerms": ["baratza", "breville"],
"sortBy": "difficulty",
"maxIdeas": 200
}

Striking-distance keywords of two competitors (positions 4 to 20):

{
"mode": "domain",
"domains": ["competitor.com", "other-competitor.com"],
"minPosition": 4,
"maxPosition": 20,
"maxIdeas": 500
}

Another language in the same country:

{
"keywords": ["chaussures de course", "logiciel de facturation"],
"location": "CA",
"language": "fr"
}

location accepts an ISO country code (US, GB), a country name in English or French (United Kingdom, Royaume-Uni) or a numeric DataForSEO location_code (2840). Every country works. The 94 countries in the drop-down list get every metric and all three modes. The other countries, and location codes such as a city, return Google Ads metrics: search volume, CPC, competition and bids, without difficulty, intent or trend, in metrics mode.

A country typed with a typo or in its own language is understood (Frnace, Deutschland), and an unknown language falls back to the country's main language, with a note. An entry the Actor cannot use, such as a website without a dot or a fourth filter word, is left out and listed in the status message and in the SUMMARY warnings: the run still goes ahead. The form flags most of them before you start. A country is never replaced by another one: when nothing can be looked up, for example for a country the Actor does not know, or Russia and Belarus, which DataForSEO does not serve, the run ends before any lookup, charges nothing and says why. A run stopped by your maximum cost per run or by its timeout also ends normally.

Output example

A real row from a US run on 23 October 2026 (the 12 monthly values are shortened to two here):

{
"keyword": "running shoe brands",
"location_code": 2840,
"language_code": "en",
"search_volume": 8100,
"monthly_searches": [
{ "year": 2026, "month": 9, "search_volume": 8100 },
{ "year": 2026, "month": 8, "search_volume": 8100 }
],
"cpc": 1.42,
"competition": 1,
"competition_level": "HIGH",
"low_top_of_page_bid": 0.44,
"high_top_of_page_bid": 2.28,
"keyword_difficulty": 15,
"search_intent": "commercial",
"secondary_intents": ["informational"],
"trend": { "monthly": 0, "quarterly": 0, "yearly": 0 },
"core_keyword": null,
"serp_features": ["ai_overview", "organic", "popular_products", "people_also_ask", "images", "related_searches"],
"serp_url": "https://www.google.com/search?q=running%20shoe%20brands&hl=en&gl=US&ie=UTF-8&uule=w+CAIQIFISCQs2MuSEtepUEUK33kOSuTsc",
"bing_search_volume": 270,
"bing_cpc": 0,
"bing_competition": 0.5,
"bing_monthly_searches": [
{ "year": 2026, "month": 9, "search_volume": 270 },
{ "year": 2026, "month": 8, "search_volume": 280 }
],
"ai_search_volume": 3891,
"ai_monthly_searches": [
{ "year": 2026, "month": 9, "ai_search_volume": 3891 },
{ "year": 2026, "month": 8, "ai_search_volume": 2941 }
],
"data_status": "ok",
"source_endpoint": "dataforseo_labs/google/keyword_overview/live",
"retrieved_at": "2026-10-23T12:29:57.632Z"
}

Every run also writes a SUMMARY record (linked in the Output tab). It shows how many keywords were received, cleaned up, looked up and delivered, each batch with its attempts, any limit that stopped the run, and what was charged.

What to target first: keyword opportunities

Every run ends with an OPPORTUNITIES record, linked in the Output tab: what to work on first, picked from the run's own rows with simple rules. Nothing extra is looked up or charged, and free plans get it too. The run's final status message names the top one, and SUMMARY lists them all.

OpportunityPicked whenWhat to do
striking_distance (domain mode)The website ranks 4 to 20Improve those pages first, or overtake a competitor where it is weak
quick_winsKeyword difficulty of 30 or lessOne page per keyword: smaller sites can still reach page 1
buying_intentCommercial or transactional intent, with a CPCProduct, pricing, comparison or "best ..." pages, ranked by searches × CPC
questionsThe keyword is a questionAnswer it in a guide or an FAQ, in 40 to 60 words under a heading that repeats it
ai_searchAI search volume of 10 or moreCheck whether AI assistants name your brand for these topics
rising+50% searches in a year, not falling this quarterPublish before the demand peaks
top_pages (domain mode)The pages with the most estimated trafficTopics that pay off for a competitor, or pages to protect on your site
ai_overview, featured_snippet, video, local_pack, product_listingsThe SERP feature shows up for at least a fifth of the keywordsFormat the answer, make a video, complete a Business Profile or a product feed
seasonalOne month has more than twice the average searchesPublish 6 to 8 weeks before the peak
close_variantsKeywords share one core keywordOne page per group, not one page per variant

Each opportunity has a priority (high, medium or low), a title, a finding with the numbers behind it, an action and up to 10 example keywords (or pages and groups). A run returns up to 8, the most important first. Keywords with fewer than 10 searches a month are left out of these lists.

A real OPPORTUNITIES record from an ideas run on "running shoes" in the US, on 2 November 2026, shortened to the first opportunity and 3 of its 10 keywords:

{
"schema_version": "1.0",
"mode": "ideas",
"location": { "location_code": 2840, "name": "United States", "language_code": "en" },
"rows_analyzed": 100,
"note": "Built with simple rules from the rows of this run. Nothing extra was looked up or charged.",
"opportunities": [
{
"priority": "high",
"type": "quick_wins",
"title": "Target 94 low-difficulty keywords",
"finding": "94 keywords have a keyword difficulty of 30 or less, with 1,097,750 searches a month.",
"action": "Start with these: one page per keyword, or per group of close variants. A low difficulty means that pages from smaller sites can still reach the first page of Google.",
"keywords": [
{ "keyword": "on running shoes", "search_volume": 201000, "keyword_difficulty": 27, "cpc": 1.23, "search_intent": "transactional" },
{ "keyword": "trail running shoes", "search_volume": 165000, "keyword_difficulty": 3, "cpc": 1.03, "search_intent": "transactional" },
{ "keyword": "road running shoes", "search_volume": 60500, "keyword_difficulty": 17, "cpc": 0.89, "search_intent": "transactional" }
]
}
]
}

The same run found 7 more: 96 buying-intent keywords, 1 question, 95 keywords also asked in AI assistants, 11 rising keywords, AI Overviews on 38 keywords, product listings on 94 and 32 seasonal keywords (10 of them peak in March). In domain mode on allbirds.com, the top opportunity was 3 keywords ranking 4 to 20 ("all black shoes", "all black sneakers" and "grey shoes", 34,300 searches a month), and the home page brought 86% of the estimated traffic of the 100 keywords. Keywords containing the website's brand are left out of the lists in domain mode, except for positions and pages.

How much does it cost?

This Actor uses pay-per-event pricing. Platform usage is included.

EventPrice
Keyword with data (keyword-result)$0.003 per keyword
Run start (run-start), charged only when the run returns at least one keyword with data$0.01 per run
Keywords with dataTotal price
100$0.31
1,000$3.01
10,000$30.01

Higher Apify plans pay less per 1,000 keywords: $2.85 on Starter (Bronze), $2.70 on Scale (Silver) and $2.40 on Business (Gold). The Actor's Pricing tab always shows your price.

You are never charged for:

  • keywords the source has no data for (rows with data_status: "no_data");
  • keywords left out by minSearchVolume or maxKeywords, or listed as duplicates;
  • keywords in a batch that failed;
  • a run that returns nothing.

Maximum cost per run. Set it in the run options (or with maxTotalChargeUsd in the API). The Actor only requests data it can bill within that limit, and keywords that turn out to have no data free their share of the budget for the rest of your list. When the limit is reached, it stops cleanly, keeps every row already delivered and tells you how many keywords are left, for example: "Stopped at your $1.00 maximum cost per run: 330 keywords with data. Raise it to $3.01 to get the other 670." For 1,000 keywords, a limit of $3.01 is enough. A limit below the price of one keyword ends the run before any lookup, charges nothing and says what one keyword costs.

Free plan vs paid plans

Every Apify plan gets the same data: the same source, the same fields and the same metrics in each row. Only the quantity differs.

Apify free planPaid Apify plans
Keywords or ideas per run20up to 10,000
Runs per day5no limit
Data and fieldssamesame

A free run cut to 20 rows says what a paid plan would return, for example "1,250 keyword ideas found; the free plan shows 20." After 5 runs in a UTC day, the next run stops before any lookup and charges nothing; the count resets at 00:00 UTC and is kept in a small key-value store named keyword-research-api-free-usage in your Apify account. Bing search volume starts at 300 keywords in one run, which only paid plans reach.

How does it compare?

Popular keyword Actors in Apify Store charge up to $12 per 1,000 keywords, and many leave out keyword difficulty or search intent. This one:

  • costs $3 per 1,000 keywords with data, and keywords without data are free;
  • takes up to 10,000 keywords in one run;
  • puts volume, CPC, bids, difficulty, intent and the 12-month trend in the same row, for every keyword in the 94 countries with full data;
  • adds keyword ideas, long-tail suggestions, related searches and the keywords of up to 10 competitor websites at the same price per row;
  • includes AI search volume and SERP features at no extra cost, and Bing search volume on runs of 300+ keywords;
  • ends each run with keyword opportunities: what to target first, at no extra cost;
  • filters by words, position and minimum volume at the source, so keywords left out are never charged.

What it does not do: SERP results, backlinks or clickstream-adjusted volumes. It is also new, so its public track record is short. The SUMMARY record shows exactly what happened in each run.

Reliable by design

  • Keywords are sent in batches of up to 700, three batches at a time.
  • Each request is retried up to 3 times, with growing waits, on rate limits, timeouts and server errors.
  • If the DataForSEO Labs request fails for a batch, the Actor asks Google Ads for the same keywords. You still get volume, CPC, competition and bids; difficulty, intent and trend stay null and the row says data_status: "partial".
  • A failed batch does not stop the others, and results already delivered are kept. The run is marked as failed only when the data source fails or refuses the request and nothing could be delivered; nothing is charged then.
  • The Actor stops starting new batches shortly before the run timeout, leaving time to write the summary and a clear status message.
  • If the platform restarts the run, keywords already delivered are skipped and not charged again.

Use it from your code

Run it and get the rows in one request with the run-sync-get-dataset-items endpoint:

curl -X POST "https://api.apify.com/v2/acts/gaelasao~keyword-research-api/run-sync-get-dataset-items?maxTotalChargeUsd=2.01" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": ["running shoes", "trail running shoes"], "location": "US"}'

With the JavaScript client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('gaelasao/keyword-research-api').call(
{ keywords: ['running shoes', 'trail running shoes'], location: 'GB' },
{ maxTotalChargeUsd: 2.01 },
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();

For long lists, start the run asynchronously and read the dataset when it finishes; the synchronous endpoint waits up to 5 minutes.

Use it from an AI agent (MCP)

Apify hosts this Actor as a tool on its MCP server. In an MCP client such as Claude, Cursor or VS Code, add:

https://mcp.apify.com?tools=actors,docs,gaelasao/keyword-research-api

Then ask, for example: "Get search volume, CPC, difficulty and intent for these 40 keywords in Germany and sort them by volume." or "Which keywords bring competitor.com the most traffic in the UK? Show the top 50 with their ranking pages." The agent sends the same JSON input as above. The output is the same flat rows, and the price per keyword is fixed, so an agent can estimate the cost before it runs.

Guides and templates

ActorWhat it adds
AI Visibility TrackerChecks whether ChatGPT, Perplexity, Gemini and Google AI answers mention and cite your brand on the queries you found here
Building Permits APIConstruction leads from official building permits in 18 US cities and counties, with project value and contractor

FAQ

Where does the data come from?

From DataForSEO, a licensed SEO data provider. Search volume, CPC, competition and bids are Google Ads keyword data. Keyword difficulty, search intent and trend come from the DataForSEO Labs database, and AI search volume from DataForSEO's AI keyword data. source_endpoint on each row says which one answered.

How fresh is it?

Google publishes keyword volumes as monthly averages, and DataForSEO refreshes its database every month. The newest month appears a few days after it ends; the current month is never included. retrieved_at shows when the Actor fetched the data, not when Google updated it.

Why is there no data for some keywords?

Very rare or very new keywords are often missing from the Google Ads and DataForSEO databases. Those keywords come back with data_status: "no_data" and null metrics, and they are free.

Why do similar keywords have the same volume?

Google Ads groups close variants, such as plurals or reordered words, and reports the same volume for the group. This is how Google provides the data.

Which countries and languages are supported?

Every country Google Ads serves: use a two-letter code (US, GB, DE) or the country name in English, in French or, for many countries, in their own language (Deutschland); a small typo is understood. 94 countries get every metric and all three modes, each in its supported languages (for example English and Spanish for the US, Dutch, French and German for Belgium). In ideas and domain modes, a language the country does not support there is replaced by its main one. The other countries get Google Ads metrics (volume, CPC, competition and bids) in metrics mode. Regions and cities work with a numeric DataForSEO location_code. A country the Actor does not know ends the run before any lookup, with nothing charged; so do Russia and Belarus, which DataForSEO does not serve.

What are the limits?

  • Metrics mode: 1 to 10,000 keywords per run. Ideas mode: 1 to 20 seeds and up to 5,000 ideas. Domain mode: up to 10 websites or pages and up to 5,000 ranked keywords for each. Going over a limit does not fail the run: the first entries are kept and the status message says so.
  • Apify free plan: 20 keywords or ideas per run and 5 runs per day, with the same data as paid plans (see "Free plan vs paid plans" above).
  • Each keyword can have up to 80 characters and 10 words. Longer ones are listed in SUMMARY and skipped.
  • Google Ads rejects some characters (, ! @ % ^ * ( ) = { } ; ~ < > ? \ | and emojis). Keywords containing them can still get full metrics from DataForSEO Labs, but they are left out of the Google Ads fallback and listed in SUMMARY.

When do I get Bing search volume?

On runs of 300 keywords or more (in ideas and domain modes, when you ask for 300 rows or more), in English, French or German, in the countries Bing Ads covers. It costs nothing extra: Bing charges per request whatever the size, so it is added where the run is large enough to pay for it. Batches with fewer than 50 keywords with data, such as a small leftover batch, skip it. Rows then get null, and runs below 300 keywords have no Bing columns. Turn it off with "includeBing": false.

What are SERP features?

The kinds of results Google shows on the first page for a keyword: classic organic links, but also an AI Overview, a featured snippet, People Also Ask questions, a local pack, videos, images or shopping results. They tell you what it takes to be seen: a keyword with an AI Overview and a featured snippet leaves fewer clicks to the organic results. serp_features lists them for each keyword with full metrics, at no extra cost. Turn it off with "includeSerpInfo": false.

What is AI search volume?

An estimate, by DataForSEO, of how often a keyword comes up in AI assistants such as ChatGPT, built from the questions in Google's People Also Ask boxes. You get last month's value in ai_search_volume and the 12 months before in ai_monthly_searches (when includeTrend is on). It is on by default, costs nothing extra, and is null where DataForSEO has no AI data, for example for some countries or languages. Turn it off with "includeAiVolume": false.

Is it a Google Keyword Planner alternative?

Yes. You get the same Google Ads keyword metrics (search volume, CPC, competition and bid range) without a Google Ads account or ad spend, plus keyword difficulty, search intent and trend from DataForSEO Labs, for thousands of keywords at once.

Do I need a DataForSEO or Google Ads account?

No. You only need an Apify account. Charges come out of your Apify balance.

How are the keyword opportunities picked?

With fixed rules on the run's own rows, listed in the table above: difficulty, intent, CPC, trend, AI search volume, SERP features and, in domain mode, positions and traffic. They are a starting point, not an audit: a difficulty of 30 is easier, not easy for every site.

Can I track the same keywords every month?

Yes. Save your input as a task and add an Apify schedule. Each run is charged like any other run. To send the rows on, use Apify's integrations for Google Sheets, Slack, Make, Zapier or n8n.

Feedback

Found a wrong value or a missing field? Open an issue on the Issues tab with the run ID, and we will look at it. If the Actor is useful to you, an honest review helps other users decide whether it fits their needs.