Google Trends Scraper & API: Interest, Regions & Queries
Pricing
from $0.60 / 1,000 trends reports
Google Trends Scraper & API: Interest, Regions & Queries
Google Trends scraper and unofficial Google Trends API, no API key: interest over time, interest by country/region/city, related queries & topics (top, rising, Breakout), compare up to 5 terms. Any geo, time range, category, Web/Images/News/YouTube/Shopping. JSON/CSV/Excel.
Pricing
from $0.60 / 1,000 trends reports
Rating
0.0
(0)
Developer
jules imbert
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
Google Trends Scraper & API: interest over time, regions, related queries & comparisons
Google Trends Scraper extracts data from Google Trends without an API key or a browser. Use it as an unofficial Google Trends API: call it from Python, JavaScript, Make, Zapier, n8n or an AI agent and get JSON, CSV or Excel. Enter keywords (or paste Google Trends URLs), pick a country, time range, category and Google property, and you get back:
- 📈 Interest over time: the 0–100 index Google charts, plus a computed average, peak and latest value per term
- 🗺️ Interest by region: countries, subregions (states/regions) or US metro areas (DMA)
- 🔎 Related queries: Top and Rising, with
+850%growth values and Breakout flags - 🧩 Related topics: Top and Rising, when Google returns them (see Limitations)
- ⚖️ Comparison of up to 5 terms on the same 0–100 scale, over time and by region
It's built to be a reliable, well-documented alternative to the existing Google Trends scrapers. It uses residential proxies, rotates IP and cookie on every HTTP 429, retries with exponential backoff, and handles Google's explore → token → widget flow. Every report has a status and an errors list, so you can see what happened instead of getting an empty dataset.
Why use this Google Trends scraper?
| This Actor | |
|---|---|
| Rate limits (HTTP 429) | Fresh residential IP + cookie on every 429/block, exponential backoff (1 s → 30 s) with jitter, up to 8 retries per request (configurable) |
| Cost model | One charge per report, not per row. A 12-month report with 53 weekly points, 22 regions and 35 related queries is billed as 1 event, in structured or flat mode |
| Failed / empty reports | Never charged |
| Output formats | Structured JSON (one item per term) or flat rows ready for Excel/CSV/BI, plus all reports in the OUTPUT record |
| Transparency | status, errors, dataQualityNotes and googleUserType on every report; RUN_STATS record with request / 429 / session counts |
| Inputs | Keywords, topic IDs (/m/…) or pasted Google Trends URLs |
| Filters | Any geo (country, region, US metro), 9 time presets + custom dates + hourly custom ranges, category, Web / Images / News / YouTube / Google Shopping, language, timezone |
What can you use Google Trends data for?
- SEO & content planning: find rising queries and breakout topics before competitors do
- Market research: compare products, brands or technologies (
revitvsarchicadvsautocad) - Seasonality: plan campaigns and stock levels using 5-year or since-2004 weekly/monthly curves
- Local marketing: see which states, regions or metros search most for your product
- YouTube & Shopping research: switch the property to measure YouTube or Google Shopping searches
- Dashboards & AI agents: schedule runs and push flat rows to Google Sheets, BigQuery, Looker Studio or an LLM pipeline through the Apify API
How to scrape Google Trends
- Click Try for free / Start.
- Enter one or more search terms (e.g.
bim,revit), or paste Google Trends URLs. - Choose a location (empty = Worldwide), a time range, and optionally a category and property.
- Tick Compare terms if you want them on the same scale.
- Pick a dataset format: structured (per term) or flat rows.
- Run it, then download the results as JSON, CSV, Excel, XML or HTML, or fetch them through the API.
Input example
{"searchTerms": ["bim", "revit"],"geo": "FR","timeRange": "today 12-m","category": 0,"property": "web","compareTerms": true,"outputFormat": "perTerm"}
Main input fields
| Field | Description |
|---|---|
searchTerms | Keywords or topic IDs. Each term is one report. |
startUrls | Google Trends explore URLs; q, geo, date, cat, gprop, hl are read from each URL. |
geo | "" = Worldwide, US, FR, US-CA, FR-IDF, US-NY-501… |
timeRange | now 1-H, now 4-H, now 1-d, now 7-d, today 1-m, today 3-m, today 12-m, today 5-y, all, or custom (+ startDate / endDate). |
customTimeRange | Raw Google value, e.g. 2024-01-01 2024-06-30 or hourly 2026-10-20T08 2026-10-21T20. |
category | Google Trends category ID (0 = all). E.g. 12 Business & Industrial, 5 Computers & Electronics, 958 Jobs & Education, 29 Real Estate. |
property | web, images, news, youtube, froogle (Google Shopping). |
language | hl parameter (e.g. en-US, fr), used for region names and labels. |
regionResolution | auto, COUNTRY, REGION, CITY, DMA. |
compareTerms | Adds one comparison report per group of up to 5 terms. |
outputFormat | perTerm (structured) or flat (one row per data point). |
filterUnrelatedRisingQueries | Moves rising queries that share no word with the term or its top queries into relatedQueriesRisingFiltered. |
proxyConfiguration | Defaults to Apify RESIDENTIAL proxy (recommended). |
Output
Structured output (one item per term)
Real output from a test run (revit, France, past 12 months; arrays shortened):
{"type": "term","searchTerm": "revit","geo": "FR","timeRange": "today 12-m","resolvedTimeRange": "2025-10-27 2026-10-27","category": 0,"property": "web","language": "en-US","trendsUrl": "https://trends.google.com/trends/explore?q=revit&geo=FR&date=today+12-m&hl=en-US","averageValue": 71.49,"peak": { "date": "2025-11-23T00:00:00.000Z", "value": 100 },"latest": { "date": "2026-10-18T00:00:00.000Z", "value": 66 },"interestOverTime": [{ "date": "2025-10-26T00:00:00.000Z", "timestamp": 1761436800, "formattedTime": "Oct 26 – Nov 1, 2025", "isPartial": false, "value": 81, "hasData": true }],"regionResolution": "REGION","interestByRegion": [{ "geoCode": "FR-J", "geoName": "Île-de-France", "value": 100, "formattedValue": "100", "hasData": true },{ "geoCode": "FR-V", "geoName": "Rhone-Alpes", "value": 71, "formattedValue": "71", "hasData": true }],"relatedQueriesTop": [{ "query": "revit 2026", "value": 100, "formattedValue": "100", "link": "https://trends.google.com/trends/explore?q=revit+2026&date=today+12-m&geo=FR", "isBreakout": false }],"relatedQueriesRising": [{ "query": "revit 2027", "value": 111950, "formattedValue": "Breakout", "link": "https://trends.google.com/trends/explore?q=revit+2027&date=today+12-m&geo=FR", "isBreakout": true },{ "query": "revit 2026", "value": 850, "formattedValue": "+850%", "link": "https://trends.google.com/trends/explore?q=revit+2026&date=today+12-m&geo=FR", "isBreakout": false }],"relatedTopicsTop": [],"relatedTopicsRising": [],"googleUserType": "USER_TYPE_SCRAPER","dataQualityNotes": ["Related topics: Google returned an empty list (it currently withholds topics from automated sessions flagged USER_TYPE_SCRAPER)."],"status": "ok","errors": [],"scrapedAt": "2026-10-27T11:52:52.139Z"}
Comparison output (compareTerms: true)
{"type": "comparison","searchTerms": ["bim", "revit"],"geo": "FR","averages": { "bim": 73, "revit": 68 },"interestOverTime": [{ "date": "2025-10-26T00:00:00.000Z", "formattedTime": "Oct 26 – Nov 1, 2025", "isPartial": false, "values": { "bim": 79, "revit": 77 } }],"interestByRegion": [{ "geoCode": "FR-A", "geoName": "Alsace", "values": { "bim": 64, "revit": 36 }, "hasData": true }]}
Flat output (outputFormat: "flat")
One row per data point, with a recordType column: interest_over_time, interest_by_region, related_query, related_topic, comparison_over_time, comparison_by_region (plus error / no_data rows). Every row repeats searchTerm, geo, timeRange, category, property, trendsUrl and scrapedAt, so you can filter or pivot it in Excel or SQL without joins. Ready-made dataset views: Interest over time, Interest by region, Related queries, Related topics.
{ "recordType": "related_query", "searchTerm": "revit", "rankType": "top", "rank": 22, "query": "sketchup", "value": 9, "formattedValue": "9", "isBreakout": false, "geo": "US", "timeRange": "today 12-m", "property": "web" }{ "recordType": "interest_by_region", "searchTerm": "revit", "regionCode": "574", "regionName": "Johnstown-Altoona PA", "regionResolution": "DMA", "value": 22, "geo": "US" }
All structured reports are also saved to the key-value store record OUTPUT, and run diagnostics (requests, 429s, sessions, charged events) to RUN_STATS.
How much does it cost to scrape Google Trends?
This Actor uses pay-per-event pricing. You pay for reports delivered with data, never for failed or empty ones:
| Apify plan | Price per report | Per 1,000 reports |
|---|---|---|
| Free | $0.0027 | $2.70 |
| Starter (Bronze) | $0.0009 | $0.90 |
| Scale (Silver) | $0.00065 | $0.65 |
| Business (Gold) and above | $0.0006 | $0.60 |
A report = one search term with every section you enabled (or one comparison group of up to 5 terms). In flat mode a report can produce hundreds of rows and is still one event. Silver and Gold+ prices above apply since 28 October 2026 (they were $0.00045 and $0.00027 while platform usage was billed separately). No platform-usage fee on top: compute and residential proxy traffic are included in the report price. With the Apify Free plan's monthly $5 credit that's roughly 1,800 reports per month at the Free rate.
You can cap spending with Maximum cost per run on the run options. The Actor checks the cap before it starts and stops cleanly when it's reached.
Known limitations (honest list)
Google treats every automated session the same way (the explore response tags it USER_TYPE_SCRAPER, even with residential IPs or a real headless Chrome), and in 2026 it withholds some data from those sessions:
- Related topics usually come back as an empty list. The Actor still asks for them and returns them when Google sends them. An empty topics list is noted in
dataQualityNotesand is never billed on its own. - City-level interest by region returns no values. If you choose
CITY, the Actor automatically falls back to subregions (or US metros/DMA for US geos) and tells you so indataQualityNotes. - Rising queries can contain a few unrelated entries for automated sessions. Enable
filterUnrelatedRisingQueriesto move suspicious ones to a separate list for review (nothing is deleted). - Google Trends values are relative (0–100), not absolute search volumes. Values are only comparable within the same report or comparison group.
Interest over time, interest by region (country / subregion / DMA), top related queries and comparisons returned full data in all our test runs (France, US and Worldwide).
Tips for reliable runs
- Keep the default RESIDENTIAL proxy. Datacenter IPs get HTTP 429 from Google much more often.
maxConcurrency3–5 is a good balance. Higher is faster but triggers more 429s (which are retried automatically).- For hundreds of terms, split them into scheduled runs. Each report is independent, so a single failure never breaks the run.
- To compare more than 5 terms on one scale, include a common anchor term in every group of 5.
Integrations & API
Use the API tab for ready-made code (Node.js, Python, cURL) or call the Actor from Make, Zapier, n8n, Google Sheets, Slack, Airbyte and MCP-compatible AI agents. Example with the Apify Python client:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("capable_coach/google-trends-scraper").call(run_input={"searchTerms": ["bim", "revit"], "geo": "US", "timeRange": "today 5-y", "compareTerms": True})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["type"], item.get("searchTerm"), item.get("averageValue"))
FAQ
Is scraping Google Trends legal? This Actor only collects aggregated, anonymous, publicly visible statistics from Google Trends. It doesn't collect personal data. You're responsible for using the data in line with Google's terms and your local laws.
Why does a value say <1 or 0? Google returns 0 when a term has too little volume for that point or region. Enable Include low-search-volume regions to keep those regions.
Why are my numbers different from yesterday? Google Trends computes values from a sample of searches, so small variations between runs are normal (the same is true on the website).
Can I use a topic instead of a keyword? Yes. Paste the topic ID (the /m/… or /g/… value from a Google Trends topic URL) as a search term, or paste the Google Trends URL of the topic.
Something broke? Open an issue on the Issues tab with your run ID and input.
Other Actors by the same developer
- ATS Jobs Scraper: Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Personio.
- Workday Jobs Scraper: any myworkdayjobs.com career site.
- France Public Tenders Scraper (BOAMP): French public procurement notices.
- SAM.gov Contract Opportunities: US federal tenders and awards.