Skip to main content

Google Trends API

Python client for Google Trends data via the Trends API. Normalized 0-100 scores, history + growth, free tier. Not a scraper.

License: MIT PyPI Python

Key: trendsapi.ai/#get-key. HTTP contract: trendsapi-ai/trendsapi.

JS: google-trends-js, google-trends-node, google-trends-client.

Authentication

pip install google-trends-client
export TRENDSAPI_KEY=your_key

Python 3.9+. The wrapper re-exports TrendsAPI, AsyncTrendsAPI, and TrendsAPIError from the official client.

from google_trends_client import TrendsAPI

client = TrendsAPI()                    # TRENDSAPI_KEY
# client = TrendsAPI(api_key="YOUR_KEY")

Keyword helpers default to source: "google search". Pass source= to hit any other platform with the same client. Official full client (every source, no preset): trendsapi.

Methods

Method REST mode Returns
get_time_series(keyword, source=, data_mode=) get_time_series list[TrendsDataPoint]
get_growth(keyword, percent_growth=, source=, data_mode=) get_growth GetGrowthResponse
get_live(limit=, offset=, category=) get_top_trends GetTopTrendsResponse
get_top_trends(type=, ...) get_top_trends GetTopTrendsResponse

source is lowercase (google search). type is exact (Google Trends). Mixing them is a 400.

from google_trends_client import TrendsAPI

client = TrendsAPI()                    # TRENDSAPI_KEY
# client = TrendsAPI(api_key="YOUR_KEY")

series = client.get_time_series("heat pump")
print(series[-1].date, series[-1].value)

growth = client.get_growth("heat pump", percent_growth=["3M", "12M"])
print(growth.results[0].growth, growth.results[0].direction)

hot = client.get_live(limit=10)
print(hot.data)                         # [[1, "..."], ...]

get_time_series

points = client.get_time_series("heat pump")

Each point:

Field Always Meaning
date yes YYYY-MM-DD
value yes 0-100 index for this series
keyword yes Echo
volume no Absolute volume when available
source or datatype no Pipeline label

Python returns list[TrendsDataPoint]. Use .date and .value, not ["date"]. JS returns the same fields as object properties.

get_growth

g = client.get_growth("heat pump", percent_growth=["12M", "3M", "YTD"])
print(g.results[0].growth, g.results[0].direction)

percent_growth default: ["12M"]. Presets: 7D 14D 30D 1M 2M 3M 6M 9M 12M/1Y 18M 24M/2Y 36M/3Y 48M 60M/5Y MTD QTD YTD. Custom: {"name": "Launch", "recent": "2024-06-01", "baseline": "2024-01-01"}.

Field Meaning
search_term Keyword
data_source Source
results One object per window (period, growth, direction, dates, values)
metadata Counts / success flag

Several windows still count as one request. Python: growth.results[0].growth. JS: growth.results[0].growth.

get_live

hot = client.get_live(limit=10)
Field Meaning
as_of_ts Snapshot time
type Feed name
limit, offset, count Pagination
data [rank, label] rows

Python: hot.data. JS: hot.data. Optional offset= and category= (Amazon Best Sellers by Category, Top Websites only).

Async

import asyncio
from google_trends_client import AsyncTrendsAPI

async def main():
    c = AsyncTrendsAPI()
    return await asyncio.gather(
        c.get_time_series("heat pump"),
    )

asyncio.run(main())

Each 200 is one billed request.

Pandas

from dataclasses import asdict
import pandas as pd
from google_trends_client import TrendsAPI

df = pd.DataFrame(asdict(p) for p in TrendsAPI().get_time_series("heat pump"))
df["date"] = pd.to_datetime(df["date"])
print(df.set_index("date")["value"].resample("ME").mean().tail())

Call (curl)

Field Value
Endpoint POST https://api.trendsapi.ai/api
Auth Authorization: Bearer $TRENDSAPI_KEY
History source: google search with get_time_series or get_growth
Keyword Any phrase, e.g. heat pump
Live type Google Trends
curl -sS -X POST https://api.trendsapi.ai/api \
  -H "Authorization: Bearer $TRENDSAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"get_time_series","source":"google search","keyword":"heat pump"}'

Source notes

  • Related sources (same endpoint, different source): google images, google news, google shopping.
  • value is 0-100 for this term on Google web search, not Ads impressions.

Errors

HTTP Client
200 Parsed payload. Python dataclasses / JS typed objects
400 Raises. Fix source or type spelling
401 Raises. Check TRENDSAPI_KEY
404 Raises. No series for that keyword. Do not retry
429 Raises. Quota
5xx Client retries, then raises

The HTTP body field is a JSON string. SDKs decode it. Raw curl must parse body a second time.

Site: https://trendsapi.ai/trends/google-trends. GitHub: trendsapi-ai/google-trends-api.

License

MIT. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

google_trends_client-1.0.2.tar.gz (5.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

google_trends_client-1.0.2-py3-none-any.whl (5.3 kB view details)

Uploaded Python 3

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page