Google Trends Scraper - Compare Unlimited Keywords
Pricing
from $2.00 / 1,000 keyword reports
Google Trends Scraper - Compare Unlimited Keywords
Scrape Google Trends interest over time, interest by region and related queries. Compare more than 5 keywords on one common 0-100 scale. Clean flat output, automatic retries and proxy rotation.
Pricing
from $2.00 / 1,000 keyword reports
Rating
0.0
(0)
Developer
OIa Martin Torheim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 days ago
Last modified
Categories
Share
Get Google Trends data for any number of keywords on one comparable 0-100 scale, in a clean flat table you can open straight in Excel, Google Sheets, Make, n8n or Zapier.
For each keyword you can get:
- 📈 Interest over time: one row per keyword per date
- 🗺️ Interest by region: countries, regions, cities or US metros (DMA)
- 🔎 Related queries: top and rising searches, including "Breakout" terms
- 🧩 Related topics: top and rising topics (brands, products, people, places). Off by default: Google Trends currently returns no related-topics data for most searches (empty results are never charged)
- 📊 Summary row (free): average, peak, peak date, latest value and trend slope
Why use this Google Trends scraper?
| This Actor | Google Trends website / typical scrapers | |
|---|---|---|
| Keywords compared on one scale | Unlimited (up to 100 per run) | Max 5 |
| Output format | Flat rows, one type column | Nested JSON widgets |
| Rate limits (HTTP 429) | Automatic retries, exponential backoff, new IP per retry, optional residential fallback | Run crashes or returns empty |
| One keyword fails | That keyword gets an error row, the rest of the run continues | Whole run fails |
| You pay for | Only keyword reports that returned data | Often every attempt |
Python pytrends | Not needed (it was archived in April 2025) | - |
How "more than 5 keywords" works
Google Trends only compares 5 terms at a time and scales every request separately, so numbers from two different comparisons can't normally be compared. This Actor splits your keywords into batches of 4 and adds one shared anchor keyword to every batch. Because the anchor appears in every batch, its values show exactly how each batch's scale relates to the others. All batches are rescaled to the first batch's scale, then everything is normalised so the single highest point across all your keywords is 100.
valueis the number on the common scale (use this one).rawValueis the number Google returned in that batch.batchandanchorKeywordshow how each row was produced.
Tip: choose an anchor with steady interest and roughly similar popularity to your keywords. If the anchor is far more popular than a keyword, that keyword's values become coarse, and the run log warns you. If you leave the anchor empty, your first keyword is used.
Use cases
- E-commerce and print-on-demand sellers: compare 20+ product ideas at once and find seasonal peaks.
- SEO and content teams: rank topic ideas by real search interest and find rising queries.
- Market research: compare brands, products or competitors across countries.
- Data and AI pipelines: flat, typed rows that load straight into a spreadsheet, database or LLM.
Input
Only keywords is required. Everything else has sensible defaults.
| Field | Default | Description |
|---|---|---|
keywords | - | Up to 100 search terms |
timeframe | today 12-m | 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, or custom |
startDate, endDate | - | Used when timeframe is custom (YYYY-MM-DD, from 2004-01-01) |
geo | worldwide | Country code (US, GB, NO) or sub-region (US-CA) |
category / customCategoryId | 0 (all) | Google Trends category ID, e.g. 71 Food & Drink, 18 Shopping |
property | web | "" web, youtube, news, images, froogle (Google Shopping) |
includeInterestOverTime, includeInterestByRegion, includeRelatedQueries, includeRelatedTopics | true (related topics: false) | Choose which datasets to fetch (and pay for) |
includeSummary | true | Free summary row per keyword |
anchorKeyword | first keyword | Shared keyword used for rescaling across batches |
regionResolution | automatic | COUNTRY, REGION, CITY or DMA |
proxyConfiguration | Apify Proxy (automatic) | Use the RESIDENTIAL group if you see many blocks |
residentialFallback | true | Switch to residential proxy automatically after repeated blocks |
maxRetries, requestDelayMillis | 5, 1000 | Retry and pacing settings |
Example: compare 8 product ideas in the US over 5 years (time series only)
{"keywords": ["dubai chocolate", "matcha", "labubu", "protein coffee", "mushroom coffee", "cottage cheese", "bubble tea", "kombucha"],"anchorKeyword": "coffee","timeframe": "today 5-y","geo": "US","includeInterestByRegion": false,"includeRelatedQueries": false,"includeRelatedTopics": false}
Example: rising YouTube searches in Norway for a custom period
{"keywords": ["strikking", "hytte"],"timeframe": "custom","startDate": "2025-01-01","endDate": "2025-12-31","geo": "NO","property": "youtube","includeInterestOverTime": false,"includeInterestByRegion": false,"includeRelatedTopics": false}
Output
The examples below are illustrative. Every row has type, keyword, geo, timeframe, category, property and scrapedAt. Filter or split the dataset by type.
interest_over_time, one row per keyword per date:
{"type": "interest_over_time","keyword": "matcha","geo": "US","timeframe": "today 12-m","category": 0,"property": "web","scrapedAt": "2026-09-30T10:05:30Z","date": "2025-10-05","timestamp": 1759622400,"formattedTime": "Oct 5 - 11, 2025","value": 41.33,"rawValue": 62,"isPartial": false,"anchorKeyword": "coffee","batch": 2,"scaledAcrossBatches": true}
date is YYYY-MM-DD for daily, weekly and monthly data, and a full UTC timestamp (2025-10-05T14:00:00Z) for hourly data. isPartial: true marks the current, incomplete period.
summary, one row per keyword (free):
{ "type": "summary", "keyword": "matcha", "average": 38.2, "peakValue": 55.1, "peakDate": "2025-12-21", "latestValue": 41.33, "trendSlope": 0.2818, "dataPoints": 52 }
trendSlope is the linear trend in value points per period (positive = growing).
interest_by_region:
{ "type": "interest_by_region", "keyword": "matcha", "rank": 1, "geoCode": "US-HI", "geoName": "Hawaii", "value": 100, "hasData": true, "resolution": "REGION" }
Region values are Google's per-keyword scale (100 = the region where that keyword is most popular relative to all searches there).
related_query and related_topic:
{ "type": "related_query", "keyword": "matcha", "rankType": "rising", "rank": 1, "query": "matcha latte recipe", "value": 4450, "formattedValue": "+4,450%", "isBreakout": false, "link": "https://trends.google.com/trends/explore?q=matcha+latte+recipe&date=today+12-m" }{ "type": "related_topic", "keyword": "matcha", "rankType": "top", "rank": 1, "topicTitle": "Green tea", "topicType": "Beverage", "topicMid": "/m/02b_6", "value": 100, "formattedValue": "100", "isBreakout": false }
error: if a keyword or dataset still fails after all retries, you get a row like this instead of a crashed run (these rows are never charged):
{ "type": "error", "keyword": "matcha", "dataset": "interestByRegion", "errorMessage": "Failed after 6 attempts: HTTP 429 Too Many Requests (rate limited by Google)" }
A run summary (reports, errors, retries, proxy used) is saved as OUTPUT in the run's key-value store.
Pricing
This Actor uses pay-per-event pricing:
| Event | Price | When |
|---|---|---|
keyword-report | $0.002 ($2 per 1,000) | One keyword × one dataset that returned data |
| Actor start | Apify default | Once per run |
Examples:
- 10 keywords, interest over time only = 10 reports = $0.02
- 10 keywords, all 4 datasets = 40 reports = $0.08
- 100 keywords, interest over time only = $0.20
You are not charged for the anchor keyword (unless it is also in your list), for summary rows, for error rows or for datasets where Google had no data. Set Maximum cost per run in the run options and the Actor stops cleanly when it is reached.
FAQ
Why do my values differ from the Google Trends website?
Google Trends samples its data, so values can change slightly between requests. With more than 5 keywords the values are also rescaled to a common scale; rawValue holds Google's original number.
I get many 429 / "rate limited" errors.
Google Trends limits traffic heavily. Set the proxy to the RESIDENTIAL group, increase requestDelayMillis, or split very large jobs into several runs.
Can I use this without a proxy? Yes (turn Apify Proxy off), but you will be rate-limited much sooner.
Does it support "Trending now" / daily trending searches? Not in this version. It is on the roadmap.
Can I call it from Make, n8n, Zapier or my own code? Yes. Use the Apify integrations or API. Each row is flat, so it maps directly to spreadsheet columns.
Limits
- Up to 100 keywords per run (split larger jobs into several runs).
- Region, related queries and related topics are returned per keyword (Google's own per-keyword scale). Only interest over time is rescaled across batches.
- Google Trends data is sampled and relative, not absolute search volume.
- Very low-volume keywords may return no data (not charged).
- Google can change its internal endpoints at any time. We monitor the Actor daily and fix breakages quickly. Please report problems in the Issues tab.
Is it legal to scrape Google Trends?
This Actor collects only public, aggregated and anonymised statistics that Google Trends shows to any visitor. It does not collect personal data, log in, or bypass any paywall. You are responsible for using the data in line with applicable law and Google's terms of service. If in doubt, consult a lawyer. Read more in Apify's post Is web scraping legal?.
This Actor is not affiliated with or endorsed by Google.