Google Trends Scraper - Interest Over Time, Region & Queries avatar

Google Trends Scraper - Interest Over Time, Region & Queries

Pricing

from $2.80 / 1,000 search term results

Go to Apify Store
Google Trends Scraper - Interest Over Time, Region & Queries

Google Trends Scraper - Interest Over Time, Region & Queries

For SEO teams, market researchers and AI agents: Google Trends for up to 5 terms compared on one 0-100 scale - interest over time, by region, and top and rising related queries. One term took 3.8-6.7 s, 30 terms 54 s, no browser. Watch mode returns only new data points; unanswerable terms are free.

Pricing

from $2.80 / 1,000 search term results

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Share

Get Google Trends data for your keywords in seconds: interest over time, interest by region, and top and rising related queries, one clean row per search term. Compare up to 5 terms on the same 0-100 scale, exactly like the Google Trends comparison view. Built for SEO and content teams, market researchers, dashboards and AI agents that call Google Trends from code or on a schedule.

  • Fast. No browser. A one-term run took 3.8-6.7 s of run time in production (256 MB); 30 terms took 54 s.
  • Terms Google cannot answer are free, with the reason. A term with too little search volume, a request Google rejects (for example an unknown country code) or a request Google refuses comes back as a free row that says why. If Google refused every term or none could be read (blocked, unreadable or timed out), the run is not charged and ends with an error so your schedule sees it. A run whose terms were only rejected (HTTP 400) or had no data ends normally with those free rows and is not charged either.
  • Retries on Google's rate limit. Requests go out directly first; when Google answers HTTP 429 or 403, the request is sent again from another IP address through Apify's US residential proxy (up to 6 attempts per request). Check pages and CAPTCHAs are never solved.
  • Compare terms. Turn on compareTerms and the terms share one scale (100 = the highest point of any term in the group), so the values of different terms can be compared directly instead of each term peaking at its own 100.
  • Watch mode for schedules. With onlyChanges, later runs return a term only when Google Trends has a new complete data point since the last run; everything else is one free no-change row.
  • Extra columns Google does not give you directly: latest value and whether it is a partial (still counting) period, last complete value, change from the previous complete point, average, peak value and date, top region.

Unofficial. Uses the same public, logged-out data the Google Trends website loads. No login and no Google account needed.

What you get

One row per search term. Example (production run 0x7mZVKqy5460YfyQ, 2026-09-24, apify in the US, past 12 months, lists shortened to their first entries):

{
"status": "ok",
"changeType": null,
"searchTerm": "apify",
"comparedWith": [],
"geo": "US",
"timeRange": "today 12-m",
"timeRangeResolved": "2025-09-24 2026-09-24",
"resolution": "WEEK",
"trendsUrl": "https://trends.google.com/trends/explore?date=today%2012-m&geo=US&q=apify&hl=en-US",
"latestValue": 32,
"latestDate": "2026-09-20T00:00:00.000Z",
"latestIsPartial": true,
"lastCompleteValue": 34,
"lastCompleteDate": "2026-09-13T00:00:00.000Z",
"previousCompleteValue": 35,
"changeFromPrevious": -1,
"averageValue": 55.9,
"peakValue": 100,
"peakDate": "2026-06-07T00:00:00.000Z",
"topRegion": "Wyoming",
"topRegionCode": "US-WY",
"topRegionValue": 100,
"interestOverTime": [
{ "date": "2025-09-21T00:00:00.000Z", "label": "Sep 21 – 27, 2025", "value": 35, "isPartial": false }
],
"interestByRegion": [
{ "geoCode": "US-WY", "geoName": "Wyoming", "value": 100 },
{ "geoCode": "US-DC", "geoName": "District of Columbia", "value": 35 }
],
"relatedQueriesTop": [
{ "query": "apify scraper", "value": 100 },
{ "query": "api", "value": 59 }
],
"relatedQueriesRising": [
{ "query": "tavily", "growth": "Breakout", "value": 24350 },
{ "query": "composio", "growth": "Breakout", "value": 8750 }
],
"checkedAt": "2026-09-24T09:31:11.257Z"
}
ColumnMeaning
statusok for a result row. Other values are free rows (below)
changeTypeWatch mode only: first-check or changed. Null otherwise
searchTerm, comparedWithThe term, and the other terms of its comparison group (empty when not comparing)
geo, timeRange, timeRangeResolved, resolutionWhat was asked, the exact dates Google used, and the point size (MINUTE, EIGHT_MINUTE, HOUR, DAY, WEEK, MONTH)
category, searchTypeCategory ID and search type (web, images, news, youtube, shopping)
trendsUrlThe same query on the Google Trends website
latestValue, latestDate, latestIsPartialThe newest point. Google marks the current, still-counting period as partial
lastCompleteValue, lastCompleteDateThe newest point that is not partial
previousCompleteValue, changeFromPreviousThe complete point before it, and the difference
averageValue, peakValue, peakDateOver all points with data in the range
pointsCount, pointsWithDataNumber of points, and how many have data (Google leaves a point empty when volume is too low)
interestOverTimeEvery point: date (ISO, UTC), label (Google's label), value (0-100, null = no data), isPartial
interestByRegion, topRegion, topRegionCode, topRegionValue, regionResolution, regionsWithDataRegions with data, highest first: countries for worldwide, states or provinces for a country, metro areas for a US state
relatedQueriesTop, topQueriesCountGoogle's top related queries (value 0-100)
relatedQueriesRising, risingQueriesCountGoogle's rising related queries with growth as Google shows it (+250%, Breakout)
changes, isFirstCheck, previousCheckAtWatch mode: newCompletePoints since the last run, plus newRisingQueries and newTopQueries not seen in earlier runs of this watch
noteFree rows only: why nothing (or not everything) was returned
checkedAtTime of the check

Values are Google Trends' relative interest (0-100), not search volumes. Related topics are not included: on 2026-09-24 Google's endpoint for them returned an empty list for every term we tried outside the website.

Free rows (not charged)

statusWhen
no-dataGoogle Trends returned no data points for this term with these settings (too little search volume)
no-changeWatch mode: no new complete data point since the last run
partialThe interest over time was read, but interest by region or related queries could not be read. The row is returned with those columns null, free of charge, and watch mode does not remember it
rejectedGoogle answered HTTP 400: usually an unknown geo code, a date range Google does not accept, or a category number that does not exist
blockedGoogle refused every attempt, also from other IP addresses
unreadableGoogle's answer could not be read, or Google showed a check page (never solved, not retried)
bad-inputThe input could not be used; nothing was requested
timed-outThe run was about to reach its timeout, so it stopped asking Google Trends and returned the rows it already had. Run fewer terms per run or raise the timeout
budget-reachedThe run hit the maximum total charge you set. Terms not returned are not charged, and in watch mode not remembered, so the next run returns them

Input

FieldTypeDefaultDescription
searchTermsarray of stringscoffeeKeywords, up to 100 per run. Duplicates (ignoring case) are looked up once
compareTermsbooleanfalseCompare the terms together in groups of up to 5 on one scale
timeRangestringtoday 12-mnow 1-H, now 4-H, now 1-d, now 7-d, today 1-m, today 3-m, today 12-m, today 5-y, all
customTimeRangestring(none)2024-01-01 2024-12-31 style dates; overrides timeRange
geostringworldwideCountry (US, GB, JP) or region (US-CA, GB-ENG) code
categoryinteger0Google Trends category ID (the cat= number in a Google Trends URL); 0 = all
searchTypestringwebweb, images, news, youtube, shopping
includeInterestByRegionbooleantrueAdd interest by region
includeRelatedQueriesbooleantrueAdd top and rising related queries
onlyChangesbooleanfalseWatch mode (below)
watchNamestring(none)Separate memories for two schedules that watch the same terms. A watch remembers each term together with its comparison group, geo, time range, category and search type: changing any of them starts a new first check
resetMonitoringStatebooleanfalseForget this watch's memory at the start of the run

Example:

{ "searchTerms": ["iphone", "samsung galaxy", "google pixel"], "compareTerms": true, "geo": "US", "timeRange": "today 12-m" }

We opened the same 4 queries (bitcoin, iphone, taylor swift, python; US; past 12 months) in a browser on 2026-09-24 and compared them with a production run of this Actor:

  • Interest over time: the peak week was the same week in all 4, the shape correlated at 0.990-0.998, and single weeks differed by 0.8-2.1 points on average (at most 7). Google serves requests that do not come from its website from a separate sample, so a few points of difference are expected; the same request repeated from different IP addresses returned identical numbers (53 of 53 weeks).
  • Top region: the region this Actor reports first appeared on the page in all 4.
  • Rising related queries: Google samples them, so they change between requests (0-3 of the first 5 were also on the page). Use them as ideas, not as a stable ranking.

Watch mode

  1. Run once with onlyChanges: true and your terms: every term comes back with changeType: "first-check".
  2. Create a Schedule with the same input (daily for today 12-m or today 1-m, hourly for now 7-d).
  3. Later runs return a term only when Google Trends has a new complete data point since the last run (a new week for the 12-month range, a new day for 30 days, a new hour for 7 days). The row lists the new points in changes.newCompletePoints, and related queries this watch has not seen before in changes.newRisingQueries and changes.newTopQueries.

Related queries and regions alone never count as a change: Google samples them, and in production two requests 11 seconds apart returned the same interest over time but four different rising queries. A term without a new point comes back as one free no-change row.

Pricing

Pay per event:

  • Run start - charged once per run, only when at least one term was answered (a result row or a watch-mode no-change). Not charged when every term is no-data, partial, rejected, blocked, unreadable or timed-out, or when the run's maximum total charge has no room for the start fee plus one result row (then nothing is requested at all).
  • Search term result - one per ok row. Free rows are never charged.

The exact prices are shown on the Pricing tab.

Measured in production (2026-09-24, build 0.1, 256 MB)

InputResultRun time
{} (coffee, worldwide, 12 months)1 row, 53 weekly points6.7 s
apify, US1 row4.0 s
iphone, samsung galaxy, google pixel, compared, US3 rows on one scale3.8 s
taylor swift, travis kelce, now 7-d, watch mode2 first-check rows6.4 s
30 popular terms, one run30 rows, 121 requests, no retry needed54 s
coffee with geo ZZ1 free rejected row2.0 s

From inside Apify, direct requests, datacenter proxy and US residential proxy each returned the full data 6 of 6 times (2026-09-24).

Support

Found a term that returns something different from the Google Trends website, or need another field? Open an issue on the Issues tab with the input you used.