Skip to main content

Google Search Volume API: Free Options and a Cheap Paid One

Updated 14 min readMarkdown

The Google Ads API is the direct way to retrieve Google search volume in code. Its GenerateKeywordHistoricalMetrics method accepts up to 10,000 keywords per request when your Google Cloud project has the appropriate access. DataForSEO offers a paid Google Ads alternative, with up to 1,000 keywords per task at $0.06 Standard or $0.09 Live. Keyword Planner is the manual CSV option, while DataForSEO Labs provides keyword metrics from a separately refreshed database. The decision comes down to access requirements, turnaround time and the metrics your application needs.

This post includes affiliate links; I may receive compensation if you purchase products or services from the different links provided in this article. An AI assistant helped me draft it, and every figure links to the official page it comes from.

Here is the practical split before getting into the setup details:

Route How you get the data Published limits and costs Makes sense for
Google Keyword Planner Use the interface, then export a CSV Account setup and billing information needed for keyword suggestions Occasional research without an API integration
Google Ads API Call GenerateKeywordHistoricalMetrics Up to 10,000 keywords and 10 geo targets per request; project access and quotas apply Developers already set up to use Google Ads
DataForSEO Google Ads Post a task, then collect its result Up to 1,000 keywords; Standard $0.06, Live $0.09 per task Scheduled keyword volume jobs without a Google Ads API integration
DataForSEO Labs Query its keyword database Up to 700 keywords per request; $0.012 per request plus $0.00012 per item Volume plus intent and other metrics from a separately refreshed dataset

Option 1: Keyword Planner in the Google Ads interface

Keyword Planner lives in the Tools menu of a Google Ads account. It has two entry points: "Discover new keywords", which suggests ideas from seed words or a website, and "Get search volume and forecasts", where you upload a list you already have. Google describes it as showing estimates of how many searches a keyword gets each month and the average cost for an ad to show.

A few limits from Google's own help page matter if you plan to export from it:

  • You must enter billing information and complete your account setup before you can use basic features like keyword suggestions.
  • Each keyword can be at most 80 characters and 10 words.
  • Results for sensitive categories such as health or finance are often missing because of Google's advertising and privacy policies.

For a one off list of a few hundred keywords, this is enough. You download a CSV and you are done. It stops being enough when you want volume inside an app, a scheduled job, or a pipeline that runs without a person clicking through the interface.

Option 2: the Google Ads API

The developer route is the KeywordPlanIdeaService in the Google Ads API. According to Google's guide to generating historical metrics, you call GenerateKeywordHistoricalMetrics with up to 10,000 keywords per request, plus targeting such as language and up to 10 geo targets. The response includes:

  • average monthly searches over the past 12 months, or over a range you specify
  • approximate monthly search volumes for up to the past 4 years
  • a competition level and a competition index from 0 to 100
  • low and high top of page bid estimates

That is the same family of data you see in Keyword Planner, which Google says in that guide.

Access levels changed in 2026

The setup is where most people get stuck, and it changed this year. Google's access levels page says developer tokens were sunset on 9 September 2026, and access levels are now managed per Google Cloud project. Enabling the API gives you Test access. From there you apply for higher levels:

Access level Accounts it can reach Daily operation limit
Test Test accounts only 15,000 operations per day
Explorer Test and production accounts 2,880 per day on production accounts, 15,000 on test accounts
Basic Test and production accounts 15,000 per day
Standard Test and production accounts Unlimited

Important: Explorer access can reach production accounts, but Google's access levels page (checked 31 October 2026) lists KeywordPlanIdeaService among the services restricted at that level and says you need Basic or Standard access to use them. Since GenerateKeywordHistoricalMetrics uses that service, Explorer access is not enough for a production search volume integration. Before you build, check your access level and permitted uses on Google's access levels page. Explorer's 2,880 daily production operations are not a keyword volume allowance.

Google says Explorer access is reviewed and approved automatically in most cases.

Quotas for keyword planning calls

The API limits and quotas page puts the keyword planning methods on a separate, stricter limit because of their cost and complexity. GenerateKeywordIdeas, GenerateKeywordHistoricalMetrics and GenerateKeywordForecastMetrics are limited to 1 request per second per customer ID. Go over it and you get a RESOURCE_EXHAUSTED error. With 10,000 keywords allowed per request, that limit is rarely the bottleneck for volume lookups, but it does mean you need simple rate limiting and retries in your client.

When this route makes sense

The native API is a sensible option if Google Ads, OAuth and the Google Cloud project are already part of your stack, and the project has keyword planning access. Google's documentation cited here gives access requirements and quotas, but does not publish a price per keyword planning call. That is not the same as saying there is an unrestricted, free public search volume API. Approval, setup and client maintenance are real work.

That is the short answer to a question asked in a thread on Reddit's r/bigseo: why do people pay a third party for search volume when Google offers an API for it? The Google pages above list no per call price, but the route comes with project access levels, a permissible use review, billing setup for Keyword Planner and a 1 request per second limit on keyword planning methods. A paid API trades those prerequisites for a per task charge.

Google announced a Google Trends API in alpha on July 24, 2025. It is not a search volume API. Google's announcement says the API returns consistently scaled search interest across a rolling window of 1,800 days, and that the numbers do not reflect absolute numbers. Access is limited to a small group of testers who apply through the Trends API alpha page. Use it for comparing interest over time if you are accepted, not for monthly volume counts in a keyword report.

Option 3: DataForSEO's Google Ads endpoint

DataForSEO offers a Google Ads search volume endpoint which, per its pricing page, is sourced from Google Keyword Planner. You authenticate with a login and password, post a task, and pay per task rather than per keyword:

  • each task takes a list of as many as 1,000 keywords
  • Standard mode: $0.06 per task, results within 1 to 3 hours
  • Live mode: $0.09 per task, results within about 7 seconds, capped at 12 Live calls a minute for each account
  • the data is identical whichever mode you pick

The task_post documentation adds a few details worth knowing before you build. Historical data goes back 4 years, and by default you get the past 12 months. Each keyword can be at most 80 characters and 10 words, the same as Keyword Planner. One data quality trap is worth knowing before a keyword list goes into a report. Google Ads can combine volume for similar keyword variants. DataForSEO recommends putting close variants in separate requests if you need to separate them. Do not interpret a combined number as an independent volume count for every spelling.

There is also a coverage limit. According to the pricing page, keywords related to restricted categories such as weapons, tobacco, drugs, violence and terrorism can return empty results. An empty result in those categories should not automatically be converted into a claim that nobody searches for the term.

Standard mode is asynchronous, so a complete script has three steps: post the task, wait until it is finished, then collect it with task_get. DataForSEO charges only for posting the task; per the task_get docs, results can be collected free for the next 30 days.

The script reads the API login from two environment variables, so no credentials appear in the code. DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD must both be set before you run it, otherwise Python stops with a KeyError. The optional DATAFORSEO_BASE variable switches the host to the Sandbox.

import os
import time

import requests

# Both variables must be set before running, for example:
#   export DATAFORSEO_LOGIN="your API login"
#   export DATAFORSEO_PASSWORD="your API password"
AUTH = (os.environ["DATAFORSEO_LOGIN"], os.environ["DATAFORSEO_PASSWORD"])

# Use https://sandbox.dataforseo.com while building; it returns sample data.
BASE = os.environ.get("DATAFORSEO_BASE", "https://api.dataforseo.com")
SV = BASE + "/v3/keywords_data/google_ads/search_volume"

NOT_READY = {40601, 40602}  # "Task Handed." and "Task in Queue."


def call(method, url, **kwargs):
    resp = requests.request(method, url, auth=AUTH, timeout=60, **kwargs)
    resp.raise_for_status()
    body = resp.json()
    if body["status_code"] != 20000:
        raise RuntimeError(f"{body['status_code']} {body['status_message']}")
    return body


# 1. Post the task. This is the only step that is charged.
posted = call("POST", SV + "/task_post", json=[{
    "keywords": ["search volume api", "keyword research api"],
    "location_name": "United States",
    "language_code": "en",
}])
task = posted["tasks"][0]
if task["status_code"] != 20100:  # "Task Created."
    raise RuntimeError(f"{task['status_code']} {task['status_message']}")
task_id = task["id"]
print("posted task", task_id)

# 2. Poll until the task is done. Standard mode takes 1 to 3 hours.
for attempt in range(120):
    got = call("GET", f"{SV}/task_get/{task_id}")
    result_task = got["tasks"][0]
    if result_task["status_code"] == 20000:
        break
    if result_task["status_code"] not in NOT_READY:
        raise RuntimeError(
            f"{result_task['status_code']} {result_task['status_message']}"
        )
    time.sleep(120)
else:
    raise TimeoutError(f"task {task_id} not ready after 4 hours")

# 3. Read the volumes from the task_get response.
for row in result_task["result"] or []:
    print(row["keyword"], row["search_volume"], row["competition"])

This script was tested against the DataForSEO Sandbox on 31 October 2026, with DATAFORSEO_BASE set to https://sandbox.dataforseo.com. The post returned status 20100 (Task Created.), task_get returned status 20000 with four rows, and the script exited without errors. The Sandbox returns sample data, so the rows were its fixed example keywords (seo, phone, lkjhgfvbnm and watch) rather than the two keywords posted, and the test cost nothing. It was not run against the paid API, so no live volumes are shown here.

The loop polls task_get, which is free, and treats status 40601 (Task Handed.) and 40602 (Task in Queue.) as not ready yet, per DataForSEO's response code list. If you post many tasks, the tasks_ready endpoint is the alternative: it lists completed tasks that have not been collected, is not charged, allows up to 20 calls a minute and returns up to 1,000 tasks completed within the previous three days. Only the task_get result is suitable for populating a keyword volume report.

If the job is a scheduled list and native Google Ads API access is the obstacle, Standard trades waiting time for a lower task price. Live is the option when the result needs to arrive in seconds.

This post includes affiliate links; I may receive compensation if you purchase products or services from the different links provided in this article.

Try the DataForSEO Google Ads endpoint

One price note. The product page headline uses a lower "from" figure, but the per task rows on that same product page and the Google Ads pricing page both list $0.06 per Standard task and $0.09 per Live task (checked 31 October 2026), so budget with those.

The Labs alternative

DataForSEO also has Labs, which serves keyword data from its own database instead of querying Google Ads each time. The Keyword Overview endpoint accepts up to 700 keywords per request and returns search volume, monthly searches, CPC, competition and search intent in one Live call. The Labs pricing page charges $0.012 for each request and $0.00012 for each item returned. For 1,000 returned items across two requests, the calculation is 2 x $0.012 plus 1,000 x $0.00012, or up to $0.144. This is a calculation from the listed rates, not a measured invoice. The same page says Labs data is refreshed on 30 to 90 day cycles for most endpoints.

Use the Google Ads endpoint when the job is to retrieve Keyword Planner volumes for a known keyword list. Consider Labs when the same workflow also needs intent, CPC, and competition and the refresh schedule is acceptable. Choose the data source first, then compare the cost for your actual batch size.

When free is enough

Use the manual or native API route when:

  • a CSV export covers the keyword research you do a few times a month
  • your Google Cloud project already has Basic or Standard access, you have checked its permitted uses on Google's access levels page, and you can use the Google Ads API
  • its production quota and the 1 request per second keyword planning limit on the API limits and quotas page (checked 31 October 2026) fit your workload

Pay for an API if:

  • you need volumes inside a product or client report on a schedule
  • you do not have, or do not want, a Google Ads account with billing set up
  • you want one bill and one auth method for volumes, SERPs and other SEO data

For the broader cost picture, including SERP request modes and parameters that change charges, see the separate DataForSEO pricing guide.

Sources

The Google and vendor documentation below was checked on 31 October 2026. The Reddit discussion provides context, the Sandbox row refers to the script run described above, and the Labs batch figure is calculated from the listed rates.

Fact Source URL Fetched
Keyword Planner entry points, monthly search estimates, billing information required for keyword suggestions, 80 characters and 10 words per keyword, sensitive categories often missing https://support.google.com/google-ads/answer/7337243?hl=en 2026-10-31
GenerateKeywordHistoricalMetrics, up to 10,000 keywords per request, up to 10 geo targets, average monthly searches, up to 4 years of monthly volumes, competition index 0 to 100, top of page bids, similar to Keyword Planner https://developers.google.com/google-ads/api/docs/keyword-planning/generate-historical-metrics 2026-10-31
Developer tokens sunset 9 September 2026, access per Google Cloud project, Test, Explorer, Basic, Standard limits, Explorer automated approval in most cases, KeywordPlanIdeaService restricted at Explorer level (Basic or Standard needed), permissible use https://developers.google.com/google-ads/api/docs/api-policy/access-levels 2026-10-31
Keyword planning methods limited to 1 request per second per customer ID, RESOURCE_EXHAUSTED https://developers.google.com/google-ads/api/docs/best-practices/quotas 2026-10-31
DataForSEO Google Ads data from Keyword Planner, up to 1,000 keywords per task, Standard $0.06 in 1 to 3 hours, Live $0.09 in up to 7 seconds, 12 Live requests per minute, identical data, restricted categories (weapons, tobacco, drugs, violence, terrorism) https://dataforseo.com/pricing/keywords-data/google-ads 2026-10-31
Product page per task rows: Standard $0.06, Live $0.09, matching the pricing page https://dataforseo.com/apis/google-ads-api 2026-10-31
task_post endpoint URL, Basic authorization, 1,000 keywords, 80 characters and 10 words, 4 years of history, 12 months by default, combined volume for similar keywords, location_name and language_code fields https://docs.dataforseo.com/v3/keywords_data/google_ads/search_volume/task_post/ 2026-10-31
Keyword Overview up to 700 keywords, returns search volume, monthly searches, CPC, competition, search intent https://docs.dataforseo.com/v3/dataforseo_labs/google/keyword_overview/live/ 2026-10-31
Labs $0.012 per task plus $0.00012 per item, 30 to 90 day update cycles https://dataforseo.com/pricing/dataforseo-labs/dataforseo-google-api 2026-10-31
Sandbox returns sample responses https://dataforseo.com/pricing 2026-10-31
task_get endpoint, charged only for posting, results free for 30 days https://docs.dataforseo.com/v3/keywords_data/google_ads/search_volume/task_get/ 2026-10-31
tasks_ready lists uncollected completed tasks, not charged, 20 calls a minute, 1,000 tasks within three days https://docs.dataforseo.com/v3/keywords_data/google_ads/search_volume/tasks_ready/ 2026-10-31
Status codes 20100 Task Created, 40601 Task Handed, 40602 Task in Queue https://docs.dataforseo.com/v3/appendix/errors/ 2026-10-31
Script run against the Sandbox: post 20100, task_get 20000, four sample rows, cost 0 Sandbox test log raw/sandbox-search-volume-lifecycle-test-20261031.log 2026-10-31
Google Trends API alpha announced July 24, 2025, consistently scaled search interest, 1,800 days, not absolute numbers, limited testers https://developers.google.com/search/blog/2025/07/trends-api 2026-10-31
Trends API alpha applications for testers https://developers.google.com/search/apis/trends 2026-10-31
Reddit question on paying third parties for search volume https://www.reddit.com/r/bigseo/comments/1ahzvhn/why_do_people_use_3rd_party_apis_for_search/ 2026-10-31
1 July 2026 price update https://dataforseo.com/update/pricing-update-in-dataforseo-apis 2026-10-31
Labs cost for 1,000 keywords up to $0.144 Calculation from the Labs rates: 2 x $0.012 + 1,000 x $0.00012 2026-10-31
AAdeptAds8h ago

Useful comparison. GenerateKeywordHistoricalMetrics is the right call once you're past a few hundred keywords. One gap worth flagging at that scale: raw search volume and competition index tell you which keywords matter, not how to group them. Once you've pulled back 5-10k keywords via the API, the next bottleneck is campaign structure: splitting by intent (brand / competitor / problem-solution / category) and match type, and deciding which keywords share a landing page. Skip that and one broad ad group ends up diluting Smart Bidding's signal no matter how good the volume data is. (Disclosure: I'm from AdeptAds, a Google Ads campaign builder; account's too new for links here, happy to share our free campaign-brief tool in a reply.)