Google Trends Scraper
Pricing
$19.99/month + usage
Google Trends Scraper
Scrape real-time and historical Google Trends data, including interest over time, related queries, topics, and regional popularity. Perfect for SEO, market research, forecasting, and trend analysis. Fast, accurate, and ideal for building data-driven insights.
Pricing
$19.99/month + usage
Rating
5.0
(10)
Developer
Scraper Engine
Maintained by CommunityActor stats
3
Bookmarked
292
Total users
4
Monthly active users
15 days
Issues response
6 days ago
Last modified
Categories
Share
Google Trends Scraper — Interest Over Time, Keywords and Geo Data
Google Trends Scraper pulls Google's 0–100 interest-over-time timeline for any keyword or topic, returning searchTerm, geo, category, and dated interestOverTime_timelineData points as structured JSON — no chart-reading or manual export required. Compare up to five keywords per run, filter by country, category, or a custom date window, and skip HTML parsing entirely. Start a run below to pull search-interest history for your own keywords in minutes.
What is Google Trends Scraper?
Google Trends Scraper is an Apify Actor that extracts Google Trends' interest-over-time data — the same relative 0–100 search-popularity timeline shown on trends.google.com — for one or many keywords at once, and returns it as clean JSON or CSV. No Google account or login is required: Google Trends' interest-over-time data is fully public, and the actor reads it the same way any visitor's browser would. It's built for SEO teams, marketers, market researchers, and content planners who need keyword demand history without manually exporting charts from the Trends website.
What data can I extract with Google Trends Scraper?
Google Trends Scraper returns one dataset record per keyword or keyword-comparison group, built from the fields below.
| Field Name | Description |
|---|---|
inputUrlOrTerm | The keyword(s) or Google Trends URL that produced this row |
searchTerm | The keyword(s) actually analyzed for this row (comma-joined when comparing multiple keywords) |
timeRange | The Google Trends time window applied — a preset like today 12-m or a resolved custom range |
geo | The country/region used for this row ("worldwide" when no geo was set) |
category | The Google Trends category ID as a string ("0" = all categories) |
interestOverTime_timelineData | Array of timeline points; each point has a date plus one 0–100 relative-interest score per compared keyword |
Search & filter context
inputUrlOrTerm, searchTerm, timeRange, geo, and category describe what was searched, when, where, and under which Trends category — everything needed to reproduce or group a query.
Interest-over-time data
interestOverTime_timelineData is the actual trend line: a chronological array where every point carries a date and one 0–100 score per keyword in the group, letting you plot or compare demand over time without any additional parsing.
🤖 Add-on: Need additional trend/keyword data?
Scraper-Engine does not yet publish a dedicated companion actor for Google Trends' related-queries, related-topics, or regional-interest breakdowns — this actor covers interest-over-time only, which is the timeline data most SEO and market-research workflows need first. If your Google research also touches other Google surfaces, see Google Hotels Scraper and Google Patents & Citation Network Scraper in Related scrapers below.
Why not build this yourself?
Google Trends has no official public API — third-party tools like the archived pytrends library, and this actor's own trendspy dependency, work against an undocumented endpoint that Google can change without notice. This actor's source code notes that Google's older widgetdata endpoints now return HTTP 429 on every request, which is exactly why it was rebuilt on trendspy instead. Maintaining a home-grown scraper means tracking those endpoint changes yourself, rotating proxies by hand when Google blocks datacenter IPs, and absorbing residential-proxy costs — all before you get a single data point. Running the maintained actor instead means someone is already watching for the next breakage.
How to use Google Trends Scraper
Google Trends Scraper runs on Apify like any other Actor — no separate signup or API key beyond your Apify account.
- Open the Actor's page in the Apify Store and click Start.
- Provide at least one keyword source: Search terms, Google Trends URLs, or a Google Sheet ID (the run stops with an error if none are set).
- Optionally set Time range, Geo, Category, or enable Multiple terms mode to compare up to 5 keywords per group.
- Start the run.
- Export the results as JSON, CSV, or Excel from the run's dataset.
How to scale to bulk Google Trends extraction
searchTerms accepts an array, so one run can process many keywords or comparison groups at once. Load large keyword lists from a public Google Sheet via spreadsheetId, or pass multiple Google Trends URLs through startUrls. Each group is fetched independently, so maxConcurrency (default 10) controls how many run in parallel, and maxItems caps the total groups processed in one run.
What can you do with Google Trends data?
- An SEO strategist planning content uses
interestOverTime_timelineDataandtimeRangeto spot rising and seasonal keywords before writing a content calendar. - A market researcher uses
isMultiplecomparison groups (up to 5 keywords) withsearchTermto benchmark demand for a brand against competitor names in one chart. - A growth marketer uses
geoandcategoryfilters to check whether a campaign keyword's demand differs by country before localizing spend. - An analyst running recurring monitoring uses
startUrlsorspreadsheetIdwith scheduled runs to track how interest in a topic shifts week over week. - An AI engineer feeds the typed
interestOverTime_timelineDataJSON directly into a RAG pipeline or agent tool, letting an LLM answer "is interest in X rising or falling" without parsing a chart image.
How does Google Trends Scraper handle rate limits and blocking?
The actor starts each fetch at whatever proxy tier proxyConfiguration specifies (direct, datacenter, or residential) and, if a request comes back blocked — HTTP 429, 403, 302, a quota message, or "too many requests" — it automatically retries through the next tier up, waiting 1–3 seconds between attempts. A fixed 2-second delay is applied between requests on top of the maxRequestRetries budget (default 7), and every request carries a timeout (pageLoadTimeoutSecs, default 180s) so a slow response fails and retries rather than hanging. Keyword groups are fetched concurrently, bounded by maxConcurrency (default 10), spreading load instead of firing every request at once. If a keyword group exhausts every proxy tier, or Google Trends simply has no data for it (too little search volume), that group is logged and skipped — no row is written to the dataset and no charge occurs for it — while the rest of the run continues. There is no CAPTCHA-solving step; blocking is handled through proxy rotation, pacing, and retries only.
⬇️ Input
At least one of searchTerms, startUrls, or spreadsheetId must resolve to a keyword — otherwise the run fails with "No search terms provided."
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
searchTerms | No | array of strings | Keywords or topics to analyze. Required if no Google Sheet ID is given. | ["chatgpt", "gemini", "claude"] |
isMultiple | No | boolean (default false) | When true, splits a comma-separated line into one comparison group of up to 5 keywords. | true |
timeRange | No | string, enum (default "today 12-m") | Trend history window: now 1-H, now 4-H, now 1-d, now 7-d, today 1-m, today 3-m, today 12-m, today 5-y, or all. | "today 12-m" |
geo | No | string, enum (default "") | Country/region ISO code to localize results. Empty = Worldwide. If startUrls is set, the URL's own geo takes priority. | "US" |
viewedFrom | No | string, enum (default "") | Lowercase country context used when viewing Trends pages, to help match local results. | "us" |
skipDebugScreen | No | boolean (default false) | When true, skips saving a per-group debug snapshot to the key-value store. | false |
startUrls | No | array of strings | Full Google Trends URLs; the actor reads q, geo, date, and cat from each. | ["https://trends.google.com/trends/explore?q=chatgpt"] |
spreadsheetId | No | string (default "") | ID of a public Google Sheet (single column, row 1 = header) to load keywords from. | "1AbCDefGhIjKlmNoPQRstuVwxYZ" |
category | No | string, enum (default "") | Google Trends category ID. Empty = all categories. | "7" |
maxItems | No | integer (default 0, min 0) | Maximum number of output records. 0 = no limit. | 50 |
customTimeRange | No | string (default "") | Exact date window as YYYY-MM-DD YYYY-MM-DD. Overrides timeRange when set. | "2024-01-01 2024-12-31" |
maxConcurrency | No | integer (default 10, min 1) | Number of keyword groups fetched in parallel. | 10 |
maxRequestRetries | No | integer (default 7, min 1) | Retry attempts per request before giving up. | 7 |
pageLoadTimeoutSecs | No | integer (default 180, min 30) | Maximum seconds to wait for a request before it is retried. | 180 |
proxyConfiguration | No | object | Apify proxy configuration. Datacenter or residential proxies improve geo consistency and reduce blocking. | { "useApifyProxy": true } |
Example input
{"searchTerms": ["chatgpt, gemini, claude"],"isMultiple": true,"timeRange": "today 12-m","geo": "US","viewedFrom": "us","skipDebugScreen": false,"startUrls": [],"spreadsheetId": "","category": "","maxItems": 0,"customTimeRange": "","maxConcurrency": 10,"maxRequestRetries": 7,"pageLoadTimeoutSecs": 180,"proxyConfiguration": {"useApifyProxy": true}}
⬆️ Output
Every keyword group that returns data produces one typed JSON record in the Actor's dataset, exportable as JSON, CSV, or Excel. Only successful groups are pushed and billed under the row_result event — a group with no data (too little search volume, or blocked after exhausting every proxy tier) is skipped entirely, so nothing needs to be filtered out downstream.
Example output
{"inputUrlOrTerm": "chatgpt, gemini, claude","searchTerm": "chatgpt, gemini, claude","timeRange": "today 12-m","geo": "US","category": "0","interestOverTime_timelineData": [{ "date": "2025-07-06", "chatgpt": 74, "gemini": 40, "claude": 22 },{ "date": "2025-07-13", "chatgpt": 81, "gemini": 43, "claude": 25 },{ "date": "2025-07-20", "chatgpt": 88, "gemini": 46, "claude": 29 },{ "date": "2025-07-27", "chatgpt": 79, "gemini": 41, "claude": 24 }]}
How does it work?
Google Trends Scraper reaches Google's Trends backend through the trendspy library, which targets Google's current endpoints rather than the deprecated widgetdata API that older tools such as pytrends relied on. Requests are paced with a built-in delay, and when Google returns a block signal (429, 403, 302, or a quota message), the actor automatically escalates through a proxy ladder — direct connection, then Apify datacenter proxy, then residential proxy — before giving up on that keyword group. Each request carries its own timeout and retry budget, and keyword groups are fetched concurrently up to a configurable limit. Only the same interest-over-time data any visitor sees on trends.google.com is returned, and the output schema — searchTerm, geo, category, interestOverTime_timelineData, and related fields — stays consistent regardless of how Google's own page markup changes.
Integrations
Google Trends Scraper runs on the Apify platform, so it works with any tool that can call the Apify API or automate an Apify Actor run.
Calling Google Trends Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("scraper-engine/google-trends-scraper").call(run_input={"searchTerms": ["chatgpt", "gemini", "claude"],"isMultiple": True,"timeRange": "today 12-m","geo": "US",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["searchTerm"], item["interestOverTime_timelineData"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
MCP integration for AI agents
Like any Apify Actor, Google Trends Scraper is reachable through Apify's Actors MCP Server (mcp.apify.com) by registering its Actor ID (scraper-engine/google-trends-scraper) as a tool. This lets MCP-compatible clients — Claude, Cursor, and similar agent tools — request keyword trend data as a callable tool inside an agent workflow, without a custom integration.
No-code tools (n8n, Make, LangChain)
In n8n, use the Apify node (or the HTTP Request node against the Apify API) to start a run and read back the dataset. In Make, the Apify app's "Run Actor" and "Get Dataset Items" modules do the same without writing code. In LangChain or similar agent frameworks, wrap the Apify API call as a tool function and pass the returned JSON straight into your chain.
Is it legal to scrape Google Trends?
Yes — scraping publicly available Google Trends data is generally lawful, and Google Trends Scraper only returns the same interest-over-time timeline any visitor can see on trends.google.com without logging in. Google Trends' interest data is aggregate search-volume information, not personal data about identifiable individuals, so it falls under standard terms-of-service and data-use considerations rather than a personal-data regime like GDPR or CCPA. Review Google's Terms of Service for your specific use case, and consult legal counsel if your use case involves large-scale storage or redistribution of the collected data.
Frequently asked questions
What Google Trends fields does Google Trends Scraper return?
It returns searchTerm, geo, category, timeRange, inputUrlOrTerm, and interestOverTime_timelineData (the dated 0–100 interest score per keyword). See "What data can I extract" above for the full field table.
Does Google Trends Scraper require a Google account or login?
No. Google Trends' interest-over-time data is fully public, and the actor requests it the same way an anonymous browser would — no Google account, cookies, or login step is needed.
How many keywords can I extract in one run?
As many as fit in searchTerms, startUrls, or a Google Sheet — there's no built-in cap other than maxItems (0 = unlimited). Google Trends itself limits any single comparison group to 5 keywords, which the actor enforces automatically in isMultiple mode.
What happens if a keyword has too little search volume?
The actor logs a warning ("keyword likely has too little search volume") and skips that group — no row is pushed to the dataset and no charge occurs for it. The rest of the run continues normally.
Can I scrape multiple Google Trends keywords at once?
Yes. Pass an array to searchTerms, enable isMultiple to compare up to 5 keywords per group, or load a full list from a public Google Sheet via spreadsheetId. maxConcurrency controls how many groups are fetched in parallel.
Does Google Trends Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes. It's callable as an HTTP endpoint through the Apify API by any agent framework, and it's also reachable through Apify's Actors MCP Server for MCP-compatible clients like Claude and Cursor.
Why does this scraper use trendspy instead of pytrends?
Because pytrends targets Google's old widgetdata endpoints, which now return HTTP 429 on every request per this actor's own testing. trendspy targets Google's current Trends endpoints, which is why this actor was built on it instead.
Does Google Trends Scraper return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with consistent field names across runs — no HTML parsing or CSS selectors involved. Pass it directly to an LLM prompt, index it into a vector store, or feed it to an agent tool.
What happens when Google changes its Trends layout or blocks requests?
The actor is maintained, and its output schema stays stable across Google's front-end changes since it targets Trends' backend endpoints rather than scraping rendered HTML. No specific update turnaround time is published.
Can I use Google Trends Scraper without managing proxies or browser infrastructure?
Yes. The actor handles proxy tier selection and escalation (direct, Apify datacenter, Apify residential) internally — you only need to choose a proxyConfiguration if you want to override the defaults.
Which Google Trends fields work best for AI training data and RAG indexing?
interestOverTime_timelineData is the highest-information field — a consistent, typed array of date plus per-keyword scores — paired with searchTerm, geo, and timeRange for context. All fields return as typed primitives (strings, numbers, arrays), so no additional parsing is needed before indexing.
Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Google Hotels Scraper | Hotel search results from Google Hotels — pricing, availability, and property details |
| Google Patents & Citation Network Scraper | Patents, citation networks, and prior-art data from Google Patents |
Scraper-Engine does not currently publish other keyword- or SEO-research actors beyond Google Trends Scraper — these are the account's other Google-platform scrapers.
Your feedback
Found a bug or missing a field in Google Trends Scraper? Let us know through the Actor's Issues tab on Apify or the Apify Store support channel — reports like this directly shape what gets fixed and added next.