Google Trends Scraper & API
Pricing
from $0.60 / 1,000 keyword results
Google Trends Scraper & API
Google Trends interest over time, by region, related queries and topics as JSON, CSV or Excel. Pay only for keywords that return data. No browser, never hangs, unlimited keywords on one scale, daily data over years, works with AI agents (MCP).
Pricing
from $0.60 / 1,000 keyword results
Rating
0.0
(0)
Developer
Abhishek Anand
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Share
Interest over time, interest by region, related queries and related topics from Google Trends, for one keyword or ten thousand. $1.50 per 1,000 keywords (down to $0.60 on paid Apify plans), compute included, and keywords that fail are free.
I built this after watching browser-based Trends scrapers run for twenty minutes and come back empty. This one talks to the same data endpoints the Trends website uses, so a keyword with all four sections usually takes 2 to 5 seconds and the run never hangs.
- Pay for results, not attempts. Every keyword gets a status row (
ok,partialorfailed). Onlyokkeywords are charged. - Compare more than 5 keywords on one scale. Google caps comparisons at 5. Normalize mode puts any number of keywords on a single 0–100 scale.
- Several countries in one run. List them in
geosand every keyword runs in each one. - Daily data over years. Google switches to weekly data after about 9 months. Daily mode stitches overlapping windows into one daily series.
- Bring your existing input. It accepts the input format of the official Apify Google Trends scraper, Trends URLs, and plain English ("United Kingdom", "past 90 days").
- Works from AI agents like Claude, ChatGPT and Cursor through Apify's MCP server.
How it compares
| Typical browser-based Trends scraper | This actor | |
|---|---|---|
| How it gets data | Loads trends.google.com in a headless browser | Calls Trends' data endpoints directly |
| Typical time per keyword | 30 s to several minutes, sometimes never | 2–5 s |
| Memory per run | 4 GB | 256 MB |
| Charged when a keyword fails | Often | Never |
| Keywords on one comparable scale | 5 | Unlimited (normalize mode) |
| Countries per run | 1 | Up to 50 |
| Daily data for ranges over 9 months | No | Yes (daily mode) |
| Compute cost | Added on top | Included in the price |
What it costs
| You run | You pay |
|---|---|
| 1 keyword, all sections | $0.0015, plus $0.001 if related topics come back |
| 100 keywords | $0.15 |
| 1,000 keywords | $1.50 |
| 10,000 keywords | $15 |
| 10 keywords in 5 countries | $0.075 (each keyword × country counts once) |
| A keyword that fails | $0 |
A few details, so nothing surprises you:
- Paid Apify plans pay less: $1.20 per 1,000 keywords on Bronze, $0.90 on Silver, and $0.60 on Gold, Platinum and Diamond. The table above uses the Free plan price.
- Related topics cost an extra $1 per 1,000 keywords, and only when Google actually returned topics. Fetching them needs a heavier request. If you don't need them, untick "Related topics" and you pay only the keyword price.
- Rows output (one row per date or region, for spreadsheets) adds $0.01 per 1,000 rows. The default nested output has no row charge.
- Max cost per run. Set one and the actor only starts keywords that fit inside it, then stops cleanly and tells you how many it skipped.
- Apify adds a tiny standard start fee, well under $0.001 per run.
Quick start
The simplest input:
{ "searchTerms": ["web scraping", "ai agents"], "geo": "US", "timeRange": "today 12-m" }
Compare streaming services on one scale (add as many as you like):
{ "searchTerms": ["netflix", "hulu", "disney plus", "max", "peacock", "paramount plus"], "mode": "normalize", "geo": "US", "sections": ["timeline"] }
The same keywords in three markets:
{ "searchTerms": ["electric bike", "cargo bike"], "geos": ["US", "GB", "Germany"], "timeRange": "today 12-m" }
Three years of daily data:
{ "searchTerms": ["black friday"], "customTimeRange": "2023-09-01 2026-09-30", "dailyResolution": true, "geo": "US" }
Paste Google Trends URLs:
{ "startUrls": [{ "url": "https://trends.google.com/trends/explore?q=tea,coffee&geo=GB&date=today%203-m" }] }
Plain English works too: "geo": "Germany", "timeRange": "past 7 days", "sections": ["timeline", "region"].
What you get
| Section | Contents |
|---|---|
| Interest over time | A 0–100 value per hour, day, week or month |
| Interest by region | Countries, states, US metro areas (DMA) or cities |
| Related queries | Top and rising, including Breakout terms |
| Related topics | Top and rising Knowledge Graph topics |
| Status | ok, partial or failed for every keyword, with the reason |
Sample item (default nested output)
Real output, trimmed to one entry per list:
{"keyword": "pixel phone", "geo": "GB", "timeRange": "today 3-m", "status": "ok", "resolution": "DAY","interestOverTime_averages": [58.66],"interestOverTime_timelineData": [{ "time": "1784332800", "date": "2026-07-18", "value": [53], "formattedValue": ["53"], "hasData": [true] }],"interestBy": [{ "geoCode": "GB-ENG", "geoName": "England", "value": [100], "formattedValue": ["100"], "hasData": [true] }],"relatedQueries_top": [{ "query": "google phone", "value": 100, "formattedValue": "100", "link": "https://trends.google.com/trends/explore?q=google+phone&date=today+3-m&geo=GB" }],"relatedQueries_rising": [{ "query": "google pixel phone price increase", "value": 12850, "formattedValue": "Breakout", "link": "https://trends.google.com/trends/explore?q=google+pixel+phone+price+increase&date=today+3-m&geo=GB" }],"relatedTopics_top": [], "relatedTopics_rising": [],"errors": [], "notes": [], "durationMs": 3032}
A Breakout query shows up as "formattedValue": "Breakout". Rows output adds an isBreakout column and an isPartial column, which flags the current, still-incomplete day or week.
Pick rows output if you're going straight into Excel, Google Sheets or a BI tool. You get one row per date, region or related item, with a type column to filter on.
Every run also saves a SUMMARY record with the success rate, requests, retries, proxy used and keywords charged.
Measured, not promised
| Test (Oct 2026, on Apify) | Result |
|---|---|
| 500 keywords, all sections | 500 of 500 returned data, about 0.6–0.9 s per keyword with 10 in parallel |
| Google throttling during that run | 35–39 rate limits out of about 3,200 requests, all retried automatically. It switched to residential proxies on its own when needed |
| Memory | Peak about 180 MB, even for 5 years of daily data |
| Platform restarts | Finished keywords are skipped on restart, unfinished ones resume, nothing is charged twice |
Switching from the official Apify scraper
Paste your existing input. These fields work the same: searchTerms, isMultiple, timeRange, customTimeRange, geo, category, startUrls, maxItems, viewedFrom, maxConcurrency, maxRequestRetries. skipDebugScreen and pageLoadTimeoutSecs are ignored because there's no browser. spreadsheetId isn't supported yet, so paste the terms instead.
Three output differences to check before you switch a pipeline:
- Region data is always in
interestBy(the official scraper splits it intointerestBySubregion,interestByCityorinterestByMetro). - Timeline points carry
date(YYYY-MM-DD or an ISO time) instead offormattedTime. - Related-item
linkvalues are full URLs.
Use it from code, AI agents and other tools
API. Start a run and get the results in one call:
curl -X POST "https://api.apify.com/v2/acts/curiousanand~google-trends-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTerms": ["tea", "coffee"], "geo": "GB", "timeRange": "past 90 days"}'
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("curiousanand/google-trends-scraper").call(run_input={"searchTerms": ["tea", "coffee"], "geo": "GB"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["keyword"], item["interestOverTime_averages"])
Claude, ChatGPT, Cursor and other agents (MCP). Add Apify's MCP server with just this tool:
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=curiousanand/google-trends-scraper" } } }
Then ask something like "Compare interest in Notion, Obsidian and Evernote in Germany over the past 5 years."
No code. Apify's integrations can send results to Google Sheets, Slack, Zapier, Make, n8n or a webhook when a run finishes. Add a Schedule for weekly tracking.
Want what's trending right now instead? Google Trends Trending Now Scraper with News returns the full Trending Now list for any country, with the news behind each trend.
FAQ
Is there an official Google Trends API? Google has an alpha API with limited access. Most people use the Trends website or a scraper like this one, which reads the same data the website shows.
How do I export Google Trends data to CSV or Excel? Run the actor, open the dataset and click Export. Choose rows output for one row per date or region, which opens cleanly in Excel and Google Sheets.
Why are related topics sometimes empty? Since September 2026 Google withholds related topics from automated requests. The actor fetches them through Google's embed widget instead, which has a per-IP quota. In my tests, residential proxies got topics for 10 of 10 keywords and the default datacenter proxies got them for 0 of 30. When topics are missing, the keyword's notes say why and the topics charge isn't applied. If topics matter to you, set the proxy to Residential.
Do I need a proxy or a Google account? You don't need a Google account. On Apify the default proxy is included in the price, and the actor switches to residential proxies by itself if Google starts blocking. If you run it somewhere without a proxy, Google will rate-limit you after a handful of keywords.
Can I compare countries? Yes. Put them in geos and each keyword runs in every country, with country in the geo field. Each country has its own 0–100 scale, as on the Trends website, so compare shapes and timing across countries rather than raw numbers. In normalize mode every country gets its own anchor unless you set anchorTerm.
How does normalize mode work? Your keywords go to Google in batches of 4, plus one anchor keyword that appears in every batch. The anchor's value in each batch puts all batches on one scale. Google rounds to whole numbers, so a keyword about 50 times smaller than the biggest one can't be measured precisely; those rows are marked precisionWarning: low-precision rather than showing false precision. Pick a medium-popular anchorTerm for the best results.
Is the data the same as on the Trends website? Yes, for the same query on the same day. Google samples its data, so values can move a little from one day to the next.
Is scraping Google Trends legal? The actor collects public, aggregated, anonymized data that anyone can see on trends.google.com. It doesn't touch personal data or log in anywhere. How you use the results is up to you.
Something isn't working? Open an issue on the Issues tab with your run link and I'll take a look.