Google Trends API — Interest, Regions & Queries
Pricing
from $0.60 / 1,000 search terms
Google Trends API — Interest, Regions & Queries
Google Trends data for a list of search terms: interest over time, interest by country or region, and related queries (top and rising). One flat row per term and country, every field always present, never null. Only complete rows are billed.
Pricing
from $0.60 / 1,000 search terms
Rating
0.0
(0)
Developer
Sumitr Mardy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Google Trends Scraper — Interest, Regions & Related Queries
Give it search terms, get Google Trends back: interest over time, interest by country or region, and related queries (top and rising). One flat row per search term and country, every field always present, never null. Built to be called from pipelines, n8n/Make/Zapier flows and AI agents.
$1 per 1,000 search terms on paid plans, down to $0.60 on Gold, plus $0.0005 per run. No platform usage on top. Rows that fail or have no data are free.
Why this one
- It finishes. The most-used Google Trends actor on the Store completed 55% of its runs in the last 30 days. Google answers HTTP 429 to almost every automated request unless it carries a Google session cookie, from residential IPs too. This actor gets that cookie for each proxy session and retries a blocked request on a fresh one. Measured on Apify: 1,000 of 1,000 search terms across 20 countries came back complete in 4 minutes 21 seconds.
- The numbers match trends.google.com. Checked against the live Google Trends page for the same term, country and period: same weekly values, same peak week, same top regions, same related queries.
- One row for every term you send. A term with almost no searches comes back as
status: "no_data"(free), not as a missing row, and not as a fake chart. - You pay for complete rows only. A row is billed when every section you asked for was fetched. Partial, failed and no-data rows are free.
- Flat and stable. The same 20 keys on every row. Arrays are always arrays, numbers are numbers. An agent can read
peakDateorrelatedQueriesRisingwithout a null check.
Input
| Field | Default | What it does |
|---|---|---|
searchTerms | — | Search terms, one per item. Required. Each term is looked up on its own, so every row has its own 0–100 scale. |
geos | worldwide | Country codes (US, DE, VN) or regions (US-CA). Every term is fetched once per entry. |
timeRange | today 12-m | Past hour, 4 hours, day, 7 days, 30 days, 90 days, 12 months, 5 years, or since 2004. |
customTimeRange | — | YYYY-MM-DD YYYY-MM-DD; overrides timeRange. |
category | 0 | Google Trends category ID (e.g. 71 Food & Drink). |
property | web | images, news, froogle (Shopping) or youtube search instead of web search. |
interestOverTime / interestByRegion / relatedQueries | true | Switch sections off to get faster rows. A row is complete when every section you left on was fetched. |
language | en-US | Language for region names. |
{"searchTerms": ["coffee", "matcha"],"geos": ["US", "GB"],"timeRange": "today 12-m"}
Output
One row per search term × country, in completion order. inputIndex lines rows up with your input.
{"inputIndex": 0,"searchTerm": "coffee","geo": "US","timeRange": "today 12-m","category": 0,"property": "","status": "ok","subStatus": "complete","error": "","averageInterest": 76,"peakInterest": 100,"peakDate": "2026-04-12T00:00:00.000Z","latestInterest": 65,"interestOverTime": [{ "date": "2026-10-18T00:00:00.000Z", "value": 65, "isPartial": false }],"interestByRegion": [{ "geoCode": "US-WY", "geoName": "Wyoming", "value": 100 }],"relatedQueriesTop": [{ "query": "coffee near me", "value": 100, "formattedValue": "100" }],"relatedQueriesRising": [{ "query": "home workout routines", "value": 6050, "formattedValue": "Breakout" }],"missing": [],"trendsUrl": "https://trends.google.com/trends/explore?q=coffee&date=today+12-m&hl=en&geo=US","scrapedAt": "2026-10-26T07:57:10.837Z"}
This is a real row from 2026-10-26, shortened: interestOverTime has 53 weekly points for 12 months. The odd rising query is what trends.google.com itself shows for "coffee" in the US that day.
- Interest values are Google's 0–100 scale: 100 is the term's own peak in that period and place.
interestByRegionlists countries whengeois worldwide, and states or regions whengeois a country.- Rising
valueis percent growth."Breakout"means more than +5,000%. averageInterest,peakInterest,peakDateandlatestInterestskip the last, still-filling period (isPartial: true).
Status
status | subStatus | Charged |
|---|---|---|
ok | complete: every requested section fetched | yes |
partial | section_failed: one section failed after retries; missing names it | free |
no_data | low_search_volume: Google has too few searches for this term there | free |
failed | blocked, network_error, invalid_request, timeout, bad_response, cost_limit_reached, free_work_limit | free |
Pricing
| Event | Price | When |
|---|---|---|
search-term | $1.00 per 1,000 on Bronze, down to $0.60 per 1,000 on Gold ($2.00 per 1,000 on the free plan) | A row with status: "ok" |
The only other charge is a start fee of $0.0005 per run, which covers the fixed cost of opening a residential proxy session. No platform usage is added on top. A run stops starting new terms when your maximum cost per run is reached, and marks the rest cost_limit_reached, uncharged.
Fair use
Failed and no-data rows are free, so a run that spends its proxy traffic on terms that keep failing stops starting new ones. The rest come back as failed / free_work_limit, uncharged, and can be resubmitted. Ordinary lists never get near this. Up to 5,000 term × country pairs per run.
What it does not do (yet)
- No related topics. The Google Trends page shows them to signed-in browsers, but Google's data endpoint returns an empty list to every automated caller we tested. Rather than ship an always-empty field, the row leaves it out.
- No multi-term comparison on one scale. Each term gets its own 0–100 scale. To compare terms against each other, normalise by the values you get, or ask for comparison mode.
- Rising queries are what Google shows, noise included. On 2026-10-26 trends.google.com itself listed unrelated "Breakout" items ("pet care tips", "best vpn service") as rising queries for evergreen terms such as "coffee" and "electric bike", and a different set on each reload. News-driven and seasonal terms ("hurricane", "diwali") had real ones. Top related queries were relevant in every case we checked.
- No "Trending now" daily list. This actor answers "how is this term doing"; it does not list today's trending searches.
- Google's data is sampled, so values can differ by a point or two between days, as they do on trends.google.com itself.
Use it from AI agents (MCP)
This Actor is a tool on the Apify MCP server, so Claude, Cursor, VS Code or any MCP client can call it to check how a topic is trending. Load only this tool: a short tool list keeps the agent from picking the wrong one.
Recommended: hosted server, OAuth sign-in (nothing secret on disk). Add to your MCP client config (claude_desktop_config.json, .cursor/mcp.json, …):
{"mcpServers": {"google-trends": {"url": "https://mcp.apify.com?tools=sumitr_mardy/google-trends-scraper"}}}
With an API token instead (clients without OAuth, or unattended setups):
{"mcpServers": {"google-trends": {"url": "https://mcp.apify.com?tools=sumitr_mardy/google-trends-scraper","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
Local server (stdio):
{"mcpServers": {"google-trends": {"command": "npx","args": ["-y", "@apify/actors-mcp-server@latest", "--tools", "sumitr_mardy/google-trends-scraper"],"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }}}}
The hosted server also gives the agent this Actor's output schema, so it knows every field before the first call. apify mcp install <client> writes the config for you if you use the Apify CLI. Get a token at Apify Console → API & Integrations, and never commit it.
Tips for agents:
- "Is X trending up?": compare
latestInterestwithaverageInterest, and readrelatedQueriesRisingfor why. - "Where is X most popular?": read
interestByRegion; it is sorted as Google sorts it, highest first. - Switch off sections you do not need (
interestByRegion: false,relatedQueries: false): fewer requests, faster rows. - Check
statusfirst.no_datameans Google has too few searches for the term, which is an answer, not an error. - The MCP
call-actortool waits up to 45 seconds; a few terms finish well inside that. For long lists, fetch results withget-dataset-itemsand the run'sdatasetId.
Use it from code
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("sumitr_mardy/google-trends-scraper").call(run_input={"searchTerms": ["coffee", "matcha"],"geos": ["US"],})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["searchTerm"], row["status"], row["latestInterest"], row["peakDate"])
curl -X POST "https://api.apify.com/v2/acts/sumitr_mardy~google-trends-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"searchTerms": ["coffee"], "geos": ["US"]}'