Google Trends API - Interest Over Time & Related Queries
Pricing
$5.00 / 1,000 trend query analyzeds
Google Trends API - Interest Over Time & Related Queries
Get Google Trends data for your keywords: interest over time, top and rising related queries and interest by region, for any country, language and period. One row per keyword as JSON, CSV or Excel. For SEO, content planning, market research and demand forecasting.
Google Trends API: Interest Over Time, Related Queries and Regions
This Google Trends API returns search interest over time, top and rising related queries and optional interest by region for your keywords, as structured dataset rows. Use it for keyword research, content planning, demand forecasting or market research without copying charts by hand. Supply your keywords, a country, a language and a period, run the Actor, and download the results or read them through the Apify API. Each keyword keeps its own row, including repeated keywords, so the dataset follows the order of your input.
This Actor was previously listed as "Free Google Trends API". The address, input and output are unchanged, so saved tasks, schedules and integrations keep working.
How the Google Trends API works
- Enter one or more keywords, for example
pizzaandsushi. - Pick a country (
geo), a language (hl) and a period (timeframe). - Choose the sections you need: related queries, related topics, regional interest.
- Run the Actor. Every keyword becomes one dataset row with all requested sections.
- Export the dataset as JSON, CSV or Excel, or fetch it from the API in your own code.
What the Google Trends API returns
Use the time series to follow changes in interest within a keyword's selected period. Google Trends reports relative interest, usually on a scale from zero to one hundred. A value of one hundred marks the peak within that series. These values are not search counts, revenue estimates or market share. A series for one keyword is fetched separately from another keyword's series; their numbers should not be treated as a single comparison scale.
Related queries provide the top and rising searches associated with the keyword. Rising
results can include percentage labels or the text “Breakout”. The numeric value and the
source's text label remain separate fields. Regional interest adds the area code, area
name and relative value for each returned region. Related topics are requested when
enabled, but Google currently returns empty topic lists in the tested searches. The Actor
preserves those lists and does not replace them with estimated topics.
Input
keywords is a required array of search terms. The store form opens with pizza and
sushi, the same terms used in the recorded default run. Whitespace around a term is
removed, and empty terms are skipped. A single string instead of an array is invalid.
Duplicate terms are kept rather than merged. If you need distinct output rows only,
deduplicate your own keyword list before starting the run.
| Field | Default | Meaning |
|---|---|---|
keywords | Required | Array of terms to fetch |
geo | US | Country (ISO code) or supported subregion, such as NL or US-CA |
hl | en-US | Language code, which also sets the localized date labels |
timeframe | today 12-m | Relative period or a fixed date range |
include_related_queries | true | Include top and rising related queries |
include_related_topics | true | Include the available related topic lists |
include_regional_interest | false | Include the geographic breakdown |
category | 0 | Optional Google Trends category filter |
tz | 0 | Optional timezone offset in minutes |
For a fixed date range, use two dates separated by a space. Recorded runs include
2024-01-01 2024-12-31 with geo: "NL" and hl: "nl-NL", and
2025-01-01 2025-06-30 with geo: "GB", hl: "en-GB" and category five.
Relative periods such as today 12-m change as time passes; a fixed period makes repeated
analysis easier to interpret, although Google may revise its sampled results.
category and tz are whole numbers. A whole number written as text, such as "5" or
"60", works the same as the number itself, and the decimal part of a number is dropped. A value
that is not a whole number, such as "abc" or "5.5", falls back to 0 (all categories,
no offset) instead of failing the run, as it did in earlier versions of this Actor.
Country codes are converted to uppercase. An omitted or empty geo uses US, preserving
the behavior of the existing Actor. Earlier descriptive text suggested that an empty
value meant worldwide, but the recorded Actor actually returned US data. Do not use an
empty country value when you need a worldwide series.
The existing use_cookies, use_proxy and use_residential_proxy inputs remain accepted
for compatibility with saved tasks. They do not alter the fields returned by this Actor.
You can continue using saved inputs with their existing values.
Output
Each dataset row contains keyword, geo, hl and timeframe. Successful responses can
include interest_over_time, interest_by_region, related_queries_top,
related_queries_rising, related_topics_top and related_topics_rising. Disabled
optional sections are absent. Sections with no source data are empty arrays.
Each time-series point retains date, integer value and boolean is_partial. It also
provides timestamp, the UTC start of that time interval. The original date remains
Google's localized display label; use timestamp for joins and sorting across languages.
Rows additionally provide source, fetched_at, engine, query and language for
integrations that use a common trend record format.
Regional rows include geo_code, geo_name, integer value, string formatted_value
and boolean has_data. Related rows retain query, integer value, extracted_value,
link and formatted_value. extracted_value is null when Google does not supply it.
Links can be relative paths, matching the existing dataset format.
The default key-value store keeps the summary record with itemCount and errorCount.
The additional OUTPUT record reports delivery counts, charges and applicable free-tier
flags. An errors record is present when there are run-level errors. Widget failures are
also visible on their dataset row under fields such as related_queries_error or
interest_over_time_error; a missing failed section is not silently replaced with data.
Output example
A real row from a run with keywords: ["iphone", "samsung galaxy"], geo: "GB",
hl: "en-GB", timeframe: "2025-01-01 2025-06-30", category: 5 and all sections
enabled. Lists are shortened to their first two entries; the full row had 181 daily
points, 4 regions, 25 top and 12 rising related queries.
{"keyword": "iphone","geo": "GB","hl": "en-GB","timeframe": "2025-01-01 2025-06-30","source": "google-trends-scraper","fetched_at": "2026-10-02T02:15:01.768Z","engine": "google_trends","query": "iphone","language": "en-GB","interest_over_time": [{"date": "1 Jan 2025", "value": 97, "is_partial": false, "timestamp": "2025-01-01T00:00:00.000Z"},{"date": "2 Jan 2025", "value": 91, "is_partial": false, "timestamp": "2025-01-02T00:00:00.000Z"}],"related_topics_top": [],"related_topics_rising": [],"interest_by_region": [{"geo_code": "GB-ENG", "geo_name": "England", "value": 100, "formatted_value": "100", "has_data": true},{"geo_code": "GB-SCT", "geo_name": "Scotland", "value": 94, "formatted_value": "94", "has_data": true}],"related_queries_top": [{"query": "iphone 16", "value": 100, "extracted_value": null,"link": "/trends/explore?q=iphone+16&date=2025-01-01+2025-06-30&geo=GB", "formatted_value": "100"},{"query": "apple iphone", "value": 77, "extracted_value": null,"link": "/trends/explore?q=apple+iphone&date=2025-01-01+2025-06-30&geo=GB", "formatted_value": "77"}],"related_queries_rising": [{"query": "iphone 16e", "value": 63800, "extracted_value": null,"link": "/trends/explore?q=iphone+16e&date=2025-01-01+2025-06-30&geo=GB", "formatted_value": "Breakout"},{"query": "iphone 17 launch date", "value": 3850, "extracted_value": null,"link": "/trends/explore?q=iphone+17+launch+date&date=2025-01-01+2025-06-30&geo=GB", "formatted_value": "+3,850%"}]}
Use cases
- SEO and keyword research: see which of your keywords grow or decline, and harvest rising related queries as new content ideas.
- Content and campaign planning: find the weeks when interest in a seasonal product peaks and time articles, ads and stock around them.
- Market research: compare how interest in a brand, product or category develops per country and region, for example before entering a new market.
- Demand forecasting and data science: feed weekly or daily interest series with UTC timestamps into forecasting models, dashboards or a data warehouse.
- Monitoring: schedule the same input daily or weekly and track changes over time.
Google Trends API compared with the alternatives
| Option | What you get | What to keep in mind |
|---|---|---|
| The Google Trends website | Charts and a CSV download per search | Manual work, one comparison at a time |
| Google's own Trends API (alpha) | Official access to trends data | Announced in 2025 for a limited group of testers |
| pytrends and similar libraries | Free Python code you run yourself | Unofficial; you maintain the code and handle failures |
| This Actor | Interest over time, related queries and regions per keyword as rows | Pay per keyword with data; nothing to install |
The Actor accepts the same timeframe notation as pytrends (today 12-m, now 7-d,
today 5-y or a date range), so existing scripts translate directly to an Actor input.
Pricing
The existing pay-per-event price remains $0.005 per delivered keyword row with data,
using the trend_query event. There is no start-fee event. A row is counted once when at
least one of its data lists is nonempty and the initial search succeeded. Multiple
time-series points or related queries inside that row do not create extra keyword charges.
A keyword without data still gets its row with empty lists, but its charge is zero. A failed initial search is also free. This corrects the previous behavior that charged for empty rows. If a requested widget fails while another section returns data, the row can still count as one delivered result. A free-plan user receives at most ten keywords per run. The limit is applied before fetching; paid users can submit longer lists subject to the run's time limit.
FAQ
Is this the official Google Trends API?
No. This Actor collects the data shown on the public Google Trends website and returns it as structured rows. It is available to everyone on Apify without an application or an API key from Google; you only need an Apify account.
Can I get Google Trends data for many keywords at once?
Yes. Put all keywords in the keywords list. Each keyword is fetched as its own search and
gets its own row, so values are relative within that keyword's series, not across keywords.
Can I use the same saved task after the migration?
Yes. The old input names, defaults and dataset field names remain supported. The Actor adds UTC timestamps and common record fields without renaming the original output. Existing inputs containing the three legacy connection options remain accepted.
Does a value of zero mean nobody searched for the term?
No. Google Trends normalizes and samples its data. A zero or an empty series can indicate insufficient data for the chosen keyword, period and area. The Actor returns the source response and does not infer absolute search volume from it.
Why are the related topic lists empty?
The source returned empty related topic lists in the recorded tests, including runs of the previous Actor. Empty lists are valid output. Related queries can still contain results for the same keyword. Disable the topic option if you do not need those lists.
What happens when Google cannot return a result?
A partial result can retain its usable sections and include a field explaining which widget failed. An entirely blocked search across all keywords produces a successful empty run with an error record. Invalid input also produces a successful empty run. Check both the dataset and the key-value records when processing scheduled jobs.
Can I download or schedule the results?
The results are stored in the default Apify dataset and can be downloaded as JSON or other dataset export formats. Use the dataset API for automated ingestion, or configure an Apify task and schedule to repeat the same input. Store the fetched timestamp alongside the data so later runs remain distinguishable from earlier observations.