Google Trends Scraper: Trends Pages via API
ProxyField's Web Scraping API fetches Google Trends URLs for $0.50 per 1,000 successful results over plain HTTP, or $0.20 from 10,000 results in one purchase, and $2.00 with JS rendering. You pay only for successful results. To start, contact sales, or run your own Trends scripts on ProxyField residential proxies with the Easy Trial: 1 GB for $2.95.
Through the sales team on our 24/7 live chat
| Fetch | Entry | Volume, from |
|---|---|---|
| HTTP | $0.50 | $0.20 |
| JS rendering | $2.00 | $1.00 |
Billed on successful results only.
Reliable Trends data for many keywords, in 5 rules:
- Compare up to 5 terms per batch, with the same anchor term in every batch, so you can rescale the batches to one another.
- Keep the place, time range, category and search type the same in every batch.
- Run each batch's calls on one sticky IP and pause between batches.
- Repeat important pulls, because Trends works from a sample.
- Save the settings and the download time with every result.
pytrends and 429: pytrends, the long-standing Python library for Trends, was archived by its owner on April 17, 2025 and is read-only. A 429 means Google throttled your IP. Spread batches over rotating residential IPs with one sticky IP per batch, and wait 60 seconds once you are limited. Or send the same URLs to the Web Scraping API and pay only for results that come back.
What Google Trends data you can collect
Google Trends shows search interest as an index from 0 to 100, where 100 is the peak for the terms, place and period you chose. The explore page splits it into widgets, each loaded as JSON from Google's own endpoints:
| Widget or option | What it holds | Endpoint the website calls |
|---|---|---|
| Interest over time | The 0-100 index per day, week or month, for up to 5 terms compared | /trends/api/widgetdata/multiline |
| Interest by region | The index by country, state, metro area (DMA) or city | /trends/api/widgetdata/comparedgeo |
| Related topics | Topics searched with your term, top and rising | /trends/api/widgetdata/relatedsearches |
| Related queries | Queries searched with your term, top and rising | /trends/api/widgetdata/relatedsearches |
| Trending now | Searches rising in a country in the last hours | separate endpoints |
| CSV export | The download button on each widget saves that widget's numbers (Google: export Trends data) | by hand |
| Terms or topics | A search term is "the exact word or phrase" people type; a topic is "a group of related search terms" for one concept (Google: terms versus topics) | a parameter of each term |
Endpoint paths as the pytrends source code uses them. Google can change them at any time.
Can you get absolute search volumes from Google Trends?
No. The 0-100 score is relative to the peak of your own comparison, not a count of searches. Google scales the numbers "on a range of 0 to 100 based on a topic's proportion to all searches on all topics", and "search terms with low volume appear as 0", so 0 can mean low volume, not none (Google: how Trends data is adjusted).
Where real numbers come from:
| Source | What it gives | Catch |
|---|---|---|
| Google Ads Keyword Planner | Average monthly searches per keyword, by location and date range | Needs a Google Ads account set up with billing; low-spend accounts may see ranges |
| Google Ads API (keyword planning) | The same historical metrics, by code, for keyword lists | A developer token and an Ads account |
| SEO tools (Semrush, Ahrefs and others) | Monthly volume estimates | Modeled from their own data, not Google's counts |
| Google Trends API (alpha) | Consistently scaled search interest, not 0-100, over a rolling 5 years (Google) | Still search interest, not counts; open only to accepted alpha testers |
Calibrating Trends against one known volume (an estimate):
-
Pick a term A with a monthly volume you trust, say 10,000 searches in Keyword Planner.
-
Compare it in Trends with term B, using the same place, month and search type. Say A scores 50 and B scores 25.
-
B is then roughly 25 / 50 × 10,000 = 5,000 searches that month.
Trends samples its data, so repeat the pull and treat the result as an approximation, never an exact count.
How to collect Google Trends data reliably for many keywords
-
Pick an anchor term that is moderately popular and stable in your market. Put it in every batch with up to 4 new terms (5 terms is the limit per comparison).
-
Fix the settings the same
geo, time range, category and search type (web, images, news, Shopping, YouTube) in every batch. Batches with different settings cannot be compared. -
Run each batch on one IP the explore call and its widget calls belong together. On ProxyField proxies, set a sticky session (
-session-<id>-ttl-<seconds>); through the Web Scraping API, send onesession_id. -
Pause between batches and spread them over new IPs. Once Google answers
429, the pytrends README's figure is 60 seconds of sleep between requests. -
Rescale divide each batch by its anchor's average and multiply by the anchor's average in the first batch (code below).
-
Repeat and record
Trends works from a sample, so re-run the batches that matter. Save the terms, topic IDs, settings, anchor and download time with each result.
What 500 keywords cost: 500 keywords at 4 new terms per batch is 125 batches. At about 3 calls each (the explore call and two widgets), that is 375 results: about $0.19 at $0.50 per 1,000 over plain HTTP. Run weekly, it is about 1,600 results a month, about $0.81. Through the API, you can send batches of up to 1,000 requests, with a signed callback for each finished job; results are kept for 48 hours, and up to 20 requests run at once.
How a Google Trends scraper works
The explore page does not carry the data in its HTML. It first asks Google for the widget list and a token per widget, then fetches each widget's data with that token. A scraper repeats these calls:
-
Request the explore call (
/trends/api/explore) for your terms, place and time range; the answer lists the widgets and their tokens. -
Request each widget's data with its token: the time series, the regions, the related topics and queries.
-
Strip the short guard prefix Google puts before the JSON, then parse it.
Because the calls belong together, run each set on one IP. A ProxyField sticky session keeps the same IP for 30 s up to 36 h (20 minutes by default).
Which option when
| Option | Use it for | Limits |
|---|---|---|
| Website and CSV | A few terms, by hand | One widget per download |
| Google Trends API (alpha) | Teams accepted into the alpha | Limited access; apply at Google |
| pytrends | Quick Python scripts on your own IPs | Archived since April 17, 2025, read-only; breaks when Google changes the calls; 429 from one IP |
trendspyg (maintained, pip install trendspyg) | Python with interest over time, related queries, regions and an RSS feed for trending searches | Drives a browser for some features; its README says about 8-10 fresh browser sessions in about 15 minutes can bring Google's 429 block |
| Your scripts on ProxyField residential proxies | Many keywords on a schedule, your own parser | $2.95/GB for 1 GB, from $1.95/GB; you manage batches and pauses |
| ProxyField Web Scraping API | HTTP calls with no IPs to manage, billed per successful result | Returns the page or widget response, not parsed Trends fields; your parser reads them (code below) |
The libraries call Google from your IP, so on their own they hit the same 429 as any script. A proxy or an API changes where the calls come from.
What you send
You send a Google Trends URL to the Web Scraping API and get the response back. Its design (full reference in the API documentation, access through Contact sales):
- Request: a
POSTtohttps://api.proxyfield.io/v1/scrapewith your API key in anAuthorization: Bearer <api_key>header. - JSON body:
url;render(falsefor plain HTTP,truefor JS rendering);country;session_id;output(html,markdown,textorjson). session_idkeeps the same exit IP for requests that send the same id, for up to 10 minutes. That is long enough for one explore call and its widgets. It is separate from the proxy sticky session above.- No scheduler: your code sends the requests when you need them.
- Batches: jobs of up to 1,000 requests, with a signed callback for each finished job; results are kept for 48 hours.
- Concurrency: 20 concurrent requests per account; higher limits through sales.
An explore URL you would send looks like https://trends.google.com/trends/explore?q=web%20scraping&geo=US&date=today%2012-m: q holds the terms, geo the place and date the time range.
# The request the Web Scraping API takes (access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"url": "https://trends.google.com/trends/explore?q=web%20scraping&geo=US&date=today%2012-m", "render": true, "country": "us", "output": "json"}'Example response (shortened; content is the rendered page's HTML):
{
"metadata": {"id": "req_f3a8c61e5b0d2947", "api": "web_scrape", "status": "success", "billed": true},
"status_code": 200,
"final_url": "https://trends.google.com/trends/explore?q=web%20scraping&geo=US&date=today%2012-m",
"content_type": "text/html; charset=utf-8",
"content": "<!doctype html><html lang=\"en-US\">…</html>"
}Pricing: $0.50 per 1,000 results, from $0.20
If each call is one result, one comparison is about 3 calls over plain HTTP: the explore call, interest over time and one more widget. Tracking 1,000 comparisons a week is then about 13,000 results in a 30-day month. That is about $6.50 at $0.50, or $2.60 at $0.20 if you buy the 13,000 results in one purchase.
What is billed:
- Billed: a page delivered, including a target's 404 or 410 and a sign-in page the site serves with a 200 status.
- Not billed: error responses, blocked and timed-out requests, and our internal retries on new IPs.
- Every response says whether it was billed.
The API is paid from the same crypto balance as proxies, which never expires; there is no subscription or monthly fee. For availability and access, contact sales through the sales team on our 24/7 live chat. All prices: pricing.
Through the sales team on our 24/7 live chat
| Route | Entry price | At volume |
|---|---|---|
| Web Scraping API, plain HTTP (widget URLs) | $0.50 per 1,000 successful results | $0.20 from 10,000 results in one purchase |
| Web Scraping API, JS rendering (explore page) | $2.00 per 1,000 successful results | $1.00 from 10,000 results in one purchase |
| Your own scripts on residential proxies | $2.95/GB (Easy Trial: 1 GB) | from $1.95/GB at 1,000+ GB |
Why Google Trends returns 429
HTTP 429 means "too many requests": Google throttles an IP that sends many Trends calls in a short time. Libraries hit it fast on one connection. The pytrends README says the limit is not public; one user reached it after 1,400 sequential requests, and 60 seconds of sleep between requests is the figure it gives once you are limited.
Spread batches over rotating residential IPs, keep each set of calls on one sticky IP, and wait between batches. With the Web Scraping API, a blocked request is retried on new IPs and you pay only for successful results.
Scrape Google Trends with Python and ProxyField proxies
pytrends wraps the explore and widget calls and takes a proxy list. It is archived and read-only since April 17, 2025 (github.com/GeneralMills/pytrends): it still runs, but nobody fixes it when Google changes the calls.
Access to the proxies opens once the payment is confirmed; the gateway, credentials or allowlist are in your account. The username takes optional parts after the login: -country-<cc>, -region-<region>, -city-<city>, -session-<id> and -ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default). For example: <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600.
The sample below gives each attempt a new sticky IP, and backs off on 429:
import time
import uuid
from pytrends.exceptions import TooManyRequestsError
from pytrends.request import TrendReq
def proxy(session):
# one sticky IP per session id, held for 600 s
return f"http://<login>-country-us-session-{session}-ttl-600:<password>@gate.proxyfield.io:7000"
def interest(terms, geo="US", timeframe="today 12-m", tries=3):
for _ in range(tries):
pt = TrendReq(hl="en-US", tz=0, timeout=(10, 30), proxies=[proxy(uuid.uuid4().hex[:8])])
try:
pt.build_payload(terms, timeframe=timeframe, geo=geo)
return pt.interest_over_time()
except TooManyRequestsError:
time.sleep(60) # the pytrends README's pause once rate-limited; the next try gets a new IP
raise RuntimeError("still rate-limited after %d tries" % tries)
print(interest(["web scraping", "residential proxies"]).tail())Read moreShow less
Rescale batches that share one anchor term to the first batch's scale (pandas):
import pandas as pd
def rescale(batches, anchor):
base = batches[0][anchor].mean()
scaled = [df.drop(columns=[anchor, "isPartial"], errors="ignore") * (base / df[anchor].mean())
for df in batches]
return pd.concat(scaled, axis=1).join(batches[0][[anchor]])Parse a widget response yourself, from your own client or from the Web Scraping API's content field:
import json
def timeline(text):
# Google puts a short guard prefix before the JSON: start at the first brace
data = json.loads(text[text.find("{"):])
return [(p["formattedTime"], p["value"]) for p in data["default"]["timelineData"]]
# points = timeline(api_response["content"]) # for a /trends/api/widgetdata/multiline URLFor your own scripts, ProxyField's pool is clean for Google, checked and segmented. Residential proxies cost $2.95/GB for 1 GB and from $1.95/GB at volume, over HTTP, HTTPS or SOCKS5, with targeting by country, region (state) and city. The traffic never expires, and all purchases are final.
What teams use Google Trends data for
- Keyword and content planning: which topics are rising before search volumes update.
- Seasonality: when demand for a product peaks, by state or country.
- Market and brand comparison: interest in your brand against your category.
- Forecasting inputs for demand and inventory models.
More SEO work with proxies: proxies for SEO.
Legal questions
Google's Terms of Service restrict automated access to its services, and Trends data is a relative index that Google publishes for public viewing. Collect what you need, cite Google Trends as the source when you publish charts, and read Is Scraping Google Legal? and Is Web Scraping Legal? US, EU and UK Rules (2026). This is not legal advice.
More scrapers
- Google SERP API: the Google results page as JSON, with the AI Overview, People Also Ask and the local pack parsed, $1.20 per 1,000 successful results, from $0.80.
- Google AI Mode API: the AI Mode answer, $1.50 per 1,000 successful results, from $1.00.
- Bing scraper and YouTube scraper on the Web Scraping API.
- All scrapers: scrapers.
Google Trends Scraper FAQ
24/7 support by live chat, including help with setup and integration.
How do I collect Google Trends data reliably for many keywords?
ProxyField's Web Scraping API fetches Google Trends URLs for $0.50 per 1,000 successful results over plain HTTP, so 500 keywords in batches of 5 cost about $0.19 a pull. Whichever tool you use, compare up to 5 terms per batch with one anchor term in every batch, keep the place, time range, category and search type the same, and run each batch on one sticky IP with pauses between batches. Repeat important pulls, since Trends samples its data, and save the settings with each result.
pytrends keeps hitting 429 errors; which GitHub library or API is more reliable for scraping Google Trends with Python?
pytrends was archived on April 17, 2025, so look elsewhere. trendspyg is maintained, but it still calls Google from your IP, and its README warns that about 8-10 fresh browser sessions in 15 minutes can bring a 429. Google's official Trends API is an alpha for accepted testers only. For volume, run your script on rotating residential IPs with one sticky IP per batch, or send the URLs to ProxyField's Web Scraping API at $0.50 per 1,000 successful results and parse the response yourself.
Is there any way to get absolute search volumes out of Google Trends instead of the relative 0 to 100 score?
Not from Trends itself: the 0-100 score is relative to the peak of your comparison, and 0 can mean low volume rather than none. For monthly volumes, use Google Ads Keyword Planner or the Google Ads API, or SEO tools that model volume. To estimate, compare your term with one whose Keyword Planner volume you know, using the same place and dates: if A has 10,000 searches and scores 50, a term scoring 25 is roughly 5,000.
How do I scrape Google Trends with a library from GitHub?
Install an open-source library such as pytrends or trendspyg, pass it a proxy, build a payload with your terms, place and time range, and call interest_over_time(), as in the code on this page. These libraries repeat the website's internal calls, so they break when Google changes them. pytrends has been archived since April 17, 2025, so check a repository's status before you rely on it.
What is a Google Trends scraper and how does it work?
It is a script or API that collects Trends numbers without clicking through the website. It repeats the explore call to get a token per widget, then fetches each widget's JSON with that token.
How do I scrape Google Trends?
Request the explore call for your terms, read the widget tokens, fetch each widget's data and strip the prefix before the JSON. Use a Python library to do this, or send the URLs to the Web Scraping API.
How do I scrape Google Trends with Python?
Use pytrends: create TrendReq with a ProxyField proxy, call build_payload with up to 5 terms, then interest_over_time() or interest_by_region(). Catch TooManyRequestsError, sleep 60 seconds and retry on a new session id, as in the sample on this page.
Why scrape Google Trends instead of using the website?
The website shows one comparison at a time and its CSV button exports one widget at a time. A scraper collects hundreds of terms, places and periods on a schedule and stores them for analysis.
Does Google Trends have an API?
Yes, in a limited form: Google's Trends API is an alpha open to accepted testers, with a rolling 5 years of data in daily, weekly, monthly or yearly steps, not scaled to 0-100. Everyone else uses the website, its CSV downloads, or libraries and scraping APIs that read the same data the website loads.
Is there a free API for Google Trends?
pytrends and similar open-source libraries cost nothing to install, but they run on your IPs and hit Google's limits quickly. The smallest ProxyField purchase for your own scripts is 1 GB of residential traffic for $2.95, with no subscription.
Show 11 more questionsShow fewer questions
Why does Google Trends return a 429 error?
429 means too many requests: Google throttles an IP that sends many Trends calls in a short time. The limit is not public; slow down, wait 60 seconds once limited, spread batches over rotating IPs and keep each batch on one sticky IP.
Why is pytrends not working?
Most often because Google is answering 429 to your IP, or because Google changed the calls. pytrends has been archived and read-only since April 17, 2025, so it gets no more fixes. Try a fresh IP and a 60-second pause first; if every request fails, move to a maintained library or an API.
Do you need a proxy to scrape Google Trends?
For a few comparisons, no; for hundreds, yes, because Google throttles Trends calls per IP. ProxyField residential proxies rotate the IP on every request or hold it for a sticky session from 30 s to 36 h.
How often does Google Trends update?
Google Trends has two data sets: real-time data for the last few days and non-real-time data going back to 2004, which runs up to shortly before your search. The "Trending now" list changes through the day, and Google's Trends help pages give the current delays.
What data can I extract from Google Trends?
Interest over time, interest by region (country, state, metro area or city), related topics, related queries and the trending searches in a country. All of them are relative numbers on a 0-100 scale, not search volumes.
Can I scrape Google Trends for a specific country or state?
Yes: the place is a parameter of the request, such as geo=GB or geo=US-CA, so you choose it in the URL. ProxyField proxies target country, region (state) and city if you also want the requests to leave from that place.
How do I handle JavaScript when scraping Google Trends?
Usually you can skip the rendered page: the numbers come from the widget calls, which a plain HTTP client such as pytrends makes directly. Through the Web Scraping API, plain HTTP costs $0.50 per 1,000 successful results; render the explore page, at $2.00 per 1,000, only if you need it exactly as a browser shows it.
Can I scrape Google Trends without writing code?
Yes, for small jobs: each widget on the website has a CSV download button. Anything on a schedule or across many terms needs a script or an API.
What is a Google Trends crawler?
Another name for a Google Trends scraper: a program that walks through many terms, places and periods and saves the Trends numbers for each. It runs the same explore and widget calls for every combination.
How fast and at what volume can a scraper API handle Google Trends?
ProxyField publishes no speed figure for the Web Scraping API. Its design runs 20 concurrent requests per account and batches of up to 1,000 requests, at $0.50 per 1,000 successful results, or $0.20 from 10,000 results in one purchase. For a larger recurring job, contact sales with the number of terms and how often you need them.
How do I get started with a Google Trends scraper API?
Contact sales with your terms, places and schedule; the price is $0.50 per 1,000 successful results over plain HTTP, or $0.20 from 10,000 results in one purchase. To run your own scripts instead, start with the Easy Trial: 1 GB of residential traffic for $2.95.
Related pages
Collect Google Trends pages with the Web Scraping API
Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.