Marketing
Google Trends Scraper
Download historical Google Trends data for any keyword set: interest over time, geo breakdown, related queries, and topics. Export to CSV or JSON. Up to 100 keywords per run.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
This Google Trends scraper pulls four data widgets for every keyword you submit:
One dataset row per data point. A single keyword with interest-over-time over 12 months emits ~52 rows. All four widgets for one keyword emit ~200 rows.
What we handle for you
- All four widgets — interest over time, geo breakdown, related queries, and related topics in one run.
- Batch beyond the 5-keyword limit — submit up to 100 keywords; the Actor batches them silently in groups of ≤5 with a minimum 2-second inter-batch delay.
- We rotate residential proxies — exit IPs cycle through Apify's residential pool; Google Trends blocks datacenter IPs within 2–3 requests. We handle that so you don't have to.
- We rotate browser fingerprints — each request impersonates a real Chrome or Firefox TLS + HTTP/2 session via curl-cffi. Standard Python HTTP clients emit detectable signatures; we don't.
- We retry with exponential backoff — 429s trigger a fresh proxy session and a 2 s → 4 s → 8 s → 16 s → 30 s wait. Up to 5 attempts per request.
- Partial-success surfacing — if one widget fails after all retries, the Actor logs an error, emits zero rows for that widget, and continues. We never silently return an empty dataset.
maxResultscap — set an optional row limit per keyword to keep test runs cheap.- Pydantic v2 validation — every input field validated before any network call; invalid timeframe strings are rejected immediately with a clear error message.
- Timeframe presets — seven preset tokens (past 24 hours through all-time since 2004).
- Export Google Trends to CSV, JSON, Excel, or XML — Apify's dataset download handles all formats.
Use cases
- Content calendar planning — track interest-over-time for a topic list to identify seasonal peaks and plan publication timing.
- SEO keyword opportunity scoring — compare relative interest across a keyword set and prioritize by trend direction rather than static search volume.
- Bulk download Google Trends data — pull historical interest scores for 100 keywords in a single scheduled run without hitting quota limits.
- Competitor brand monitoring — pull related queries for a competitor's brand to discover what problems their customers are searching for.
- Market entry research — use geo breakdowns to see which countries show the highest relative interest in your product category before deciding where to expand.
- Trend alerting — schedule a recurring Actor run on a fixed keyword list and diff interest scores to catch emerging demand spikes before they saturate.
- Long-tail keyword discovery — mine related queries and topics for terms that existing keyword tools miss because they fall below their volume threshold.
- Academic and market research — download historical Google Trends data in bulk for modelling, forecasting, or index construction. The Google Trends Python alternative for researchers whose pytrends workflows broke in 2025.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
keywords | array | yes | One or more search terms to look up on Google Trends. Up to 100 keywords; the Actor batches them in groups of 5 as required by the Trends API. |
geo | string | no | BCP-47 country code to restrict results (e.g. US, GB, DE). Leave empty for worldwide data. |
timeframe | string | no | Time window for the query. Must be one of the seven preset tokens — custom date ranges are not supported in v1. |
category | integer | no | Google Trends category filter. 0 = All categories. See the Google Trends category list for numeric IDs. |
widgets | array | no | Which data widgets to retrieve. Defaults to all four. Valid values: interest_over_time, interest_by_region, related_queries, related_topics. |
maxResults | integer | no | Maximum number of dataset rows to emit per keyword across all widgets. 0 means unlimited. |
{
"keywords": [
"python",
"javascript"
],
"geo": "US",
"timeframe": "today 12-m",
"category": 0,
"widgets": [
"interest_over_time",
"interest_by_region",
"related_queries",
"related_topics"
],
"maxResults": 0,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
keywordwidgetdategeotimeframevalueformattedValuelabelgeoCodegeoNameisPartialscrapedAt
{
"keyword": "python",
"widget": "interest_over_time",
"date": "2025-05-01T00:00:00Z",
"geo": "US",
"timeframe": "today 12-m",
"value": 82,
"formattedValue": "82",
"label": null,
"geoCode": null,
"geoName": null,
"isPartial": false,
"scrapedAt": "2026-06-01T09:14:33Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row emitted | $0.0020 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Relative values only — Google Trends values are 0–100 relative scores normalized within your request. Absolute search volumes are not available from the Trends API.
- No custom date ranges in v1 — only the seven preset timeframe tokens are supported. Custom
YYYY-MM-DD YYYY-MM-DDstrings will be rejected. This is planned for v2. - No real-time / trending-searches surface — this Actor targets the historical interest data widgets, not the live "trending now" feed.
- No city-level geo drill-down — state/province level is the finest granularity available reliably across timeframes.
- Cross-batch normalization for >5 keywords — Google Trends normalizes values within each batch of ≤5 keywords. When you submit more than 5 keywords, the Actor processes them in sequential batches, and values across batches are not directly comparable. This is a Google Trends API constraint.
- Residential proxy required — datacenter IPs are blocked within a few requests. The Actor defaults to RESIDENTIAL proxies; disabling this will lead to rapid blocking.
- Rate limits at high volume — even with residential proxies and backoff, very large runs (>100 keyword batches in a short window) may encounter sustained 429s. The Actor surfaces partial success and never silently returns empty results.
FAQ
Why are all values relative (0–100) instead of absolute search volume?
Can I compare trends across different runs?
Why does a related term show "Breakout" instead of a number?
Is this a Google Trends Python alternative to pytrends?
What happens if Google blocks a request?
Is the Google Trends API officially supported for this use?
How many keywords can I submit per run?
Can I export Google Trends data to CSV or Excel?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors