Google Trends Scraper
Under maintenancePricing
$2.00 / 1,000 data row delivereds
Google Trends Scraper
Under maintenanceGoogle Trends API and pytrends alternative: interest over time, by region, related queries/topics, and trending now as flat rows. Up to 5 keywords, any country. Pay only for delivered rows - no start fees, failed keywords never charged. Automatic session rotation for reliability.
Pricing
$2.00 / 1,000 data row delivereds
Rating
0.0
(0)
Developer
Aaron S
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Share
Pull Google Trends data (interest over time, interest by region, related queries, trending now) as flat, ready-to-use rows, with automatic session rotation and no charge for keywords that fail.
Try it
Paste this into the input editor and hit Run:
{"mode": "interest_over_time","keywords": ["bitcoin", "ethereum"],"geo": "GB","timeRange": "today 12-m","resolution": "COUNTRY","maxItems": 1000}
Input fields
| Field | Type | Values | Notes |
|---|---|---|---|
mode | string | interest_over_time | interest_by_region | related | trending_now | Which Trends report to pull |
keywords | array | up to 5 terms | Leave empty only for trending_now |
geo | string | ISO code, e.g. GB, US, GB-SCT | Empty means worldwide |
timeRange | string | e.g. today 12-m, now 7-d | Google Trends time-range syntax |
resolution | string | COUNTRY | REGION | CITY | Only used by interest_by_region |
maxItems | integer | e.g. 1000 | Caps rows delivered before the run stops |
proxyGroups | array | e.g. ["RESIDENTIAL"] | Apify proxy groups; RESIDENTIAL (default) recommended - Google blocks most datacenter IPs |
Output
Every mode returns flat rows, one per data point. No nested objects to unpack. Each row carries keyword, geo, timeRange, mode, and fetchedAt, plus fields specific to the mode below.
interest_over_time
{"keyword": "bitcoin","geo": "GB","timeRange": "today 12-m","mode": "interest_over_time","fetchedAt": "2026-07-19T12:00:00.000Z","date": "Jan 1, 2025","time": "1704067200","value": 42}
interest_by_region
{"keyword": "bitcoin","geo": "GB","timeRange": "today 12-m","mode": "interest_by_region","fetchedAt": "2026-07-19T12:00:00.000Z","location": "Scotland","geoCode": "GB-SCT","value": 88}
related
{"keyword": "bitcoin","geo": "GB","timeRange": "today 12-m","mode": "related","fetchedAt": "2026-07-19T12:00:00.000Z","query": "bitcoin etf","value": 250,"formattedValue": "Breakout","rankingType": "rising"}
rankingType is top or rising, matching the two lists Google Trends returns per keyword.
trending_now
{"keyword": "","geo": "GB","timeRange": "","mode": "trending_now","fetchedAt": "2026-07-19T12:00:00.000Z","title": "Scotland match","traffic": "50K+","pubDate": "Tue, 25 Aug 2026 15:00:00 -0700"}
Keywords that fail after retries are logged to a separate errors dataset (keyword, mode, reason, fetchedAt) instead of leaving a silent gap in your results.
Coming from pytrends?
The pytrends library is archived (last commit August 2024, 150+ open issues) - Google's endpoint changes, cookie requirements, and 429 blocks are what killed it, and they're exactly what this actor handles for you: session-scoped cookies, residential proxy rotation, and retries with identity rotation on every 429.
| pytrends call | This actor |
|---|---|
interest_over_time() | "mode": "interest_over_time" |
interest_by_region() | "mode": "interest_by_region" (+ resolution) |
related_queries() / related_topics() | "mode": "related" (both, tagged by source) |
trending_searches() | "mode": "trending_now" |
kw_list=[...] | "keywords": [...] (up to 5) |
geo='GB', timeframe='today 12-m' | "geo": "GB", "timeRange": "today 12-m" (same syntax) |
How this compares
| This actor | Typical Trends actors on the Store | |
|---|---|---|
| Charge on failed keywords | Never - only delivered rows are billed | Often bills per run regardless of failed items |
| Actor start | Free - no per-run fee | Some popular Trends actors charge $0.02 per run before any data lands |
| Output shape | Flat rows, one per data point | Frequently nested per-keyword JSON you have to unpack |
| Reliability approach | Automatic session rotation (Crawlee session pool) and bounded retries with backoff | Not usually documented in the listing |
We don't have 30 days of canary data yet, so we're not publishing a success-rate number - just the mechanics above, which you can verify in the run log.
Pricing
Pay-per-event, priced on delivered rows. The free tier is $0.002 per row, tiering down as your volume grows. Starting a run costs nothing - you're billed only once rows land in your dataset. If a keyword fails after retries, it goes to the errors dataset instead, and you pay nothing for it.
Using the API
Apify API (HTTP)
curl "https://api.apify.com/v2/acts/meticulous_ground~google-trends-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode": "interest_over_time","keywords": ["bitcoin"],"geo": "GB","timeRange": "today 12-m"}'
JavaScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('meticulous_ground/google-trends-scraper').call({mode: 'interest_over_time',keywords: ['bitcoin'],geo: 'GB',timeRange: 'today 12-m',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python (apify-client)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("meticulous_ground/google-trends-scraper").call(run_input={"mode": "interest_over_time","keywords": ["bitcoin"],"geo": "GB","timeRange": "today 12-m",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Swap mode/keywords/geo/timeRange for any of the four modes above.