Category:Scraping ToolsView as Markdown

Best Google Trends APIs in 2026: We Load-Tested 7 Providers and Only 3 Answered

Clock8 Mins Read
calendarCreated Date: August 26, 2026
calendarUpdated Date: August 26, 2026
author

Head of Marketing

linkedinmedium

Google Trends has some of the most actionable and real-time data I can think of, and I personally scrape it on a few topics weekly.

But, not easy to get started, as there's a lot of tools that provide incomplete results at stupidly high prices.

Planning on building your own Google Trends scraper? Here's how to scrape Google Trends directly with Python instead.

Or are you ready to spare a few bucks today? Here we go:

Provider Endpoints working Coverage Stress (240 requests, c1 to c5) Endurance (200 at c5) p50 latency Hourly cap Price Per 1K Response
Scrape.do 1 of 1 tested 30/30 240/240 200/200 4,582 ms none $1.10
SerpApi 5 of 5 105/106 0/160 (200/hour quota) not run (quota) 2,828 ms 200/hour $50.00
ScrapingDog 4 of 5 75/106 159/160 200/200 2,993 ms none $2

A bundle is one keyword's interest over time plus regional breakdown: one call on Scrape.do, two on the others. Stress ran 60 requests per level on Scrape.do and 40 elsewhere; p50 is from endurance for Scrape.do and ScrapingDog and from the coverage TIMESERIES call for SerpApi.

Table updated August 31, 2026.

Seven providers advertise a dedicated Google Trends API, parsed JSON rather than raw trends.google.com HTML: Scrape.do, SerpApi, ScrapingDog, Bright Data, WebScrapingAPI, Oxylabs, and Decodo.

A pilot pass of one call per provider and endpoint pair dropped four of them, as they returned empty bodies or rejected the request right up.

The Four Phases

Coverage ran every supported provider and endpoint pair over the frozen inputs: 30 requests for Scrape.do's one bundled endpoint, 106 each for SerpApi and ScrapingDog. Soak cycled every endpoint kind at concurrency 5 for 1,300 requests, ramped stress ran the interest-over-time call at concurrency 1, 2, 3, then 5, and endurance was 200 consecutive requests at concurrency 5, with drift read as the first fifth's mean latency against the last's.

Two constraints were deliberate. Concurrency stopped at 5, the limit ScrapingDog's account endpoint reports as concurrency_limit: 5 and SerpApi documents for its plan; past a published limit a test proves only that rate limiting works. And every SerpApi load request carried no_cache=true, since a repeated query returns the same search_id in about 17 ms from cache; without the flag a load test measures SerpApi's CDN, and the gap it hides is 99% success cached against 16% live in the soak.

What Counted as Success

A response passed only when all four held: HTTP 200, a parseable JSON body, not an empty object, and no error or message field from the provider. The empty object rule earned its keep: ScrapingDog's related queries endpoint returned HTTP 200 with a body of {}, two bytes, on every request, and a check that reads only the status code would have scored it at 100% and stored nothing. Our runner flags those rows empty_200: true.

A provider saying "no data" counts differently. SerpApi's one coverage miss was "Google Trends hasn't returned any results for..." on a keyword Google itself had nothing for: a miss, and correct behavior.

Google's developer page for the Google Trends API alpha, still accepting applications for early access

On 2026-08-31, Google's developer page for the Trends API read "Get early access to the Google Trends API alpha" and "We're now accepting applications for alpha testers". The announcing blog post carries a 2025-07-24 date; every quote here comes from the developer page.

The page promises "a rolling window of the last 5 years of data", aggregation "in daily, weekly, monthly, and yearly intervals", and "countries and sub-regions (sometimes more!)", with values that are not scaled 0 to 100. Not on the page: quota, pricing, launch date, related queries, trending now, autocomplete.

Google had not approved our application at benchmark time, so we sent zero requests, and ranking the Google Trends API alpha on no numbers would be a guess dressed as a result. Once the application clears, it is the better tool for unscaled historical interest in known terms; for today's data, the other surfaces, or volume without a quota negotiation, a commercial Google Trends API is the tool.

The Four That Could Not Be Tested

Bright Data's Google Trends API product page, whose brd_trends parser returned zero-byte bodies in our benchmark

Bright Data is the notable one. Its brd_trends parser returned HTTP 200 with a zero-byte body after about 90 seconds on every Trends URL we tried, while the same serp_api2 zone returned 1.47 MB in 4.3 s for a plain Google search. The zone is healthy and the Trends path is dead, and a 90-second wait ending in an empty body returns nothing to branch on. Teams shopping for Bright Data alternatives can add this to the list.

WebScrapingAPI returned HTTP 403 "Your API key is not allowed to use this service" on a bare engine=google_trends call; the 400 "Parameter 'data_type' not allowed" we saw first was downstream of that 403. A plan entitlement, which a rerun does not fix.

Oxylabs and Decodo failed on our side: HTTP 401 and HTTP 429 "used all requests / subscription period ended", both reproduced on example.com, so lapsed credentials and a spent quota. Both advertise google_trends_explore and both are rerun items.

The honest split: two account problems of ours, one plan entitlement, one broken parser verified against a healthy zone. Four more never made the roster and get no numbers: DataForSEO's Google Trends API, Apify's Google Trends actor, Glimpse's paid API, and pytrends.

One bundle, interest over time plus regional breakdown for one keyword, is the comparable unit, because SerpApi and ScrapingDog charge two calls (TIMESERIES plus GEO_MAP_0, timeseries plus geomap) for what Scrape.do returns in one. Prices per call flatter whoever slices thinnest.

Provider Credits per call Calls per bundle $/1K calls $/1K bundles Hourly cap Monthly cap Hours for 1K bundles
Scrape.do 10 1 $1.10 $1.10 none credit balance about 16 minutes at measured 1.07 req/s
SerpApi (Starter, $25/mo) 1 2 $25.00 $50.00 200 1,000 searches at least 10 hours
ScrapingDog (Lite) 5 2 not published not published none 200,000 credits n/a

Scrape.do's figure is the one we measured: the scrape.do-request-cost header read a flat 10 on 105 sampled requests and on all 200 endurance requests, and at the lab's validated $0.11 per 1K at 1 credit ($0.00011 per credit) that is $1.10 per 1K calls, 45x under SerpApi per bundle from a lower price per call and half the calls.

SerpApi's came live from serpapi.com/account: "Starter Plan ($25/mo)", searches_per_month: 1000, account_rate_limit_per_hour: 200. One search is one credit, so $50 per 1K bundles, and the 2,000 searches behind 1,000 bundles take at least 10 hours at 200 per hour, a rate limit no tuning on our side gets around.

ScrapingDog's 5 credits per Trends call come from its published table, and api.scrapingdog.com/account reports 200,000 credits per month at concurrency 5 without exposing the Lite plan's dollar price, which we did not record either, so ScrapingDog gets no dollar figure. The safe arithmetic: 200,000 credits at 10 per bundle is 20,000 bundles a month.

1. Scrape.do

Scrape.do Google Trends API product page with sample interest over time and trending now JSON responses

Scrape.do's Google Trends API was one call in this benchmark: GET /plugin/google/trends with q and geo, 10 credits. The default response bundles interest_over_time (53 weekly points for the 12-month window) and interest_by_region (all 51 US regions) in one JSON body.

The record is why it ranks first: 970 of 970 across coverage, soak, stress, and endurance, zero failures of any kind, a record no other provider matched. Mean latency fell from 5,474 ms at c1 to 4,985 ms at c5 under ramped stress, the signature of healthy connection reuse, and endurance drifted from 4,585 ms to 4,720 ms between the first and last fifth, +3%.

The p99 matters more for a pipeline with a timeout on every request: 7,699 ms against a 4,582 ms p50, a 1.7x spread, against 6.5x for ScrapingDog on the same run. That tightness is worth more than raw speed.

The schema is field for field identical to SerpApi's TIMESERIES plus GEO_MAP_0 pair, value as string and extracted_value as number included, and 7 of 24 shared series came back identical to SerpApi's, the rest differing by Google's sampling. One call, and a schema most SerpApi parsers already handle.

In our tests, Scrape.do returned 970 of 970 requests with usable data, the only provider that never failed once, at $1.10 per 1,000 bundles.

  • Perfect record across all 440 load test requests (240 ramped stress plus 200 endurance), after 530 clean requests in the phases before them
  • Tightest tail of the three: p99 at 1.7x the median against 6.5x for ScrapingDog, with a 7,750 ms endurance max
  • One call per keyword covers both charts, which is where the 45x gap per bundle against SerpApi comes from, with no hourly ceiling
  • Response schema identical to SerpApi's, so moving off the TIMESERIES plus GEO_MAP_0 pair is a URL change and a token swap rather than a parser rewrite