Google Trends Scraper & API: Interest, Regions & Queries avatar

Google Trends Scraper & API: Interest, Regions & Queries

Pricing

from $0.60 / 1,000 trends reports

Go to Apify Store
Google Trends Scraper & API: Interest, Regions & Queries

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

jules imbert

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

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.


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 modelOne 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 reportsNever charged
Output formatsStructured JSON (one item per term) or flat rows ready for Excel/CSV/BI, plus all reports in the OUTPUT record
Transparencystatus, errors, dataQualityNotes and googleUserType on every report; RUN_STATS record with request / 429 / session counts
InputsKeywords, topic IDs (/m/…) or pasted Google Trends URLs
FiltersAny geo (country, region, US metro), 9 time presets + custom dates + hourly custom ranges, category, Web / Images / News / YouTube / Google Shopping, language, timezone
  • SEO & content planning: find rising queries and breakout topics before competitors do
  • Market research: compare products, brands or technologies (revit vs archicad vs autocad)
  • 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
  1. Click Try for free / Start.
  2. Enter one or more search terms (e.g. bim, revit), or paste Google Trends URLs.
  3. Choose a location (empty = Worldwide), a time range, and optionally a category and property.
  4. Tick Compare terms if you want them on the same scale.
  5. Pick a dataset format: structured (per term) or flat rows.
  6. 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

FieldDescription
searchTermsKeywords or topic IDs. Each term is one report.
startUrlsGoogle 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…
timeRangenow 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).
customTimeRangeRaw Google value, e.g. 2024-01-01 2024-06-30 or hourly 2026-10-20T08 2026-10-21T20.
categoryGoogle Trends category ID (0 = all). E.g. 12 Business & Industrial, 5 Computers & Electronics, 958 Jobs & Education, 29 Real Estate.
propertyweb, images, news, youtube, froogle (Google Shopping).
languagehl parameter (e.g. en-US, fr), used for region names and labels.
regionResolutionauto, COUNTRY, REGION, CITY, DMA.
compareTermsAdds one comparison report per group of up to 5 terms.
outputFormatperTerm (structured) or flat (one row per data point).
filterUnrelatedRisingQueriesMoves rising queries that share no word with the term or its top queries into relatedQueriesRisingFiltered.
proxyConfigurationDefaults 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.

This Actor uses pay-per-event pricing. You pay for reports delivered with data, never for failed or empty ones:

Apify planPrice per reportPer 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 dataQualityNotes and 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 in dataQualityNotes.
  • Rising queries can contain a few unrelated entries for automated sessions. Enable filterUnrelatedRisingQueries to 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.
  • maxConcurrency 3–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 ApifyClient
client = 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