Google Trends Scraper: Interest, Related Queries, Trending avatar

Google Trends Scraper: Interest, Related Queries, Trending

Pricing

from $0.27 / 1,000 result rows

Go to Apify Store
Google Trends Scraper: Interest, Related Queries, Trending

Google Trends Scraper: Interest, Related Queries, Trending

Google Trends interest over time, by region, related queries and topics for keywords, links or a country; $2.70 per 1,000 rows. Trending now lists, 12+ keywords on one scale, monitoring mode that returns only changes. Input names of the Apify-made scraper accepted, free error rows.

Pricing

from $0.27 / 1,000 result rows

Rating

0.0

(0)

Developer

Arcadium Data

Arcadium Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Give it keywords, a Google Trends link or a country and it returns Google Trends data as JSON: one row per keyword with interest over time, interest by region, related queries and related topics, or one row per live "Trending now" search. $2.70 per 1,000 rows on the free plan, less on paid plans. You pay only for rows you get.

Why this actor

  • Compares 12+ keywords on one scale in one run, not only Google's limit of 5.
  • Monitoring mode (onlyChanges): after a baseline, a keyword comes back only when a new rising query appears or interest moves; unchanged keywords are free.
  • Input names of the Apify-made Trends scraper work as they are (searchTerms, geo, timeRange...). That actor failed 21.5% of its runs over 30 days (Apify Store, 2026-10-28).
  • Free error rows with a code for every input that fails.

Built by Arcadium Data: public data, dated and agent-ready, never personal data.

Use with AI agents

Agents can call this actor directly (for example through the Apify MCP server). A minimal input example:

{ "searchTerms": ["electric car"], "geo": "US", "timeRange": "today 3-m", "includeGeo": false }

The dataset has one row per keyword. Read averageInterest for a quick answer, interestOverTime_timelineData[].value[0] for the curve, and relatedQueries_rising for what is taking off. To compare brands, use {"searchTerms":["nike","adidas","puma"],"compareKeywords":true} and compare averageInterest across rows. For a live list of what people are searching right now, use {"trendingGeos":["US"],"trendingHours":"4"}. Failures arrive as rows with rowType: "error" and a machine-readable code; they are free.

Connect it through the Apify MCP server (https://mcp.apify.com, actor arcadium/google-trends). Cost: $2.70 per 1,000 rows on the free plan, less on paid plans (see Pricing); error rows are free.

What you get

Every keyword is one row. The field names follow the well-known apify/google-trends-scraper, so a pipeline built for it keeps working (see "Switching from another Google Trends actor").

FieldWhat it holds
searchTerm, inputUrlOrTerm, geo, timeRange, category, propertyWhat was asked: keyword, what you typed, location, period (as Google writes it, for example today 12-m), category and search type.
interestOverTime_timelineDataThe timeline: one entry per point with time (Unix seconds), formattedTime, value (0-100), hasData, and isPartial on the unfinished last point.
averageInterestMean of the timeline values.
interestBy, interestBySubregion, interestByCity, interestByMetroInterest by place. Google picks the level: a worldwide search gives countries, a country search gives subregions or cities, a region search can give metro areas. The other lists are empty.
relatedQueries_top, relatedQueries_risingRelated search queries. Rising ones carry a formattedValue such as +250% or Breakout.
relatedTopics_top, relatedTopics_risingRelated topics, with Google's topic id and type.
scaleHow the values are scaled: single, compare (exact) or anchor (approximate), with the keywords, the anchor and the estimated error.
changeOnly in monitoring mode: what changed since the last run.
scrapedAtWhen the row was read.

"Trending now" rows look different: keyword, geo, searchVolume (lower bound of Google's bracket), increasePercent, startedAt, endedAt, active, relatedKeywords, categoryIds, articleCount, windowHours.

Output example:

{
"rowType": "trend",
"searchTerm": "coffee",
"geo": "US",
"timeRange": "today 12-m",
"averageInterest": 77.7,
"interestOverTime_timelineData": [
{ "time": "1760832000", "formattedTime": "Oct 19 – 25, 2025", "value": [63], "hasData": [true], "formattedValue": ["63"] }
],
"interestBySubregion": [{ "geoCode": "US-WY", "geoName": "Wyoming", "value": [100] }],
"relatedQueries_top": [{ "query": "coffee near me", "value": 100, "formattedValue": "100" }],
"relatedQueries_rising": [{ "query": "best coffee near me", "value": 160, "formattedValue": "+160%" }],
"scale": { "method": "single", "keywords": ["coffee"] }
}

Input

{
"searchTerms": ["electric car", "solar panels"],
"geo": "US",
"timeRange": "today 3-m"
}
FieldWhat it does
searchTermsKeywords, one row each.
startUrlsLinks copied from trends.google.com/trends/explore. Keywords, location, period and category come from the link. Several keywords in one link are compared on one scale.
geoUS, GB, DE, or a region like US-CA. Empty is worldwide.
timeRange, customTimeRangeA preset period, or an exact YYYY-MM-DD YYYY-MM-DD range.
category, propertyRestrict to a Trends category, or measure image, news, YouTube or shopping search.
compareKeywords, anchorKeywordPut all search terms on one scale (see below).
includeRelatedQueries, includeRelatedTopics, includeGeoSwitch sections off to save requests. All on by default.
onlyChanges, changeThreshold, stateNameMonitoring mode (see below).
trendingGeos, trendingHoursAdd the "Trending now" list for these countries.
spreadsheetIdRead search terms from the first column of a public Google Sheet.
maxItemsStop after this many rows.
includeErrorRowsFree rows that explain what failed. On by default.

More than five keywords on one scale

Google Trends compares at most five keywords at a time and scales each request to its own peak, so numbers from two requests cannot be compared directly. Switch on compareKeywords and the actor does this for you:

  • Up to 5 keywords: one request, Google's own shared scale. Exact.
  • More than 5: the keywords are split into batches of five, and every batch also contains the same anchor keyword (anchorKeyword, or the first keyword). The anchor's values in each batch tell how that batch is scaled, so every batch is converted to the first batch's scale, and everything is renormalised so the highest point of all keywords is 100.

How accurate is it? Google rounds every value to a whole number. The actor puts the estimated error of each batch conversion in scale.factorErrorPct. We checked it against Google's own exact comparison on live data: for mid-sized keywords the averages matched to within 0.1%, and a keyword that sits at about 2% of the peak was off by about 5%. Keywords that are tiny next to the peak are only indicative. Pick an anchor with steady, medium search volume. If the anchor is very small inside a batch, scale.lowConfidence is true.

Interest by region is read per batch and is not converted across batches.

Monitoring mode: only what changed

Set onlyChanges and run on a schedule. The first run returns every keyword once as the baseline (change.status is baseline). After that a keyword is returned only when a new rising query appeared that was not rising last time, or the latest finished point moved by at least changeThreshold index points. Unchanged keywords are neither returned nor charged. The state lives in a key-value store named google-trends-state in your account; use stateName to keep several monitors apart.

Errors are rows, not silence

When a keyword cannot be delivered you get a free row with a code and a message:

CodeMeaning
invalid_inputThe link, location, category or date range is not valid.
no_matchGoogle reports no data: the keyword has too little search volume here.
blockedGoogle kept answering "too many requests" after all retries. Run again later.
unavailableTemporary problem on Google's side or an unexpected answer.
filter_unsupportedFor example, the anchor keyword has no volume in the chosen place.

From the Apify Google Trends Scraper: send the same input. These fields work as they are: searchTerms, startUrls, isMultiple, geo, timeRange, customTimeRange, category, spreadsheetId, maxItems. viewedFrom is read as proxyCountry, maxRequestRetries as maxRetries. maxConcurrency, pageLoadTimeoutSecs and skipDebugScreen are accepted and ignored (there is no browser). The actor logs a short notice for each renamed field.

The output uses the same field names (interestOverTime_timelineData, interestBySubregion, interestByCity, interestBy, relatedQueries_top, relatedQueries_rising, relatedTopics_top, relatedTopics_rising) and one row per keyword.

Differences you should know about:

  • interestOverTime_averages stays empty, as Google leaves it. Use averageInterest.
  • isMultiple splits a term like nike, adidas into compared keywords; each keyword is still its own row, with value holding one number (on the shared scale).
  • Keywords with no search volume come back as a free no_match error row instead of a row full of zeros.
  • No browser is used: it is faster and cheaper, and it does not save page snapshots.

Inputs of other popular Trends actors also work: keyword or keywords become searchTerms, timeframe becomes timeRange (today 12-m is the default 12 months), dataTypes switches related queries, related topics and interest by region on or off (trending_searches with trendingSearchesGeo gives a Trending now list), maxResults becomes maxItems, property: "web" is web search and a numeric category is read as its id.

Use it from code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("arcadium/google-trends").call(run_input={
"searchTerms": ["electric car", "solar panels"],
"geo": "US",
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["rowType"] == "trend":
print(row["searchTerm"], row["averageInterest"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('arcadium/google-trends').call({
searchTerms: ['electric car', 'solar panels'],
geo: 'US',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'rows');

Pricing

You pay per row delivered (one keyword, or one Trending now search), at the price of your Apify plan. Error rows and unchanged keywords in monitoring mode are free.

Apify planPer 1,000 rows
Free$2.70
Starter (Bronze)$0.90
Scale (Silver)$0.45
Business (Gold)$0.27
Platinum$0.15
Diamond$0.15

Plus a one-off $0.00005 per GB of memory when a run starts.

Set a maximum cost per run in the Apify run options and the actor stops before it goes over.

Use cases

  • SEO and content: find what is rising for a topic and plan around the season.
  • E-commerce: compare product or brand interest across countries and weeks.
  • Market research: track many brands on one scale with a scheduled monitor.
  • News and social teams: poll "Trending now" every few hours.

Limitations

  • Public Google Trends data only. Nothing behind a login.
  • Google shows relative interest (0-100), not search counts. Trending now gives a volume bracket (for example 100,000+), not an exact number.
  • Google sometimes answers "too many requests". The actor retries on the same or a fresh connection, repeats the lookup for new tokens, and after a short pause tries the whole keyword again, so a keyword may take a few seconds (rarely a minute) longer; if all retries fail it returns a free blocked row.
  • If three keywords in a row still end blocked, Google is limiting the whole shared connection pool. The actor then pauses for about a minute once and starts the next keywords at most every 5 seconds, so it does not prolong the limit for this run or for other users. After three successful keywords in a row it returns to normal speed. Expect a long list to take a few minutes longer on such a day rather than fail.
  • Related topics are empty for many rare keywords; that is Google's answer, not a failure.
  • Values for more than 5 compared keywords are approximate (see above).

Privacy

Only aggregated search-interest data is collected. No user accounts, no personal data.

FAQ

Why do two runs of the same keyword differ slightly? Google samples its data and updates it continuously, and the last point of a period is still being filled in (isPartial).

What do the codes in geo look like? Country codes like US, regions like US-CA, GB-ENG. Interest-by-region rows use the same codes.

Something looks wrong in the output. Who do I tell? Open an issue on the actor page with the run link. We read them all.