SEO Data Bench/Benchmarks/seo-api-latency
SEO API latency, failures and what a real workload costs
Latency, failure and no-data rates, and observed cost for 314 calls across twelve SEO data routes on one day, with a worked monthly workload for an in-house growth agent.
Written for people asking: What are the best SEO data APIs for an in house growth agent?How much does it cost to run weekly keyword and SERP checks through an API?Which SEO API is fastest?
Across 314 calls on 15 September 2026, no route returned an error on a SERP or backlink call; the only failure was a DataForSEO bulk keyword call rate-limited because our own SERP calls to the same provider were running at the same time, which succeeded on retry. Stored-index routes answer in about a second (Serpstat SERP 1.0 s, all three backlink summaries 1.0 to 1.1 s at the median); live Google fetches take 1.5 s (SerpApi), 4.6 s (Cloro render), 7.9 s (DataForSEO) and 9.2 s (Treg routed, served by DataForSEO). A monthly workload of 200 keywords, 500 SERP checks and 50 backlink summaries costs between $0.55 and $8.60 depending on route, and about $1.40 on the cheapest live-data combination. The whole benchmark cost $1.99 at list prices.
How latency was measured
Wall-clock time from the Treg CLI issuing the call to the full response arriving, including network from Sydney to each provider. One worker per provider, so our own concurrency did not queue calls behind each other. One call per query or domain; the bulk keyword endpoints were one call carrying all 50 keywords. Everything ran on the same afternoon.
Per-query routes
| Route | Returned data | No data | Errors | p50 | p95 | Cost per call |
|---|---|---|---|---|---|---|
| Cloro (live Google render) | 50 | 0 | 0 | 4559 ms | 9806 ms | $0.0028 |
| DataForSEO | 50 | 0 | 0 | 7894 ms | 18133 ms | $0.0020 |
| SerpApi | 50 | 0 | 0 | 1507 ms | 12805 ms | $0.015 |
| Serpstat | 20 | 30 | 0 | 995 ms | 1667 ms | $0.0005 |
| Treg (routed) | 50 | 0 | 0 | 9215 ms | 22424 ms | $0.0020 |
| Route | Returned data | p50 | p95 | Cost per call |
|---|---|---|---|---|
| Moz | 20 | 976 ms | 1205 ms | $0.013 |
| SE Ranking | 20 | 1129 ms | 2874 ms | $0.018 |
| Serpstat | 20 | 1026 ms | 1285 ms | $0.0025 |
Bulk keyword routes
One call each, 50 keywords. Latency is for the whole batch.
| Route | Keywords returned | Latency (bulk call) | Cost for 50 keywords |
|---|---|---|---|
| DataForSEO | 50 | 4205 ms | $0.090 |
| Google Ads (Keyword Planner) | 49 | 2097 ms | $0.0000 |
| SE Ranking | 50 | 4032 ms | $0.089 |
| Serpstat | 23 | 4066 ms | $0.025 |
DataForSEO’s first attempt returned “too many requests” because the runner was sending it SERP calls concurrently; the retry after the SERP run took 4.2 seconds. The rate limit is per account across endpoints, which matters if an agent mixes keyword and SERP calls to the same provider.
Reading the numbers
- Stored indexes answer in a second. Live Google fetches do not. Serpstat’s SERP and all three backlink summaries returned in about a second because nothing is fetched at request time. Live routes ranged from 1.5 s (SerpApi) to 9.2 s (Treg routed), and the p95 on live routes reached 12 to 22 seconds. An agent calling a live SERP route synchronously should expect to wait, and should parallelise anything over a handful of queries.
- Treg’s routed SERP endpoint cost 1.3 s at the median over calling DataForSEO directly, and 4 s at p95, for the same data at the same price. In this run every routed call was served by DataForSEO, so the route’s fallback was never exercised. The trade is one credential and automatic failover against that latency; if latency is the constraint, call the provider directly.
- Zero errors on 310 per-query calls. Every provider that was supposed to return data did. The only non-success is the rate-limited bulk call, which is a caller-side concurrency mistake, not a provider outage.
A worked monthly workload
An in-house growth agent that each month checks volume for 200 keywords, fetches 500 Google result pages, and pulls backlink summaries for 50 domains. List prices on the run date, no subscription discounts.
| Combination | Keywords (200) | SERPs (500) | Backlinks (50) | Monthly total | What you get |
|---|---|---|---|---|---|
| Cheapest stored data | Serpstat $0.10 | Serpstat $0.25 | Serpstat $0.13 | $0.48 | Stale SERPs, gaps on long tail, smallest backlink index |
| Cheapest live data | DataForSEO $0.09 (one call) | DataForSEO $1.00 | Serpstat $0.13 | $1.22 | Google’s own volumes, live pages, order-only backlinks |
| One credential (Treg routed) | via Treg $0.09 | Treg $1.00 | Treg (Serpstat) $0.13 | $1.22 | Same data as the row above in this run, plus failover, plus ~1.3 s per SERP |
| Larger backlink index | DataForSEO $0.09 | DataForSEO $1.00 | Moz $0.67 | $1.76 | As live data, backlink counts closer to the big indexes |
| Fastest live | Google Ads free | SerpApi $7.50 | SE Ranking $0.90 | $8.40 | 1.5 s SERPs; needs an Ads account for keywords |
Every route here is pay-per-call or prepaid: none of these combinations needs a monthly SEO subscription. The whole 314-call benchmark behind this page cost $1.99.
Who each route fits
- An agent that needs current Google pages and pays per call: DataForSEO direct, or Treg routed if you want one credential and can afford the added latency.
- A monitoring job on a fixed keyword list where staleness is acceptable: Serpstat, after checking your list is in its index.
- Latency-critical, cost-insensitive: SerpApi.
- Backlink order, not counts: any of the three; Serpstat is cheapest.
What this run cannot tell you
Latency was measured from one location on one afternoon with one worker per provider; providers’ throughput under parallel load, their rate limits at volume and their behaviour during an outage are untested. List prices change and volume tiers apply. A second dated run is scheduled and will be published beside this one.
Reproduce it
Cohort, runner and scorer on the dataset page; every raw response, with its latency and exit code in the header, is under evidence.
Spotted an error or a changed price? Email corrections@seodatabench.com with the page URL and a source. Corrections are logged on the corrections page.