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:

  1. perez hilton
  2. michigan primary
  3. idaho murders
  4. tom holland spider man movies
  5. 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

  1. Store TRENDSAPI_API_KEY in the secret manager. Never commit it.
  2. POST JSON with mode, source, and keyword (except get_top_trends, which uses type).
  3. Parse the envelope, then json.loads the body string.
  4. Treat 0-100 value as relative interest. Use volume only when the payload marks it available.
  5. Prefer get_growth for alerts. Prefer get_time_series for charts. Prefer get_top_trends for discovery.
  6. 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.