Google Trends Scraper - Keywords, Regions & Trending avatar

Google Trends Scraper - Keywords, Regions & Trending

Pricing

from $3.20 / 1,000 google trends searches

Go to Apify Store
Google Trends Scraper - Keywords, Regions & Trending

Google Trends Scraper - Keywords, Regions & Trending

Google Trends scraper: interest over time and by region, related queries and topics, plus today's trending searches for any country. Geo, time, category and property filters. No API key, no proxies to manage.

Pricing

from $3.20 / 1,000 google trends searches

Rating

0.0

(0)

Developer

Rosario Vitale

Rosario Vitale

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Why use this Actor?

Google Trends scraper: interest over time and by region, related queries and topics, plus today's trending searches for any country. Geo, time, category and property filters. No API key, no proxies to manage.

Features

  • Mode — Analyze keywords or fetch current trending searches.
  • Keywords — One to five terms to compare in Google Trends Explore. For more terms or several comparisons, use the bulk section below.
  • Geography — Country/region code such as US, IT, GB. Leave blank for worldwide Explore data.
  • Time range — Examples: today 3-m, today 12-m, today 5-y, all, or a custom date range.
  • Category — Google Trends category ID. Use 0 for all categories.
  • Google property — Search surface to analyze.
  • Language — Google Trends interface locale, for example en-US or it-IT.
  • Timezone offset (minutes) — Timezone offset in minutes used by Google Trends.
  • Interest over time — Return the interest-over-time series: one dataset row per date with the 0–100 popularity of every keyword.
  • Interest by region — Return regional interest data.
  • Related queries — Return top and rising related searches.
  • Related topics — Return top and rising related topics.

Use cases

  • Keyword trend research.
  • Regional demand analysis.
  • Trending now monitoring.
  • Content and market planning.

Example input

{
"mode": "explore",
"keywords": [
"bitcoin",
"ethereum"
],
"geo": "US",
"timeRange": "today 3-m",
"category": 0,
"language": "en-US"
}

Pricing & cost control

The primary event costs $0.004000 per Google Trends search (about $4.00 per 1,000 successful primary events). Only successful primary events are intentionally billed by this Actor; summary/status rows add context without adding primary-event charges.

Use the bounded input limits and filters to keep both event charges and platform usage predictable.

FAQ

What is this Actor for?
It is designed for keyword trend research, regional demand analysis, Trending Now monitoring.

Can I run it on a schedule?
Yes. You can schedule Actor runs on Apify and send the resulting dataset into automations, webhooks, storage, or downstream APIs.

How do I control cost and run size?
Use the input limits and filters shown in the Actor input form. The Actor applies bounded defaults and hard caps so large jobs remain predictable.

Pricing at a glance

RunSearchesCost
2 keywords compared, all sections (about 340 rows)1$0.004
10 keyword groups or 10 single search terms10$0.04
Trending now (RSS feed or Trending Now list)1$0.004

Plus a small run start fee of $0.0001 per GB of run memory.

Subscriber discounts: on a paid Apify plan you pay even less per search — Bronze −10%, Silver −15%, Gold and higher −20% ($0.0032 per search on Gold).

Apify platform usage (compute, storage, data transfer) is included — you pay only the search price plus the start fee. No surprise compute bill, even on long runs.

Use the run's maximum charge setting to cap spending — the Actor stops cleanly when the limit is reached, and a search is only delivered if it was paid for.

Use it from AI agents (MCP) and code

AI agents — Claude, ChatGPT, Cursor, VS Code, n8n AI agents and any MCP client can run this Actor through the official Apify MCP server: add https://mcp.apify.com?tools=zenomastro/google-trends-reliable to your client. Then just ask, for example:

"What is trending on Google in the US right now, and how has interest in 'AI agents' changed this year?"

The agent fills the input from the field descriptions and receives clean JSON it can reason over.

API — one HTTP call runs the Actor and returns the results directly:

curl -X POST "https://api.apify.com/v2/acts/zenomastro~google-trends-reliable/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "trending", "geo": "US", "trendingLimit": 3, "requestTimeoutSecs": 20, "retries": 2}'

The same works from the Apify Python/JavaScript clients, Make, n8n, Zapier, LangChain and LlamaIndex integrations, or on a schedule.

It exports Google Trends data as clean rows: interest over time, interest by region (countries, states, US metro areas or cities), related queries and related topics for any keywords, plus today's trending searches for any country, from Google's RSS feed or the full Trending Now list with search volume. It compares up to 5 terms per search, puts any number of terms on one shared scale with an anchor keyword, and runs many comparisons and locations in one run. No API key, no browser and no proxies to manage; every run can be scheduled or called through the Apify API, MCP or integrations.

Who it is for: SEO and content teams comparing keywords and seasonality, marketers and e-commerce sellers sizing demand by country and region, analysts and data scientists who need Google Trends as an API, newsrooms and social teams watching what is trending, and AI agents that need trend data as JSON.

How to use it

  1. Choose the Mode: Keyword analysis or Trending now.
  2. For keyword analysis, enter up to 5 keywords to compare (or use Search terms, Keyword groups, Google Trends URLs or a Google Sheet for many), then pick the Geography (or several locations), Time range, Category and Google property (web, images, news, YouTube, Shopping).
  3. For trending searches, enter the country (or several) and, optionally, the Trending Now source with time window and categories.
  4. Click Start. Export the results as JSON, CSV, Excel or HTML, or read them through the API. One search (a keyword comparison or one trending list) is one charge, however many rows it returns.

Keyword analysis

Example input:

{
"mode": "explore",
"keywords": ["bitcoin", "ethereum"],
"geo": "US",
"timeRange": "today 3-m",
"property": "",
"includeInterestOverTime": true,
"includeInterestByRegion": true,
"includeRelatedQueries": true,
"includeRelatedTopics": true
}

Supported Google properties: Web Search, Image Search, News Search, YouTube Search and Google Shopping.

Common time ranges include today 1-m, today 3-m, today 12-m, today 5-y, all, now 1-H, now 4-H, now 1-d and now 7-d. Custom ranges use "YYYY-MM-DD YYYY-MM-DD". A time range or geo code Google would reject is reported as a clear input error before any request is made.

Bulk keywords and comparing more than 5 terms

Google Trends compares at most 5 terms at a time. To analyze more, use any of these (when one is set, keywords is ignored):

  • searchTerms — a list of any length. Without an anchor, each term is analyzed on its own.
  • keywordGroups — one comparison per line, for example iphone, samsung galaxy, google pixel.
  • trendsUrls — pasted trends.google.com/trends/explore?... links. Each URL keeps its own q, geo, date, cat and gprop; a URL without date uses Google's default, the past 12 months.
  • spreadsheetId — a public Google Sheet (shared as "Anyone with the link can view"): paste its URL or ID. The first column below the header row is added to searchTerms; a #gid= in the URL selects the tab. If the sheet cannot be read, the run says so in an error row and nothing is charged for it.
{
"mode": "explore",
"searchTerms": ["iphone", "samsung galaxy", "google pixel", "oneplus", "xiaomi", "motorola"],
"anchorKeyword": "weather",
"geo": "US",
"timeRange": "today 12-m",
"includeKeywordSummary": true
}

With anchorKeyword, terms are compared in batches of 4 plus the anchor, and every value also gets a scaledValue: value × (anchor in the first group ÷ anchor in this group). All terms are then on the first group's scale and can be compared directly (scaled values can exceed 100). For interest by region the ratio is applied per region, so a region gets a scaledValue only if the first group also has data for it. Pick a popular, stable anchor; if the anchor has no data, scaledValue is null. The anchor's own region map and related queries/topics are the same in every batch, so they are returned once, with the first group. URL groups are not anchored because each URL can use its own location and period.

Every row carries groupIndex, groupKeywords and a sourceUrl that opens the same comparison on Google Trends. maxGroups (default 20, max 100) caps the searches per run; extra groups are listed in a free notice row. Groups run one after another with a short pause to avoid Google rate limits. A single-term group takes about 5 Google requests. Every extra compared term adds its own region map and related lists, so a 5-term group takes up to 18 requests and returns more rows.

Several locations in one run

geos runs the same analysis for up to 50 locations, for example ["US", "GB", "DE", "IT"] (use WORLDWIDE for a worldwide search). Every keyword group is fetched once per location, location by location, and each is one search; rows carry their own geo. Google normalizes every location on its own 0–100 scale, so values are comparable within a location, not across locations; with an anchor keyword, each location gets its own reference scale. Pasted Trends URLs keep their own location. Remember that maxGroups counts every keyword group once per location.

{
"mode": "explore",
"keywordGroups": ["electric car, hybrid car"],
"geos": ["US", "GB", "DE", "FR", "IT"],
"timeRange": "today 5-y",
"includeKeywordSummary": true
}

Region detail

regionResolution chooses the level of Interest by region: AUTO (Google's default), COUNTRY (worldwide searches, blank geo), REGION (states/regions of a country geo), DMA (US metro areas, geo US or a US state) or CITY. City rows have regionCode: null and coordinates (lat, lng); city maps only return cities that have data. includeLowVolumeRegions adds regions with low search volume. skipEmptyRegions drops regions where Google has no data for any keyword. A worldwide map lists about 250 countries, many of them empty for niche terms, so this option makes the dataset much smaller. Every region row has resolution and per-keyword hasData. Per-keyword maps (one per compared term) carry sourceKeyword. With several locations, a level that does not fit one of them (for example DMA outside the US) is reported for that location only.

Keyword summary (free)

With includeKeywordSummary: true, each keyword also gets one free keyword_summary row with these fields:

  • average — Google's own average for the period
  • peakValue / peakDate
  • latestValue / latestDate — the last complete point
  • changeVsPeriodStartPercent — average of the last 10% of points vs the first 10%
  • trendDirection — rising, stable or falling, from a linear fit; stable means less than 10% change over the period
  • points
  • scaledAverage — only with an anchor

The last time point is often still being collected by Google and looks like a sudden drop. Interest-over-time rows have isPartial: true on that point, and summaries ignore it.

Example input:

{
"mode": "trending",
"geo": "US",
"trendingLimit": 50
}

By default (trendingSource: "rss") the Actor reads Google's Trending RSS feed. It usually lists only 10–20 trends, even with a higher trendingLimit. RSS rows include the search term, approximate traffic, publication time, image when available, and related news items. If the RSS feed is unavailable, the run returns the Trending Now list for the past 24 hours instead (with search volume, without news) and says so in a free notice row.

For the full list from trends.google.com/trending, use the Trending Now source:

{
"mode": "trending",
"geos": ["US", "GB", "IN"],
"trendingSource": "trendingNow",
"trendingHours": "168",
"trendingCategories": ["technology", "science"],
"trendingActiveOnly": false,
"trendingLimit": 1000
}

Trending Now rows add searchVolume, increasePercent, startedAt, endedAt, isActive, categories, categoryIds, trendBreakdown (related searches), timeWindowHours and source: "trendingNow". Their sourceUrl opens the term on Google Trends Explore. News articles and the picture are attached when the trend also appears in the RSS feed. trendingLimit can be up to 1,000 per location (a 7-day US window lists about 2,000 trends). Setting a time window other than 24 hours, categories or active-only switches to this source automatically. With geos, each country is one search; a country that fails gets a free error row and the others still run.

This source uses the same internal data call as the Trending Now page. Google does not document that call, so it is best effort. If it fails and no filters are set, the run returns the RSS feed instead, with a free notice row. If filters are set, that location ends with an error row and nothing is charged for it.

Category values: autos_vehicles, beauty_fashion, business_finance, climate, entertainment, food_drink, games, health, hobbies_leisure, jobs_education, law_government, other, pets_animals, politics, science, shopping, sports, technology, travel_transportation.

Output

The default Dataset uses normalized row types:

  • interest_over_time — one row per time point with values for each compared keyword
  • interest_by_region — one row per region with values for each compared keyword
  • related_query — top/rising related searches
  • related_topic — top/rising related topics when Google provides them, with the topic's Knowledge Graph ID in topicMid (for example /m/0vpj4_b, usable as a Google Trends search term)
  • trending — current trending searches (source is rss or trendingNow)

Example interest_over_time row (illustrative values):

{
"geo": "US",
"timeRange": "today 3-m",
"category": 0,
"property": "web",
"groupIndex": 1,
"groupKeywords": ["bitcoin", "ethereum"],
"sourceUrl": "https://trends.google.com/trends/explore?date=today+3-m&geo=US&q=bitcoin%2Cethereum&hl=en-US",
"scrapedAt": "2026-10-14T07:00:00.000Z",
"type": "interest_over_time",
"timestamp": "1789689600",
"date": "Sep 18, 2026",
"isPartial": false,
"values": [
{"keyword": "bitcoin", "value": 61, "formattedValue": "61", "hasData": true},
{"keyword": "ethereum", "value": 18, "formattedValue": "18", "hasData": true}
],
"recordType": "interest_over_time"
}

Free rows (never charged):

  • keyword_summary — per-keyword summary when includeKeywordSummary is on
  • notice — explains an empty or skipped section, for example when Google returns no related topics, when groups beyond maxGroups were skipped, or when the run stopped before its timeout (with skippedGroupIndexes)
  • error — a section, keyword group, location or URL that failed, with error, groupIndex, groupKeywords and, for section failures, widget

Google may legitimately omit related topics or other optional sections for some terms. It often withholds related topics for multi-term comparisons and for some proxy or datacenter traffic. This is treated as a valid empty result, not as a failed run, and a free notice row says so.

Reliability controls

Use requestTimeoutSecs and retries to control how aggressively the Actor waits for Google. Defaults are intentionally conservative: 20 seconds per request and 3 attempts. After a rate limit (HTTP 429), the next attempt starts with a fresh Google session.

  • If Google rejects direct requests, the rest of the run continues through the included Apify datacenter proxy. You can also set proxyConfiguration; the Actor rotates through multiple Apify/custom proxy sessions between retries.
  • A keyword group that Google refuses temporarily (rate limit, HTTP 5xx) is tried once more at the end of the run, after a short pause and with a fresh Google session; only if it fails again is it reported as an error row.
  • The run watches its own timeout: it stops starting new searches shortly before the limit, keeps every paid search, lists the groups or locations it could not analyze (not charged) in a notice row and finishes normally instead of timing out. Request timeouts and retry pauses are shortened to fit the remaining time.
  • Bad input, a failing keyword group, section, location, URL or Google Sheet never fails the run: each becomes a free error row with a clear message.

How many rows a run produces (and what it costs)

You pay per search, not per row. Examples measured on 2 October 2026:

InputRowsSearchesCost at $0.004 / search
2 keywords, US, today 3-m, all sectionsabout 3401$0.004
1 keyword, worldwide, today 12-m, maxRelated: 5about 310 (250 of them country rows)1$0.004
10 searchTerms without anchor10 × one search10$0.04
Trending, RSS feed10–201$0.004

Plus the start fee of $0.0001 per GB of run memory. Switching off sections you do not need, lowering maxRelated or enabling skipEmptyRegions makes runs faster and datasets smaller; it does not change the price. With geos, every location is a separate search. You can cap the run with Apify's maximum charge setting.

API calls and tasks written for other Google Trends scrapers on Apify usually work as they are: besides its own fields, the Actor accepts searchTerms, geo, timeRange, category, startUrls (list of { "url": ... }), customTimeRange (overrides timeRange), isMultiple (terms that contain commas are compared together), spreadsheetId and maxItems (maximum searches, 0 = up to 100). Differences to check: category must be a number (for example 71), a missing geo means the United States (send "" for worldwide), and the output is one row per time point, region or related item instead of one large item per term.

Limits

  • Google Trends compares at most 5 terms per search; use an anchor keyword to compare more on one scale.
  • Up to 100 searches (maxGroups), 50 locations and 1,000 trending rows per location in one run. A Google Sheet is read up to 2,000 rows.
  • Google Trends values are normalized interest scores (0–100), not absolute search volumes; Trending Now searchVolume is Google's own rounded estimate.
  • Google may withhold related topics or regions for low-volume terms.
  • Google Trends uses undocumented internal endpoints that can change without notice; failures are isolated into free error rows.

FAQ

Do I pay for failed or empty searches?
No. A search is charged only when it returns data. Failed groups, empty trending lists and all keyword_summary, notice and error rows are free.

Why are my values different from the Google Trends website?
Google samples its data, so values for the same query can vary slightly between requests and days. The run uses the same parameters as the sourceUrl of each row; open it to compare.

How do I compare more than 5 keywords?
Put them in searchTerms and set an anchorKeyword (a popular, stable term such as weather). Use scaledValue and scaledAverage to compare terms across batches.

How do I compare countries?
Add them to geos. Each country is its own search with Google's own 0–100 scale for that country, so compare the shape and timing of curves across countries, and absolute values only within a country.

Can I get daily data for a whole year?
Google decides the granularity from the time range: about 9 months or less gives daily points, longer ranges weekly or monthly points. Use custom ranges such as 2026-01-01 2026-06-30 for daily data and run several ranges.

Good use cases

  • SEO keyword comparison
  • Content and editorial research
  • Brand or product demand tracking
  • Regional and international market research
  • YouTube search trend analysis
  • News/topic discovery
  • Scheduled trend monitoring
  • Data pipelines through the Apify API

Support

If a run fails, include the run ID, input, and the final error message. Do not include private API tokens or proxy passwords in issue reports. Feature requests are welcome on the Issues tab.