Google Trends Data API
Pricing
from $0.25 / 1,000 results
Google Trends Data API
Scrape Google Trends interest over time, interest by region, and related/rising queries for any keyword, country and date range. Reliable, proxy-aware, no API key needed.
Export Google Trends data as clean, structured JSON, CSV or Excel — no API key, no browser, no scraping code.
Google does not publish an official Trends API. This Actor talks to the same endpoints the Google Trends website uses and returns the three datasets people actually need:
| Dataset | What you get |
|---|---|
| Interest over time | The 0–100 popularity score for each date in your range |
| Interest by region | The 0–100 score broken down by country, state or sub‑region |
| Related & rising queries | The top and fastest‑rising searches associated with your term |
| Trending now | What is trending in a country right now — with estimated search volumes |
Two modes, one Actor. Keyword research analyses terms you supply. Trending now needs no keywords at all — pick a country and get the live trending board, each term carrying an estimated search volume (e.g. 500000), a growth percentage, whether it is still active, and the queries it broke down into.
Why this Actor
Google aggressively rate-limits its Trends endpoints, which is why most Trends scrapers fail partway through a run and return half a dataset. This Actor is built around that problem:
- Warmed sessions. A cold request is rejected before it is even rate-limited. Every session is established the way a browser establishes one.
- Exponential backoff with jitter. Genuine rate limits are waited out instead of hammered.
- Automatic identity rotation. When an IP gets throttled, the run rotates onto a fresh Apify Proxy session and continues instead of dying.
- Proactive IP rotation. Each proxy identity is retired before Google throttles it, rather than after. This is the difference between a run that finishes and a run that hangs.
- Partial failures never kill the run. If one dataset for one keyword cannot be read, the rest still land, and the problem is reported in the log.
- Transparent pricing. You pay per result row. Platform usage is not billed on top.
Measured (Apify platform, 512 MB, Apify Proxy on, geo: US, today 12-m, independent mode): 20 keywords × 3 datasets — 20 explore calls + 60 widget reads, 80 requests plus session warm-ups — returned 3,006 rows in 50 seconds with 0 errors. The identical input on the build before proactive rotation stalled on the 15th keyword and had to be aborted after 200 s at 2,112 rows.
What you get here
Rather than rank the alternatives — they change their pricing and features whenever they like, and any table here would be stale within weeks — here is plainly what this Actor does, so you can check it against whatever else you are considering:
- Unlimited keywords per run, each scored on its own scale, or up to 5 on a shared scale for direct comparison.
- Keyword research and Trending Now in one Actor, so you are not buying and wiring together two.
- Every value states its scale.
valueScaletells you whether a number is a 0–100 index, a percentage share between compared terms, or a growth percentage. Mixing those up is the most common way to draw a wrong conclusion from Trends data. - Sortable ISO-8601 dates, not locale display strings that drop the year on short ranges.
- No per-run start fee, and platform usage is not billed on top of results.
- Failed requests are never written to your dataset, so a Google-side error cannot appear on your bill as a result row.
- Paste a Google Trends URL instead of filling in fields.
One thing worth knowing before you compare: Google's Trending Now board is country-level. Sub-region codes return the parent country's identical board, and metro (DMA) codes return nothing at all — verified by direct testing. This Actor accepts a sub-region code, warns you in the log, and uses the country, rather than implying a precision Google does not provide.
Input
In keyword mode, only keywords is required (or a Trends URL in startUrls). In trending mode nothing is required — geo defaults to US. Everything else has a sensible default.
{"keywords": ["air fryer", "espresso machine"],"geo": "US","timeRange": "today 12-m","dataTypes": ["interest_over_time", "interest_by_region", "related_queries"],"compareKeywords": false,"proxyConfiguration": { "useApifyProxy": true }}
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | keywords | keywords (research) or trending (live board). |
keywords | array | — | Search terms, or Google Trends topic IDs such as /m/0k8z. |
startUrls | array | — | Paste Trends explore URLs; q/geo/date/cat are parsed out. Keywords from several URLs are pooled; geo/date/category come from the first URL. |
geo | string | "" | US, GB, DE, or a sub‑region such as US-CA. Empty means Worldwide. |
timeRange | string | today 12-m | Preset (now 1-d, today 3-m, today 5-y, all, …) or a custom range like 2024-01-01 2024-12-31. |
dataTypes | array | all three | Which datasets to return. Requesting fewer costs less. |
compareKeywords | boolean | false | See below. |
searchType | string | "" (Web search) | images, news, froogle (Shopping) or youtube. Web search is the empty string, not "web". |
category | string | "0" | Labelled Google Trends category picker. |
language | string | en-US | Language of returned labels. |
maxItems | integer | — | Hard cap on result rows. |
maxRetriesPerRequest | integer | 8 | How hard to retry when Google throttles. |
maxRunSeconds | integer | 3600 | Stop starting new batches after this long, so an outage cannot burn a run. 0 disables. |
rotateAfterRequests | integer | 24 | Retire each proxy identity after N requests. 0 disables. |
timezoneOffsetMinutes | integer | 0 | Offset used to bucket hourly data. |
proxyConfiguration | object | Apify Proxy on | Strongly recommended to leave enabled. |
Trending-now mode only
| Field | Type | Default | Description |
|---|---|---|---|
trendingHours | string | 24 | 4, 24, 48 or 168 (7 days). |
trendingCategories | array | all | Multi-select of Google's 19 trending categories. |
trendStatus | string | all | all, active (still rising) or ended. |
Trending mode ignores timeRange, dataTypes, category, searchType, compareKeywords, language, timezoneOffsetMinutes and maxRunSeconds.
Independent scores vs. comparison
This matters, and most scrapers get it wrong.
compareKeywords: false(default) — each term is fetched on its own and scored 0–100 against itself. Use this when you want each keyword's own trend shape. You can pass any number of keywords. Rows carryvalueScale: "index_0_100".compareKeywords: true— up to 5 terms are fetched together on one shared scale, so they are directly comparable. This is the Google Trends comparison view.
Read valueScale before comparing numbers. In comparison mode interest_by_region is a percentage share between the compared terms (valueScale: "comparison_share_percent") — Wyoming returns bitcoin 82% / ethereum 18%, summing to 100 across terms. That is a different quantity from the self-normalised 0–100 index, and mixing them up is the classic way to draw a wrong conclusion from Trends data.
Passing more than 5 terms with comparison on splits them into groups of 5; terms in different groups are not comparable to each other, only within their group.
Output
One flat row per data point — ready for a spreadsheet, a database, or a dashboard.
Interest over time — date is always a sortable ISO-8601 UTC timestamp; Google's own display label is kept beside it.
{"keyword": "air fryer","dataType": "interest_over_time","date": "2025-07-20T00:00:00+00:00","dateLabel": "Jul 20, 2025","dateRangeLabel": "Jul 20 – 26, 2025","timestamp": 1752969600,"value": 60,"hasData": true,"geo": "US","timeRange": "today 12-m","searchType": "web"}
Interest by region
{"keyword": "air fryer","dataType": "interest_by_region","geoCode": "US-WY","geoName": "Wyoming","value": 100,"formattedValue": "100","valueScale": "index_0_100","hasData": true}
Rows where hasData is false are regions Google has no signal for; they carry value: 0 and are still written (and billed) so the region list stays complete. Filter on hasData if you only want regions with real signal.
Related & rising queries
{"keyword": "air fryer","dataType": "related_queries","rankType": "TOP","query": "air fryer chicken","value": 100,"link": "https://trends.google.com/trends/explore?q=air+fryer+chicken&date=today+12-m&geo=US"}
Trending now (mode: "trending")
{"dataType": "trending_now","term": "david jonsson","geo": "US","searchVolume": 500000,"growthPercent": 1000,"isActive": true,"startTimestamp": 1785029400,"endTimestamp": null,"categoryIds": [4],"breakdownQueries": ["david jonsson", "black panther 3", "damson idris"],"trendsUrl": "https://trends.google.com/trends/explore?q=david+jonsson"}
Filter by the dataType field to split the datasets apart, or use the Apify API to export each separately.
What you can build with it
- Product research — find rising products before they peak, and see which states want them.
- SEO & content planning — mine
rankType: "RISING"queries for topics with growing demand. - Market entry — compare brand interest by country before committing spend.
- Finance & research — track attention on tickers, technologies or public figures over five years.
- Dashboards — schedule a daily run and pipe the dataset into Sheets, BigQuery, or your own store.
Pricing
Pay per result row, with the Apify platform usage included — you are not billed twice. Requesting only the datasets you need in dataTypes, narrowing timeRange, or setting maxItems all reduce cost directly.
Notes and limits
- Keyword-mode values (
interest_over_time,interest_by_region) are relative popularity indices, not absolute search counts — either 0–100 against the term itself, or a percentage share between compared terms. CheckvalueScale. - Trending-now
searchVolumeis an absolute figure, but it is Google's own bucketed lower bound —500000is displayed by Google as "500K+", andgrowthPercentof1000means "1,000%+". Treat both as floors, not exact counts; summing them understates the true total. - Google's Related topics widget currently returns an empty list for every query we tested, so this Actor does not offer it rather than shipping a field that is always blank.
- Very long ranges return coarser buckets (5 years → weekly,
all→ monthly). That is Google's own resolution behaviour. - This Actor collects public, aggregated, non-personal statistics only.
Integrations
Works with everything on the Apify platform: scheduled runs, webhooks, the REST API, the MCP server, Zapier, Make, n8n, Slack, Google Sheets, Airbyte, and LangChain / LlamaIndex.
Support
Found a bug or need a dataset that isn't here? Open an issue on the Actor's Issues tab and I'll take a look.