Google Trends Scraper: Interest, Related Queries, Trending
Pricing
from $0.27 / 1,000 result rows
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
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
codefor 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").
| Field | What it holds |
|---|---|
searchTerm, inputUrlOrTerm, geo, timeRange, category, property | What was asked: keyword, what you typed, location, period (as Google writes it, for example today 12-m), category and search type. |
interestOverTime_timelineData | The timeline: one entry per point with time (Unix seconds), formattedTime, value (0-100), hasData, and isPartial on the unfinished last point. |
averageInterest | Mean of the timeline values. |
interestBy, interestBySubregion, interestByCity, interestByMetro | Interest 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_rising | Related search queries. Rising ones carry a formattedValue such as +250% or Breakout. |
relatedTopics_top, relatedTopics_rising | Related topics, with Google's topic id and type. |
scale | How the values are scaled: single, compare (exact) or anchor (approximate), with the keywords, the anchor and the estimated error. |
change | Only in monitoring mode: what changed since the last run. |
scrapedAt | When 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"}
| Field | What it does |
|---|---|
searchTerms | Keywords, one row each. |
startUrls | Links 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. |
geo | US, GB, DE, or a region like US-CA. Empty is worldwide. |
timeRange, customTimeRange | A preset period, or an exact YYYY-MM-DD YYYY-MM-DD range. |
category, property | Restrict to a Trends category, or measure image, news, YouTube or shopping search. |
compareKeywords, anchorKeyword | Put all search terms on one scale (see below). |
includeRelatedQueries, includeRelatedTopics, includeGeo | Switch sections off to save requests. All on by default. |
onlyChanges, changeThreshold, stateName | Monitoring mode (see below). |
trendingGeos, trendingHours | Add the "Trending now" list for these countries. |
spreadsheetId | Read search terms from the first column of a public Google Sheet. |
maxItems | Stop after this many rows. |
includeErrorRows | Free 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:
| Code | Meaning |
|---|---|
invalid_input | The link, location, category or date range is not valid. |
no_match | Google reports no data: the keyword has too little search volume here. |
blocked | Google kept answering "too many requests" after all retries. Run again later. |
unavailable | Temporary problem on Google's side or an unexpected answer. |
filter_unsupported | For example, the anchor keyword has no volume in the chosen place. |
Switching from another Google Trends actor
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_averagesstays empty, as Google leaves it. UseaverageInterest.isMultiplesplits a term likenike, adidasinto compared keywords; each keyword is still its own row, withvalueholding one number (on the shared scale).- Keywords with no search volume come back as a free
no_matcherror 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 ApifyClientclient = 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 plan | Per 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.
Related actors and data
- Google News Scraper: Real Article URLs, Full Text
- YouTube Videos Scraper: Channels, Playlists, Search
- AliExpress Search Scraper: Price, Orders, Rank
- Arcadium Data MCP Server: AI agents can ask the same questions as tools (
trends).
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
blockedrow. - 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.