Google does not expose a public Google Trends API. Trends API fills that gap with POST https://api.trendsapi.ai/api, Bearer auth, and three modes: get_time_series, get_growth, and get_top_trends. On 2026-08-06, bitcoin Google Search interest sat at 24 on the 0-100 scale after a 3M decline of -31.43%, while the live Google Trends board listed 15 terms headed by "perez hilton". The same key also returns Amazon and YouTube series when a keyword has commerce or video demand. Parse body twice; that is the most common integration mistake.
Why developers look for a Google Trends API alternative
Google Trends is useful in a browser and awkward in a pipeline. There is no official public endpoint, rate contract, or SLA. Unofficial clients such as pytrends reverse-engineer private Google endpoints. Those clients work until Google changes a cookie, a URL, or a response shape, then overnight jobs fail.
Demand for that path is still real. On 2026-08-06, the PyPI project pytrends showed 313,892 weekly downloads and a 3M volume growth of 43.66% (recent volume 313,892 vs baseline 218,491). Google Search interest for the keyword "pytrends" moved the other way: recent value 12 vs baseline 55 over 3M, a -78.18% drop, and -40.0% over 12M. Package installs stay high while search interest cools. That split is exactly why a managed JSON API is easier to operate than a scraper tied to Google's UI.
For source-level docs on the Google Search feed, see Google Trends. For a pytrends-focused comparison already on the site, see pytrends alternative.
Minimal request that replaces a Trends scrape
The first call is one POST. Free tier is 100 successful requests per month. Starter is 5,000, Pro is 25,000, Business is 100,000. Only HTTP 200 responses count against quota.
import json
import os
import urllib.request
payload = {
"mode": "get_growth",
"source": "google search",
"keyword": "bitcoin",
"percent_growth": ["3M", "6M", "12M"],
}
req = urllib.request.Request(
"https://api.trendsapi.ai/api",
data=json.dumps(payload).encode(),
headers={
"Authorization": f"Bearer {os.environ['TRENDSAPI_API_KEY']}",
"Content-Type": "application/json",
},
method="POST",
)
envelope = json.loads(urllib.request.urlopen(req).read().decode())
data = json.loads(envelope["body"]) # body is a JSON string
for row in data["results"]:
print(row["period"], row["growth"], row["direction"], row["recent_value"])
Live result for bitcoin on google search, pulled 2026-08-06:
| Period | Recent value | Baseline value | Growth | Direction |
|---|---|---|---|---|
| 3M | 24.0 | 35.0 | -31.43% | decrease |
| 6M | 24.0 | 45.0 | -46.67% | decrease |
| 12M | 24.0 | 39.0 | -38.46% | decrease |
Recent date for those windows is 2026-08-01. Baselines are 2026-05-02 (3M), 2026-01-31 (6M), and 2025-08-02 (12M). The growth call reported 261 underlying points and 3 completed calculations.
Time series shape for charts and models
get_time_series returns dated points with value on the 0-100 scale. For bitcoin on google search, the series runs from 2021-08-07 (value 49) through 2026-08-01 (value 24). Peak in the returned window is 100 on 2022-06-18. A later spike hit 99 on 2026-02-07, then cooled to 24 by 2026-08-01.
curl -s https://api.trendsapi.ai/api \
-H "Authorization: Bearer $TRENDSAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"mode":"get_time_series","source":"google search","keyword":"bitcoin"}'
After the double JSON parse, each element looks like {"date":"2026-08-01","value":24,"keyword":"bitcoin","source":"google search"}. That array is what dashboards and feature stores want. No HTML. No cookie jar.
Live board without inventing a keyword
When the job is "what is trending now", use get_top_trends with "type":"Google Trends". No keyword field. On 2026-08-06 (as_of 2026-08-06T00:01:40+00:00), the top 5 were:
- perez hilton
- michigan primary
- idaho murders
- tom holland spider man movies
- glen hansard
Ranks 11 through 15 included spirit halloween (11), the punisher (12), samara weaving (13), lioness (14), and the wall street journal (15). That board is the feed to poll on a cron, then pass winning labels into get_growth for confirmation across sources.
Multi-source check the unofficial Google clients cannot do
A Google-only scrape stops at search interest. Trends API reuses the same auth for commerce and video. Example: "spirit halloween" on 2026-08-06.
| Source | 3M growth | Recent value | Notes |
|---|---|---|---|
| google search | +350.0% | 9.0 | baseline 2.0 on 2026-05-02 |
| amazon | +122.95% | 13.6 | recent volume 21,785 |
| youtube | +90.0% | 57.0 | baseline 30.0 |
| tiktok | n/a | n/a | source returned unavailable |
Amazon 6M growth was +189.36% with volume rising from 7,579 to 21,785. YouTube 6M growth was +185.0% (20.0 to 57.0). Google Search 6M growth was +800.0% (1.0 to 9.0). TikTok had no series for this keyword; absence is a finding, not a reason to hide the row. A seasonal demand walkthrough with copy-paste Python is in Spirit Halloween demand sensing.
For Amazon-specific field notes, see Amazon trends.
Comparison matrix for the usual alternatives
| Approach | Official? | Auth | Multi-source | Failure mode |
|---|---|---|---|---|
| Google Trends UI export | Yes (manual) | Google login | No | Not automatable |
| pytrends / scrapers | No | Session hacks | No | Breaks on Google changes |
| SerpApi-style SERP wrappers | Vendor | API key | Partial, product-dependent | Priced per SERP scrape |
| Trends API | Managed REST | Bearer | 15+ sources | HTTP status + JSON errors |
Trends API pricing is request-based: 100 free, then 5,000 / 25,000 / 100,000 on paid tiers. Failed calls do not burn quota. That model fits cron monitors that poll a small keyword list every hour more cleanly than per-SERP pricing.
Integration checklist
- Store
TRENDSAPI_API_KEYin the secret manager. Never commit it. - POST JSON with
mode,source, andkeyword(exceptget_top_trends, which usestype). - Parse the envelope, then
json.loadsthebodystring. - Treat 0-100
valueas relative interest. Usevolumeonly when the payload marks it available. - Prefer
get_growthfor alerts. Preferget_time_seriesfor charts. Preferget_top_trendsfor discovery. - When a source returns unavailable, log it and continue. Multi-source calls can succeed on 3 of 4 feeds, as with spirit halloween (sources_successful 3, sources_failed 1).
When this alternative is the right tool
Use Trends API when the pipeline needs Google Search interest as JSON, needs growth windows without hand-built date math, or needs the same keyword checked on Amazon and YouTube in one auth context. Stay on the Trends UI for one-off human research. Stay on pytrends only for throwaway notebooks that can tolerate breakage.
The contract is stable: one endpoint, three modes, apex docs at trendsapi.ai, and per-source guides under /trends/*. Start with bitcoin or a seasonal term, confirm the double parse, then point the cron at the live Google Trends board.