Google Trends API & Scraper
The Google Trends API returns the trending half of Trends as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Google has closed the keyword-analysis endpoints to API clients, so interest_over_time, interest_by_region, related_queries and related_topics answer DISABLED and this engine says so instead of returning an empty array that looks like an answer. What still runs, re-measured on 2026-08-28: trending_now (10 trends with traffic buckets and source articles), realtime_trending (story clusters with their full related-query vocabulary), suggest (Google entity ids for a keyword) and categories (the whole taxonomy, over 1,400 ids, in one call). It is built for trend discovery and entity resolution. One ReefAPI key, one shared credit pool, the standard envelope.
Which google-trends actions still return data (measured 2026-08-27)
Google has closed off the keyword-analysis half of Trends to API clients, and this engine reports that plainly instead of returning empty arrays that look like real answers. Every row below is the result of a live call made on 2026-08-27. Check this table before you design against an action.
| Action | Status | What came back |
|---|---|---|
| interest_over_time | DISABLED | ok: false, error.code DISABLED, meta.scope ENDPOINT_DISABLED, retryable false |
| interest_by_region | DISABLED | same envelope: "Google now blocks this data for API clients" |
| related_queries | DISABLED | same envelope; top[] and rising[] cannot be served |
| related_topics | DISABLED | same envelope |
| trending_now | Live | geo=US returned 10 trends with title, traffic "200+" (string), approx_traffic 200 (integer), pub_date, picture and articles[] carrying title/url/source |
| realtime_trending | Live | geo=US, hours=24, limit=5 returned 5 story clusters; "tim curry" carried traffic 2000000, category_ids [4], started_date 2026-08-26, active true, 127 related_queries and article_count 44 |
| suggest | Live | keyword "apple" returned 5 entities: /m/04st9hr Topic, /m/014j1m Fruit, /m/0k8z Technology company, /g/11bc6hq8w2 Topic, /m/05253_m Vinegar |
| categories | Live | the whole tree in one call, over 1,400 rows; query=finance returned id 7 Finance (parent_id 0, depth 1), 1138 Business Finance (parent 12 Business & Industrial, depth 2) and 1161 Public Finance |
The DISABLED responses short-circuit in 2 to 3 ms with retryable: false, so do not build a retry loop around them. One ordering quirk: parameter validation runs before the availability check, so calling interest_over_time with only a keywords array returns MISSING_PARAM "missing: keyword" rather than DISABLED. A MISSING_PARAM there is not evidence that the action works.
Real request and response JSON
Captured from the indexed primary action, interest_over_time, on .
{
"method": "POST",
"url": "https://api.reefapi.com/google-trends/v1/interest_over_time",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"keyword": "bitcoin",
"geo": "US",
"timeframe": "today 12-m"
}
}{
"ok": true,
"meta": {
"api": "google-trends",
"endpoint": "interest_over_time",
"mode": "live",
"latency_ms": 2226.8,
"record_count": 53,
"bytes": 14239,
"cache_hit": false,
"completeness_pct": 100
},
"data": {
"keywords": [
"bitcoin"
],
"geo": "US",
"timeframe": "today 12-m",
"category": 0,
"property": "",
"timeline": [
{
"date": "[redacted-phone]",
"timestamp": 1752364800,
"formatted_time": "Jul 13 – 19, 2025",
"value": 54,
"has_data": true
},
{
"date": "[redacted-phone]",
"timestamp": 1752969600,
"formatted_time": "Jul 20 – 26, 2025",
"value": 44,
"has_data": true
},
{
"date": "[redacted-phone]",
"timestamp": 1753574400,
"formatted_time": "Jul 27 – Aug 2, 2025",
"value": 48,
"has_data": true
}
]
}
}What the Google Trends API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| trending_now | Currently trending searches for a geo (title + approx traffic + news articles) | SEO teams call trending_now to get currently trending searches for a geo (title + approx traffic + news articles). | geo |
| suggest | Keyword autocomplete — candidate topics/entities (the Google Trends suggestion list) so you can pick the right entity (e.g. the 'Apple Inc. — Technology company' topic mid vs the fruit) before querying interest_over_time/related. | Content strategists call suggest to get keyword autocomplete. | keyword, hl |
| categories | List the Google Trends category taxonomy (id + name, hierarchical) so you can find the right `category` id to narrow interest_over_time / related_queries / interest_by_region (e.g. 7=Finance, 5=Computers & Electronics). Optionally filter by a name substring. | Rank trackers call categories to list the Google Trends category taxonomy (id + name, hierarchical) so you can find the right…. | query |
| realtime_trending | Realtime trending story-clusters for a country (richer than trending_now): each cluster has a title, approximate search-traffic volume, the FULL related-query set, category ids, and an article count. Best for 'what is breaking right now' research. | AI answer-monitoring tools call realtime_trending to get realtime trending story-clusters for a country (richer than trending_now). | geo, hours, limit |
Call trending_now from your stack
curl -X POST https://api.reefapi.com/google-trends/v1/trending_now \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"keyword":"bitcoin","geo":"US","timeframe":"today 12-m"}'import requests
r = requests.post(
"https://api.reefapi.com/google-trends/v1/trending_now",
headers={"x-api-key": REEF_KEY},
json={
"keyword": "bitcoin",
"geo": "US",
"timeframe": "today 12-m"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/google-trends/v1/trending_now", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"keyword": "bitcoin",
"geo": "US",
"timeframe": "today 12-m"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.google-trends.trending_now with {"keyword":"bitcoin","geo":"US","timeframe":"today 12-m"}.Who uses this API and why
- Trend trackers call trending_now for the country feed and catch a rising topic with its source articles.
- Editorial teams call realtime_trending for the story cluster behind a headline and take its related_queries list as keyword vocabulary.
- Entity resolution calls suggest to turn an ambiguous word into Google's own topic ids before branching on which sense was meant.
Questions developers ask before integrating
Does this API still return the 0-100 Google Trends interest score?
Not as of 2026-08-27. interest_over_time, interest_by_region, related_queries and related_topics all return ok: false with error.code DISABLED, meta.scope ENDPOINT_DISABLED and the message "Google now blocks this data for API clients". The engine's own schema describes that number as a 0-100 index normalized to the peak of the requested window rather than a count of searches, but we could not measure it because Google no longer serves it to programmatic clients. What does still work is the trending side: trending_now, realtime_trending, suggest and categories.
What is the difference between trending_now and realtime_trending?
trending_now is the headline feed and realtime_trending is the story cluster behind it. Measured for geo=US on 2026-08-27, trending_now returned 10 items where traffic is a string bucket ("200+", "2000+") with approx_traffic as the parsed integer, plus pub_date and an articles[] list carrying title, url and source such as CNN, Fox News and ESPN. realtime_trending returned clusters instead: "tim curry" with traffic as a plain integer 2,000,000, category_ids [4], started and started_date, active true, article_count 44 and the full 127-entry related_queries list. Use the first for headlines, the second when you want the query vocabulary around a breaking story.
How do I find the right Google Trends category id?
Call categories. The full taxonomy runs to over fourteen hundred entries — the exact total drifts by a row or two as Google edits it, so read it from meta rather than pinning it — and each row carries id, name, parent_id, parent_name and depth so you can see where it sits. query=finance returned id 7 (Finance, parent All categories, depth 1), 1138 (Business Finance, parent Business & Industrial, depth 2) and 1161 (Public Finance). id 0 is All categories and is the default. Omit query to pull the whole tree once and cache it.
What is the mid value in a suggest response?
It is Google's entity id for that topic, and it is how you disambiguate a word that means several things. The keyword "apple" returned five: /m/04st9hr as a Topic, /m/014j1m as a Fruit, /m/0k8z as a Technology company, /g/11bc6hq8w2 as another Topic and /m/05253_m for Apple cider vinegar. The /m/ prefix marks older Knowledge Graph entities and /g/ marks newer ones. suggest is still live and useful for entity resolution even though the keyword actions those mids would normally feed are currently disabled.
What geo values do the trending actions accept?
Country level. trending_now takes a country code and defaults to US. realtime_trending is explicitly country-only, so a sub-region suffix such as US-CA is dropped rather than honored, and country or US-state names are auto-mapped to codes. realtime_trending also takes hours from the set 4, 24, 48 and 168 (default 24) and limit from 1 to 300 (default 50). A measured call with hours=24 and limit=5 returned exactly 5 clusters, so limit is a hard cut rather than a hint.
Is a DISABLED error worth retrying?
No. error.retryable comes back false and the call short-circuits before any fetch, with a measured latency of 2 to 3 ms. The failure is instant, but it will never succeed on a retry either. Treat DISABLED as a capability statement, branch your code on it, and fall back to trending_now, realtime_trending, suggest or categories.
Why did interest_over_time return MISSING_PARAM instead of DISABLED?
Parameter validation runs before the availability check. Sending only keywords: ["bitcoin", "ethereum"] returns MISSING_PARAM with the message "missing: keyword", because keyword is required even when you intend to pass a compare array through keywords. Add keyword and the same call returns DISABLED instead. If you are probing which actions are alive, make your test payload complete first or you will misread a validation error as a working endpoint.
What is the Google Trends API?
Google Trends API is a ReefAPI endpoint group for search interest over time, by region, and trending now. It returns live JSON through POST requests under /google-trends/v1.
Is the Google Trends API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Google Trends calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Google Trends login or account?
No login to Google Trends is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Google Trends data?
The page example is captured from a live trending_now call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Google Trends API use?
Google Trends actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Google Trends from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call google-trends actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Google Trends API a Google Trends scraper?
It is the managed alternative to a DIY Google Trends scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same search interest over time, by region, and trending now back as clean JSON.