Google Trends Scraper: Compare 100 Keywords avatar

Google Trends Scraper: Compare 100 Keywords

Pricing

from $1.50 / 1,000 search term with data

Go to Apify Store
Google Trends Scraper: Compare 100 Keywords

Google Trends Scraper: Compare 100 Keywords

Get Google Trends data in bulk: interest over time, by country, state, metro or city, related and rising queries and topics, and Trending Now. Compare up to 100 keywords on one 0–100 scale. Paste Trends URLs. Runs finish before their timeout, no compute bills, failed terms are free.

Pricing

from $1.50 / 1,000 search term with data

Rating

0.0

(0)

Developer

Aaron Tuttle

Aaron Tuttle

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

Google Trends Scraper & API

Get Google Trends data in bulk as JSON, CSV, Excel or flat spreadsheet rows: interest over time, interest by country, state, metro or city, related and rising queries and topics (with Breakout flags), and Trending Now with search volume, start and end times, related searches and news. Compare up to 100 keywords on one 0–100 scale, look up several countries in one run, or paste Google Trends URLs.

You pay per keyword that returns data, from $1.50 per 1,000 on Apify's Gold tier ($3 per 1,000 on the Free tier). Compute and proxies are included, and failed terms are free.

⏱️ Why it doesn't time out

Google throttles automated Trends requests hard, which is why many Trends scrapers hang, time out or come back empty. This one is built around that:

  • No browser. It calls the same data endpoints the Google Trends website uses, so it runs on 256 MB and starts in seconds.
  • Every throttled request is retried on a fresh session and IP with short, capped backoff. If Google keeps blocking the default proxy, all parallel sessions switch to residential proxy together, at no extra cost to you.
  • A time limit per term, so one stubborn keyword can't stall the run. A term that still fails is listed with an error and not charged.
  • Runs end before their timeout. Shortly before the run's timeout, the scraper stops starting new terms, saves everything and lists the unfinished terms in the run summary (unfinishedTerms). They aren't charged; run just those again.
  • Crash- and migration-safe. Progress is saved before every charge, so a restarted or migrated run never scrapes or charges the same term twice.
  • Parallel sessions (5 by default, up to 10): roughly 30–40 minutes per 1,000 terms with every section included.

Your existing input works as it is. These input names are accepted with the same meaning:

Apify's Google Trends ScraperThis scraper
searchTermssearchTerms (Trends URLs can go here too)
isMultiple: true (comma = several terms)isMultiple: each line like nike, adidas becomes one comparison of those terms. Or use "mode": "compare"
timeRange ("" = past 12 months)timeRange, same values, "" accepted
geo ("" = worldwide)geo, same codes. Several at once: US, GB, DE
startUrls ([{ "url": … }])startUrls, same format
category ("" = all)category, same IDs, "" accepted
customTimeRange (YYYY-MM-DD YYYY-MM-DD)customTimeRange, same format
maxItems (0 = no limit)maxItems: max search terms, 0 = no limit
maxConcurrency, maxRequestRetriesmaxConcurrency (1–10), maxRequestRetries (or maxRetries, up to 15)
viewedFrom, skipDebugScreen, pageLoadTimeoutSecsNot needed (no browser); ignored
spreadsheetIdNot supported: paste the terms instead (the run log says so)

Output fields have different names: interestOverTime_timelineData → interestOverTime, interestBySubregion / interestByCity / interestBy → interestByRegion (pick the level with regionResolution), relatedQueries_top / relatedQueries_rising → relatedQueries.top / relatedQueries.rising, relatedTopics_top → relatedTopics.top. See Output samples.

What's different:

Apify's Google Trends ScraperThis scraper
Runs in the last 30 days that succeeded58.5% (22.9% timed out)*Runs stop cleanly before their timeout
Price modelPer dataset item, plus platform usage (compute at 4 GB memory by default, proxies)Per keyword with data; compute and proxies included
Failed or empty termsCharged per dataset itemFree (listed with an error)
Keywords on one scaleUp to 5 (Google's limit)Up to 100
Several countries per runOne geo per run (or one per Trends URL)US, GB, DE
Trending NowNoYes, with filters and monitor mode

* Public run statistics shown on Apify, as observed on 2026-10-06: 13,109 of 22,415 runs succeeded and 5,134 timed out.

All-in cost for 100 keywords (one run, one country):

Apify tierApify's Google Trends ScraperThis scraper
Free$0.30 for results + platform usage$0.30
Bronze$0.10 + platform usage$0.25
Silver$0.05 + platform usage$0.20
Gold$0.03 + platform usage$0.15

Platform usage is billed by Apify as compute units (1 CU = 1 GB of memory for 1 hour) plus proxy traffic, at your plan's rates. At the default 4 GB, every 15 minutes of run time is 1 CU. Here, the prices above are the whole bill. Per-result prices for Apify's scraper are as listed on its Store page on 2026-10-06.

Switching from pytrends?

pytrends calls Google's endpoints from your own IP, so it often fails with 429 Too Many Requests after a few dozen requests. This scraper calls the same data with session rotation, proxies and retries handled for you, and returns the same values pytrends gives you (interest_over_time, interest_by_region, related_queries, related_topics, trending_searches), plus comparisons of up to 100 terms on one scale. Call it from Python with the Apify client (see API).

📊 Data you get

DataDetails
Interest over time0–100 search interest per minute, hour, day, week or month, depending on the time range
Interest by regionCountries, states/regions, US metro areas (DMA) or cities
Related queriesTop and rising searches, with Breakout flags and links
Related topicsTop and rising topics (entities) with their type, when Google provides them (see FAQ)
ComparisonsUp to 100 terms on one scale, plus which term leads in each region (up to 5 terms)
Trending NowWhat's trending in a country or region over 4, 24 or 48 hours or 7 days: search volume, % increase, start and end time, active or ended, categories, related searches (breakdown) and news articles
SummaryAverage, peak, peak date, latest value, % change, and a rising / falling / stable label per term

Works for Web, Image, News, YouTube and Google Shopping search, in any country or sub-region and any language. Time ranges run from the past hour to 2004–present, including custom date ranges and all Google Trends categories.

💸 Pricing tiers and examples

You pay per result. Compute and proxy costs are included. Prices drop with your Apify subscription tier:

EventFreeBronzeSilverGoldPlatinumDiamond
Search term with data$0.003$0.0025$0.002$0.0015$0.0013$0.0012
Trending Now topic$0.001$0.0008$0.0006$0.0005$0.00045$0.0004
Run start$0.00005$0.00005$0.00005$0.00005$0.00005$0.00005

Per 1,000 search terms: $3.00 (Free), $2.50 (Bronze), $2.00 (Silver), $1.50 (Gold), $1.30 (Platinum), $1.20 (Diamond).

ExampleFree tierGold tier
1 keyword$0.003$0.0016
100 keywords$0.30$0.15
100 keywords in 3 countries$0.90$0.45
1,000 keywords$3.00$1.50
Trending Now, 1 country, 50 topics$0.05$0.025
Daily Trending Now monitor, ~20 new topics a day for 30 days$0.60$0.30

Free: terms that fail after all retries, terms Google has too little data for (all zeros), terms that can't be put on a shared scale, and terms not started before the run's timeout. News articles on Trending Now topics are included. To cap any run, set Apify's Maximum cost per run: the scraper stops cleanly at the limit.

🚀 Quick-start presets

Compare brands across a year in the US (one 0–100 scale):

{ "searchTerms": ["nike", "adidas", "puma", "new balance", "asics", "hoka", "on running"], "mode": "compare", "geo": "US", "timeRange": "today 12-m" }

The same terms in three countries, as spreadsheet rows:

{ "searchTerms": ["air fryer", "slow cooker"], "geo": "US, GB, CA", "outputFormat": "rows" }

Straight from a Google Trends URL:

{ "searchTerms": ["https://trends.google.com/trends/explore?q=pickleball,padel&geo=US&date=today%205-y"] }

US cities for one term over the past 90 days:

{ "searchTerms": ["matcha"], "geo": "US", "timeRange": "today 3-m", "regionResolution": "CITY", "includeRelatedTopics": false }

Sports trending in the US in the past 48 hours, still active:

{ "trendingNowGeos": ["US"], "trendingNowHours": "48", "trendingNowCategory": "17", "trendingNowActiveOnly": true, "trendingNowMaxItems": 100 }

Daily monitor (schedule it): only new trending topics and new rising queries:

{ "searchTerms": ["ai agents"], "trendingNowGeos": ["US", "GB"], "onlyNew": true, "monitorStoreName": "my-trends-monitor" }

📦 Output samples

Search term (Separate mode, shortened):

{
"type": "keyword",
"searchTerm": "pickleball",
"hasData": true,
"geo": "US",
"timeRange": "today 12-m",
"summary": { "average": 64, "peakValue": 100, "peakDate": "2026-04-12T00:00:00.000Z", "latestValue": 50, "changePercent": 14, "trend": "stable" },
"interestOverTime": [{ "date": "2025-09-28T00:00:00.000Z", "formattedTime": "Sep 28 – Oct 4, 2025", "value": 49, "isPartial": false }],
"interestByRegion": [{ "geoCode": "US-HI", "geoName": "Hawaii", "value": 100 }],
"relatedQueries": {
"top": [{ "query": "pickleball paddle", "value": 100, "formattedValue": "100", "isBreakout": false }],
"rising": [{ "query": "national pickleball day", "value": 300, "formattedValue": "+300%", "isBreakout": false }]
},
"relatedTopics": { "top": [{ "topicTitle": "Pickleball", "topicType": "Sport", "value": 100 }], "rising": [] },
"trendsUrl": "https://trends.google.com/trends/explore?q=pickleball&date=today+12-m&geo=US"
}

Comparison (Compare mode): one item per comparison. interestOverTime[].values is keyed by term, keywords[] holds a summary per term, and with more than 5 terms a normalization block names the anchor term and flags any terms whose scaling is approximate.

Trending Now topic (shortened):

{
"type": "trending",
"rank": 1,
"geo": "US",
"title": "dodgers vs braves",
"searchVolume": 200000,
"approxTraffic": "200K+",
"increasePercentage": 1000,
"startedAt": "2026-10-06T19:00:00.000Z",
"endedAt": null,
"isActive": true,
"hours": 24,
"categories": [{ "id": 17, "name": "Sports" }],
"breakdownTerms": ["dodgers vs braves", "braves", "braves game", "matt olson"],
"news": [{ "title": "Burning questions facing each NLDS team ahead of tonight's Game 3s", "url": "https://www.mlb.com/news/…", "source": "MLB.com", "publishedAt": "2026-10-06T06:05:35.000Z", "picture": "https://…" }],
"trendsUrl": "https://trends.google.com/trends/explore?q=dodgers+vs+braves&date=now+1-d&geo=US",
"source": "trending_now"
}

Flat rows mode returns rows with recordType set to summary, interest_over_time, interest_by_region, related_query, related_topic, trending_now or error, and the same columns on every row.

The dataset has ready-made table views: Overview, Interest over time, Flat rows and Trending Now. The run summary (OUTPUT in the key-value store) counts terms with and without data, failures and retries.

Trending Now reads the same public data as trends.google.com/trending, with the same filters:

  • Locations: country codes (US, GB, JP) or supported regions (US-CA, GB-ENG). You can also paste a Trending Now URL such as https://trends.google.com/trending?geo=GB&hours=48&category=17&status=active; its filters are used.
  • Window: past 4, 24 or 48 hours, or 7 days (trendingNowHours).
  • Category: Sports, Entertainment, Politics, Technology and the other Trending Now categories (trendingNowCategory).
  • Active only: skip searches that have stopped trending (trendingNowActiveOnly).
  • Max topics per location (trendingNowMaxItems, default 50, 0 = all; the US often lists 400+ topics for 24 hours and 2,000+ for 7 days).
  • News articles per topic (trendingNowNewsPerTopic, 0–10, default 3, no extra charge).

If Google's Trending Now data keeps failing, the scraper falls back to the Trending Now RSS feed (about the last day, without categories) and says so in each item's warnings. With a category filter there's no fallback, since the feed can't be filtered: the location is reported as failed and not charged.

Monitor mode (onlyNew: true) is for scheduled runs. It returns only Trending Now topics and rising related queries that no earlier run returned, so each run is a list of what's new:

  • What was returned is remembered in a named key-value store in your account (monitorStoreName, default google-trends-monitor). Use a different name per schedule to keep separate memories, or delete the store to start over.
  • The first run returns everything and remembers it. Topics are remembered per location, rising queries per term, location, time range, category and search type. Entries unseen for 90 days are forgotten.
  • Only new trending topics are charged. Search terms are still delivered with their full data (and charged); only their relatedQueries.rising list is filtered, and monitor on each item counts what was new.
  • A run with nothing new finishes normally with an empty dataset.

🔌 API, MCP and AI agents

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('AaronOptimus/google-trends-scraper').call({ searchTerms: ['pickleball'], geo: 'US' });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python:

from apify_client import ApifyClient
client = ApifyClient("MY_APIFY_TOKEN")
run = client.actor("AaronOptimus/google-trends-scraper").call(run_input={"searchTerms": ["pickleball"], "geo": "US"})
items = client.dataset(run["defaultDatasetId"]).list_items().items

Or one HTTP call that runs the scraper and returns the items:

curl -X POST "https://api.apify.com/v2/acts/AaronOptimus~google-trends-scraper/run-sync-get-dataset-items?token=MY_APIFY_TOKEN" \
-H "Content-Type: application/json" -d '{"searchTerms": ["pickleball"], "geo": "US"}'

AI agents and MCP: add the scraper as a tool through Apify's MCP server (https://mcp.apify.com) in Claude, Cursor or any MCP client, and ask for Google Trends data in plain language. You can also schedule runs and send results to Google Sheets, Slack, Zapier, Make or webhooks with Apify integrations.

💡 Tips

  • Values are relative, not absolute. 100 is the peak for that term, place and period. To put several terms on the same scale, use Compare.
  • Comparing more than 5 terms? Put your most popular term first. It becomes the anchor, which gives the most precise scaling. Terms more than ~100× as popular as the anchor can't be placed on the same scale; they're marked notComparable and not charged. Lists longer than 100 are split into separate scales of 100.
  • Data resolution: per-minute for the past hour or 4 hours, 8-minute steps for the past day, hourly for 7 days, daily up to ~9 months, weekly up to 5 years, monthly beyond.
  • Ambiguous words? Pick a category, or use a topic ID (e.g. /m/05zppz, from a related-topics link) to measure the topic instead of the exact phrase.
  • Big lists: raise Parallel sessions for speed and set the run timeout to a few hours for many thousands of terms. Turning off regions or related data you don't need makes runs faster.

❓ FAQ

Is there a Google Trends API? Google has an alpha Trends API with limited access. This scraper works as a Google Trends API for everyone: it reads the same public data the Google Trends website shows and returns it as JSON, CSV or Excel through Apify's API.

Why does pytrends give me 429 errors? Google rate-limits Trends requests per IP and session. pytrends sends them from your own IP, so after a burst of requests Google answers 429 Too Many Requests. This scraper rotates sessions and IPs, backs off briefly and retries, and doesn't charge for terms that still fail.

What does "Breakout" mean? In rising related queries and topics, Google shows Breakout instead of a percentage when a search grew by more than 5,000%. Those entries have isBreakout: true and formattedValue: "Breakout".

Why are some values 0? Google shows 0 when there isn't enough search volume for that term, place and period, and so does this scraper. A term with no data at all (or only zeros) is marked hasData: false and isn't charged. Comparing a small term with a very popular one can also round the small one to 0.

Why are related topics empty? Google often withholds related topics from automated requests while still returning related queries. The item then has empty topic lists and a warnings note. If the first 3 terms of a run come back without topics, the scraper stops asking for them for the rest of the run, which makes it faster. The price per term is the same.

Why do my numbers differ slightly from the website? Google samples its data, so repeated requests can differ by a few points. That's normal for all Trends data.

What happens if Google blocks a request? The scraper retries on a fresh session and IP, and switches to residential proxy if needed. If a term still fails within its time limit, it's listed with an error and not charged. If only regions or related searches fail, you still get the rest, plus a warnings note.

What if my run is about to hit its timeout? The scraper stops starting new terms shortly before the timeout (up to 45 seconds before it) and ends normally. The run summary lists unfinishedTerms; those weren't charged.

Is it legal? The scraper only collects publicly available, aggregated statistics. It doesn't log in, solve CAPTCHAs or collect personal data. You're responsible for using the data in line with Google's terms and your local laws.

🛠 Support

Found a problem or need a feature? Open an issue on the Issues tab. See the Changelog for updates.