Google Trends API — Pay Per Result, No Empty Charges
Pricing
from $5.00 / 1,000 keyword results
Google Trends API — Pay Per Result, No Empty Charges
Google Trends via a resilient API: interest over time, cross-term compare (one 0–100 scale), related, interest by region, realtime trending. Pay per result — never charged for empty data.
Pricing
from $5.00 / 1,000 keyword results
Rating
0.0
(0)
Developer
Sergei Peleskov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Google Trends data through a resilient API: interest over time, cross-term compare (2–5 keywords on one shared 0–100 scale), related queries & topics, interest by region, and realtime trending. You pay per result — and never for empty data.
Built for people who tried the official Google Trends API and hit its walls: alpha status, quotas, Google Cloud auth, and no recent/realtime data.
Why this Actor
This Actor vs typical / official Trends scrapers
| This Actor | Typical / official Trends API | |
|---|---|---|
| Pay for empty results | ❌ Never — empty = no_data, not billed | ✅ You pay for the call regardless |
Realtime windows (now 1-H…now 7-d) | ✅ Yes | ❌ Official alpha has no recent data |
| Retries + residential rotation | ✅ Built in — survives the first 429, doesn't fall over | ❌ You handle 429s / IP bans yourself |
| Cross-term scaling (up to 5 keywords, one 0–100 scale) | ✅ Yes | ❌ Single-keyword scales only |
| Related + interest-by-region | ✅ One Actor, one contract | ⚠️ Fragmented / partial |
| Pricing | ✅ Pay-per-event, pay for what you use | ❌ Quota tiers / rental subscription |
Reliability (retries, residential IP rotation, backpressure with Retry-After) is handled server-side — you just get stable results that don't break on the first rate-limit.
Scrape types
Pick one via scrapeType:
interestOverTime— popularity of each keyword over time (independent 0–100 scale per keyword).compare— 2–5 keywords on one shared 0–100 scale (cross-term scaling). One request, one price — comparable numbers across terms.related— top & rising related queries and topics.interestByRegion— geographic breakdown (COUNTRY/REGION/CITY/DMA).trendingNow— realtime trending searches for a location.
Input
{"scrapeType": "interestOverTime","keywords": ["bitcoin", "ethereum"],"geo": "US","timeRange": "today 3-m","category": 0}
| Field | Type | Notes |
|---|---|---|
scrapeType | enum | interestOverTime | compare | related | interestByRegion | trendingNow |
keywords | string[] | 1–50; exactly 2–5 for compare; not required for trendingNow |
geo | string | "" = worldwide, US, US-CA |
timeRange | enum | now 1-H…now 7-d, today 1-m…today 5-y, all, custom |
customTimeRange | string | when timeRange=custom: YYYY-MM-DD YYYY-MM-DD |
category | integer | Google category id, 0 = all |
resolution | enum | interestByRegion only: COUNTRY/REGION/CITY/DMA |
No proxy configuration — residential rotation is included.
Output
One dataset item per keyword × scrape type (compare = one item for the group). Data mirrors the normalized API schema, plus the request fields (kw/keywords, geo, time) for easy filtering.
interestOverTime
{ "scrapeType": "interestOverTime", "kw": "bitcoin", "geo": "US", "time": "today 3-m","points": [{ "date": "Jun 1, 2026", "value": 52, "isPartial": false }] }
compare (one shared 0–100 scale, order preserved)
{ "scrapeType": "compare", "geo": "US", "time": "today 3-m","keywords": ["btc", "eth", "doge"],"points": [{ "date": "Jun 5, 2026", "isPartial": false,"values": { "btc": 100, "eth": 26, "doge": 13 } }],"keywords_meta": {} }
Low-volume terms come back with values: 0 and a keywords_meta[kw]: "low_volume" flag — the run never fails on them.
No data / failed (never billed)
{ "scrapeType": "related", "kw": "asdfqwerzxcv", "geo": "US", "status": "no_data" }
Pricing (pay per event)
You are charged only for delivered non-empty results:
| Event | When | Price |
|---|---|---|
keyword-result | one keyword returned data (iot / related / region) | $0.005 |
compare-result | one 2–5 keyword comparison returned data (once, not ×5) | $0.005 |
trending-page | one realtime trending page returned data | $0.005 |
Never charged: empty results (no_data), failed requests, or any error. Compare is one event for the whole group — that's the point of batching.
FAQ
How is this different from the official Google Trends API?
The official API is alpha: quota-limited, requires Google Cloud auth, and has no recent/realtime data. This Actor gives realtime windows (now 1-H…now 7-d), needs only an Apify token, and bills per delivered result instead of per quota unit.
Why did I get no_data for a keyword?
Google returned a valid response with no data for that term (too low volume, or no coverage in the geo). It's in the dataset with status: "no_data" and is not billed.
What happens under heavy load?
The backing service applies backpressure (503 + Retry-After); the Actor honors it — waits and retries automatically, so your run doesn't drop requests.
Can I compare keywords on the same scale?
Yes — scrapeType: "compare" with 2–5 keywords puts them on one shared 0–100 scale (cross-term scaling), so the numbers are directly comparable.
Integrations
Works with the Apify API, n8n, Make, and MCP — run it and pull results from the dataset like any Actor.
Example (API run input):
{ "scrapeType": "compare", "keywords": ["btc", "eth", "doge"], "geo": "US", "timeRange": "today 3-m" }
Notes for operators
- Requires two secret environment variables on the Actor:
GATEWAY_URLandGATEWAY_API_KEY(never in input, never hardcoded). - Optional env:
ACTOR_CONCURRENCY(default 8),GATEWAY_RETRY_503(default 6).