Google Trends API & Scraper — pytrends alternative avatar

Google Trends API & Scraper — pytrends alternative

Pricing

from $2.00 / 1,000 data results

Go to Apify Store
Google Trends API & Scraper — pytrends alternative

Google Trends API & Scraper — pytrends alternative

Google Trends API & pytrends alternative: bulk Google Trends data for any keyword list — interest over time, regions, related queries & topics, CSV or JSON. 50 terms on one scale, daily historical data for years. Works from AI agents via MCP.

Pricing

from $2.00 / 1,000 data results

Rating

0.0

(0)

Developer

Insane Developer

Insane Developer

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Google Trends API & Scraper gets Google Trends data for any list of search terms in seconds: interest over time, interest by country, state, metro area and city, related queries and related topics. Compare any number of terms on one scale (Google stops at 5), get daily data for years, fetch many regions in one run, and export to JSON, CSV or Excel — or call it from your code, Make, Zapier, n8n or an AI agent.

  • ✅ Reliable — 99.9–100% of queries returned complete data in our latest 1,000-query tests (200 terms × 5 countries); no browser, no timeouts.
  • ⚡ Fast — 1,000 queries with timeline, regions and related queries in about 16 minutes with 3 samples each (about 10 minutes with 1 sample), on 256 MB of memory.
  • 💸 You only pay for data you get — failed requests and terms without data are free.
  • 🎯 More accurate — every timeline is the median of 3 independent samples, 3× closer to Google's consensus value than a single request (see below).
  • 📊 Beyond Google's limits — up to 50 terms on one 0–100 scale and daily data for any period, both checked against Google's own numbers (see below).
  • 🧹 Cleaner data — we flag the generic filler queries Google mixes into anonymous results (see below).
  • 🔁 Drop-in replacement for Apify's Google Trends Scraper: same input fields, same output fields, plus more.
Data typeWhat you getBilled as
Interest over time0–100 index per week/day/hour, averages, peak, trend direction, seasonality1 result
Daily data for long periods (optional)One daily series for any period (e.g. 5 years), stitched from ≤ 269-day windows1 result per window (5 years ≈ 7)
Interest by subregionStates/provinces of a country, or countries for Worldwide (metro areas for a US state)1 result
Interest by metro area (US)210 US metro areas (DMA)1 result
Interest by cityCities Google has data for (popular terms only)1 result
Related queriesTop and rising queries, with Breakout flags and filler flags1 result
Related topicsTop and rising topics (best effort — see FAQ)1 result, only when returned

Every row also has a plain-text summaryText, metrics (average, peak, change, direction, seasonality) and dataBreaks (dates where Google changed how it collects data).

This ActorTypical Google Trends scraper
Success rate99.9–100% of queries complete in our latest 1,000-query testsoften 60–90%; runs that time out
Accuracymedian of 3 independent samples per timelinesingle request (1 in 5 differs from Google's consensus)
Speedseconds per term, 256 MBminutes per run, 4 GB browser
Many terms per run✅ any list, many regions per runoften 1 term per run
More than 5 terms on one scale✅ up to 50 per comparison❌ Google's limit is 5
Daily data for years✅ stitched and calibrated❌ weekly or monthly only
Related queries✅ with Breakout and filler flagsoften empty or unfiltered
Related topics✅ best effort, only billed when returnedusually empty
Metro areas (DMA) & cities✅often missing or zeros
Trend direction, seasonality, data breaks✅❌
Topic search (/m/… ids)✅rarely
You pay for failures❌ neveroften yes
  1. Enter your search terms (one per line) or paste Google Trends URLs from your browser.
  2. Choose a region, a time range and the data to collect. Add more regions under More regions if you want each term for several countries.
  3. Click Start and download the results as JSON, CSV or Excel — or get them via the API.

Input examples

Bulk keywords, default data, United States, past 12 months:

{ "searchTerms": ["air fryer", "standing desk", "electric bike"], "geo": "US" }

Compare terms on one scale (like the Compare button on Google Trends), 5 years, several countries:

{
"searchTerms": ["python, javascript, rust"],
"isMultiple": true,
"timeRange": "today 5-y",
"geo": "US",
"geos": ["DE", "IN"]
}

Compare 12 terms on one scale — more than Google allows (see How can you compare more than 5 terms on one scale?):

{
"searchTerms": ["google, weather, coffee, yoga, pickleball, kubernetes, sourdough starter, matcha latte, rust programming, python, netflix, tiktok"],
"isMultiple": true,
"timeRange": "today 5-y",
"geo": "US"
}

Daily interest over the past 5 years (Google itself gives weekly points for this period):

{
"searchTerms": ["coffee, bitcoin"],
"isMultiple": true,
"timeRange": "today 5-y",
"geo": "US",
"dailyData": true,
"includeInterestBySubregion": false,
"includeRelatedQueries": false
}

Paste Google Trends URLs, get flat rows for Excel, only the timeline:

{
"startUrls": [{ "url": "https://trends.google.com/trends/explore?date=today%203-m&geo=GB&q=sourdough" }],
"includeInterestBySubregion": false,
"includeRelatedQueries": false,
"outputFormat": "flat"
}

Search a topic instead of a word (language-independent and unambiguous — /m/05z1_ is Python the programming language, not the snake):

{ "searchTerms": ["/m/05z1_"], "geo": "US", "timeRange": "today 5-y" }

Output example

One row per term and region (outputFormat: "nested", trimmed):

{
"searchTerm": "stock market",
"geo": "US",
"timeRange": "today 5-y",
"status": "ok",
"summaryText": "\"stock market\" (US, today 5-y): average interest 16.5/100, peak 100 on 2025-04-06; trend rising (+25.4%); seasonal peak in March, low in September; rising: yahoo finance stock market live, quotes, business & finance news (Breakout), meta stock (Breakout).",
"metrics": {
"average": 16.5,
"peakValue": 100,
"peakDate": "2025-04-06T00:00:00.000Z",
"changePercent": 25.4,
"direction": "rising",
"seasonality": { "peakMonth": "March", "lowMonth": "September", "strengthPercent": 55.6 },
"hasDataRatio": 1
},
"interestOverTime_timelineData": [
{ "time": "1632614400", "formattedTime": "Sep 26 – Oct 2, 2021", "value": [15], "hasData": [true] }
],
"interestBySubregion": [{ "geoCode": "US-WY", "geoName": "Wyoming", "value": [100] }],
"relatedQueries_rising": [
{ "query": "meta stock", "formattedValue": "Breakout", "isBreakout": true, "likelyNoise": false },
{ "query": "best laptops 2025", "formattedValue": "Breakout", "isBreakout": true, "likelyNoise": true }
],
"relatedQueriesNoiseShare": 0.2,
"dataBreaks": [{ "date": "2021-12-26T00:00:00.000Z", "note": "An improvement to our data collection system was applied from 1/1/22." }],
"billedResults": 3
}

Besides the full metrics object, every row has flat copies for tables and spreadsheets — term, average, peakValue, peakDate, latestValue, changePercent, direction, seasonalPeakMonth — and regions (subregions, or countries for Worldwide). In a comparison, each term's data is in byTerm, and the Output tables show one row per compared term.

With outputFormat: "flat" you get one row per data point — term, geo, dataType, date, value, geoName, query, topicTitle, rank — ready for a spreadsheet or a pivot table. The Output tab also has ready-made tables: overview, interest over time, rising and top queries, regions and topics.

Why are our numbers more accurate?

Google Trends is computed from a random sample of searches, so the same request can return slightly different numbers. In our test of 20 popular terms × 5 independent requests, 13 terms came back in 2–3 different versions, and 1 in 5 single requests did not match the most common version — by up to 8 points. In a 1,000-query run, the 3 samples disagreed somewhere on 36% of timelines.

Every other tool we tested makes a single request. We fetch each timeline from 3 independent IP addresses and return the per-point median, plus a samplingSpread field that tells you how noisy Google's data is for that term:

Compared with the median of 5 samplesSingle requestThis Actor (median of 3)
Average error per point0.250.08
Timelines with at least one wrong point24%9%

You can set Samples per term from 1 (fastest) to 10 (research-grade). The price per result stays the same.

How can you compare more than 5 terms on one scale?

Google Trends compares at most 5 terms at once, and every comparison has its own 0–100 scale — so "coffee" in one comparison and "tiktok" in another can't be compared. With Compare terms on, you can enter up to 50 terms in one line. The Actor then:

  1. fetches the first 5 terms and picks the one with medium popularity as the anchor;
  2. fetches the other terms in groups of 4 together with the anchor, and rescales each group through the anchor;
  3. re-measures terms that came out too small to be precise (Google rounds to whole numbers, so a term at 0–2 next to "google" is mostly rounding) next to a term of similar popularity — a "ladder", like the G-TAB method used by researchers.

Values keep 3 significant digits, so a tiny term shows as 0.0633 instead of 0. The row's normalization field names the anchor, the number of comparisons used and any term that is still imprecise.

We checked it against Google's own 2-term comparisons (12 terms, US, 5 years, 28 September 2026):

Pair (from different groups)Google, compared directlyThis Actor, one 12-term scaleDifference
pickleball / sourdough starter4.334.34+0.1%
coffee / python3.633.59−0.8%
google / netflix5.545.61+1.3%
weather / tiktok10.810.2−5.3%*
kubernetes / python0.0630.058−6.8%*

* Google's direct numbers are themselves rounded: tiktok = 5 and kubernetes = 4 carry ±10% rounding error. Terms shared between comparisons are billed once: a 12-term comparison is 12 results per data type.

Google Trends historical data goes back to 2004, but Google gives daily points only for periods of up to about 9 months (269 days); longer periods come as weekly or monthly points. With Daily data for long periods on, the Actor also fetches the period in daily windows of up to 269 days and scales every window so that its weekly means match Google's weekly series for the whole period. Each window is calibrated on its own, so errors don't add up over the years. The row's stitching field lists the windows.

We checked the seams against Google's own daily data (coffee and bitcoin, US, 5 years stitched from 7 windows, compared with direct 269-day requests across two seams):

Result
Correlation with Google's direct daily data0.987 – 1.000
Average difference per day0.14 – 0.93 points (on 0–100)
Level change across a seam, stitched vs. directwithin 0.5%

Every window is a separate Google request, so daily interest over time is billed as one result per window and term (5 years ≈ 7 results per term).

We ran the same job — 8 terms, United States, past 12 months, timeline + regions + related queries — through the most popular Google Trends Actors on Apify Store on 28 September 2026:

This ActorOther Actors tested
Time12 seconds (3 samples per term)30 seconds – 21 minutes (one did not finish 8 terms in 21 min)
Price paid for the job$0.07$0.17 – $1.54 (one charged $1.54 for a single term)
All 8 terms in one run✅one needed 8 separate runs; one stops at 5 terms
Related topicsbest effortnone returned any
Filler queries flagged✅❌ (e.g. "gardening ideas" returned as a Breakout for "stock market")
Memory69 MB70 MB – 2 GB

What are "filler" queries and why do we flag them?

Google Trends shows anonymous visitors (every scraper and every logged-out browser) related queries that sometimes include generic queries unrelated to your term. In our tests, 20–76% of the rising queries for terms like "stock market", "coffee" or "yoga" were fillers such as "pet care tips", "gardening ideas" or "top songs this week". Other tools pass them on as real data.

Some fillers even show up as "Breakout" — for "stock market" we saw "best laptops 2025" marked as a Breakout. We keep Google's lists exactly as returned, but mark each known filler with likelyNoise: true and report the share in relatedQueriesNoiseShare. Filter them out in one line — or keep them, your choice. A query that shares a word with your term is never flagged.

You pay per result: one search term × one data type that Google returned data for. Errors and empty results are free, there is no subscription and no minimum.

Your Apify planPrice per 1,000 resultsDefault data (3 types) per 1,000 terms
Free / Starter$3.00$9.00
Scale$2.50$7.50
Business, Enterprise$2.00$6.00

Examples on the Free plan: 1 term, timeline only = $0.003; 20 terms with default data = $0.18; 100 terms × 3 countries, timeline only = $0.90; 12 terms on one scale, timeline only = $0.036; 1 term, daily data for 5 years = $0.021. There is no start fee and no platform usage on top — the price per result is all you pay. New Apify accounts get free monthly platform credit you can use to try it.

Keep your integration and change only the Actor ID to insanedev/google-trends-scraper. These input fields work the same: searchTerms, isMultiple, timeRange, customTimeRange, geo, category, startUrls, maxItems, viewedFrom. The output keeps the same field names (searchTerm, inputUrlOrTerm, interestOverTime_timelineData, interestOverTime_averages, interestBySubregion, interestBy, interestByCity, relatedQueries_top, relatedQueries_rising, relatedTopics_top, relatedTopics_rising) and adds new ones next to them.

A Google Trends Python API without pytrends: pytrends is archived and blocked by Google's rate limits (HTTP 429). This Actor handles proxies, retries and parsing for you:

pytrendsThis Actor
build_payload(kw_list, timeframe, geo, cat, gprop)searchTerms (+ isMultiple for a comparison), timeRange / customTimeRange, geo, category, property
interest_over_time()interestOverTime_timelineData (or outputFormat: "flat")
interest_by_region(resolution=...)interestBySubregion, interestByMetro, interestByCity
related_queries() / related_topics()relatedQueries_top/rising, relatedTopics_top/rising
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("insanedev/google-trends-scraper").call(
run_input={"searchTerms": ["python", "javascript"], "geo": "US", "timeRange": "today 5-y"},
)
for row in client.dataset(run.default_dataset_id).iterate_items():
print(row["searchTerm"], row["metrics"]["direction"], row["metrics"]["seasonality"])

Every run is a dataset you can download as CSV, Excel, JSON or HTML from the Output tab or the API (…/items?format=csv). For a Google Trends bulk download — hundreds of keywords into one sheet — set outputFormat: "flat": one row per date, region or query with the columns term, geo, dataType, date, value, ready for Excel, Google Sheets or a pivot table.

Integrations and API

  • API — run the Actor and fetch results from any language (Apify API), or use the API tab above for ready-made code.
  • Schedules — track your terms daily or weekly; combine with webhooks to get notified when a run finishes.
  • Make, Zapier, n8n, Google Sheets, Slack — via Apify integrations.
  • AI agents (MCP) — use it as a tool through the Apify MCP server; summaryText gives agents a compact answer.

Add https://mcp.apify.com?tools=insanedev/google-trends-scraper to Claude, Cursor or any MCP client and your agent can call Google Trends as a tool: it sends search terms and gets back interest over time, regions and related queries with a one-line summaryText.

FAQ

Google limits how many requests one IP address can send. This Actor spreads requests over a pool of residential IP addresses, keeps a steady pace and retries on a new address when Google blocks one — so you don't have to manage proxies.

Google serves related topics to anonymous visitors only through its public embed widget, which has a quota that is often used up. When that happens, relatedTopicsStatus is unavailable and you are not billed for topics. Related topics are off by default.

Google Trends is based on a random sample of searches, so the website and every API can show slightly different values from one request to the next — especially for less popular terms. This Actor combines 3 independent samples by default, which brings the values much closer to Google's most common answer (see Why are our numbers more accurate?). Logged-in users may also see slightly different data. Values are relative (0–100), not search counts.

Use our Google Trends Trending Now API: every trending search for 125 countries and US states in one run, with search volume, growth, related searches and news, plus an "only new trends" mode for hourly alerts. Found a trend worth a closer look? Paste it here for its history, regions and related queries.

What is dataBreaks?

Google occasionally improves how it collects data (for example on 1 January 2022). Values before and after such a date are not fully comparable; dataBreaks tells you where that happens in your time range.

The Actor collects publicly available, aggregated and anonymous statistics from Google Trends without logging in. You are responsible for how you use the data; check the laws that apply to you and Google's terms. If you are unsure, consult a lawyer.

Limitations

  • Up to 50 terms per comparison line. Comparisons of more than 5 terms put interest over time on one scale; the combined region map (interestBySubregion of the whole comparison) is only available for up to 5 terms — each term still gets its own regions in byTerm.
  • City data exists only for popular terms; metro areas are available for the United States.
  • Google gives daily data for periods up to about 9 months and hourly for up to 7 days; longer daily series are stitched (Daily data for long periods, up to 5 terms per comparison).
  • Related topics are best effort (see FAQ).

Support

Found a bug or missing a feature? Open an issue on the Issues tab — we usually answer within a day.