Google Trends Scraper: Compare Keywords, Trending Now, API
Pricing
$1.00 / 1,000 results
Google Trends Scraper: Compare Keywords, Trending Now, API
Google Trends scraper and API: interest over time, interest by region, related queries and Trending Now for any number of keywords. Compares more than 5 terms on one scale. $1 per 1,000 results, pay per result, no rental. No login, no browser.
Pricing
$1.00 / 1,000 results
Rating
0.0
(0)
Developer
Data Gleaner
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Share
Google Trends Scraper and API: compare keywords, related queries, Trending Now
Give it any number of keywords and countries and get Google Trends interest over time, interest by region, related queries and topics, and the Trending Now list as JSON, CSV or Excel. No login, no browser, no Google account. $1 per 1,000 results, charged per result: no monthly rental.
Why this one
- Compare more than 5 keywords. Google compares at most 5 terms at once. Give this Actor 50: it splits them into groups of up to 5, keeps the first term in every group as an anchor, and rescales each group so the values stay comparable (
scaledToAnchor; the unscaled number is kept inrawValue). - You pay for results, not for waiting. One flat price per dataset item. A related-queries or topics result that comes back empty is skipped and not charged, and an output type that fails entirely is not charged.
maxItemsand the run's maximum charge cap the bill. - Built for Google's rate limits. Paced requests, then exponential backoff with a fresh session on HTTP 429 (
maxRetries, default 6). One failing term never fails the run. A heavily throttled run can take a couple of minutes; the status message names any output that failed. - Trending Now in one call. Current trending searches for a country with start time, search volume, growth and related queries, sorted by volume or start time, over 4, 24, 48 or 168 hours.
- Paste a Google Trends link. A
trends.google.com/trends/explore?q=...URL insearchTermsruns with its terms, location, range, category and property.
Minimal input
{"searchTerms": ["python", "javascript"], "geo": ["US"]}
Sample output rows
Interest over time, from a platform run on 2026-10-11 (timeline shortened to two of its weekly points):
{"outputType": "interestOverTime","searchTerm": "chatgpt","geo": "US","timeRange": "today 12-m","category": 0,"property": "web","average": 76.22,"peakValue": 100,"peakDate": "2025-10-19T00:00:00+00:00","latestValue": 77,"groupIndex": 1,"scaledToAnchor": null,"timeline": [{"date": "2025-10-05T00:00:00+00:00","value": 94,"rawValue": 94,"hasData": true,"isPartial": false},{"date": "2025-10-12T00:00:00+00:00","value": 92,"rawValue": 92,"hasData": true,"isPartial": false}],"scrapedAt": "2026-10-11T06:10:10+00:00"}
Trending Now ("mode": "trendingNow", related queries shortened):
{"outputType": "trendingNow","rank": 1,"title": "arch manning","geo": "US","startedAt": "2026-10-10T15:30:00+00:00","searchVolume": 1000000,"growthPercent": 1000,"relatedQueries": ["ut vs ou","oklahoma vs texas","texas football"],"categoryIds": [17],"windowHours": 24,"input": {"geo": "US","trendingHours": 24,"trendingSortBy": "searchVolume"},"scrapedAt": "2026-10-11T06:10:02+00:00"}
Price
$1 per 1,000 results ($0.001 each). 40 terms x 2 countries x 2 outputs = 160 results = $0.16. A Trending Now run is 20 to 500 results depending on the window.
Limits
Google decides what it answers: relatedTopics is beta and often empty for automated requests, and Google can slow or block bursts of requests. Values are relative (0 to 100 per comparison), not search counts.
Why use it
- Compare more than 5 keywords. Google compares at most 5 terms at once. Give this Actor 50 and it splits them into groups of up to 5, puts the first term (the anchor) in every group, and rescales each group to the first group's scale using the anchor's peak, so values from different groups can be compared. Each item says which group it came from and whether it was rescaled (
scaledToAnchor); the unscaled number is kept inrawValue. - Handles Google's rate limits. Requests are paced (
requestDelaySeconds), and on HTTP 429 the Actor backs off and retries (maxRetries). One failing term never fails the run. - Trending Now mode. The current trending searches for a country, with start time, search volume, growth and related queries, ordered by search volume or start time (
trendingSortBy). - YouTube, News, Images and Shopping. Set
propertyto measure those Google surfaces instead of web search. - Paste a Google Trends URL. A
trends.google.com/trends/explore?q=...link insearchTermsruns with the terms, location, time range, category and property from that URL. - No browser. Plain HTTP requests, so runs are light and fast.
- Easy to consume. camelCase fields, ISO 8601 dates, numbers as numbers, scalar summary columns (
average,peakValue,peakDate,latestValue,topRegion,topQuery) next to the arrays.
Use cases
Keyword and content research, SEO seasonality, market and product timing, news and PR monitoring, comparing regions, feeding trend data into an LLM or a dashboard.
Input
{"mode": "search","searchTerms": ["python", "rust", "go", "java", "kotlin", "swift"],"geo": ["US", "GB"],"timeRange": "today 12-m","category": 0,"property": "web","outputs": ["interestOverTime", "interestByRegion", "relatedQueries", "relatedTopics"],"regionResolution": "REGION"}
| Field | Meaning |
|---|---|
mode | search (default) or trendingNow. |
searchTerms | Any number of terms. Duplicates are removed. |
geo | Country or region codes (US, DE, US-CA). Empty means worldwide. Each location is run separately. |
timeRange | Default today 12-m. 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. |
customStartDate, customEndDate | YYYY-MM-DD. When both are set they replace the preset. |
category | Google Trends category ID. 0 is all. |
property | web, youtube, news, images, froogle. |
outputs | Any of interestOverTime (default), interestByRegion, relatedQueries, relatedTopics. One item is written per term, location and output. A related queries or topics result that comes back empty is skipped and not charged. relatedTopics is beta and often empty: Google withholds the data from automated requests. |
regionResolution | COUNTRY, REGION, CITY, DMA. Applies to country-level locations; worldwide and sub-country searches use Google's native level. |
includeLowSearchVolumeRegions | Also list regions with too little data. |
trendingHours | Trending Now window: 4, 24, 48 or 168 hours (default 24). |
trendingSortBy | Trending Now order: searchVolume (default, biggest first) or startedAt (newest first). |
maxItems | Stop after this many dataset items, each one charged. 0 (default) means no limit. Useful in Trending Now mode, where one country can return several hundred trends. |
language | Interface language for related query and topic names, such as en-US (default), de, ja. |
requestDelaySeconds, maxRetries | Pacing (default 1.5 s) and attempts per request (default 6, maximum 15; a request is given up after that many tries). On 429 or a network error the wait starts at about 8 s and doubles up to about 45 s (with jitter), with a fresh session each time, so a throttled run can take a couple of minutes. If large batches keep hitting 429, raise requestDelaySeconds or turn on a residential proxy. |
proxyConfiguration | Optional. Off by default, which works best: Apify's shared datacenter proxy is throttled by Google. Use a residential proxy only if a large batch keeps hitting 429. |
Output
Interest over time (outputType: "interestOverTime"):
{"outputType": "interestOverTime","searchTerm": "rust","geo": "US","timeRange": "today 3-m","category": 0,"property": "web","average": 41.3,"peakValue": 66.2,"peakDate": "2026-08-14T00:00:00+00:00","latestValue": 52.1,"groupIndex": 2,"scaledToAnchor": "python","timeline": [{"date": "2026-07-07T00:00:00+00:00", "value": 39.0, "rawValue": 39, "hasData": true, "isPartial": false}],"input": {"searchTerm": "rust", "geo": "US", "timeRange": "today 3-m", "category": 0, "property": "web"},"scrapedAt": "2026-10-07T15:54:54+00:00"}
Other output types: interestByRegion (resolution, topRegion, regions: [{geoCode, name, value}]), relatedQueries and relatedTopics (top and rising arrays; rising entries have isBreakout), and trendingNow (rank, title, startedAt, searchVolume, growthPercent, relatedQueries, categoryIds, windowHours).
How values work: Google scales each comparison so its highest point is 100. Interest over time is rescaled across groups with the anchor as described above (the anchor's peak must be above zero in both groups; otherwise the item keeps its raw values and scaledToAnchor is null). Region values and related-query values are always relative to that one term, so they are not rescaled. Related topics need a separate request per term because Google leaves them out of multi-term comparisons.
Pricing
Pay per event: one result event for each dataset item, at $1 per 1,000 results. The Actor stops pushing as soon as your maximum charge is reached.
With no searchTerms, the Actor runs an example: 2 terms (python, javascript), interest over time plus related queries, up to 4 items. The Console prefill is the same.
If an output type fails entirely (for example Google refuses every request), the run's status message names it, and nothing is charged for it.
Worked example: 40 terms, 2 countries, interest over time plus related queries is 40 x 2 x 2 = 160 results, about $0.16. A Trending Now run for one country is about 20 to 500 results depending on the window.
Use with Python
pip install apify-client, set the APIFY_TOKEN environment variable, and run. This input returns 5 items (one timeline per term), under $0.01.
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("datagleaner/google-trends-scraper").call(run_input={"searchTerms": ["python", "javascript", "rust", "go", "kotlin"],"geo": ["US"],"timeRange": "today 12-m","outputs": ["interestOverTime"],})for item in client.dataset(run.default_dataset_id).iterate_items():print(item["searchTerm"], item.get("average"), item.get("peakValue"), item.get("peakDate"))
Use with JavaScript / Node.js
npm install apify-client, set APIFY_TOKEN, and run it as an ES module (.mjs).
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('datagleaner/google-trends-scraper').call({searchTerms: ['python', 'javascript', 'rust', 'go', 'kotlin'],geo: ['US'],timeRange: 'today 12-m',outputs: ['interestOverTime'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) console.log(item.searchTerm, item.average, item.peakValue, item.peakDate);
Use it from n8n, Make, Zapier or an AI agent
Actor ID: datagleaner/google-trends-scraper
Minimal input:
{"searchTerms": ["python", "javascript"], "geo": ["US"]}
Each tool below runs this Actor with your own Apify API token.
-
n8n: add the Apify node (
@apify/n8n-nodes-apify). On n8n Cloud you install it from the community node registry. Choose Run an Actor and get dataset, set Actor todatagleaner/google-trends-scraperand paste the input above. -
Make: use the Apify app's Run an Actor module, then Get Dataset Items to read the results. Watch Actor Runs can trigger a scenario when a run finishes.
-
Zapier: use the Apify action Run Actor, then the search Fetch dataset items. The trigger Finished Actor run starts a Zap when a run ends.
-
AI agents (MCP): connect to
https://mcp.apify.com?tools=datagleaner/google-trends-scraper. In Claude Code:claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/google-trends-scraper"Then run
/mcpto sign in to Apify in your browser. To use an Apify token instead, add--header "Authorization: Bearer YOUR_APIFY_TOKEN". Clients that take a remote server URL in anmcpServersconfig use{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=datagleaner/google-trends-scraper"}}}. Then ask in plain language, for example: "Pull Google Trends interest over the past 12 months in the US for air fryer, rice cooker and slow cooker, plus their rising related queries, and tell me which one is growing fastest." An agent without the Actor preloaded can find it with Apify'ssearch-actorstool by searching "google trends". -
LangChain (Python):
# pip install langchain-apify, then set APIFY_TOKEN in your environmentimport jsonfrom langchain_apify import ApifyActorsTooltool = ApifyActorsTool("datagleaner/google-trends-scraper")result = tool.invoke({"run_input": json.loads('{"searchTerms": ["python", "javascript"], "geo": ["US"]}')})
Limits
- Google rate-limits Trends requests. Without a proxy, a 40-term, 2-country, 3-output batch (264 requests) finished with every result in about 14 minutes, with the Actor backing off on 429. Apify's shared datacenter proxy does worse than no proxy, and a very large batch may need a residential proxy.
- Google's data is sampled and normalised; it is a relative index, not search counts (Trending Now search volumes are Google's rounded buckets).
- Region data for a term with very low interest can be empty.
FAQ
Is this a Google Trends API? It works as one: call it over the Apify API or from Python and Node.js (examples above) and get the same Trends data as JSON. No Google account or API key is needed; only public Trends data is read.
Can I compare more than 5 keywords in Google Trends? Yes. Give any number of searchTerms; the Actor groups them in fives around the first term and rescales every group to one scale, so all terms are comparable.
How do I export Google Trends data to CSV or Excel? Export the run's dataset as CSV or Excel. The scalar columns are flat and the arrays (such as timeline) are JSON text in their cell.
Why do values for the same term differ between runs? Google samples its data and the index depends on the other terms in the comparison. Use the anchor to compare across groups.
Is the data real time? now 1-H and Trending Now with trendingHours: 4 are close to real time.
Responsible use
The Actor collects only data that Google Trends shows publicly and contains no personal data. You are responsible for using the output lawfully and in line with Google's terms and the rules that apply to you.