Google Trends Scraper — Reliable, With Rising Queries
Pricing
from $3.50 / 1,000 search terms
Google Trends Scraper — Reliable, With Rising Queries
Google Trends interest over time, interest by country, region and city, related queries and topics (top and rising) for up to 5 compared terms. Every run reports a clear status per term and only charges for rows with data.
Pricing
from $3.50 / 1,000 search terms
Rating
0.0
(0)
Developer
Dottti
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Get Google Trends data as structured JSON, CSV or Excel. Each run returns interest over time, interest by country, region or city, and related queries (top and rising). You can compare up to 5 terms on one scale.
The Actor is built to finish. Google limits automated traffic, so some requests get refused. When that happens, the run keeps everything it already fetched. Each term gets a clear status for each section. You pay only for rows that contain data.
Who uses it
- SEO and content teams. They find rising and breakout queries for a topic before writing.
- Market researchers. They compare brands or products on one 0-100 scale, by country or region.
- Analysts and data teams. They feed weekly trend series into dashboards and models.
- Regional teams. It works with any language and any country, including Arabic terms in Saudi Arabia, the UAE or Egypt.
What you get per term
| Section | What it is |
|---|---|
| Interest over time | The 0-100 series from the chart on Google Trends. |
| Interest by region | Countries for a worldwide search. Sub-regions for one country. Cities and US metro areas on request. |
| Related queries | Top and rising lists, 25 each at most. Rising items above +5,000% carry isBreakout: true. |
| Related topics | Optional and off by default. See "Limits". |
| Summary | Peak date and value, average, latest value, last 30 days against the 30 days before, and the breakout queries. |
| Trending now | Optional. The current Trending Now list for any country, with approximate traffic and news links. |
The summary is plain arithmetic on the series Google returned. It uses no AI and no estimates.
Output example
Real output from a run on 2026-10-21. Input: coffee, worldwide, past 12 months. Long lists are cut to 2 or 3 items here.
{"type": "term","searchTerm": "coffee","comparedWith": [],"geo": "Worldwide","timeRange": "today 12-m","resolvedTimeframe": "2025-10-21 2026-10-21","searchType": "web","trendsUrl": "https://trends.google.com/trends/explore?q=coffee&date=today+12-m","status": "complete","sectionStatus": {"interestOverTime": "ok","interestByRegion": { "COUNTRY": "ok" },"relatedQueries": "ok"},"averageInterest": 77.3,"summary": {"points": 53,"peakDate": "2026-05-10T00:00:00.000Z","peakValue": 100,"averageValue": 77.3,"latestValue": 57,"latestIsPartial": true,"last30DaysAverage": 69.4,"previous30DaysAverage": 81.3,"changeLast30VsPrevious30Pct": -14.6,"risingQueriesCount": 25,"breakoutQueries": ["how to remove coffee stain from carpet","how to brew pour over coffee","how to clean a coffee grinder"],"hasBreakout": true},"interestOverTime": [{ "date": "2025-10-19T00:00:00.000Z", "formattedTime": "Oct 19 – 25, 2025", "value": 65, "hasData": true, "isPartial": false },{ "date": "2025-10-26T00:00:00.000Z", "formattedTime": "Oct 26 – Nov 1, 2025", "value": 57, "hasData": true, "isPartial": false }],"interestByRegion": {"COUNTRY": [{ "geoCode": "SG", "geoName": "Singapore", "value": 100, "hasData": true },{ "geoCode": "AU", "geoName": "Australia", "value": 85, "hasData": true }]},"relatedQueriesTop": [{ "rank": 1, "query": "coffee shop", "value": 100, "formattedValue": "100", "link": "https://trends.google.com/trends/explore?q=coffee+shop&date=today+12-m" }],"relatedQueriesRising": [{ "rank": 1, "query": "how to remove coffee stain from carpet", "value": 7900, "formattedValue": "Breakout", "isBreakout": true, "link": "https://trends.google.com/trends/explore?q=how+to+remove+coffee+stain+from+carpet&date=today+12-m" }],"scrapedAt": "2026-10-21T09:40:45.133Z"}
An Arabic term in Saudi Arabia (قهوة, geo SA, language ar) returns Arabic region names and Google's Arabic labels. The breakout flag still works because it reads the number:
{ "rank": 1, "query": "قهوة طهر", "value": 11900, "formattedValue": "ارتفاع هائل", "isBreakout": true }
A Trending Now row (trendingNowGeos: ["SA"]):
{"type": "trendingNow","geo": "SA","rank": 1,"title": "جائزة أفضل لاعب في آسيا","approxTraffic": "2000+","approxTrafficMin": 2000,"publishedAt": "2026-10-21T09:40:00.000Z","news": [{ "title": "سالم الدوسري أفضل لاعب آسيوي للمرة الثالثة", "source": "العربية", "url": "https://www.alarabiya.net/..." }]}
Flat format
Set outputFormat to flat for one row per data point. Use it for spreadsheets. Each row has a type: interestOverTime, interestByRegion, relatedQuery, relatedTopic or summary. One term over 12 months worldwide gave 162 rows: 53 dates, 58 countries, 50 related queries and 1 summary.
How it handles Google's limits
Google answers fast callers with HTTP 429 or a redirect to a check page. The Actor handles this in five ways.
- Pacing. It waits 3.5 seconds plus a random 0 to 1.5 seconds between requests. You can raise this.
- Backoff. A refused request is retried with growing waits: 5, 10, 20, 40 seconds.
- Fresh sessions. After two refusals in a row it starts a new session with a new Google cookie.
- Proxy fallback. If refusals continue across sessions, it moves from no proxy to Apify datacenter proxy, then to residential proxy. You can turn off the residential step.
- A second pass for related queries. Google limits the related-queries endpoint harder than the others. If it refuses, the Actor stops asking for related lists for a while. It finishes the rest of the run, then retries the refused lists after a 30-second pause.
Every row shows what happened in sectionStatus. Example of a partial result: "relatedQueries": "failed: relatedQueries: gave up after 5 attempts (last: HTTP 429)". The run summary in the key-value store (RUN_SUMMARY) lists each term's status. It also lists the request count, HTTP status counts, retries, proxy tier and bytes transferred.
Run outcome rules
- The run ends as Succeeded when at least one row has data. Terms that failed get a row with
status: "failed"andcharged: false. - The run ends as Failed when Google refused every request. The message says so. Nothing is charged.
- Bad input fails at once with a list of problems. Nothing is fetched and nothing is charged.
Pricing
- Search term: $0.005 for each term that returned data ($5 per 1,000 terms). Google slows down automated requests, so most of the work is per term.
- Result row: $0.0002 each ($0.20 per 1,000 rows).
A run for 10 terms in the default format costs about $0.05.
- In the default format, one row holds one search term with all its sections.
- In flat format, every data point is a row, so one term can be 150 rows or more.
- Each Trending Now item is one row.
- Rows with no data and rows for failed terms are free.
- The Actor stops when your run cost limit is reached. Terms it did not fetch are listed as
skipped_cost_limitand are not charged.
Input
| Field | What it does |
|---|---|
searchTerms | Terms to look up. Any language. |
compareTerms | Compare terms in groups of up to 5 on one 0-100 scale. |
startUrls | Google Trends explore URLs. Terms and settings are read from the URL. |
timeRange | Past hour up to 2004 to present. Default: past 12 months. |
customTimeRange | YYYY-MM-DD YYYY-MM-DD. Overrides timeRange. |
geo | Empty for worldwide, a country code (SA), or a region code (US-CA). |
category | Google Trends category number. 0 means all. |
searchType | web, news, images, youtube or shopping. |
regionResolutions | auto, plus COUNTRY, REGION, CITY or DMA. Each extra level is one more request. |
trendingNowGeos | Countries for the Trending Now list. |
outputFormat | perTerm (default) or flat. |
language | Language of region and topic names, for example en-US or ar. |
proxyConfiguration | Your own proxy. This turns off the automatic fallback. |
requestDelayMs, maxRetries | Pacing and retry limits. |
Example:
{"searchTerms": ["iphone", "samsung galaxy", "google pixel"],"compareTerms": true,"geo": "US","timeRange": "today 12-m","regionResolutions": ["auto", "CITY"]}
Limits
- Values are relative. Google Trends gives 0-100 scores. It does not give search volumes.
- Related queries are refused most often. In our tests, Google refused this endpoint far more often than the others. The term row is still delivered with its other sections, and the status says what failed.
- Related topics are off by default. In every test on 2026-10-21, Google returned an empty topics list to automated requests. The same lists appeared on the website. Google also does not offer related topics when you compare terms. If you turn this on and the list is empty, the row says so and you pay nothing extra.
- Small places have no data. Google marks cities and regions with too little search volume as having no data. They are left out of the output, the same way the website hides them. A term can have an empty city list.
- The summary needs 60 days. For short ranges (past hour to past 30 days), the 30-day comparison is
nullandchangeNoteexplains why. - Speed depends on Google. One term needs about 5 requests. With no refusals that is about 25 seconds at the default pacing. When Google limits traffic, the Actor waits and retries, so a run can take several minutes.
- Rising lists change. Google's rising lists are recalculated often. Two runs a few minutes apart can return different rising items.
Data source
The Actor calls the same public data endpoints that the Google Trends website calls when you open an explore page. Trending Now comes from Google Trends' public RSS feed. No Google account or API key is used.
Development
npm installnpm testnode src/main.js
Unit tests replay real Google responses saved in test/fixtures. Set GT_SAVE_RESPONSES=<folder> to save every raw response of a local run.