Google Trends Scraper — Trending Now, timelines & queries avatar

Google Trends Scraper — Trending Now, timelines & queries

Pricing

from $0.75 / 1,000 results

Go to Apify Store
Google Trends Scraper — Trending Now, timelines & queries

Google Trends Scraper — Trending Now, timelines & queries

Google Trends scraper, no login or API key: interest over time, by region, related queries, compare up to 5 terms, back to 2004, and Trending Now by category with search volume. $0.75 per 1,000 terms, every chart in one row. Paste an apify/google-trends-scraper input unchanged.

Pricing

from $0.75 / 1,000 results

Rating

5.0

(1)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

51

Total users

9

Monthly active users

3 days ago

Last modified

Features

Limited permissions

Share

Google Trends Scraper

Google Trends as clean JSON: the 0–100 interest over time timeline, interest by region, top + rising related queries, multi-term compare on one shared scale, and the live Trending Now board for any country with search volume, growth %, start time and categories attached. $0.75 per 1,000 search terms with every chart in one row. Any term, any country or region, any preset window or a fixed date range back to 2004, on any Google property. No login or API key needed, and a run finishes in seconds.

You pay for delivered results. A fetch that fails, is blocked, or comes back empty never becomes a dataset row and is never charged as one. It is named in the run's ERRORS record with the reason and what to change, and the run's status line reconciles the arithmetic: results asked for = results delivered + results reported. The run-stats box on this page is public; check the live success rate yourself.

Paste your saved input as it is. This actor reads that scraper's field names: searchTerms (blank rows skipped), isMultiple (a comma separates compared terms), startUrls (trends.google.com explore links, each with its own location, window, category and property), spreadsheetId (a public Google Sheet of terms), geo, category (as "7" or blank), timeRange (including its blank default, past 12 months), customTimeRange, maxItems (0 = no limit), maxConcurrency and maxRequestRetries. viewedFrom, skipDebugScreen and pageLoadTimeoutSecs are accepted and ignored: there is no browser to time out and the proxy is built in.

Keep the same rows, too. With "outputFormat": "perTerm", which the input form opens on, each search term (per location) comes back as one row with that scraper's field names and Google's own arrays: inputUrlOrTerm, searchTerm, interestOverTime_timelineData, interestOverTime_averages, interestBy (worldwide), interestBySubregion / interestByCity / interestByMetro (whichever Google serves for the country), relatedQueries_top / _rising and relatedTopics_top / _rising. A Zapier step, sheet or script written for that output keeps working.

Public 30-day run stats from both Store pages, read on 2026-11-01:

apify/google-trends-scraperThis actor
Runs that succeeded56.2% of 26,02889.9% of 168
Runs that timed out5,0330
Runs aborted5,9430
Typical run timeMinutes; 1 run in 5 times outSeconds
Price per search term, all charts in one row$0.003 on the free plan, $0.001 on Bronze, $0.0005 Silver, $0.0003 Gold, down to $0.0001 Diamond$0.00075 on every plan, the layout the input form opens on
Charged when a run returns nothingCompute for the minutes it ran before timing out$0.00005 run start, no results

And the complaints on its public issues board, answered:

Their open issueWhat happens here
"Runs with infinite loop and no result" / "Too much time and no output"Runs finish in seconds. A run Google keeps turning away stops retrying and says so in its status line, instead of looping until the timeout.
"Missing data in interestOverTime_timelineData", and the request for "a flag to scrape JUST the timeline"Every dataset has its own switch: turn off regions and related queries and you fetch and pay for the timeline only. A term Google has no data for is named in the ERRORS record and costs nothing.
"Not working", "No funciona", "It never worked"90% of runs succeed. The ones that don't end FAILED with the cause in the status message and every undelivered result listed in ERRORS, never charged.
"Doesn't work with an empty searchTerms row"Blank rows are skipped.
"MCP tool isn't passing the isMultiple flag"compareKeywords: true compares a plain list of terms, so an agent needs no comma tricks. isMultiple still works for pasted inputs.

About cost. Pick the output that matches how you use the data. perTerm, which the input form opens on, bills one row per term and location, like that scraper: $0.00075 for the timeline, regions and related queries together, which is less than its free-plan and Bronze prices and more than its Silver and higher tiers. nested bills one row per chart (3 rows, about $0.0023, for the same term). flat bills every data point as its own row (about 150 rows, about $0.11, for that term), which costs the most and is the easiest to load into a spreadsheet or database. A scheduled or programmatic run that leaves outputFormat out gets flat, so set it to perTerm there if you want the lower price.

How Google Trends Scraper works

✨ Why use this scraper?

  • Live Trending Now feed — the full board for any country (600+ topics per 24 h for the US), each with absolute search volume, growth %, when it started, its related queries and its categories. Filter to the categories you want (Sports, Technology, Politics…) and pay only for those rows. Most Trends scrapers do not return this at all.
  • All four Trends datasets in one run — timelines, region breakdowns, top + rising related queries, and related topics (see the note on topics below).
  • Many terms × many countries per run — searchTerms and geos are both lists, so one run covers bitcoin / ethereum across US / GB / DE.
  • Compare mode — up to 5 terms in one request, interest values relative to each other, exactly like the compare view on trends.google.com.
  • Every miss is explained, none is billed — a term below Google's volume floor, a rate-limited call, a withheld topics feed: each is a named line in the ERRORS record, never an empty row you paid for.
  • No API key, no login, no setup: the defaults work out of the box, and runs finish in seconds.
  • Any geo, any window, any property — worldwide, country (US) or region (US-CA); from the past hour back to 2004; Web, News, YouTube, Images, Shopping.
  • Self-describing rows — one row per term × location × data type, each carrying its full query context, so CSV exports and downstream joins need no lookup.

🧾 What you pay for, and what you never pay for

Per term is one row per term and location, with every chart inside. In flat output one result is one data point. A 12-month timeline is one row per week, a region breakdown is one row per region, each related query or topic is its own row, and each Trending Now topic is one row. Set outputFormat to nested when you want the old shape: the whole timeline, the whole region table, or the whole related-query set in a single row, billed once.

A result that is not delivered is not charged, and it is never silently dropped either. Every one lands in the run's ERRORS record (key-value store) with a reason, a plain-language detail saying what happened and what to change, and a retryable flag:

reasonWhat happenedRe-run as-is?
no_dataGoogle answered with nothing measurable: an empty or all-zero timeline or region table, or empty related lists. The term sits below Google's volume floor for that window.No — widen the time range, drop the region filter, or use a topic id
topics_gatedGoogle returned an empty related-topics list. Related queries are unaffected.No
rate_limitedGoogle turned the request away for now and the automatic retries are spent.Yes, in a few minutes
blockedGoogle did not answer this query on any attempt.Yes, in a few minutes
proxy_failedA connection fault on our side. Nothing reached Google.Yes
fetch_failedA transport failure that survived one retry.Yes
no_widgetGoogle's answer for this query had no chart of this type.Yes
budget_capmaxItems was reached before this result's turn.Raise maxItems

The run's status line carries the same arithmetic, so a partial result is visible in your run list rather than something you discover in the dataset later:

Delivered 4 of 6 results. 2 not delivered and not charged: 1 no data from Google (below its volume floor), 1 rate-limited by Google — see the ERRORS record; 1 worth re-running in a few minutes.

A timeline with even one measurable week is a delivered result, because Google charted the term and found interest only in those weeks. Every timeline row carries measurablePeriods and totalPeriods, so a sparse timeline explains itself on the row and is never mistaken for a failed fetch.

A run that delivers nothing because of a block or a fault on our side is marked FAILED, with the reason in its status message, so it stands out in your run list and in our alerts. A run that delivers nothing because Google has no data for your terms is a SUCCEEDED run with an empty dataset and a full ERRORS record: nothing went wrong, and the record says exactly which term had nothing in that window.

🎯 Use cases

  • SEO & content planning — find rising queries around your topic before the competition writes about them.
  • Market & brand research — track how interest in a brand, product, or ticker moves across time and geography.
  • Newsrooms & social teams — poll the Trending Now feed on a schedule and catch breaking topics with search-volume and growth numbers attached.
  • E-commerce & merchandising — spot seasonal demand curves and regional hot-spots for product categories.
  • Investment & alt-data signals — search interest is a leading indicator; pipe timelines into your models as CSV/JSON.
  • Academic & social research — reproducible interest data across dozens of geos in one run, with every miss on the record.

📥 Supported inputs

InputWhat it does
searchTermsKeywords or Google topic ids (/m/05p0rrx) — each queried independently
compareKeywordsCompare all terms in one request (groups of ≤5, relative 0–100 scale)
startUrlstrends.google.com explore links, each run with its own location, window, category and property; /trending links switch on Trending Now
spreadsheetIdPublic Google Sheet id or link; terms from the first column, header row skipped
isMultiplePasted-input compatibility: a comma inside a term separates compared terms ("bitcoin,ethereum")
geosUS, GB, DE, US-CA, … or empty string for worldwide — every term is queried per geo
timeRangenow 1-H → all (2004–present), same windows as the Trends UI
customTimeRangeFixed window YYYY-MM-DD YYYY-MM-DD (from 2004-01-01); replaces timeRange when set
propertyWeb Search (default), Images, News, YouTube, Shopping
category / categoryIdTrends category id to narrow results (7 = Finance; empty or 0 = all). category takes a number or a string; the Console form fills categoryId
includeInterestOverTimeInterest timeline — on by default
includeInterestByRegionGeographic breakdown by country/subregion — on by default
includeRelatedQueriesTop + rising related search queries — on by default
includeRelatedTopicsTop + rising related topics (entities) — off by default, see FAQ
trendingNow + trendingNowGeo + trendingNowHoursLive Trending Now feed per country, 4 h–7 d window
trendingNowCategoriesKeep only these Trending Now categories, as ids: "17" Sports, "18" Technology, "14" Politics, "3" Business and Finance, "4" Entertainment and more. Empty keeps the whole board, and only kept rows are billed. A category= in a /trending link works too
outputFormatperTerm (one row per term in apify/google-trends-scraper's layout, what the input form opens on), nested (one row per chart) or flat (one row per data point, used when a run leaves this out)
maxItemsHard cap on rows produced, and therefore on run cost; 0 = no limit; what it stops is reported as budget_cap

🔄 How it works

  1. Your terms, locations, time window and filters become one query per term (or compare group) and location.
  2. Each query fetches the charts you switched on, in the order timeline, regions, related queries, related topics. A request that fails is retried automatically, within limits.
  3. Trending Now comes from the live Trending now board for the country you pick, with search volume, growth %, start time and related queries.
  4. Results come back in the shape you chose: one row per data point, per chart, or per term.
  5. Every delivered chart becomes dataset rows. Everything else is written to the ERRORS record, and the run's status line reconciles the two.

⚙️ Input parameters

{
"searchTerms": ["bitcoin", "chatgpt"],
"geos": ["US"],
"timeRange": "today 12-m",
"customTimeRange": "",
"includeInterestOverTime": true,
"includeInterestByRegion": true,
"includeRelatedQueries": true,
"includeRelatedTopics": false,
"trendingNow": true,
"trendingNowGeo": "US",
"trendingNowHours": "24",
"maxItems": 100
}

To pull a fixed window instead of a preset, set customTimeRange to "2024-01-01 2024-06-30". Google chooses the timeline resolution from the window length: daily points for a few months, weekly or monthly for longer windows. A malformed or reversed range stops the run at once with an input error, before anything is fetched.

📊 Output overview

Flat mode writes one row per timeline period, region, related query, topic, or trending topic. Every row carries keyword, geo, scrapedAt, and sourceUrl. Nested mode writes one row per term × location × data type, with the points inside timeline, regions, top, and rising. The dataset opens on the All results table.

Alongside the dataset, every run writes an ERRORS record to its default key-value store — an empty items list on a clean run, so your integration can read it unconditionally.

💵 What a run actually costs

You only pay for the datasets you switch on, and only for the points those datasets contain. maxItems caps billed rows. Free-plan runs stop at 60. Apify's Maximum cost per run caps the spend in dollars. Nested mode is the exception that bills the whole chart once: a 5-year weekly timeline is a single row with about 260 points inside it.

At $0.00075 per delivered row plus a $0.00005 run start (charged once per run, including a run that delivers nothing). Flat mode, a past-12-months timeline is about 53 weekly points:

RunRowsCost
1 term, 12-month timeline~53~$0.040
1 term, timeline + regions + related queries~154~$0.116
5 terms, those 3 datasets, 1 country~770~$0.58
Same three datasets, nested mode, 1 term3~$0.002
Same three datasets, perTerm mode, 1 term1~$0.0008
Trending Now, top 100 topics100~$0.075

These are ceilings: a result Google has no data for, a rate-limited call, or a withheld topics feed costs $0. Switch to nested when you want one charge per chart instead of one charge per point. The Trending Now feed is deep (600+ topics for a large country in a 24 h window), so maxItems doubles as your spend cap — rows come back rank-ordered, so maxItems: 25 gives you the top 25.

📦 Output sample

Flat mode, one period of a timeline:

{
"type": "interest_over_time",
"dataType": "interestOverTime",
"keyword": "bitcoin",
"geo": "US",
"date": "Sep 14 – 20, 2025",
"value": 53,
"isPartial": false,
"scrapedAt": "2026-10-24T12:00:00.000Z",
"sourceUrl": "https://trends.google.com/trends/explore?q=bitcoin&geo=US"
}

Per-term mode (outputFormat: "perTerm"), one search term in the US, arrays shortened:

{
"inputUrlOrTerm": "bitcoin",
"searchTerm": "bitcoin",
"interestOverTime_timelineData": [
{ "time": "1760832000", "formattedTime": "Oct 19 – 25, 2025", "formattedAxisTime": "Oct 19, 2025", "value": [31], "hasData": [true], "formattedValue": ["31"] }
],
"interestOverTime_averages": [],
"interestBy": [],
"interestBySubregion": [
{ "geoCode": "US-WY", "geoName": "Wyoming", "value": [100], "formattedValue": ["100"], "maxValueIndex": 0, "hasData": [true] }
],
"interestByCity": [],
"interestByMetro": [],
"relatedQueries_top": [
{ "query": "bitcoin price", "value": 100, "formattedValue": "100", "hasData": true, "link": "/trends/explore?q=bitcoin+price&date=today+12-m&geo=US" }
],
"relatedQueries_rising": [],
"relatedTopics_top": [],
"relatedTopics_rising": [],
"geo": "US",
"timeRange": "today 12-m",
"exploreUrl": "https://trends.google.com/trends/explore?date=today%2012-m&q=bitcoin&geo=US",
"scrapedAt": "2026-10-25T22:30:00.000Z"
}

Nested mode keeps the whole chart in one row.

Interest over time:

{
"dataType": "interestOverTime",
"keyword": "bitcoin",
"geo": "US",
"timeRange": "today 12-m",
"property": "web",
"exploreUrl": "https://trends.google.com/trends/explore?q=bitcoin&geo=US",
"averages": [43],
"measurablePeriods": 53,
"totalPeriods": 53,
"timeline": [
{ "time": "1757808000", "formattedTime": "Sep 14 – 20, 2025", "values": [53], "isPartial": false },
{ "time": "1789171200", "formattedTime": "Sep 13 – 19, 2026", "values": [21], "isPartial": true }
]
}

Related queries:

{
"dataType": "relatedQueries",
"keyword": "chatgpt",
"geo": "US",
"top": [{ "query": "what is chatgpt", "value": 100, "formattedValue": "100" }],
"rising": [{ "query": "chatgpt agent", "value": 850, "formattedValue": "+850%" }]
}

Trending Now:

{
"dataType": "trendingNow",
"geo": "US",
"rank": 1,
"query": "world cup final",
"searchVolume": 1000000,
"formattedSearchVolume": "1M+",
"percentGrowth": 300,
"startTimestamp": 1784406000,
"startedAgoSeconds": 81754,
"relatedQueries": ["world cup final", "what time is the world cup game today"]
}

The ERRORS record, from a run that asked for a real term and a term Google has never charted:

{
"schemaVersion": 1,
"asked": 8,
"delivered": 3,
"notDelivered": 5,
"byReason": { "no_data": 3, "topics_gated": 2 },
"items": [
{
"keywords": ["xqzv9plmwq8kqq"],
"geo": "US",
"dataType": "interestOverTime",
"reason": "no_data",
"detail": "Google returned an empty timeline for this term in this window — it sits below Google's volume floor. Try a broader time range, drop the region filter, or use a topic id instead of free text.",
"retryable": false,
"charged": false
}
]
}

🗂 Key output fields

FieldMeaning
dataTypeinterestOverTime | interestByRegion | relatedQueries | relatedTopics | trendingNow
timeline[].valuesRelative search interest 0–100 (100 = peak within the window/compare set)
timeline[].isPartialThe last point is usually partial — the current period is not finished yet
measurablePeriods / totalPeriodsHow many periods carried interest, out of how many Google returned; a sparse term reads e.g. 4 / 53
regions[].geoCodeISO region code (US-WY), with the same 0–100 scaling
top / risingRelated queries: top = most popular, rising = fastest-growing (value is % growth, formattedValue may be "Breakout")
parentGeoThe location you queried, on each region row (US when the row is US-CA)
scrapedAt / sourceUrlWhen the row was fetched, and the Trends page for the same query
articles / imageUrlUp to three news items on a Trending Now row (title, url, source, snippet) and the first image
searchVolume / formattedSearchVolumeTrending Now: absolute volume bucket (e.g. 1000000 / "1M+"). Flat rows also copy these to trafficValue and traffic
percentGrowthTrending Now: growth vs the previous period, in %
keywordsCompare mode: the full compare set; per-point values align with this array
ERRORS.items[].reasonWhy a result was not delivered — see the table above; retryable says whether re-running as-is can help

⏰ Run it on a schedule

Save the input as a Task, put the Task on an Apify Schedule, and add an integration on run succeeded (a Google Sheet with one row per keyword per run is the usual shape). Google refreshes a 12-month timeline about weekly and the now windows about daily, so match the cadence to the window: weekly for today 12-m and longer, daily for today 1-m and now 7-d, hourly only for now 1-H / now 4-H and Trending Now. Have the integration read the ERRORS record too — the retryable entries are the ones worth queuing for a second pass.

❓ FAQ

Are the interest values absolute search counts? No. Google Trends publishes relative interest, scaled 0–100 against the peak in your chosen window (or across the compare set in compare mode). Only Trending Now rows carry absolute volume buckets.

Does a failed or empty run cost anything? No result charges. A run that delivers nothing bills only the $0.00005 run start. Every result that was asked for and not delivered is in the ERRORS record, and charged is false on each one. Flat mode bills each timeline period, region, query, topic, and trending topic on its own. Nested mode bills the chart once.

Why did my run end as FAILED? Because nothing was delivered and the cause was a block, a rate limit, or a fault on our side, and a green run with an empty dataset would have hidden that. The status message names the cause; the ERRORS record names every result. Re-run in a few minutes, and keep several terms in one run rather than launching one run per term — the latter is what trips Google's quota.

My term came back with no_data. Is the actor broken? No: Google charts nothing for a term below its volume floor, and it says so with a complete, empty answer. Try a broader time range, drop the region filter, or use the topic id (/m/...) instead of the free-text term — the same term often charts.

Why is relatedTopics off by default? Google often returns an empty related-topics list; related queries are unaffected. Switch it on if you want the actor to try. When the list comes back empty, no row is written, nothing is charged, and the miss is recorded as topics_gated.

Can I paste a trends.google.com URL? Yes. Put explore links in startUrls: each one runs as its own query with the link's terms (q, up to 5 compared), location (geo), window (date), category (cat) and property (gprop). A trends.google.com/trending?geo=GB link switches on the Trending Now feed for that country. Every output row carries an exploreUrl that opens the same query on the site.

Can I load search terms from a Google Sheet? Yes. Share the sheet as "Anyone with the link can view", put the terms in the first column with a header in row 1, and pass its id (or the whole link) as spreadsheetId. A sheet that is not public stops the run at once with an input error.

Does it return interest by city? The region row holds the same breakdown the region map on trends.google.com shows for the location you query; Google picks its resolution (countries for worldwide, subregions or cities for a country). There is no switch to force a different resolution.

Can I compare more than 5 terms? Google's compare view caps at 5 terms per request. With compareKeywords on, the actor splits longer lists into groups of 5 (each group is internally consistent). For cross-group comparability, include a shared anchor term in each group.

How fresh is Trending Now? It is the same live feed the trends.google.com "Trending now" page shows, queryable for windows of 4, 24, 48, or 168 hours per country.

Do I need my own proxies? No. The default works out of the box. The proxy input exists only as an optional override; residential proxies are recommended if you set your own.

What happens when Google turns a request away? It is retried automatically, within limits. If Google keeps refusing, the run stops retrying and reports the affected results as rate_limited: not charged, and marked retryable. Everything that succeeded is kept. Re-run in a few minutes, and put several terms in one run rather than one run per term.

💬 Support

  • Found a bug or need a field added? Open an issue on the actor's Issues tab in the Apify Console — issues are answered within a day.
  • Custom requirements (bigger volumes, extra endpoints, private deployment)? Message via the Apify contact form.

🛠 Additional services

  • Scheduling & monitoring — run the actor on a cron schedule from the Apify Console and export new rows to a webhook, database, or Google Sheets.
  • Custom scrapers — need another data source scraped to the same standard? Get in touch via the profile below.

🔎 Explore more scrapers

  • Keyword Metrics — the absolute numbers Trends can't give you: Google + Bing search volume, CPC, competition, top-of-page bids, difficulty, search intent, and ~93 months of history. 1000 keywords per run at one flat price, or expand 20 seeds into up to 20,000 keyword ideas across 111 countries and 46 languages.
  • Google Autocomplete & Keyword Suggest Scraper — every suggestion Google completes for a seed, by country and language.
  • Ahrefs Scraper — Domain Rating, backlinks, keyword ideas, and AI visibility for any domain.
  • Semrush Scraper — traffic estimates, authority score, backlinks, and top websites per niche.
  • Ubersuggest Scraper — keyword volume, CPC, difficulty, and domain backlink data.

If this Google Trends Scraper was useful, see other scrapers and actors at memo23's Apify profile — covering job boards, real estate, e-commerce, social media, and more.

🤖 For AI Agents & LLM Apps

Purpose: Google Trends relative search interest (0–100) for terms and locations, plus the live Trending Now board with absolute volume buckets.

Minimal tested input (one term, timeline only, fixed window):

{ "searchTerms": ["bitcoin"], "geos": ["US"], "customTimeRange": "2024-01-01 2024-03-31", "includeInterestByRegion": false, "includeRelatedQueries": false, "maxItems": 5 }

What's trending right now: { "trendingNow": true, "trendingNowGeo": "US", "trendingNowHours": "24", "maxItems": 25 } (rows come back rank-ordered).

Output fields (flat): dataType, keyword, keywords, geo, timeRange, category, property, exploreUrl, timeline[].time, timeline[].formattedTime, timeline[].values, timeline[].isPartial, averages, measurablePeriods, totalPeriods, regions[].geoCode, top[], rising[], rank, query, searchVolume, formattedSearchVolume, percentGrowth, startTimestamp, relatedQueries.

Billing and behavior: $0.00005 per run start plus $0.00075 per dataset row. Flat output, used when a run leaves outputFormat out, writes one row per data point. outputFormat: "nested" writes one row per chart; "perTerm" writes one row per term and location with every chart inside, under apify/google-trends-scraper's field names. maxItems caps rows and cost. Free-plan runs stop at 60 rows. Results not delivered are in the key-value record ERRORS (items[].reason, items[].retryable) and are not charged. A run that delivers nothing because of a block ends FAILED with the cause in its status message; one where Google simply has no data ends SUCCEEDED.

⚠️ Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google. It retrieves only publicly available data that Google Trends serves to any visitor without signing in. "Google", "Google Trends", and related marks are trademarks of Google LLC. You are responsible for how you use the data, including compliance with applicable laws and Google's terms of service. Interest values are Google's own relative, sampled estimates and may change between requests.

SEO Keywords

google trends scraper, google trends api, scrape google trends, google trends data export, interest over time api, google trends csv download, trending searches scraper, google trends keyword research, related queries scraper, rising queries google trends, google trending now api, search interest data, google trends alternative api, trends.google.com scraper, google search trends data, keyword trend analysis tool, google trends json, google trends no api key, google trends custom date range, google trends historical data, google trends without browser, apify google trends scraper alternative, google trends scraper not working, google trends start urls, google trends google sheet