Google Trends Scraper With Keyword Research avatar

Google Trends Scraper With Keyword Research

Pricing

from $5.99 / 1,000 results

Go to Apify Store
Google Trends Scraper With Keyword Research

Google Trends Scraper With Keyword Research

Google Trends Scraper: Analyze keyword popularity, search interest, related queries, rising topics, geographic trends, and time-based demand. Discover emerging keywords, compare search trends, and uncover content opportunities for SEO, market research, and digital marketing strategy.

Pricing

from $5.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

1

Bookmarked

19

Total users

3

Monthly active users

4 days ago

Last modified

Share

Google Trends Scraper With Keyword Research turns seed keywords into a keyword-research dataset pulled from Google Trends: interest-over-time trend lines, related queries and topics (top or rising), Google autocomplete long-tail expansion, and deterministic topic clusters, not just one trend line per keyword. Every response is structured JSON, ready to pass to an LLM, load into a vector store, or feed a monitoring pipeline. No Google account or login is required. Point it at seed keywords, a Google Trends URL, or a Google Sheet and start building a keyword universe.

Google Trends Scraper With Keyword Research queries the live Google Trends widgets for one or more seed keywords and returns one JSON row per seed group. Beyond the standard interest-over-time series, it pulls Google's own related-queries and related-topics data (top or rising/breakout), expands each seed through the Google Suggest autocomplete endpoint for long-tail ideas, and derives deterministic topic clusters from the combined keyword pool — the keyword-research layer a plain trend export doesn't provide. No Google account or login is required; every source it hits is a public, logged-out endpoint.

  • Interest-over-time trend series (0–100 index) for each seed keyword or comma-separated comparison group
  • Related queries and related topics per seed, switchable between rising (breakout) and top (most popular)
  • Google autocomplete expansion into long-tail keyword suggestions, with optional a–z probing
  • Deterministic topic clusters grouped from the expanded keyword pool (no AI, fully reproducible)
  • Region (targetCountry), category (researchCategory), and history-range (historyRange or an exact date window) controls
  • Seed input via a typed keyword list, pasted Google Trends URLs, or a public Google Sheet column

The Actor returns one row per seed group, combining the interest-over-time series with related queries, related topics, autocomplete expansion, and derived topic clusters.

Result TypeExtracted FieldsPrimary Use Case
Interest over timesearchTerm, inputUrlOrTerm, interestOverTime_timelineData (array of {date, <keyword>: value}), timeRange, geo, categoryCharting demand and seasonality for a keyword
Related queries & topicsrelatedQueries (array of {query, value, rank}), relatedTopics (array of {topicTitle, topicType, topicMid, value, rank}), relatedUnavailableKeyword expansion and breakout-topic discovery
Autocomplete expansionautocompleteTerms (array of long-tail suggestion strings)Long-tail keyword ideation
Topic clusterstopicClusters (array of {clusterLabel, keywords[], count})Grouping expanded keywords into content-brief buckets
Run metadatascrapedAtTracking when each row was captured, for diffing across runs

This is the keyword-research layer that separates this Actor from a plain interest-over-time export. For each seed, relatedQueries and relatedTopics come straight from Google Trends' own related-searches widget — the same "rising"/"top" data you'd see on the Trends website — parsed into a ranked array with a relative value score. Because Google throttles that widget hard under load, the Actor retries across freshly-rotated residential proxy sessions and only falls back to relatedUnavailable: true with null fields when every attempt is genuinely exhausted; it never fabricates a value. Separately, autocompleteTerms comes from the Google Suggest endpoint (the same one behind the search box), expanded a–z per seed for broad long-tail coverage, and topicClusters groups that pool into deterministic lexical buckets with no model involved.

{
"relatedQueries": [
{ "query": "best coffee maker 2026", "value": 100, "rank": 1 },
{ "query": "coffee maker with grinder", "value": 87, "rank": 2 }
],
"relatedTopics": [
{ "topicTitle": "Espresso machine", "topicType": "Topic", "topicMid": "/m/02f2t3", "value": 92, "rank": 1 }
],
"relatedUnavailable": false,
"autocompleteTerms": ["coffee maker with grinder", "coffee maker single serve", "coffee maker under $50"],
"topicClusters": [{ "clusterLabel": "grinder", "keywords": ["coffee maker with grinder", "espresso grinder combo"], "count": 2 }]
}

Interest-over-time trend series

interestOverTime_timelineData is the same 0–100 relative-popularity series Google Trends shows for a keyword (or up to five comma-separated keywords compared together via splitCommaSeparated), bucketed by date and localized by geo, category, and timeRange/exactDateRange. It's the baseline signal to chart seasonality and demand shifts alongside the related-query and autocomplete layers.

Why not build this yourself?

Google Trends has no official public API — the widgets behind the public website are unofficial endpoints that change shape without notice, throttle aggressively (especially the related-queries widget), and block datacenter IPs outright under load. Building and maintaining a scraper for this means handling proxy escalation, retry logic, and endpoint drift yourself, on top of writing the autocomplete-expansion and clustering layer from scratch. Google Trends Scraper With Keyword Research already climbs a no-proxy → datacenter → residential proxy ladder, retries the related-queries widget across rotated residential sessions, and normalizes everything into one JSON schema. Use it when you want keyword-research data now; build your own only if you need to change the underlying scraping logic itself.

A Google Trends scraper answers "how has interest in this term moved, relative to itself, over time," while a keyword research tool typically answers "how many people search this term, and what else should I target." Traditional keyword tools (built on Google Keyword Planner-style data) report absolute or estimated monthly search volume; Google Trends only ever reports a relative 0–100 index, and this Actor does not compute or invent an absolute volume number — it doesn't have access to one. What it does add on top of the trend line is the discovery side of keyword research: real related queries and topics, autocomplete-derived long-tail variants, and topic clusters — the part of "keyword research" that's about finding new terms, not sizing existing ones.

Google Trends Scraper With Keyword Research sits across both categories: interestOverTime_timelineData covers the trend-tracking side, while relatedQueries, relatedTopics, autocompleteTerms, and topicClusters cover the discovery side. If you need absolute search-volume estimates, pair this Actor's output with a volume-reporting tool rather than expecting it here.

No input field is required, but a run needs at least one seed — via seedKeywords, googleTrendsUrls, or keywordSheetId — to return any rows.

  1. Open the Actor on its Apify Store listing and go to the Input tab.
  2. Add one or more terms to seedKeywords (e.g. "coffee maker"), or paste Google Trends URLs into googleTrendsUrls, or point keywordSheetId at a public Google Sheet.
  3. Set the query controls that matter: historyRange or exactDateRange, targetCountry, researchCategory, risingOrTop, and the autocomplete/cluster toggles.
  4. Start the run.
  5. Read results from the Dataset tab, or export as JSON or CSV.
{
"seedKeywords": ["coffee maker", "espresso machine"],
"historyRange": "today 12-m",
"targetCountry": "US",
"risingOrTop": "rising",
"includeRelated": true,
"includeAutocomplete": true
}

How to run multiple keyword searches in one job

seedKeywords accepts an array — each line becomes its own seed group by default, fetched concurrently up to concurrencyLimit. Turn on splitCommaSeparated to instead compare up to five comma-separated keywords per line as a single group (Google Trends' own comparison limit). Seed groups run through an asyncio.Semaphore bounded by concurrencyLimit, so a large batch doesn't need a separate run per keyword.

⬇️ Input

All 22 input fields are optional; a run needs at least one seed source (seedKeywords, googleTrendsUrls, or keywordSheetId) to return rows.

ParameterRequiredTypeDescriptionExample Value
seedKeywordsNoarrayKeywords/topics to research. Required unless a Trends URL or Sheet is used.["coffee maker"]
splitCommaSeparatedNobooleanOn: a comma-separated line is compared as one group (max 5). Off: each line is its own seed. Default false.false
includeRelatedNobooleanFetch related queries and related topics for each seed. Default true.true
risingOrTopNostringWhich related set to return: rising (breakout) or top (most popular). Default rising.rising
includeAutocompleteNobooleanExpand each seed via Google Suggest autocomplete. Default true.true
autocompleteExpandNobooleanOn: probe seed aseed z for more long-tail suggestions. Off: raw seed only. Default true.true
clusterKeywordsNobooleanDerive topicClusters from the expanded keyword pool. Default true.true
autocompleteLanguageNostringISO 639-1 language code for autocomplete. Default en.en
autocompleteCountryNostringISO 3166-1 alpha-2 country code for autocomplete. Blank = derived from targetCountry.us
historyRangeNostringInterest-history window: Past hour to All time. Default today 12-m.today 12-m
targetCountryNostringISO country code to localize trend and related data. Blank = Worldwide.US
localeCountryNostringLowercase "viewed-from" country context. Blank = auto.us
researchCategoryNostringGoogle Trends category id, or blank for all categories.""
exactDateRangeNostringExact window YYYY-MM-DD YYYY-MM-DD, overrides historyRange.""
googleTrendsUrlsNoarrayFull Google Trends URLs to derive seeds/geo/date/category from.[]
keywordSheetIdNostringPublic Google Sheet ID to load seeds from (one column, row 1 = header).""
maxKeywordGroupsNointegerMax output rows (seed groups). 0 = no limit.0
requestRetriesNointegerRetry attempts for failed Google Trends requests. Default 3.3
concurrencyLimitNointegerSeed groups fetched in parallel (real asyncio.Semaphore). Default 10.10
pageTimeoutSecsNointegerPer-request HTTP timeout applied to every Trends call. Default 180.180
skipDebugSnapshotsNobooleanSkip saving the per-group debug key-value-store snapshot. Default false.false
proxyConfigurationNoobjectProxy settings. RESIDENTIAL reduces related-widget throttling.{"useApifyProxy": true}

Example JSON input

{
"seedKeywords": ["coffee maker", "espresso machine", "cold brew"],
"splitCommaSeparated": false,
"includeRelated": true,
"risingOrTop": "rising",
"includeAutocomplete": true,
"autocompleteExpand": true,
"clusterKeywords": true,
"autocompleteLanguage": "en",
"autocompleteCountry": "us",
"historyRange": "today 12-m",
"targetCountry": "US",
"researchCategory": "",
"maxKeywordGroups": 0,
"requestRetries": 3,
"concurrencyLimit": 10,
"pageTimeoutSecs": 180,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Common pitfall: relatedQueries/relatedTopics come from the Google Trends widget Google throttles hardest. If you're seeing relatedUnavailable: true on a lot of rows, set proxyConfiguration to use RESIDENTIAL proxy groups rather than running with no proxy — datacenter and no-proxy connections are throttled far more aggressively on the related widget than on interest-over-time.

⬆️ Output

Results are typed, normalized JSON with a consistent schema across runs, exportable as JSON or CSV from the Dataset tab. One row is pushed per seed group that returned a valid interest-over-time series; groups with no search volume are skipped rather than pushed empty.

Scraped results

[
{
"inputUrlOrTerm": "coffee maker",
"searchTerm": "coffee maker",
"timeRange": "today 12-m",
"geo": "US",
"category": "0",
"interestOverTime_timelineData": [
{ "date": "2025-07-27", "coffee maker": 62 },
{ "date": "2025-08-03", "coffee maker": 58 },
{ "date": "2025-08-10", "coffee maker": 65 }
],
"relatedQueries": [
{ "query": "best coffee maker 2026", "value": 100, "rank": 1 },
{ "query": "coffee maker with grinder", "value": 87, "rank": 2 },
{ "query": "single serve coffee maker", "value": 74, "rank": 3 }
],
"relatedTopics": [
{ "topicTitle": "Espresso machine", "topicType": "Topic", "topicMid": "/m/02f2t3", "value": 92, "rank": 1 },
{ "topicTitle": "Keurig", "topicType": "Brand", "topicMid": "/m/0j8t4x", "value": 68, "rank": 2 }
],
"relatedUnavailable": false,
"autocompleteTerms": ["coffee maker with grinder", "coffee maker single serve", "coffee maker under $50"],
"topicClusters": [
{ "clusterLabel": "grinder", "keywords": ["coffee maker with grinder", "espresso grinder combo"], "count": 2 }
],
"scrapedAt": "2026-07-26T09:14:02Z"
},
{
"inputUrlOrTerm": "espresso machine",
"searchTerm": "espresso machine",
"timeRange": "today 12-m",
"geo": "US",
"category": "0",
"interestOverTime_timelineData": [
{ "date": "2025-07-27", "espresso machine": 48 },
{ "date": "2025-08-03", "espresso machine": 51 }
],
"relatedQueries": null,
"relatedTopics": null,
"relatedUnavailable": true,
"autocompleteTerms": ["espresso machine under $200", "espresso machine with grinder"],
"topicClusters": [],
"scrapedAt": "2026-07-26T09:14:11Z"
},
{
"inputUrlOrTerm": "cold brew",
"searchTerm": "cold brew",
"timeRange": "today 12-m",
"geo": "US",
"category": "0",
"interestOverTime_timelineData": [
{ "date": "2025-07-27", "cold brew": 71 },
{ "date": "2025-08-03", "cold brew": 69 }
],
"relatedQueries": [
{ "query": "cold brew concentrate", "value": 100, "rank": 1 }
],
"relatedTopics": [
{ "topicTitle": "Cold brew coffee", "topicType": "Topic", "topicMid": "/m/0h8n2z", "value": 88, "rank": 1 }
],
"relatedUnavailable": false,
"autocompleteTerms": ["cold brew concentrate", "cold brew recipe", "cold brew vs iced coffee"],
"topicClusters": [
{ "clusterLabel": "concentrate", "keywords": ["cold brew concentrate", "cold brew concentrate recipe"], "count": 2 }
],
"scrapedAt": "2026-07-26T09:14:20Z"
}
]

The second row above shows relatedUnavailable: true — the honest failure state when Google's related-queries quota blocked every retry attempt for that seed, rather than a fabricated value.

  • SEO and content strategists: feed relatedQueries, autocompleteTerms, and topicClusters straight into a content brief — cluster labels become article buckets, and risingOrTop: "rising" surfaces breakout terms before competitors write about them.
  • PPC and paid-search teams: build keyword lists and negative-keyword candidates from relatedQueries/autocompleteTerms without manually typing suggestions into the Trends UI one seed at a time.
  • Market researchers: compare interestOverTime_timelineData across a set of seeds (brand vs. category vs. competitor) to gauge relative share of search interest and volatility over a chosen historyRange.
  • AI engineers and LLM developers: an agent issues a seed-keyword query, receives this Actor's structured JSON back, and grounds a content, SEO, or trend-forecasting answer in live Google Trends data instead of stale training data.

Keyword monitoring here means re-running the same seed list on a schedule and diffing the new rows against the previous run, rather than treating one snapshot as permanent — a keyword's trend line and related-query set both drift week to week, and a single run only ever tells you where things stood at that moment. Because each row is keyed by searchTerm and stamped with scrapedAt, repeated runs let you diff interestOverTime_timelineData for a rising or falling trend line, watch relatedQueries/relatedTopics for new entries that weren't in the prior run (a signal a term is newly breaking out), track autocompleteTerms for newly-surfacing long-tail phrasing, and track topicClusters for clusters that grow or shrink in count between runs.

A basic workflow: schedule this Actor against a fixed seedKeywords list with risingOrTop set to rising, store each run's rows keyed by searchTerm and scrapedAt in your own database or warehouse, then diff the newest run's relatedQueries array against the previous run's for the same seed and alert whenever a new query enters the top ranks or an existing query's value jumps sharply. The same diff applied to interestOverTime_timelineData catches a trend line that's newly turning upward before it shows up anywhere else. There's no actor-specific webhook built into this Actor, so pair a scheduled run with Apify's platform-level Schedule feature and the Apify API's dataset endpoints or run-finished webhooks to move each run's rows into your own pipeline for the diffing step.

Google Trends Scraper With Keyword Research works with any language or tool that can send an HTTP request.

REST API with Python

import requests
TOKEN = "<YOUR_APIFY_TOKEN>"
url = "https://api.apify.com/v2/acts/scrapier~google-trends-scraper-with-keyword-research/run-sync-get-dataset-items"
payload = {
"seedKeywords": ["coffee maker"],
"risingOrTop": "rising",
"includeRelated": True,
}
resp = requests.post(url, params={"token": TOKEN}, json=payload, timeout=180)
rows = resp.json() # list of seed-group rows, as shown above
for row in rows:
print(row["searchTerm"], row["relatedQueries"], row["relatedUnavailable"])

MCP for query-grounded AI agents

The Actor is reachable through Apify's Actors MCP Server: run npx @apify/actors-mcp-server --tools scrapier/google-trends-scraper-with-keyword-research locally with an APIFY_TOKEN set, or connect the hosted server at https://mcp.apify.com. Register it with an MCP-compatible client — Claude Desktop, Claude Code, or Cursor — and an agent can call it as a tool: a user asks about a trending topic, the agent runs the keyword research, and grounds its answer in the returned related-query and trend fields.

Scheduled monitoring and delivery

There is no actor-specific webhook built into this Actor. Attach it to Apify's platform-level Schedule to trigger runs on an interval, and use the Apify API's run-finished webhooks or dataset export endpoints to deliver each run's rows into your own storage or pipeline.

Yes. Google Trends data is aggregate, non-personal search-interest data that Google itself publishes on a public website for any visitor to view — this Actor returns the same relative trend scores, related queries/topics, and autocomplete suggestions a logged-out visitor already sees, not personal or account-linked data. Google's Terms of Service govern automated access to its properties, so ongoing high-volume or commercial use should be reviewed against those terms. Scraping aggregate trend data for research or monitoring carries a different risk profile than scraping personal data, and a different one again than using it to train a model. Consult your legal team for commercial use cases involving bulk data storage or resale.

Frequently asked questions

What keyword-research data does this Actor actually return?

Beyond the interest-over-time trend line, it returns Google's own related queries and related topics (relatedQueries, relatedTopics, switchable between rising and top), Google Suggest autocomplete expansion (autocompleteTerms), and deterministic topic clusters (topicClusters) derived from the combined keyword pool — real discovery data, not just a single term's trend score.

Which regions and categories can I localize results to?

targetCountry localizes trend and related data to any of the ISO country codes in the schema (blank = worldwide), researchCategory narrows to a specific Google Trends category id, and autocompleteLanguage/autocompleteCountry control the language and region used for autocomplete suggestions independently.

Yes. risingOrTop (default rising) switches the related-queries and related-topics sets between Google's "rising" (fast-growing/breakout) and "top" (most popular all-time) classifications for every seed in the run.

How does this Actor handle Google's anti-bot and rate-limit measures?

It escalates through a no-proxy → datacenter → residential proxy ladder when interest-over-time requests come back blocked, and for the related-queries widget specifically it retries across freshly-rotated residential proxy sessions with backoff, since Google throttles that endpoint harder than any other it hits.

It extracts both. relatedQueries and relatedTopics arrive alongside interestOverTime_timelineData on every row, unless Google's related-widget quota blocks every retry attempt for that seed — in that case both are null and relatedUnavailable is set to true, never filled with fabricated data.

How many results does this Actor return per query?

One row per seed group by default, capped by maxKeywordGroups (0 = no limit). Within a row, relatedQueries/relatedTopics and autocompleteTerms reflect whatever Google's widgets return for that seed — there is no fixed per-query result-count cap in the schema beyond maxKeywordGroups.

Schedule this Actor against the same seedKeywords list, store each run's rows keyed by searchTerm and scrapedAt, and diff interestOverTime_timelineData, relatedQueries, and topicClusters between runs to catch a rising trend or a newly-emerging related term.

Does this Actor work with Claude, ChatGPT, and AI agent frameworks?

Yes — it's callable as a plain HTTP endpoint by any agent framework that can send a request, and it's also reachable through Apify's Actors MCP Server (npx @apify/actors-mcp-server --tools scrapier/google-trends-scraper-with-keyword-research, or the hosted https://mcp.apify.com) for MCP-native clients like Claude Desktop and Claude Code.

Can I load seeds from a URL or spreadsheet instead of typing keywords?

Yes. googleTrendsUrls derives seeds, geo, date range, and category directly from pasted Google Trends URLs, and keywordSheetId loads seeds from a public Google Sheet's first column (row 1 treated as a header).

Can I use this Actor without managing proxies or a Google account?

Yes. No Google account or login is required — every endpoint this Actor hits (Trends widgets, Google Suggest) is public and logged-out. Proxy escalation is automatic across the no-proxy/datacenter/residential ladder; you can also pin proxyConfiguration to RESIDENTIAL yourself to reduce related-widget throttling.

Your feedback

Found a bug or a field that doesn't match what's documented here? Let us know through the Actor's Issues tab on Apify or Scrapier's support contact — reports like this go straight into fixing the extractor.