π Google Trends Insights Scraper
Pricing
from $4.99 / 1,000 results
π Google Trends Insights Scraper
Analyze search trends effortlessly. Scrape keyword popularity, categories, breakout queries, trend comparisons, and geographic data. Perfect for forecasting, SEO planning, market intelligence, and content strategy optimization.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
1
Bookmarked
19
Total users
4
Monthly active users
4 days ago
Last modified
Categories
Share
Google Trends Insights Scraper β Trends, Regions & Related Queries
Google Trends Insights Scraper extracts Google Trends data as typed JSON: interest over time, interest by region/city/DMA, related queries and topics, and real-time trending searches β plus a statistics bundle (peak, trend direction, percent change, breakout flag, volatility) computed for every keyword. Every response returns typed, normalized JSON β no HTML, no selectors, no parsing. Each of the five data types is opt-in and billed as its own pay-per-event, so a run only charges for what it actually fetches. Read on for the exact input schema, output shape, and pricing.
What is Google Trends Insights Scraper?
Google Trends Insights Scraper is an Apify Actor that queries Google Trends on your behalf β through the trendspy client library β and returns up to five distinct kinds of search-interest data as structured JSON. No Google account, Google Cloud project, or Google API key is required; the only credential needed is your Apify API token.
- π Interest over time, for up to 5 keywords compared together in one normalized 0β100 request (
isMultiple) - π Interest by region, state, city, or DMA-level geographic breakdown
- π Top and rising related queries and related topics per keyword
- π₯ Real-time trending searches by region, with optional per-trend news articles
- β¬οΈ Export as JSON, CSV, XML, HTML, or Excel directly from the Apify dataset
What data does Google Trends Insights Scraper collect?
Every row carries a type field identifying which of the five families it belongs to. Select the families you need with dataTypes β each one is fetched, and billed, independently.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
Interest over time (TIMESERIES) | average/peak/min/latest interest, trend direction, percent change, breakout flag, volatility, timeline | averageInterest, peakValue, peakDate, minValue, latestValue, trendDirection, slope, percentChange, breakout, volatilityStdDev, volatilityCV, spikeDates, timeline |
Interest by region (GEO) | region/city name, region code, 0β100 value, resolution, coordinates | geoName, regionCode, value, resolution, lat, lng |
Related queries (RELATED_QUERIES) | top/rising search queries, relative value, breakout flag | query, relation, value, isBreakout |
Related topics (RELATED_TOPICS) | top/rising topics, topic type, Google topic MID | topicTitle, topicType, topicMid, value, isBreakout |
Trending now (TRENDING_NOW) | trending keyword, search volume, growth %, active window, related news | keyword, volume, volumeGrowthPct, startedAt, endedAt, isActive, trendKeywords, topics, newsArticles |
When a query returns nothing (too little search volume, a blocked request, an empty region), the Actor pushes an explicit {"type": "error", "dataType": ..., "reason": ...} row instead of one of the rows above β and that row is not charged.
How does Google Trends Insights Scraper differ from the official Google Trends API?
Google announced an official Google Trends API in alpha in July 2025 (Google Search Central blog, "Introducing the Google Trends API (alpha)," July 2025). As of this writing (checked 2026-07-26), independent coverage β including ScrapingBee's 2026 Google Trends API roundup and Glimpse's "Google Trends' API isn't Public" β reports it is still application-gated and allowlisted, has not reached general availability, and requires Google Cloud project authentication with restricted quotas.
| Feature | Google Trends API (official, alpha) | Google Trends Insights Scraper |
|---|---|---|
| Access | Apply and wait for allowlist approval | Any Apify account β start a run immediately |
| Authentication | Google Cloud project + API credentials | Apify API token only, no Google credentials |
| Availability | Alpha, not generally available as of 2026-07-26 | Generally available now |
| Data families | Limited alpha scope (per Google's July 2025 announcement) | 5 families: interest over time, region, related queries, related topics, trending now |
| Derived analytics | Not part of the raw API response | Peak, trend direction, %-change, breakout flag, and volatility computed per keyword, no extra request |
| Rate-limit handling | Managed by Google under alpha quotas | Actor-side proxy tier escalation (none β datacenter β residential) and exponential backoff |
If you already hold alpha access to Google's own API, it is the first-party option and worth using directly. For everyone else β including any workflow that needs region, related-query, related-topic, or trending-now data today β this Actor is the accessible path, live now, with no application process.
Why do developers and teams scrape Google Trends?
For AI engineers and agent builders
Feed dataTypes: ["TIMESERIES", "RELATED_QUERIES"] output straight into a RAG index or an agent tool: trendDirection and breakout give a cheap, deterministic signal for "is this topic worth researching further," while relation: "rising" related queries surface emerging sub-topics an LLM can expand into search plans. Because every field is typed JSON keyed by keyword and scrapedAt, no HTML parsing sits between the fetch and the prompt β the row can go directly into a tool-call response or a vector-store upsert.
For marketers and brand teams
Track campaign and competitor terms with gprop: "news" or "shopping" to see which vertical is driving interest, and pull RELATED_QUERIES with isBreakout: true to catch a term jumping over 5000% before it peaks. Comparing up to 5 brand or product names in one normalized request (isMultiple: true, comma-joined term) shows relative share of search interest without separate runs, and category narrows results to a relevant industry vertical instead of noisy general web search.
For researchers and analysts
Because Google Trends exposes only public, aggregated search-interest data, longitudinal studies can run with timeRange: "all" for the full 2004-to-present window without touching any personal data. GEO requests break interest down to resolution: "REGION", "CITY", or "DMA" for geographic comparison studies, and category resolves either a numeric Google Trends category ID or a free-text name (e.g. "Travel") against the full category tree for consistent topic scoping across a study.
For developers building data products
Build a scheduled keyword-monitoring pipeline on an Apify schedule: set outputFormat: "long" to get one row per date Γ keyword for direct loading into a warehouse or BI tool, tune maxConcurrency (1β10) to control how many keyword groups fetch in parallel, and let maxRequestRetries and requestDelaySecs absorb Google's rate limiting without the pipeline failing a run.
How to scrape Google Trends (step by step)
- Open Google Trends Insights Scraper on its Apify Store listing and click Try for free / Start.
- Provide input: no field is required by the schema, but if you request any
dataTypesother thanTRENDING_NOW, you must supply at least one ofsearchTerms,startUrls, orspreadsheetIdβ otherwise the run fails immediately with "No search terms provided." - Choose your
dataTypes(default["TIMESERIES"]), and setgprop,geo,timeRange(or a customstartDate/endDate), andcategoryas needed β or skip all of that and paste ready-made Google Trends explore URLs intostartUrlsinstead. - Click Start. The Actor fetches through
trendspyunder your chosen proxy tier, escalating and backing off automatically if Google rate-limits it. - Open the Output tab and export the dataset as JSON, CSV, XML, HTML, or Excel, or pull it programmatically via the Apify API.
What to do when Google changes its Trends structure
Google Trends is not a stable public API surface; its underlying endpoints change periodically without notice. The Actor is maintained against the current trendspy client, and the dataset's field names and types are the contract with you β they don't change on your end when Google's backend does. No fixed turnaround time is promised for any given break.
β¬οΈ Input
24 parameters, none required by the schema.
| Parameter | Required | Type | Constraints | Description |
|---|---|---|---|---|
searchTerms | No | array | β | Keywords or topics to analyze. Required unless you use startUrls, spreadsheetId, or select only TRENDING_NOW. Example: ["chatgpt", "python"]. |
isMultiple | No | boolean | default false | When on, commas inside one search term split it into a single comparison group (max 5 keywords, normalized 0β100 against each other). Example: "chatgpt, gemini, claude" β one comparison. |
dataTypes | No | array | default ["TIMESERIES"]; enum per item: TIMESERIES, GEO, RELATED_QUERIES, RELATED_TOPICS, TRENDING_NOW | Which data families to fetch. Each is billed as its own pay-per-event. |
gprop | No | string | default "web"; enum: web, news, images, youtube, shopping | Google surface to measure. |
timeRange | No | string | default "today 12-m"; enum: now 1-H, now 4-H, now 1-d, now 7-d, today 1-m, today 3-m, today 12-m, today 5-y, all | How far back to analyze. Ignored if a custom date range is set. |
startDate | No | string | datepicker, absolute or relative | Optional exact start date (YYYY-MM-DD or e.g. "3 months"). Overrides timeRange. |
endDate | No | string | datepicker, absolute or relative | Optional exact end date. Defaults to today when only a start is given. |
geo | No | string | default "" | Location code: country (US), region (US-NY), city (US-NY-501), or DMA. Empty = worldwide. Ignored per-URL if startUrls supplies its own geo. |
resolution | No | string | default ""; enum: "" (Auto), COUNTRY, REGION, CITY, DMA | Granularity for GEO results. Auto = COUNTRY if geo is worldwide, else REGION. |
includeLowVolumeGeos | No | boolean | default false | Include low-search-volume regions/cities in GEO results. |
category | No | string | default "" | Numeric Google Trends category ID (e.g. 5 = Computers & Electronics, 71 = Food & Drink) or a search name (e.g. "Travel") resolved against the full category tree. Empty = all categories. |
hl | No | string | default "en" | Two-letter interface language for labels. |
tz | No | integer | default 360 | Timezone offset in minutes used when bucketing time data. 360 = US Central. |
outputFormat | No | string | default "wide"; enum: wide, long | wide = one row per keyword with a nested timeline + stats. long = additionally emit one row per date Γ keyword. |
trendingHours | No | integer | default 24; min 1; max 191 | For TRENDING_NOW: detect searches trending within the last N hours. |
trendingNews | No | boolean | default false | For TRENDING_NOW: also fetch related news articles per trend (adds one request per trend). |
maxTrendingItems | No | integer | default 25; min 0 | Cap TRENDING_NOW results per region. 0 = all. |
startUrls | No | array | β | Full Google Trends explore URLs. Each URL's own q/geo/date/cat/gprop parameters apply to that URL only. |
spreadsheetId | No | string | default "" | Load terms from a public Google Sheet (one column, row 1 = header). |
maxItems | No | integer | default 0; min 0 | Cap the number of keyword groups (jobs) processed. 0 = no limit. Each group may still emit multiple rows and data types. |
maxConcurrency | No | integer | default 1; min 1; max 10 | How many keyword groups fetch in parallel, each with its own client/IP. |
maxRequestRetries | No | integer | default 3; min 1 | On a 429/block, how many times to rotate the proxy IP within a tier before escalating none β datacenter β residential. |
requestDelaySecs | No | integer | default 2; min 0 | Minimum spacing between Google Trends requests. |
proxyConfiguration | No | object | proxy editor; prefill {"useApifyProxy": false} | Apify Proxy configuration. Off by default. RESIDENTIAL recommended β Google Trends rate-limits datacenter/cloud IPs heavily. |
Example input:
{"searchTerms": ["chatgpt, gemini, claude"],"isMultiple": true,"dataTypes": ["TIMESERIES", "GEO", "RELATED_QUERIES"],"gprop": "web","timeRange": "today 12-m","geo": "US","resolution": "","includeLowVolumeGeos": false,"category": "","hl": "en","tz": 360,"outputFormat": "wide","trendingHours": 24,"trendingNews": false,"maxTrendingItems": 25,"startUrls": [],"spreadsheetId": "","maxItems": 0,"maxConcurrency": 1,"maxRequestRetries": 3,"requestDelaySecs": 2,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Common pitfall: proxyConfiguration prefills to {"useApifyProxy": false} β proxy is off unless you turn it on. Google Trends blocks Apify's shared datacenter IPs quickly; the Actor will auto-escalate none β datacenter β residential on a block, but each escalation burns retries and time. Enable proxyConfiguration with apifyProxyGroups: ["RESIDENTIAL"] from the start for reliable runs.
β¬οΈ Output
The dataset always returns typed, normalized JSON with a type field distinguishing the row's data family β no HTML, no selectors. It has four dataset views: the default Interest & insights view (16 columns, for TIMESERIES rows), plus regions, related, and trending views scoped to their respective row types. Each view is a display subset β the underlying row carries more fields than its view shows, listed in full below. Export as JSON, CSV, XML, HTML, or Excel from the Output tab, or via the Apify API.
Search-trend results (TIMESERIES, charged as row_result)
One row per keyword in the group (wide format always; long format adds one extra point-row per date Γ keyword):
{"type": "interest_over_time","keyword": "chatgpt","groupKeywords": ["chatgpt", "gemini", "claude"],"averageInterest": 61.2,"peakValue": 100,"peakDate": "2025-04-13","minValue": 21,"latestValue": 88,"trendDirection": "rising","slope": 0.42,"percentChange": 73.5,"breakout": false,"volatilityStdDev": 18.4,"volatilityCV": 0.3,"spikeDates": ["2025-04-13"],"inputUrlOrTerm": "chatgpt, gemini, claude","timeRange": "today 12-m","geoCode": "US","category": "0","gprop": "web","hl": "en","tz": 360,"normalizedTo": "Values are 0-100, relative within this single request/comparison group.","timeline": [{ "date": "2024-07-07", "value": 42, "isPartial": false },{ "date": "2025-07-19", "value": 88, "isPartial": true }],"scrapedAt": "2026-07-19T00:00:00Z"}
With outputFormat: "long", an extra row per date Γ keyword is pushed under the same row_result charge:
{"type": "interest_over_time_point","keyword": "chatgpt","date": "2025-07-19","value": 88,"isPartial": true,"inputUrlOrTerm": "chatgpt, gemini, claude","timeRange": "today 12-m","geoCode": "US","category": "0","gprop": "web","hl": "en","tz": 360,"normalizedTo": "Values are 0-100, relative within this single request/comparison group.","scrapedAt": "2026-07-19T00:00:00Z"}
Interest-by-region results (GEO, charged as region_result)
{"type": "interest_by_region","keyword": "chatgpt","geoName": "California","regionCode": "US-CA","value": 100,"resolution": "REGION","lat": null,"lng": null,"inputUrlOrTerm": "chatgpt, gemini, claude","timeRange": "today 12-m","geoCode": "US","category": "0","gprop": "web","hl": "en","tz": 360,"normalizedTo": "Values are 0-100, relative within this single request/comparison group.","scrapedAt": "2026-07-19T00:00:00Z"}
Related queries & topics (RELATED_QUERIES / RELATED_TOPICS, charged as related_result)
{"type": "related_query","keyword": "chatgpt","relation": "rising","query": "chatgpt login","value": 5000,"isBreakout": true,"inputUrlOrTerm": "chatgpt, gemini, claude","timeRange": "today 12-m","geoCode": "US","category": "0","gprop": "web","hl": "en","tz": 360,"normalizedTo": "Values are 0-100, relative within this single request/comparison group.","scrapedAt": "2026-07-19T00:00:00Z"}
{"type": "related_topic","keyword": "chatgpt","relation": "top","topicTitle": "OpenAI","topicType": "Company","topicMid": "/g/11h03_9qjf","value": 100,"isBreakout": false,"inputUrlOrTerm": "chatgpt, gemini, claude","timeRange": "today 12-m","geoCode": "US","category": "0","gprop": "web","hl": "en","tz": 360,"normalizedTo": "Values are 0-100, relative within this single request/comparison group.","scrapedAt": "2026-07-19T00:00:00Z"}
Charging is per keyword: with both RELATED_QUERIES and RELATED_TOPICS selected, a 3-keyword comparison group charges up to 6 related_result events (2 per keyword), not 1.
Real-time trending results (TRENDING_NOW, charged as trend_result)
{"type": "trending_now","keyword": "eclipse 2026","geoCode": "US","volume": "200K+","volumeGrowthPct": 1200,"startedAt": "2026-07-19T02:00:00Z","endedAt": null,"isActive": true,"trendKeywords": ["solar eclipse", "eclipse path"],"topics": ["Astronomy"],"newsArticles": [{ "title": "Eclipse coverage tonight", "url": "https://example.com/a", "source": "Example News", "picture": "https://example.com/a.jpg" }],"scrapedAt": "2026-07-19T00:00:00Z"}
trend_result is charged once per unique geo (region), not per trend item β a run covering 3 regions with TRENDING_NOW selected charges up to 3 trend_result events regardless of how many trends each region returns (capped by maxTrendingItems).
Empty results never charge: a query that returns nothing pushes an unbilled {"type": "error", "dataType": ..., "reason": ...} row (or {"type": "error", "dataType": "TRENDING_NOW", "geoCode": ..., "reason": ...} for trending) instead of one of the rows above.
How does Google Trends Insights Scraper compare to other Google Trends scrapers?
| Feature | Google Trends Insights Scraper | Generic alternative |
|---|---|---|
| Derived statistics per keyword (peak, trend direction, %-change, breakout, volatility) | Computed locally, included in every TIMESERIES row | Not documented on apify/google-trends-scraper's or data_xplorer/google-trends-fast-scraper's listings, as observed on the Apify Store on 2026-07-26 |
| Multi-keyword comparison in one request | Up to 5 keywords via isMultiple | data_xplorer/google-trends-fast-scraper's schema accepts a single keyword string, no comparison mode documented, as observed on the Apify Store on 2026-07-26 |
| Data-family coverage | 5 families: timeseries, region, related queries, related topics, trending now | data_xplorer/google-trends-fast-scraper documents keyword trends and region data only β no related queries/topics, no trending-now β as observed on the Apify Store on 2026-07-26 |
| Billing granularity | Each data family is its own pay-per-event; unused families cost nothing | Not itemized by data family on apify/google-trends-scraper's listing, as observed on the Apify Store on 2026-07-26 |
| Unbilled empty-result handling | Empty queries push an explicit unbilled {"type": "error"} row | Not documented on either competitor's listing, as observed on the Apify Store on 2026-07-26 |
If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker β parsing raw, deeply-nested Google widget JSON (as returned by apify/google-trends-scraper's example output) inside an agent loop is a reliability failure mode, not a feature.
How many results can you scrape with Google Trends Insights Scraper?
There is no hard cap enforced by the Actor itself on total dataset rows. maxItems caps the number of keyword groups (jobs) processed β default 0 means no limit. Within a group, isMultiple bundles up to 5 keywords compared together; each searchTerms entry (or each startUrls URL, or each row loaded from spreadsheetId) becomes its own group. For TRENDING_NOW, maxTrendingItems caps the number of trends returned per geo (default 25, 0 = all). maxConcurrency (1β10, default 1) controls how many groups fetch in parallel β Google Trends rate-limits aggressively, so the schema recommends keeping this at 1β3. No benchmark run time is published; actual throughput depends on how much backoff and retry the current proxy tier needs.
Integrate Google Trends Insights Scraper and automate your workflow
Google Trends Insights Scraper works with any language or tool that can send an HTTP request, through the Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run_input = {"searchTerms": ["chatgpt", "python"],"dataTypes": ["TIMESERIES", "RELATED_QUERIES"],"geo": "US","proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]},}run = client.actor("google-trends-insights-scraper").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["type"], item.get("keyword"), item.get("averageInterest"))
Works in Python, Node.js, Go, Ruby, cURL.
Automation platforms (n8n, Make, LangChain)
Apify publishes a general-purpose Apify app/module for both n8n and Make that can start any Actor β including this one β pass it JSON input, and poll or wait for the dataset; select this Actor by its ID (google-trends-insights-scraper) inside the node/module's Actor field rather than a dedicated per-Actor node. For LangChain, the langchain_apify package's ApifyWrapper/ApifyActorsTool calls an Actor by ID and loads its dataset directly into a document loader or agent tool, so TIMESERIES/RELATED_QUERIES rows can feed a retrieval chain without a manual JSON-parsing step.
Is it legal to scrape Google Trends?
Yes β scraping Google Trends is legal when limited to the publicly available, aggregated search-interest data this Actor returns. Google Trends Insights Scraper only returns public data: every value is an anonymized index computed across many searchers, not information tied to an individual, so this is business/aggregate data rather than personal data β GDPR/CCPA's personal-data rules do not attach to it. What does apply is Google's own Terms of Service governing automated access to its properties. Consult legal counsel for commercial use cases involving bulk personal data.
β Frequently asked questions
Does Google Trends Insights Scraper work without a Google account?
Yes. No Google login, Google Cloud project, or Google API key is required β the only credential needed is your Apify API token.
How often is the scraped data updated?
Every run fetches live from Google Trends through trendspy at run time. Nothing is cached between runs; each run reflects Google's current interest data at the moment it executes.
What happens when a search term has no Google Trends data?
The Actor pushes an unbilled {"type": "error", "dataType": ..., "reason": "..."} row instead of charging β for example "No interest-over-time data (keyword may have too little search volume)" for TIMESERIES, or "No related data returned for this keyword" for RELATED_QUERIES/RELATED_TOPICS. No pay-per-event fires for these rows.
Can I scrape private or restricted Google Trends data?
No β and there isn't any. Google Trends only ever exposes public, aggregated search-interest data; there is no private or login-gated Trends content to access.
How does pay-per-event billing work for this Actor?
Each of the 5 dataTypes is billed independently: row_result (once per keyword group's timeseries fetch), region_result (once per keyword group's region fetch), related_result (once per keyword within a group, per related endpoint), and trend_result (once per unique geo for TRENDING_NOW). Only the first row of each fetched unit is charged; the remaining rows in that unit (e.g. the rest of a comparison group's keywords, or all of one region's trending items) are pushed for free. Empty-result error rows are never charged.
Does Google Trends Insights Scraper work for AI agent workflows and LLM pipelines?
Yes β it is callable as an HTTP endpoint by any agent framework via the Apify API and apify_client. Every response is typed JSON with stable field names, so it can be passed to an LLM context window, indexed into a vector store, or routed through an agent tool without a parsing step.
How does Google Trends Insights Scraper handle Google's anti-bot system?
The Actor auto-escalates proxy tiers (none β datacenter β residential) on a 429/403/302/quota response, rotates to a fresh proxy IP for up to maxRequestRetries attempts within each tier, and applies exponential backoff (honoring a Retry-After header when Google sends one). For the quota-limited related-queries and related-topics endpoints, it also rotates the request's referer header across attempts, since Google's embed quota for those endpoints is keyed to the referer.
How does Google Trends Insights Scraper compare to other Google Trends scrapers?
See the comparison table above. In short: it is the only one of the top-3 ranked Google Trends scrapers on the Apify Store (as observed 2026-07-26) documented to compute derived statistics locally, bill each data family separately, and push unbilled error rows for empty results.
Does Google Trends Insights Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names β no HTML, no selectors, no parsing required before passing it to an LLM.
Can I use Google Trends Insights Scraper without managing proxies?
Yes β enable proxyConfiguration and the Actor handles proxy acquisition and tier escalation itself via Apify Proxy; you never source or rotate IPs manually. Note that proxy is off by default (prefill: {"useApifyProxy": false}), so turn it on explicitly for reliable results.
What happens when Google changes Google Trends' structure or blocks the scraper?
The Actor is maintained, and the output schema stays stable β field names and types don't change on your end when Google's backend does. No numeric turnaround time is promised for any given break.
π¬ Your feedback
Found a bug or missing a field? We want to know. Report it on the Actor's Issues tab in Apify Console, or reach out through your Apify account's support channel β active maintenance is how this Actor keeps working against Google Trends' current endpoints.