Google Trends is one of the best free signals for demand: is a product category growing, which country searches for it most, and which queries are rising right now. Getting that data out of Google Trends is harder. The website gives you one small CSV per chart, and doing that by hand for 50 keywords is a lost afternoon.
This guide covers why exporting is awkward in 2026, how to export Trends data to CSV, JSON or Excel without code, and how to do the same from Python.
The problem: no open API, and pytrends is archived
There is still no generally available official API. In July 2025 Google announced a Google Trends API alpha. As of October 2026 it is still application-only: the page asks developers to apply as alpha testers, and Google has said it is onboarding a small group. If you have a research use case it is worth applying, but you can't count on access.
pytrends, the popular unofficial library, is no longer maintained. The GeneralMills/pytrends repository is archived, and the last PyPI release (4.9.2) is from April 2023. It can still work, but you are on your own with Google's frequent 429 Too Many Requests responses, changes to the internal endpoints, and proxy rotation.
Manual CSV downloads don't scale. Each chart on trends.google.com has its own download button, and every file has its own header layout.
One thing to remember whatever tool you use: Google Trends values are a relative index from 0 to 100, not search volumes. 100 is the peak popularity within that request (those keywords, that region, that time range). Change the comparison and the numbers change.
Option: a hosted Google Trends scraper
For this walkthrough I'll use Google Trends Scraper, an Actor on the Apify platform (disclosure: built by CleanData Labs). It reads the same public data you see on trends.google.com and returns:
- interest over time (with
isPartialflags and per-keyword averages), - interest by region (country, state, city or US metro),
- related queries and related topics (top and rising, with a numeric
growthPercentand anisBreakoutflag), - daily Trending Now searches per country.
It goes through Apify Proxy by default and retries rate-limited requests with a new session and a new IP. If the proxy isn't available to your account, it carries on without it instead of failing the run. Anything that still fails ends up in the dataset as an error row with a plain-English reason (and isn't charged), so nothing silently disappears.
Pricing: $0.0025 per result, where one result is a complete data block (for example, a full 12-month timeline or a full region table), not one row per date. Error rows and "no data" rows are free, and Apify adds a $0.00005 Actor start fee per run. Apify's free plan includes $5 of monthly credit, so you can try it without paying. If you want a hard limit, set a maximum cost per run in the run options; the Actor stops cleanly when it gets there.
Step-by-step: export Google Trends data in Apify Console
- Open the Actor page and click Try for free. Sign in or create a free Apify account.
- In Keywords / search terms, replace the example terms (
chatgpt,gemini) with your own, e.g.electric bikeande-scooter. You can also paste a full chart link into Google Trends URLs; the keywords, country, time range, category and property are read from the URL. If you only want the URL, clear the keyword list, otherwise the example keywords run too. - Turn on Compare keywords together if you want the keywords on one shared 0–100 scale (up to 5 per comparison, like on the website). Leave it off to get a separate chart for each keyword. If you compare more than 5, the Actor splits them into groups of 5, and each group gets its own scale (see the anchor-term tip below).
- Set Countries / regions (it starts with
US; use e.g.GB, orUS-CAfor California; leave it empty for worldwide). You don't have to be strict about the format:usbecomesUSandUKbecomesGB. Then pick a Time range, such as Past 12 months, or use Custom time range (optional) for exact dates like2025-01-01 2025-12-31(2025-01-01 to 2025-12-31works too). If a code is invalid, you get an error row that says so instead of a silent empty result. - Tick the data you need: Interest over time, Interest by region, Related queries (top + rising), Related topics (top + rising). (Google only returns related topics for single-keyword queries, so leave Compare off if you need them.) For daily trending searches, add country codes to Trending Now countries.
- If you plan to open the file in Excel or Google Sheets, turn on Flatten output (CSV / Sheets friendly). Each date or region then becomes its own row instead of a nested array. The price stays the same, because billing counts data blocks, not rows.
- Click Start. A small run like this usually finishes in well under a minute. Open the Output tab and export as JSON, CSV, Excel, XML or HTML.
Every interest and related-queries/topics row includes a trendsUrl, so you can open the same chart on trends.google.com and check it. Trending Now rows have an exploreUrl instead.
What the output looks like
Here is a shortened interest-over-time row from a real run (US, past 12 months, the two keywords compared):
{
"type": "interest_over_time",
"keywords": ["electric bike", "e-scooter"],
"geo": "US",
"timeRange": "today 12-m",
"timeline": [
{"date": "Oct 26 – Nov 1, 2025", "timestamp": 1761436800, "isPartial": false, "electric bike": 13, "e-scooter": 0},
{"date": "Nov 2 – 8, 2025", "timestamp": 1762041600, "isPartial": false, "electric bike": 16, "e-scooter": 1}
],
"averages": {"electric bike": 31, "e-scooter": 1},
"pointCount": 53
}
And one entry from the "rising" list of a related-queries row from the same run:
{"rank": 2, "query": "yozma", "value": 4100, "formattedValue": "+4,100%", "isBreakout": false, "growthPercent": 4100}
"Breakout" entries (growth over 5,000%) come with isBreakout: true and growthPercent: null, so you can filter them without parsing strings. In this run, "yozma in 10" was the breakout for "electric bike".
Python example with apify-client
To automate this, install the official client (pip install apify-client) and get your API token from Settings → API & Integrations in Apify Console. I tested this with apify-client 3.4:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"keywords": ["electric bike", "e-scooter"],
"compareKeywords": True,
"geos": ["US"],
"timeRange": "today 12-m",
"interestOverTime": True,
"interestByRegion": True,
"regionResolution": "REGION",
"relatedQueries": True,
}
run = client.actor("cleandata-labs/google-trends-explorer").call(run_input=run_input)
for item in client.dataset(run.default_dataset_id).iterate_items():
if item["type"] == "interest_over_time":
for point in item["timeline"]:
print(point["date"], point["electric bike"], point["e-scooter"])
That run returned four results: one timeline, one table of 51 US regions, and one related-queries list per keyword, so it cost about $0.01. To cap spend from code, pass max_total_charge_usd=Decimal("0.50") (from decimal import Decimal) to .call().
To get a CSV file directly, call the dataset items endpoint with format=csv, for example https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv. Combine it with flattenOutput: true for clean columns. With the JavaScript client the same call is client.actor("cleandata-labs/google-trends-explorer").call(input).
Tips for comparing keywords
-
Compare in one request. Values from separate requests are each scaled to their own peak, so "62" in one chart and "62" in another are not comparable. Put the terms in one comparison (
compareKeywords: true). - Use an anchor term for more than 5 keywords. Split them into groups of 4 plus one shared reference keyword, then rescale each group by the anchor's values.
-
Watch the last data point. Points with
isPartial: truecover a period that hasn't ended yet and usually look lower than they will end up. -
Use topics for ambiguous words. Turn on Keyword / topic suggestions to get Google's topic IDs (e.g.
/m/...). Topics group spellings and languages; plain search terms don't. - Look at the scale. In the run above, "e-scooter" averaged 1 next to "electric bike". That doesn't mean nobody searches for it. Next to a much bigger term, small ones get rounded down toward 0.
Tips for regional data
- Use ISO codes in Countries / regions:
DEfor Germany,US-TXfor Texas. -
Region resolution controls the breakdown:
COUNTRY(worldwide),REGION(states/provinces),CITY, orDMA(US metro areas). - Keep Only regions with data on (the default) to drop regions where Google reports nothing.
- Region values are relative too: 100 is the region with the highest share of searches for the term, not the most searches.
- Apify Proxy is on by default. For bigger runs (more than about 20 queries), switch the proxy group to Residential, because Google rate-limits busy datacenter IPs. If the log shows a lot of retries, raise Delay between requests (s) from the default 1 second.
Using it from an AI agent (MCP)
If you'd rather ask "is interest in e-bikes growing in Germany?" than click through a form, the same Actor works as a tool for Claude, ChatGPT, Cursor, VS Code or any other MCP client, through Apify's MCP server:
https://mcp.apify.com?tools=cleandata-labs/google-trends-explorer
It's also listed in the official MCP Registry as io.github.CleanData-Labs/google-trends-explorer. On first connect your client opens the Apify sign-in (or you can send Authorization: Bearer <APIFY_TOKEN>). In Cursor, for example, put this in .cursor/mcp.json:
{
"mcpServers": {
"google-trends": { "url": "https://mcp.apify.com?tools=cleandata-labs/google-trends-explorer" }
}
}
In Claude Code it's one line: claude mcp add --transport http google-trends "https://mcp.apify.com?tools=cleandata-labs/google-trends-explorer".
Most runs finish in 5–10 seconds, so the agent gets the data within a single tool call, at the same $0.0025 per result. Tip for prompts: say "on one scale" when you compare terms, so the agent sets compareKeywords: true.
Wrapping up
Until Google's official API is widely available, you can choose between doing it by hand, maintaining a scraper yourself, or using a hosted one. If you just need clean JSON or CSV for a list of keywords, a hosted Actor like Google Trends Scraper is quick to set up. You can schedule it in Apify Console, connect it to Google Sheets, Make, Zapier or n8n, or hand it to an AI agent over MCP. If you're feeding web content into an LLM or RAG pipeline next, I wrote a companion guide: How to convert web pages and PDFs to clean Markdown for LLMs and RAG.
Whatever tool you use, the data is the public, aggregated information Google shows on its website. Check Google's terms and the rules that apply to your use.
Top comments (0)