Google Trends is one of the most misused free datasets on the internet. Not because the data is bad — it is excellent — but because almost everyone reads it wrong. The single most important fact to internalize: Trends does not give you search volume. It gives you a 0–100 relative interest index, rescaled to the peak inside whatever query, region and timeframe you happened to ask for. Get that wrong and every conclusion downstream is wrong too.
There is no first-party Trends API — on purpose
Google has never published a supported Trends API. The community has leaned on the unofficial pytrends wrapper for years, but it hits the same internal endpoints the website uses, which means it inherits the website's rate limiting and breaks whenever Google adjusts the response shape or tightens its bot defenses. If you have seen 429 errors or empty frames out of pytrends, that is the design working as intended against automated callers. The durable approach is a maintained scraper that handles the token handshake, batching and proxy rotation for you and hands back the same numbers as clean structured rows.
How to actually read the 0–100 index
The value 100 is always the single highest point in your selected slice. Everything else is expressed as a percentage of that peak. A few consequences people miss:
- The index is relative to itself. A term sitting at 80 for two years has not "grown" — it is just consistently near its own ceiling within that window.
- Changing the timeframe rescales the whole curve. A spike that reads 100 over the last 90 days might flatten to a bump of 12 when you zoom out to five years, because some bigger historical peak now owns the 100.
- A value of 0 does not mean zero searches — it means volume was below the threshold Google needs to report, often a privacy/low-sample cutoff.
- Two separate single-term queries are not comparable. Each is independently scaled to its own peak. "Term A hit 100 and Term B hit 100" tells you nothing about which gets more searches.
The four mistakes that wreck Trends analysis
An index of 50 is not "50,000 searches." It is half of that slice's peak. If you need absolute estimates, anchor the index against a known-volume keyword from another source and scale — never present the raw index as a count.
Do instead: report it as relative interestTo compare two terms you must put them in the same query so Google scales them on one shared axis. Run them apart and each gets its own 100, which makes them look equal when one may be 30x larger.
Do instead: batch comparison terms in one requestTrends is computed on a sample, and the sample is re-drawn. Pull the exact same query twice and the numbers can wobble a few points. Average across a couple of pulls for anything you will make a decision on.
Do instead: pull twice and smoothThe property dimension matters. Web Search, Image, News, Shopping and YouTube each have separate indices. A term that trends on YouTube can be flat on Web Search. Lock the property and state it.
The parameters that change everything
Almost every "Trends is broken" complaint is actually a misset parameter. These are the levers that reshape your result:
| Parameter | What it controls | Gotcha |
|---|---|---|
geo | Region: country, sub-region, or metro (e.g. US, US-CA, DMA codes) | Drilling to metro thins the sample — more 0s and more jitter |
timeframe | Window (today 12-m, 2020-01-01 2026-06-29, now 7-d) | Resolution flips: hourly under 9 months, weekly under 5 years, monthly beyond |
property | Search surface: web, images, news, shopping, youtube | Each has an independent 0–100 scale |
| search type | Free-text term vs. a Google "Topic" entity | A Topic aggregates spelling/language variants; a raw term does not — pick deliberately |
Worked example: comparing three product categories the right way
Suppose you want to know whether "cold plunge," "sauna blanket," or "red light therapy" has the most momentum in the US over the last year. The only correct move is one request with all three terms together, a fixed geo and timeframe, so they share one axis:
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchTerms": ["cold plunge", "sauna blanket", "red light therapy"],
"geo": "US",
"timeframe": "today 12-m",
"property": ""
}'
The response gives you interestOverTime rows (one timestamped value per term, all on the shared scale) plus relatedQueries split into top (consistently popular) and rising (fastest-growing, where "Breakout" means a jump too large to express as a percentage). The rising bucket is usually the gold — that is where you find the long-tail demand before it is obvious. From there you can sort by the latest value, look at the 12-month slope, and report a relative ranking honestly: "over this window, in the US, on Web Search, X carried the highest relative interest" — never "X had Y searches."
Get clean Trends rows, not a rate-limited wrapper
Our maintained Google Trends Actor handles the token handshake, batching and proxies, and returns interest-over-time, related and rising queries as structured JSON — callable as an API, free to start with monthly Apify credits.
Get the Google Trends Scraper → Or get done-for-you leadsWhen Trends is the wrong tool
Trends is built for direction and comparison, not magnitude. If your question is "how many people search this per month," you want a keyword-volume source, not Trends. If your question is "is interest in this rising, where, and what adjacent terms are breaking out," Trends is unbeatable and free. Match the tool to the question and you will never be embarrassed by a chart.
Disclosure: the links to Apify on this page are affiliate links. If you create a paid account through them we may earn a commission, at no extra cost to you. We recommend Apify because we build and ship Actors on it ourselves.