Google Trends Scraper
Pricing
from $5.53 / 1,000 term reports
Google Trends Scraper
Google Trends data per search term: interest over time, by region, metro, or city, and top and rising related queries. Compare up to 5 terms, any geo, category, or property (web, news, images, YouTube, shopping). One summary row per term plus flat rows, ready for Clay or CSV.
Pricing
from $5.53 / 1,000 term reports
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Security
Limited permissionsShare
Give search terms and get Google Trends data back as flat rows: one summary row per term, then a row per time point, region, and related query. Set the geo, timeframe, category, and search property, or compare up to 5 terms on one chart. Mamba Labs pays the platform and proxy costs; you pay per term that returns data.
Features
- One summary row per term.
term_reportholds the average, latest, and peak interest, the peak date, the recent change, the top region, and the top and rising queries, so a Clay column or a CSV has one row per term to work from. - Flat detail rows.
trend_point,region, andrelatedrows share one fixed layout, so nothing is nested and no column disappears between row types. Filter onrow_type. - Compare up to 5 terms on one scale. With
compareon, terms chart together in groups of 5, the way the Trends page does it. - Regions, metro areas, and cities. Countries worldwide, regions inside a country, and US metro areas or cities when you ask for them.
- Web, news, images, YouTube, and shopping search.
- Each row says what its number means.
value_meaningseparates relative interest from a share between compared terms and from a rising percent.is_partialmarks a period still running. - One price per term, like the Store leaders. Not one price per data point, so a 53 point chart does not cost 53 times as much.
- You pay for data only. A term with no data, and a term Google refused after every retry, is one free row that says so.
- Cost guards. A maximum charge per run, and the actor stops 90 seconds before the run's timeout and delivers what it has.
How the data is read
The actor calls the same JSON endpoints the Google Trends page calls, through the Apify proxy, with no browser. No Google account, no login, no key, and no other developer's actor. A refused request retries on a new address with a new session, then on residential addresses, with a limit on every wait, so a run does not hang on Google.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
terms | array | Search terms, up to 200 per run. A Google topic ID such as /m/0j6n6s8 also works. | |
geo | string | `` | Empty for worldwide, or a Google geo code such as US, DE, or US-CA. |
timeframe | string | 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, or two dates as YYYY-MM-DD YYYY-MM-DD. |
category | string | 0 | Google Trends category number. 0 is all categories. The number is in the cat= part of a Trends URL. |
property | string | web | Which Google search to read: web, news, images, youtube, or shopping. |
compare | string | false | true: terms are charted together in groups of 5, on one shared scale. false: each term gets its own chart. Each term is charged either way. |
outputs | array | Any of interest_over_time, interest_by_region, related_queries, related_topics. Default is the first three. See Limitations for related_topics. | |
region_resolution | string | auto | auto: countries worldwide, regions inside a country. DMA is US metro areas. CITY needs a geo. COUNTRY needs an empty geo. |
max_charge_usd | string | Optional. The run stops before a charge that would pass this amount. Summary rows are always returned. | |
proxy_mode | string | auto | auto (default): requests go through the Apify proxy pool, and a request the pool cannot get through is retried on residential addresses. residential: every request uses residential addresses. A reliability setting only; it does not change what you pay. |
Give at least one term. compare and the other text fields take the values shown as text, which is what Clay sends.
Output
| Field | Type | What it holds |
|---|---|---|
row_type | string | One of: term_report, trend_point, region, related, extra_rows_receipt, run_summary. run_summary is the one free row written when the input is refused. |
term | string | The search term this row belongs to. |
compared_with | array | In compare mode, the other terms on the same chart. Values on these rows are on one shared scale. |
geo | string | The geo code you set. Empty means worldwide. |
timeframe | string | The timeframe you set. |
category | integer | The Google Trends category number. 0 is all categories. |
property | string | web, news, images, youtube, or shopping. |
explore_url | string | The same chart on trends.google.com. |
average_interest | integer | term_report: average of the points, 0 to 100 on the chart scale. |
latest_interest | integer | term_report: value of the last complete period. |
peak_interest | integer | term_report: highest value on the chart. |
peak_date | string | term_report: start of the period with the highest value. |
recent_change_pct | number | term_report: average of the last 4 complete periods against the 4 before, or fewer on a short chart. |
points_returned | integer | term_report: time points on the chart. |
regions_returned | integer | term_report: regions with data. |
top_region | string | term_report: region with the highest value. |
related_queries_returned | integer | term_report: top and rising queries returned. |
top_related_query | string | term_report: the first query on the top list. |
top_rising_query | string | term_report: the first query on the rising list. |
related_topics_returned | integer | term_report: top and rising topics returned. See Limitations. |
date | string | trend_point: start of the period, UTC. |
date_label | string | trend_point: the period as Google labels it. |
is_partial | boolean | trend_point: true when the period is still running, so the value can change. |
region_code | string | region: Google code for the region, such as US-WY or SG. Empty on city rows. |
region_name | string | region: name of the region, metro area, or city. |
latitude | number | region: city rows only. |
longitude | number | region: city rows only. |
related_kind | string | related: query or topic. |
related_list | string | related: top (most searched) or rising (biggest increase). |
related_term | string | related: the query or topic title. |
topic_id | string | related: Google topic ID on a topic row. You can use it as a search term. |
topic_type | string | related: Google topic type on a topic row. |
related_url | string | related: this query or topic on trends.google.com. |
value | integer | trend_point, region, related: the number Google gives. value_meaning says what it measures. Empty when Google has no data for the point. |
formatted_value | string | The number as Google shows it: <1 means under 1, and Breakout means a rise too large for Google to state as a percent. |
value_meaning | string | What value measures. Values are relative to this chart: they are not search counts. |
row_status | string | ok, or why this row carries no data: no_results, no_change, partial, blocked, or error. |
error_reason | string | Why the row is not ok. A refused input reads input_invalid: followed by what to fix. |
billable_events_json | string | What this row was billed as, for example {"term-report":1}. {} means free. |
scraped_at | string | When the row was written, UTC. |
Reading the numbers
Google Trends values are relative, not search counts. On an interest chart, 100 is the peak of that chart, and values from two separate charts are not comparable: to compare terms, use compare. <1 in formatted_value means under 1, and value is then 0. A point with no data has an empty value. On a related row in the rising list, value is a percent increase, and Breakout means a rise too large for Google to state. On a region row in compare mode, value is that term's share among the compared terms in that region.
Google samples its data, so two runs of the same chart can differ by a few points.
Pricing
Pay per event. You pay for each term that returns data and for the run start. A term's price includes its summary row and up to 170 detail rows, which covers a 12 month chart with regions and related queries. A longer chart, such as 5 years, or city level regions, adds one extra-rows event per further 100 rows, each shown as a free extra_rows_receipt row. To avoid it, ask for fewer outputs. Summary rows for a term with no data, a term Google refused, a term with a refused part, and a refused input are free.
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
term-report, one search term with data, summary row plus up to 170 detail rows | $0.0065 | $0.006175 | $0.00585 | $0.005525 |
extra-rows, each further 100 detail rows on one term past the first 170 | $0.0035 | $0.003325 | $0.00315 | $0.002975 |
apify-actor-start, once per run (one per GB of memory; the default 256 MB is one) | $0.002 | $0.002 | $0.002 | $0.002 |
Per 1,000 rows of term-report: $6.50 on the free plan, $5.52 on Gold.
Free plan cap: 1.50 USD of evaluation a month, about 231 rows. Any paid Apify plan removes the cap, and it resets on the 1st. The run stops before a charge that passes your maximum charge per run in Apify or your max_charge_usd input.
Mamba Labs pays the platform costs of your run, Apify proxy traffic included.
Usage examples
Apify Console or API.
{"terms": ["coffee", "matcha"],"geo": "US","timeframe": "today 12-m","outputs": ["interest_over_time", "related_queries"]}
Compare terms by US metro area.
{"terms": ["coffee", "tea"],"geo": "US","compare": "true","region_resolution": "DMA"}
Read the rows with GET https://api.apify.com/v2/datasets/{datasetId}/items.
Clay. Number and on or off inputs are text fields, which is what Clay sends. A list input takes a JSON list, so put the column inside a one item list. Use the term_report row for one row per term.
MCP. The Mamba Labs MCP server @mambalabsdev/mcp-google-trends-scraper exposes this actor to Claude and other MCP clients.
Error handling
| Case | What you get |
|---|---|
| Missing or unreadable input | One free row, row_type run_summary, error_reason starting input_invalid: with what to fix. The run ends successfully and charges nothing but the run start |
| No data for a term | One free term_report row, row_status no_results |
| Google refuses every attempt for a term | One free term_report row, row_status blocked. Run that term again |
| One part of a term is refused, for example its regions | A free term_report row, row_status partial, with the parts that were read |
| Google rejects the settings | One free term_report row, row_status error |
| The run is close to its timeout | The actor stops starting new work 90 seconds before the timeout and delivers what it has |
Limitations
- Related topics: Google answers an empty list to automated clients, on every address tested when this actor was built.
related_topicsstays available, costs nothing extra, and the row says when none came back. Related queries are not affected. - Google offers related topics per term only outside compare mode.
- Values are relative and sampled, as described above. They are not search volumes.
- Trending Searches, the daily list of what is trending, is not read by this actor. It reads terms you give.
- A metro level (
DMA) outside the US returns no region rows: the term is still delivered with its other rows, andregions_returnedis 0. - A very rare term can return a chart with a single point. That is Google's data, and the term is charged as a term with data.
- Interest by city and metro is what Google returns for the chart: often about 200 rows, many without data, which are left out.
Mamba Labs actor suite
Built by Mamba Labs.