Quarra
Guide · Google Trends

Google Trends API in 2026: the official alpha, pytrends 429 errors and what to use

Google's official API is an alpha you apply for, and pytrends was archived in April 2025. The options in between, and the part that retries do not fix.

Checked against Google's alpha page and the pytrends repository on October 9, 2026.

The short answer

Google does have an official Trends API, but it is an alpha with access by application, so most people cannot use it yet. Pytrends, a widely used unofficial library, was archived by its maintainers in April 2025, and it can return 429 errors once you pass a rate limit Google does not publish. The usual ways out are another maintained library, your own requests with retries and backoff, a paid search-data API, or a scraper that returns clean rows. The part that is easy to miss, whichever you pick, is that Google serves different versions of the same curve to different connections, so a single request is not a stable measurement.

Google announced it on July 24, 2025 and, on October 9, 2026, its page still reads “apply for the alpha”. It is for a limited group of developers, chosen by use case and ability to give feedback. What it describes: a rolling five-year window, daily, weekly, monthly and yearly aggregation, region and sub-region breakdowns, and values scaled consistently across requests instead of 0 to 100 per request, so that many terms can be compared and merged. It states no request quotas on that page. If you can get in, it is the cleanest source; apply, and use another route while you wait.

What happened to pytrends

  • The repository was archived by its owner on April 17, 2025 and is read-only. No fix will land there.
  • Its own README says the rate limit is not publicly known, mentions one user hitting it after about 1,400 sequential requests, and suggests pausing 60 seconds once you hit it. It also documents retries and backoff_factor options for people who hit Google's limit.

Other libraries exist (trendspy is one); try one on your own terms and volumes before you rely on it. If you stay with a library, plan for retries and delays.

The problem retries do not fix

Google Trends does not serve the same sample to everyone. At the same minute, different connections get different versions of the data. We asked for coffee, United States, past 12 months, 43 times from different US connections within three minutes on October 6, 2026: 34 answers matched; the other 9 were one of two variants, up to 9 points off on some weeks. The terms pizza, weather and running shoes, asked from the same connections, also came back in two or three versions each. The trends.google.com page itself draws whichever version your connection gets.

So a client that asks once gets a minority version about one run in five (9 of 43). Two runs of the same script a minute apart can disagree, and nothing in the response says so. We wrote about it in Google Trends is not one dataset.

The Google Trends Scraper asks each request several times independently, keeps the version most answers carry, and writes the vote on every row as sampleAgreement (for example "4/4" or "5/7"). Three terms compared over five years in the United States:

{
  "searchTerms": ["coffee", "tea", "matcha"],
  "geo": "US",
  "timeRange": "past 5 years"
}

By default you get interest over time only. Ask for the regional map and the related queries (top, rising and Breakout) too with dataTypes:

{
  "searchTerms": ["coffee"],
  "dataTypes": ["interestOverTime", "interestByRegion", "relatedQueries"],
  "geo": "US",
  "timeRange": "today 12-m"
}

Locations and dates can be written in plain words: "United States", "California", "U.K.", "past 90 days", "5y", "2024", "Q1 2024", "since 2020". A search the Google way works too: "air fryer" in straight quotes for the exact phrase, coffee + tea for either, coffee -starbucks for one without the other.

What the rows look like

Each curve comes with a free summary row, so that a script or an agent can read one row per term instead of 52 points. An example row (coffee, United States, past 12 months, October 6, 2026; some fields left out):

{
  "dataType": "summary",
  "term": "coffee",
  "geo": "US",
  "timeRange": "today 12-m",
  "property": "web",
  "scrapedAt": "2026-10-06T22:56:27Z",
  "scale": "single",
  "points": 52,
  "latestValue": 71,
  "latestDate": "2026-09-27T00:00:00Z",
  "average": 76.9423,
  "peakValue": 100,
  "peakDate": "2026-04-12T00:00:00Z",
  "changePercent": 8.4,
  "trend": "stable",
  "isSpiking": false,
  "sampleAgreement": "4/4"
}

The curve itself is one row per term with a timeline array, shown here with three of its 53 points:

{
  "dataType": "interestOverTime",
  "term": "coffee",
  "geo": "US",
  "timeRange": "today 12-m",
  "scale": "single",
  "sampleAgreement": "4/4",
  "timeline": [
    { "date": "2025-10-05T00:00:00Z", "value": 62, "isPartial": false },
    { "date": "2025-10-12T00:00:00Z", "value": 60, "isPartial": false },
    { "date": "2025-10-19T00:00:00Z", "value": 64, "isPartial": false }
  ]
}

value is Google's relative interest, 0 to 100, as on the website. isPartial marks a last point whose period is not over. A term Google has no data for gets a free missing row that says so, and an input that fails gets a free error row with a code, a message and retryable.

Related queries

Related queries come as one row per term: 25 top queries and 25 rising ones for coffee in the United States over the past 12 months. This is a real run of the published build (October 9, 2026), with 4 of the 50 queries kept and their trendsUrl left out:

{
  "dataType": "relatedQueries",
  "term": "coffee",
  "geo": "US",
  "timeRange": "today 12-m",
  "property": "web",
  "scrapedAt": "2026-10-09T14:52:39Z",
  "sampleAgreement": "2/2",
  "queries": [
    {"ranking": "top", "rank": 1, "query": "coffee near me", "value": 100, "formattedValue": "100", "isBreakout": false},
    {"ranking": "top", "rank": 2, "query": "coffee shop", "value": 90, "formattedValue": "90", "isBreakout": false},
    {"ranking": "rising", "rank": 3, "query": "home workout routines", "value": 5150, "formattedValue": "Breakout", "isBreakout": true},
    {"ranking": "rising", "rank": 4, "query": "how to remove coffee stain from carpet", "value": 5000, "formattedValue": "+5,000%", "isBreakout": false}
  ]
}

formattedValue is what Google shows, "Breakout" or a percentage for rising queries; isBreakout says which. That run cost $0.025 to start and $0.0006 for its one result at Starter plan rates ($0.0256).

One row per point, for a spreadsheet or pandas

Add unwind=timeline,regions,queries,trends&clean=true to the dataset items URL, and &format=csv for a CSV: each point, region, query and trend becomes its own row with the fields of its curve.

from apify_client import ApifyClient
import pandas as pd

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/google-trends-scraper").call(run_input={
    "searchTerms": ["coffee", "tea", "matcha"],
    "geo": "US",
    "timeRange": "past 5 years",
})
items = client.dataset(run.default_dataset_id).list_items(clean=True).items
df = pd.DataFrame(
    {"term": r["term"], "date": p["date"], "value": p["value"]}
    for r in items if r["dataType"] == "interestOverTime"
    for p in r["timeline"]
)
print(df.pivot(index="date", columns="term", values="value").tail())

Tested with apify-client 3.2. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

Trending now, as a list

The Trending now list of a country or a region comes in one call, with its search volume bucket, growth, start time, categories, related queries and up to 10 news articles for the first 25 trends (357 to 409 trends for the United States on October 6, 2026, depending on the hour):

{
  "mode": "trendingNow",
  "trendingLocations": ["US-CA", "JP"],
  "trendingCategory": "Sports",
  "trendingArticles": 3,
  "trendingOnlyNew": true
}

With trendingOnlyNew on a schedule, a run returns only the trends it has not returned before. A whole list, news included, is one paid result.

What we measured

  • A run for one term (curve, regions, related queries) took 5 to 10 seconds on Apify in October 2026, vote included.
  • On 100 terms run twice, 15 minutes apart, 89% of the points were identical. The difference is Google refreshing its data: values can move between two runs on the website too.
  • The vote finds the most common version about 96 times in 100 in simulations on the measured proportions. A close vote shows in sampleAgreement, for example "4/8".

Limits

  • Values are relative, not search counts, and Google samples its data.
  • Related topics are not provided; related queries (top and rising) are.
  • A search written with operators (quotes, +, -) gets no related queries from Google: the row says so, free of charge.
  • With stableSampling off, each request is asked once and you get that answer's version.
  • For terms with almost no searches, Google returns isolated values we cannot tell from its own noise. Count the non-zero points before reading a trend into them.

What it costs

A run starts at $0.025. On the Free plan: one term, curve only, $0.0262; curve, regions and related queries $0.0286; five terms compared $0.031; Trending now for the United States $0.027. Per 1,000 results, the curve, map and related-queries rows cost $1.20 on Free, $0.60 on Starter, $0.45 on Scale and $0.30 on Business. The summary, missing and error rows are free, and so is anything that comes back empty. If Google refuses the standard connection, the affected results are charged one extra premium connection result each ($0.30 per 1,000 on Free and Starter, $0.40 on Scale, $0.55 on Business and above), on top of their own price. It is not charged when the standard connection works, on small runs, for Trending now lists or calibrated terms, or when you use your own proxy. The run status says how many results were charged.

At the Store rates in effect on October 10, 2026, a curve or a map costs 20% more here than with the lowest-priced Trends scraper we tested, because each term is measured several times to return a stable value. That alternative bills a curve and its map as one row, so a curve alone costs less here. Platform costs are included.

Next: daily data over several years and many terms on one scale.

Run it on the Apify Store

A run starts at $0.025; one curve costs about $0.026 on the Free plan. Errors and empty results are not charged, and you can set a maximum cost per run.