Google Trends Scraper: drop-in input, no browser avatar

Google Trends Scraper: drop-in input, no browser

Pricing

from $1.63 / 1,000 search term delivereds

Go to Apify Store
Google Trends Scraper: drop-in input, no browser

Google Trends Scraper: drop-in input, no browser

Google Trends per search term: interest over time, by subregion and city, and related queries. Takes the same input fields as Apify's Google Trends Scraper and returns the same row shape, so switching means changing only the actor ID. No browser, so no page timeouts. Pay per term.

Pricing

from $1.63 / 1,000 search term delivereds

Rating

0.0

(0)

Developer

Steadydata Team

Steadydata Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Google Trends per search term: interest over time, by subregion and city, and related queries. Takes the same input fields as Apify's Google Trends Scraper and returns the same row shape, so switching means changing only the actor ID. No browser, so no page timeouts. Pay per term.

Why this scraper

  • Drop-in for existing tasks and integrations. The input fields are searchTerms, isMultiple, timeRange, customTimeRange, geo, category, viewedFrom, startUrls and maxItems, and each row carries interestOverTime_timelineData, interestBySubregion, interestByCity, relatedQueries_top, relatedQueries_rising, relatedTopics_top and relatedTopics_rising in Google's own format. A schedule, a Make or Zapier step or a script that reads those fields keeps working when you point it at steadydata/google-trends-scraper.
  • No browser. The data comes from the same JSON endpoints the Google Trends page itself calls, over a fresh proxy session per term. There is no page to load, so there is no page-load timeout to hit.
  • A failed block never fails the row. If one block (say, cities) cannot be fetched, the row still arrives with the rest and notes says which block is missing and why, instead of leaving a silent empty list.
  • You only pay for delivered terms. A term Google has no data for comes back as a free error row with a reason.

Who this is for

  • Teams whose Google Trends schedule, task or integration is built on the field names above and who want it to keep running.
  • Marketers, SEO and content teams tracking interest in topics, brands or products over time and by place.
  • Analysts and AI agents that need Google Trends as structured JSON without running a browser.

Who this is not for

Read this before you buy. Google Trends values are relative: 100 is the peak within the chosen term, place and period, never a search volume. If you need absolute monthly search volumes, this is the wrong tool. Related topics are not delivered: Google only serves them to its own Trends page after a reCAPTCHA check, and to every other request it returns an empty list (measured on 24 popular terms on 03-10-2026 and traced on 05-10-2026). This actor does not get around that check, so relatedTopics_top and relatedTopics_rising stay empty with a note. Related queries do come in full. If your workflow depends on related topics, this actor does not cover it. The spreadsheet input of the other actor (spreadsheetId) is accepted but not read: paste the terms into searchTerms.

Input fields

FieldTypeRequired or defaultWhat it does
searchTermslist of textOne row per search term. With 'Compare terms' switched on, a comma-separated entry such as 'tea, coffee' is compared in one chart. Max 200 per run.
isMultipletrue/falsefalseTreat a comma-separated entry as up to five terms compared in one chart, like the comparison on the Google Trends site.
timeRangetext (, 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)Period of the interest-over-time series. Empty means the past 12 months.
customTimeRangetextOverrides the time range. Format 'YYYY-MM-DD YYYY-MM-DD', for example '2024-01-01 2024-12-31'.
geotextTwo-letter country code such as US, NL or DE, or a region code such as US-CA. Empty for worldwide. Inside a country you also get interest by subregion and by city.
categorytextGoogle Trends category ID, for example 3 for Arts & Entertainment or 47 for Autos & Vehicles. Empty for all categories.
viewedFromtextLanguage code for Google's formatted labels, for example en-US or de. Empty for English.
startUrlslist of textPaste explore URLs from trends.google.com; the term, country, period and category are read from the URL.
maxItemsnumber0Stop after this many search terms and URLs together. 0 means no limit (max 200 per run).
spreadsheetIdtextAccepted for compatibility and ignored: paste the terms into 'Search terms' instead.
skipDebugScreentrue/falseAccepted for compatibility; this actor uses no browser.
maxConcurrencynumberAccepted for compatibility; concurrency is managed by the actor.
maxRequestRetriesnumberAccepted for compatibility; every term gets three proxy sessions.
pageLoadTimeoutSecsnumberAccepted for compatibility; this actor loads no pages.

Input example

{
"searchTerms": ["web scraping", "electric bike"],
"timeRange": "today 3-m",
"geo": "US"
}

Comparing terms in one chart, or starting from a Google Trends URL:

{
"searchTerms": ["tea, coffee"],
"isMultiple": true,
"startUrls": [{"url": "https://trends.google.com/trends/explore?q=bike&geo=NL&date=today%201-m"}]
}

Output example

FieldTypeWhat it holdsExample
inputUrlOrTermtextThe search term or Google Trends URL exactly as it was given in the input.web scraping
searchTermtextThe term that was measured; with 'Compare terms' the comma-separated list.web scraping
geotextCountry or region code the interest was measured in, or 'worldwide'.US
timeRangetextThe period in Google's own notation, for example 'today 3-m' or '2024-01-01 2024-12-31'.today 3-m
categorynumberGoogle Trends category ID; 0 means all categories.0
interestOverTime_timelineDatalistThe graph as data, in Google's own format: time (Unix seconds), formattedTime, value (0 to 100, one per compared term), hasData.[{"time": "1783036800", "formattedTime": "Jul 3, 2026", "...
interestOverTime_averageslistAverage per compared term; Google only returns it when terms are compared.
interestBylistWorldwide: score per country, highest is 100.
interestBySubregionlistInside a country: score per state or province.[{"geoCode": "US-MD", "geoName": "Maryland", "value": [10...
interestByCitylistInside a country or region: score per city.
relatedTopics_toplistTopics most searched together with the term.
relatedTopics_risinglistTopics whose search together with the term grew fastest.
relatedQueries_toplistSearches most made together with the term.[{"query": "web scraping api", "value": 100, "formattedVa...
relatedQueries_risinglistSearches that grew fastest, with their growth.
noteslistWhy a block is empty, when it is: Google returned nothing for it, or the block could not be fetched.

One row per term (lists shortened; a real row for this term held 93 time points, 51 states, 200 cities, 25 top and 14 rising related queries):

{
"inputUrlOrTerm": "web scraping",
"searchTerm": "web scraping",
"status": "ok",
"geo": "US",
"timeRange": "today 3-m",
"category": 0,
"interestOverTime_timelineData": [
{"time": "1783036800", "formattedTime": "Jul 3, 2026", "formattedAxisTime": "Jul 3",
"value": [77], "hasData": [true], "formattedValue": ["77"]}
],
"interestOverTime_averages": [],
"interestBy": [],
"interestBySubregion": [
{"geoCode": "US-MD", "geoName": "Maryland", "value": [100], "formattedValue": ["100"],
"maxValueIndex": 0, "hasData": [true]}
],
"interestByCity": [],
"relatedTopics_top": [],
"relatedTopics_rising": [],
"relatedQueries_top": [
{"query": "web scraping api", "value": 100, "formattedValue": "100", "hasData": true,
"link": "/trends/explore?q=web+scraping+api&date=today+3-m&geo=US"}
],
"relatedQueries_rising": [],
"notes": ["relatedTopics: Google returned an empty list for this term"]
}

Which regional block is filled depends on geo: worldwide gives interestBy (per country); inside a country you get interestBySubregion and interestByCity; inside a region such as US-CA you get interestByCity.

Pricing

Pay per event: one trend-fetched event per delivered term, a flat price that includes every block of the row. No charge for terms Google has no data for, and no separate platform-usage surcharge.

Free Apify plan: this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. Any paid Apify plan runs it at full size, billed per delivered row, with failed rows never charged.

Reviews: if this actor saves you time, a short review on this page is the one thing that helps most.

FAQ

Do I have to change my input to switch? No. The same field names are accepted, including the ones that only made sense for a browser (maxConcurrency, maxRequestRetries, pageLoadTimeoutSecs, skipDebugScreen); those are ignored.

Is the output really the same? The blocks carry the same names and Google's own format inside them. Each row also has status, geo, timeRange, category and notes, which you can ignore.

How do I compare terms? Switch on isMultiple and put up to five terms comma-separated in one entry. Related topics and queries are per term, so run the terms separately when you need those.

Why is a block empty? Read notes on the row. Related queries are missing for terms with little volume, related topics are currently empty for every term (see above), and averages only come when terms are compared.