You give it a list of keywords. It hands back, per keyword, Google Trends’ interest-over-time series plus the related queries — the same data you’d read off the Trends website, structured and ready to use.
One keyword in, this is what comes out: a time series of interest scores over the period you asked for, and the list of related queries (rising and top) for that keyword.
$30 per 1,000 results. And the part that actually matters: you’re only billed for keywords that come back with real data. If a lookup fails after exhausting retries, it’s logged and skipped — never charged. That’s the whole point: you don’t pay for the twenty-minute run that comes back empty.
Why “runs, returns nothing, bills you anyway” is the default failure mode
Google Trends doesn’t have a public API — every scraper, mine included, talks to the same internal endpoint the website itself uses, and it treats requests from datacenter IPs very differently from a real residential connection. A bare request from a dev machine, no proxy, got an instant 429: no warm-up, no browser fingerprint, just a blunt rejection. That’s the failure mode hiding behind “ran 20 minutes, returned nothing” — the scraper isn’t broken, it’s being told no, and most scrapers don’t handle that gracefully.
There’s a second failure mode, easy to miss: every JSON response from the Trends endpoint is prefixed with an anti-hijacking guard. Most write-ups online show it followed by a comma. On the real endpoint, it’s followed by a bare newline instead — a parser hardcoded against the documented version worked fine against a mock and broke instantly against the live response.
Two fixes, neither exotic. A residential proxy with a warm-up request first, which is what actually kills most of the blunt rejections — arguably a bigger lever than anything in the code. And session rotation instead of blind retries: a fresh proxy identity and cookies after a failure, capped attempts, exponential backoff so retries don’t hammer the endpoint in a tight loop. If every attempt still comes back empty, that result is logged clearly and simply isn’t pushed to output — not a silent empty row you already paid for.
Try it
Packaged as a Google Trends scraper on Apify, interest-over-time plus related queries: Reliable Trends Scraper