agenttoolworks

Guide, measured 2026-10-05 and 2026-10-13

How to scrape Google Trends, and why a Google Trends scraper hits 429

Google Trends shows its charts to anyone, signed in or not, and its pages fill them from JSON requests. Reading those is the easy part. The hard part is the rate limit: Google answers HTTP 429 per IP, and a scraper that ignores it spends minutes per query or returns nothing. Here are the requests, the wall, what gets past it, and what a logged-out visitor cannot get, with our measurements.

The requests behind the explore page

Open a Google Trends chart in a fresh browser profile and watch the network tab. The page first gets a visitor cookie, then asks one endpoint for its widgets, then fetches each widget's data with the token that came with it:

an explore query, logged out
HEAD https://trends.google.com/trends/?geo=US&hl=en-US
     -> Set-Cookie: NID=...          the only cookie a logged-out visitor gets

GET  /trends/api/explore?hl=en-US&tz=0&req={"comparisonItem":[
       {"keyword":"coffee","geo":"US","time":"today 12-m"},
       {"keyword":"tea","geo":"US","time":"today 12-m"}],
       "category":0,"property":""}
     -> the page's widgets, each with its own request object and token:
        TIMESERIES, GEO_MAP, then per term GEO_MAP_i, RELATED_QUERIES_i, RELATED_TOPICS_i

GET  /trends/api/widgetdata/multiline?req=<TIMESERIES request>&token=<token>
GET  /trends/api/widgetdata/comparedgeo?req=<GEO_MAP request>&token=<token>
GET  /trends/api/widgetdata/relatedsearches?req=<RELATED_QUERIES_i request>&token=<token>

Each answer starts with a short anti-hijacking prefix ()]}') before the JSON. A single term gives four widgets; a comparison of up to five terms gives the shared timeline, the compared regional breakdown in percent, and regions, related queries and related topics for each term. Category, search type (web, images, news, YouTube, Shopping), time zone and language go in the same parameters.

Google's robots.txt for trends.google.com disallows /trends/explore? and /explore?, the HTML page, and nothing under /trends/api/. A scraper never needs the HTML page; a link to it in each row lets a person check a number by eye.

Trending now: one call, the whole list

The Trending now page (trends.google.com/trending) loads its list from one batchexecute call, with the country, the language and the window as arguments:

Trending now
POST /_/TrendsUi/data/batchexecute?rpcids=i0OFE&hl=en-US
     f.req=[[["i0OFE","[null,null,\"US\",0,\"en-US\",24,1]",null,"generic"]]]
                                  geo   language hours (4, 24, 48 or 168)

It answers without any cookie. On 2026-10-05 it returned 446 searches for the United States over 24 hours and 1,993 over 7 days; on 2026-10-13, 467 over 24 hours. Each item carries the search, its start and end time, Google's volume bucket, the increase, category IDs and the trend breakdown. The public RSS feed lists 10, and the old dailytrends endpoint now answers 404. There is no worldwide list: Google publishes it per country or region, and the page's category filter runs in the browser, so a scraper filters the same way.

The 429 wall

What we askedWhat came back
Explore request, no cookie, laptopHTTP 429 at once
Explore request, with the NID cookie, laptop200; 126 requests at 300 ms pacing drew no 429
8 parallel sessions, no pacing, one laptop IPFirst 429 after about 140 requests; the IP then refused for more than 75 minutes, whatever the cookie
Apify datacenter proxy, a session per worker100 of 100 queries read, 4 HTTP 429 in 412 requests, each retried from a new IP
Apify residential proxy200
Trending now RPC, no cookie200, the whole list in one answer
Public RSS feed /trending/rss10 searches only
/trends/api/dailytrendsHTTP 404 (retired)

Three lessons. The cookie is required but is not the limit: without it the explore request is refused at once, with it the limit is the IP. A refused IP stays refused for over an hour, so waiting it out is not a strategy for a batch. And dressing up as a browser does not help: three A/B rounds of 20 queries drew 15, 19 and 36 HTTP 429 with our own User-Agent, against 15, 78 and 54 with Chrome's. We kept ours.

Sessions, and the residential fallback

What works is many IPs, each used like a visitor. Our Actor runs eight workers in parallel; each holds one session, an Apify datacenter IP and its own visitor cookie, and sends one request at a time, at least 250 ms apart. When Google answers 429, that session is dropped and the request leaves again from a new IP, after a short wait: a new IP needs no long one. When a worker fails twice in a row, its next 30 requests go through residential IPs. A query that still comes back partial is read once more from fresh sessions, and the better answer is kept.

Two of those rules came from measurements. Capping the retry wait at 4 seconds: with a 20-second cap, one query once waited 150 seconds through the backoff ladder. And pushing Trending now rows in one batch per list: one at a time, 448 rows took 25 seconds and 5,581 rows took 323 seconds; batched, 1.3 and 4.4 seconds.

The result over three passes of the same 33 inputs (single terms in every time range, comparisons of 2 and 5 terms, regions, metros, cities, categories, the five search types, batches of 30, 100 and 200 terms, Trending now in one and five countries): 109 of 110 runs succeeded, the one failure an empty input refused on purpose, and 0 of 1,297 explore queries failed. The 429s never went away (691 in 2,962 requests on the last pass); they just stopped costing results.

What a logged-out visitor cannot get

What it costs in the cloud

Measured on Apify with our Actor: each run's total usage, compute, proxy and storage included.

RunResultRun timeApify usage
100 terms, US, 12 months, calm pool (0 HTTP 429 in 408 requests)100 ok80 s$0.0020
100 terms, US, 12 months, 98 HTTP 429100 ok159 s$0.0251
200 terms, worldwide, 442 HTTP 429, residential fallback200 ok516 s$0.0839
3 queries, US (2026-10-13, 14:15 UTC), 27 HTTP 429 in 79 requests3 ok126 s$0.0061
The same 3 queries (14:34 UTC), no 4293 ok6 s$0.0002
Trending now, US, 24 hours (2026-10-13)467 rows3.4 s$0.0025
Trending now, 5 countries, 7 days5,546 rows3.5 s$0.0280

Google's pressure, not the input, sets the bill: the same 100 terms cost $0.020 to $0.25 per 1,000 queries depending on how many 429s came back, and $0.42 per 1,000 in the worst case we measured, when residential IPs took over. The two three-query runs of 2026-10-13 are the same input nineteen minutes apart. Trending now is cheap in every case: one request per list.

Or skip the plumbing

Our Google Trends scraper does all of the above in one run: up to 2,000 terms, comparisons or Google Trends links, every time range and search type, regions down to US metros and cities, related queries, Trending now for any country, sessions and the residential fallback, and a status on every query. It costs $1.50 per 1,000 queries with data, platform usage included, and a query without data is free; the most used Google Trends Actor on Apify lists $3.00 per 1,000 on its free tier plus platform usage.

Questions

Does Google Trends have an API?

Google announced an official Trends API as an alpha with access by application. Without it, the public explore and Trending now pages fetch their data as JSON from trends.google.com, and those requests answer a logged-out client: that is what every Google Trends scraper reads.

Why does Google Trends answer 429 Too Many Requests?

Google rate-limits Trends per IP address. Without the visitor cookie of a first page view, the explore request gets 429 at once. With it, one IP sending quick requests was refused after about 140 of them, for more than 75 minutes, and a new cookie did not help. Only a new IP did.

Does a browser User-Agent help against the 429s?

Not in our test. Three A/B rounds of 20 queries started together drew 15, 19 and 36 HTTP 429 with our own User-Agent and 15, 78 and 54 with Chrome's.

Can you get related topics without logging in?

Not in our tests. Every logged-out client we tried, plain HTTP, headless and headful Chrome, Apify datacenter and residential IPs, got an empty related-topics list, while a signed-in browser saw topics for the same query. Related queries, interest over time and interest by region did come back.

How do I get the Trending now list as JSON?

The Trending now page loads its list from one batchexecute call (RPC i0OFE) that answers without any cookie: 446 searches for the United States over 24 hours and 1,993 over 7 days on 2026-10-05, where the public RSS feed lists 10.

Aggregated, anonymized search interest only: no personal data, no login, no account. Not affiliated with Google.