Google Trends Scraper avatar

Google Trends Scraper

Under maintenance

Pricing

$2.00 / 1,000 data row delivereds

Go to Apify Store
Google Trends Scraper

Google Trends Scraper

Under maintenance

Google 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

Aaron S

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

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

FieldTypeValuesNotes
modestringinterest_over_time | interest_by_region | related | trending_nowWhich Trends report to pull
keywordsarrayup to 5 termsLeave empty only for trending_now
geostringISO code, e.g. GB, US, GB-SCTEmpty means worldwide
timeRangestringe.g. today 12-m, now 7-dGoogle Trends time-range syntax
resolutionstringCOUNTRY | REGION | CITYOnly used by interest_by_region
maxItemsintegere.g. 1000Caps rows delivered before the run stops
proxyGroupsarraye.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
}
{
"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 callThis 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 actorTypical Trends actors on the Store
Charge on failed keywordsNever - only delivered rows are billedOften bills per run regardless of failed items
Actor startFree - no per-run feeSome popular Trends actors charge $0.02 per run before any data lands
Output shapeFlat rows, one per data pointFrequently nested per-keyword JSON you have to unpack
Reliability approachAutomatic session rotation (Crawlee session pool) and bounded retries with backoffNot 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 os
from apify_client import ApifyClient
client = 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.