Google Trends Scraper — No Browser, Full 12-Month Range
Pricing
$30.00 / 1,000 keyword processeds
Google Trends Scraper — No Browser, Full 12-Month Range
Interest over time, by region, plus related queries and topics — pulled straight from the Trends API. Seconds per keyword instead of minutes.
Pull Google Trends data through the same API the Trends interface uses — no headless browser. Seconds per keyword instead of minutes, at a fraction of the compute cost.
What you get per keyword
- Interest over time — the full series for your window, plus a computed summary (average, peak, latest, direction)
- Interest by region — subregion or country breakdown, empty regions removed
- Related queries — top and rising search terms
- Optional: related topics (see Limitations)
Measured against the incumbent
Same keyword, same day, both on Apify:
| This Actor | Google Trends Scraper (apify) | |
|---|---|---|
| Time per keyword | ~25–31 s | over 300 s — the run exceeded the API limit |
| Compute cost per keyword | $0.0056 | over $0.0968 |
today 12-m range | supported | not accepted |
| Approach | Trends widget API | headless browser |
That is roughly 17× cheaper on compute and an order of magnitude faster.
The 12-month gap is real
The incumbent's allowed time ranges jump straight from today 3-m to today 5-y.
The most common analysis window — the past 12 months — simply is not available there.
Here it is the default.
Example output
{"keyword": "python","geo": "US","timeRange": "today 12-m","status": "ok","summary": { "dataPoints": 53, "average": 71.2, "peak": 100, "latest": 66, "trend": "falling" },"interestOverTime": [{ "date": "Jul 27 – Aug 2, 2025", "timestamp": "1753574400", "value": 61, "isPartial": false }],"interestByRegion": [{ "location": "California", "code": "US-CA", "value": 100 }],"relatedQueries": {"top": [ { "query": "what is python", "value": 100, "formattedValue": "100" } ],"rising": [ { "query": "python install", "value": 250, "formattedValue": "+250%" } ]}}
One record per keyword. Failed keywords are returned with status: "failed" and a
reason — never as an empty record dressed up as success.
Pricing
$0.03 per keyword processed. You are charged only for keywords returned with
status: "ok".
A keyword here means the complete pull: time series, regional breakdown and related queries in one record. Compute on top is roughly $0.006 per keyword, because this Actor makes plain HTTP calls instead of driving a browser.
Total: about $0.036 per keyword. The incumbent is free to install, but its compute alone exceeded $0.097 for a single keyword in our measurement.
Caching — faster repeats, and a safety net
Results are cached for 24 hours by default. This is not a shortcut: Trends returns weekly data points for the common windows, so a series fetched yesterday is the same series today.
What it buys you:
| Fresh fetch | Served from cache | |
|---|---|---|
| Time | ~24 s | ~5 s |
| Compute cost | $0.0054 | $0.0010 (81% less) |
Cached records are always labelled with fromCache: true, cachedAt and
cacheAgeSeconds — you can always tell replayed data from fresh data.
Stale fallback. If a live fetch fails — Google throttling, or a proxy outage — the
Actor returns the last cached copy rather than an error, marked staleFallback: true
with its age in the warning field. A week-old series with its age stated is more useful
than a failed run. Set Cache lifetime to 0 if you always need a live fetch.
How to use
- Put your terms into Keywords — one record comes back per term.
- Pick a Location (
US,PL,GB,US-CA, or empty for worldwide). - Pick a Time range —
today 12-mby default. - Leave Proxy on. Google Trends throttles single IP addresses quickly.
From code
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("craftbox/google-trends-fast").call(run_input={"keywords": ["retrieval augmented generation", "vector database"],"geo": "US","timeRange": "today 12-m",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["keyword"], item["summary"])
Limitations — read this before you run
Stated plainly, so there are no surprises:
- Google Trends throttles hard. A handful of requests from one address is enough to start getting rejected. This Actor uses Apify Proxy by default and rotates the address per keyword. Keep it enabled.
- Related topics are off by default. Google serves related topics and related queries
from the same endpoint and usually throttles the second call, returning an empty
payload with HTTP 200. If you enable topics, raise Same-endpoint delay. Either way,
an empty result is reported in
warnings— never silently as zero. - Values are relative, not absolute. Google Trends returns 0–100 popularity indices, not search volumes. That is how the source works.
- Throughput is bounded by politeness. Expect roughly 25–30 s per keyword. Speed comes from avoiding a browser, not from hammering the source.
Politeness and compliance
This Actor calls the same public endpoints the Trends web interface calls, at a deliberately limited rate. It does not log in, does not bypass any protection mechanism, and returns no personal data.
FAQ
Why is it so much faster than the alternative? No headless browser. The Trends interface fetches its data from a JSON API; this Actor calls that API directly, so there is no page to render.
Can I compare several keywords on one chart? Not yet — each keyword is fetched independently and returns its own record. Google's own comparison mode normalises values across terms, which is a different calculation and is on the roadmap.
Which time ranges work?
now 1-H, now 4-H, now 1-d, now 7-d, today 1-m, today 3-m, today 12-m,
today 5-y, all.
What if a keyword returns nothing?
Terms with too little search volume have no Trends data at all. You get
status: "failed" with the reason, and you are not charged for it.
Can I narrow it to a category?
Yes — set the numeric Google Trends category ID. 0 means all categories.