Google Trends Scraper - Pay Only for Results
Pricing
from $4.00 / 1,000 results
Google Trends Scraper - Pay Only for Results
Google Trends data as clean JSON, CSV or Excel: interest over time, interest by region down to metro areas, related queries, and a trend summary per term. Failed lookups are never charged, and most no-data answers are free.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Dustin Goossens
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Google Trends Scraper
Get Google Trends data as clean JSON, CSV or Excel: interest over time, interest by region and related queries, for any search term, region and time range.
You pay only for search terms that come back complete. If Google blocks a request, the scraper gives up on that search term within about a minute and does not charge you for it.
What you get
For each search term, one result containing:
- Interest over time: the 0-100 interest line across your time range, with real timestamps.
- Interest by region: interest broken down by country, state or province, and optionally by metro area. Regions where Google has too little data are left out.
- Related queries: the top and rising searches made by people who searched for your term, including "Breakout" terms.
- Average interest: one number per term for the whole period.
- A summary per term: the peak, the last quarter of your time range against everything before it, and a plain rising, flat or falling label.
- A warning about unusual stretches: when part of the timeline sits far above the term's normal level, the summary says when, and gives the change with that stretch left out.
- A clear answer when there is no data: a term Google has too little search volume for is marked as such, not returned as a row of zeros.
- Spreadsheet-ready files: the same data as three CSV files that open directly in Excel or Google Sheets.
Put up to five terms on one line, separated by commas, to compare them on the same 0-100 scale, exactly as the Google Trends website does.
Why this scraper
Google Trends has no public API and throttles automated requests hard. Scrapers that keep waiting on a blocked connection produce the most common complaint about Trends tools: a long run that returns nothing and still costs money.
This one is built around that problem:
- Blocks are detected at once. Google signals a block in two ways: an error status, or a normal-looking response with an empty body. Both are caught on the first response.
- A blocked search term restarts on a fresh connection and keeps the data it already fetched, so nothing is requested twice.
- Failed search terms get a second chance. Google throttles in waves, so terms that failed are tried once more after all the others have finished.
- Every search term has a hard time limit (60 seconds by default) and a fixed number of attempts (4 by default). When either runs out, the search term is reported as failed and the run moves on.
- Failed search terms are free. You are charged only for complete results. Answers where Google has no data are free too, within a generous allowance (see Pricing).
Input
| Field | What it does |
|---|---|
| Search terms | One per line. Each line produces one result. Separate up to 5 terms with commas to compare them. |
| Region | A region code such as US, GB, DE or US-GA. Empty means worldwide. |
| Time range | From the past hour to 2004 to present. Default: past 12 months. |
| Custom time range | Optional start and end date, for example 2024-01-01 2024-12-31. |
| Search type | Web, image, news, YouTube or Google Shopping search. |
| Category | A Google Trends category number. 0 means all categories. |
| Language | Language for region names and date labels. Default: en-US. |
| Data to fetch | Switch interest over time, interest by region and related queries on or off. Fewer kinds means faster, more reliable runs. |
| Region detail (experimental) | Ask for countries, states or provinces, metro areas or cities instead of Google's default level. Metro areas have worked for single terms and comparisons; city level is untested. If Google does not allow the level you ask for, you get its default level and the result says so in regionNote. |
| Attempts per search term | Fresh connections to try before giving up. Default: 4. |
| Retry failed search terms at the end | Try failed terms once more after the others have finished, about 15 seconds later. Default: on. |
| Time limit per search term | Default: 60 seconds. |
| Search terms in parallel | Default: 3. |
| Proxy | Datacenter proxies are the cheapest. If many search terms fail, switch to residential proxies. |
Example input:
{"searchTerms": ["pickleball, padel", "standing desk"],"geo": "US","timeRange": "today 12-m"}
Output
One dataset item per search term. Shortened example:
{"query": "pickleball, padel","keywords": ["pickleball", "padel"],"geo": "US","timeRange": "today 12-m","category": 0,"property": "","trendsUrl": "https://trends.google.com/trends/explore?q=pickleball%2Cpadel&date=today+12-m&hl=en-US&geo=US","interestOverTime": [{"time": "2025-10-05T00:00:00.000Z","timestamp": 1759622400,"formattedTime": "Oct 5 - 11, 2025","values": { "pickleball": 80, "padel": 12 },"hasData": true,"isPartial": false}],"averages": { "pickleball": 90, "padel": 6 },"interestByRegion": [{ "geoCode": "US-UT", "geoName": "Utah", "values": { "pickleball": 96, "padel": 4 } }],"relatedQueries": {"pickleball": {"top": [{ "query": "pickleball paddles", "value": 100, "formattedValue": "100", "link": "https://trends.google.com/trends/explore?q=pickleball+paddles" }],"rising": [{ "query": "pickleball kingdom", "value": 5450, "formattedValue": "Breakout", "link": "https://trends.google.com/trends/explore?q=pickleball+kingdom" }]},"padel": { "top": [], "rising": [] }},"scrapedAt": "2026-10-07T19:30:00.000Z"}
Notes on the data:
- Values are Google's relative interest scores from 0 to 100, not search counts. 100 is the peak within your query.
isPartialis true for the current, unfinished period. Its value will change.- For a single term, region values run from 0 to 100, where 100 is the region with the most interest. When you compare terms, region values are each term's share of the combined searches in that region, and add up to 100.
- For a single term, each region row also carries the score as a plain
value, and the Regions tab of the results lists one row per region. regionLevelsays what the region rows are:country,region(state or province),metroorcity.- Sometimes one region scores far above all the others, and the rest are squeezed into a few low values. That can be a real local favorite, or automated traffic that Google attributes to that place. The same thing shows on the Google Trends website. For a single term, when a region scores at least 2.5 times the average of the next three, the result lists it under
dominantRegions, explains it indominantRegionNote, and addsadjustedValueto every other region row: the same score, rescaled so the highest remaining region is 100. Google's own numbers invaluesare never changed. - A few places have shown inflated scores for many unrelated terms in Google's 2026 data: the Cheyenne WY-Scottsbluff NE and Wichita-Hutchinson KS metro areas, the states of Wyoming and Kansas, and St. Helena worldwide. These are set aside at a lower bar, 1.5 times the next three, and the note says why. A real leader elsewhere, such as the United States in a worldwide search, is held to the usual 2.5.
- An empty related list means Google has too little search volume to show one. That is a normal, complete result.
averagesis the average interest per term across the time range.dataStatusisok,noData(Google had nothing to report for any term) orpartialData(some terms had nothing). The terms without data are listed inkeywordsWithoutData, and any stray region rows or related searches Google sends for them are left out. See Pricing for when a no-data answer is free.attemptsis how many fresh connections it took to fetch the result.
The summary
For each term with data, summary holds:
"standing desk": {"average": 33,"peak": { "time": "2026-04-12T00:00:00.000Z", "formattedTime": "Apr 12 – 18, 2026", "value": 100 },"earlierAverage": 36.2,"recentAverage": 24.3,"recentFrom": "2026-07-05T00:00:00.000Z","changePercent": -33,"direction": "falling","elevatedPeriod": { "from": "2026-03-22T00:00:00.000Z", "to": "2026-06-21T00:00:00.000Z", "points": 14, "averageInside": 65, "typicalOutside": 22, "ratio": 3 },"changePercentExcludingElevatedPeriod": 22,"directionExcludingElevatedPeriod": "rising"}
- "Recent" is the last quarter of your time range: the last 3 months of a 12-month search.
directionisrisingorfallingwhen the change is 15% or more, otherwiseflat. elevatedPeriodappears when a stretch of at least two weeks sits at 1.5 times the term's typical level or more. It can be a launch, a season, news, or traffic Google later discounts; the summary does not guess which. Because such a stretch can swamp the comparison, the change is also given without it. In the example, interest fell from a spring high but is up 22% on the rest of the year.- The unfinished current period is left out of every summary number, because its value still changes.
trendVerdictputs the same thing in one readable line per term, for example: "standing desk: falling (-33%), peak Apr 12, 2026. Without the high stretch Mar 22, 2026 to Jun 21, 2026: rising (+22%)." It is the column shown in the Summary view.- Small terms get no trend label. When Google reports a term in fewer than 1 in 5 periods (typical for a small band, a person's name or a niche product), a rising or falling label would be built from a few blips. The verdict then says so instead, for example: "little hopes band: too little data to call a trend. Google reported it in 2 of 261 weeks, most recently Sep 27, 2026." The same terms carry a note in
dataNote, and their region scores, when present, rest on very few searches. Watch for these terms to show up more often over time.
Spreadsheet files
Each run also saves three CSV files, linked from the run's Output tab and stored in its key-value store. They are not charged separately.
| File | One row per |
|---|---|
summary.csv | search term and keyword: the summary above |
timeline.csv | search term, keyword and period |
regions.csv | search term, keyword and region, with the adjusted value |
When a search term fails
Failed search terms are not saved to the dataset and are not billed. They are listed in the run's key-value store under FAILED_QUERIES, each with the reason, the number of attempts across both passes, and whether running it again later is likely to help:
[{"query": "standing desk","reason": "Failed on both passes. Google blocked all 4 attempt(s). Last problem: explore returned HTTP 429.","attempts": 8,"retryable": true}]
If no search term at all could be fetched, the run ends as failed so that the problem is obvious.
If you set a maximum cost for a run, the scraper stops starting new search terms once that limit is reached and lists the ones it did not start under SKIPPED_QUERIES.
Pricing
Pay per result. One result is one search term with all the data you asked for. Search terms that fail or are skipped cost nothing.
No-data answers are free, within a generous allowance. When Google has too little search volume to report anything for a search term, you still get a result saying so, and it is free. This includes runs that ask only for related searches, when Google returns none: up to 25 per run, or half of the run's search terms if that is more. A run of 200 terms can return up to 100 no-data answers free. Beyond that, no-data answers are charged like any other result. Every no-data result says whether it was free in charged and chargeNote, and the run's final status line gives the count.
FAQ
Is this an official Google API? No. Google Trends has no public API. This scraper reads the same public data the Google Trends website shows, and nothing else. The data is aggregated and anonymous: it contains no personal information.
Does it return related topics?
No. Google returns the related topics panel empty to automated requests, so this scraper does not offer it. Related queries are returned in full. For some terms with steady interest, Google leaves the related-queries list out of automated requests while still showing it on its website. It does this consistently for those terms, so retrying does not help. The result then says so in relatedQueriesNote rather than presenting it as a term with no related searches.
Why did some search terms fail? Google limits how many requests it accepts from one address. Try again later, lower "Search terms in parallel", turn off kinds of data you do not need, or switch the proxy to residential.
Why are my numbers different from last week? Google Trends scores are relative to the peak inside each query's time range and region, and Google samples its data. Small differences between runs are expected.
Can I compare more than five terms? Google compares at most five at a time. To compare more, include one common term in every line and use it as the reference.
Can I run this on a schedule or call it from my own code? Yes. Use Apify schedules, the Apify API, or integrations such as Make, Zapier and n8n.