← All posts
TelemAI Research

The Web-Search Latency Your Agent Actually Pays

We measured cold-start latency across 9 web-search APIs; the number your agent pays isn't the one benchmarks report.
measurement setup & methodology at the end
TL;DR
  • Cache: Every query cache we could observe expires within an hour, most within 15 minutes.
  • p50 vs p95: A provider that looks fast at the median can be slow at the tail. Serpapi's p95 is 13.6 s (3.5× its median) while ceramic's is 1.05× its median. When your agent fans out and waits for every result, the slowest response sets your latency.
  • Snippet generation: "Snippet" can secretly mean "run an LLM". Exa's LLM-written summary field costs 6.8 s and $0.017 per call versus 1.3 s and $0.007 for its extractive highlights, a 5× latency and 2.4× price cliff for text your downstream model would happily read raw.

Ask an agent a genuinely hard question then it doesn't run a search: it runs a deep search campaign. The question gets decomposed, sub-agents fan out, and every sub-task searches on its own. One deep research can run on our own infrastructure issued 148 web-search calls before writing a word of its answer. OpenAI tells Deep Research users up front that a single answer may take 5–30 minutes[1]; Anthropic's research agent parallelizes its sub-agents precisely because doing so cuts research time by up to 90%[2]. Search is the inner loop of all of it.

Web-search latency is also one of the worst-understood numbers: the latency a benchmark measures, and the latency an agent pays, are usually two different things. Here are two measurements of the same search API, same request shape, same region, hours apart:

105 ms
query seen 90s ago
or
3,937 ms
query never seen before

Both numbers are real. Both are median values over 150 requests, not cherry-picked outliers. The only difference between them is whether the provider had seen that query string in roughly the last half hour.

That's a 37× envelope for a single provider. As a result, published search-API latency numbers are so hard to reconcile with what you see in production. Almost every published comparison we could find reports a single latency figure without saying whether its queries were fresh. Within a 37× envelope, a number without that disclosure is not interpretable.

This post is about the right-hand number: As we'll show, if you're building agents, the cache essentially never helps you.

The cold price list

To compare nine providers fairly, we forced them onto one output contract (10 results, each with a text snippet). We then found the cheapest request that achieves it on each API, and issued 150 brand-new, never-before-seen queries[5] per provider, strictly serially, with per-phase timing (the numbers below are time-to-first-byte with connection setup subtracted; one network round-trip still rides inside TTFB, which is why providers closer together than the geography envelope are reported as ties rather than ranked). Same contract, all cold:

median TTFB (whiskers = bootstrap 95% CI) p95linear axis

Three things:

  • The spread is 12×: 320ms to 3.9s for the same deliverable. This is not a "premium vs budget" spread either; the fastest provider here is not the most expensive.
  • The tail is a second ranking hiding inside the first: serpapi's p95 is 13.6 seconds (3.5× its own median). ceramic's p95 is only 1.05× its median, which is slow but metronomic. If your agent fans out to several providers and waits for all of them, the tail is your latency. With a 9-way fan-out, the p50 you experience is the maximum of nine draws. We measured it at 4.3s, with p95 at 13.6s.
  • Some rankings are not decidable from one vantage point. We measured our network distance to each provider (a TLS 1.3 handshake costs one network round-trip[6]; spread 3.7–89ms). Pairs whose medians differ by less than that envelope, such as you.com vs brave (16ms apart), or ceramic vs tavily (73ms), are tied as far as a single measurement location can say, which is why we have not ranked them.

Q: Do these rankings survive real agent queries?

Our 150 test queries were synthetic[5]. The Information Retrieval literature is actually encouraging here: LLM-built test collections have been shown to reproduce system rankings faithfully[7] even though synthetic queries differ measurably from human ones in absolute terms[8]. We also replayed the 77 queries the real agent had generated (after a three-hour cool-down) through the same instrument, paired across all nine providers, with 693 calls and zero failures. We also included a batch of agent and synthetic queries fired within the same minutes, so time-of-day can't tip the scale. Rank agreement with the synthetic set: Kendall τ = 0.71[9] by our preregistered rule, 0.90 after also excluding the provider whose latency appears server-state-driven rather than query-driven. And side by side, the two kinds of query are simply indistinguishable:

synthetic queries real agent queriessame minutes, alternating

Every interval contains, or in brave's case grazes, 1.00. The widest belong to the two highest-variance providers (serpapi's point estimate of 0.79 comes with a 0.60–1.33 interval: noise, not a discount).

Your agent always pays the cold-start latency, and here are some more interesting findings:

Web-search caches are startlingly short-lived. We warmed each provider's cache with fresh queries, then revisited each query once after a controlled delay. We tested each delay with its own independent query set, because revisiting resets the clock. The full cycle, cold → warm → cold again:

cold (first-ever request / after expiry) warm revisit log y-axis · 6 independent queries per point

One caveat before the table: each point above plots the median of six revisits. That representation is fair for providers whose cache answers consistently, and misleading for one that doesn't, as tavily's row explains.

providercache lifetime (measured)
serpapi30–60 min
you.com≈ 30 min
exa5–15 min
brave5–15 min
tavilynot measurable from this chart, as its warm hits turned out to be intermittent (only 1–2 of 6 revisits fast, at every delay from 1 to 60 minutes), so a median-of-six always lands on the slow mode and the curve above shows "cold" even though some hits are warm. The mechanism appears different in kind, not in degree: measurements and our reading in the cache-anatomy section.

Every cache we could observe dies within an hour. Most die within 15 minutes.

Some of the providers include interesting Cache: We took 150 queries from MS MARCO[3], which consists of real Bing user queries that have been public, studied, and re-issued by researchers for years. These long-studied queries seemed to be the most likely to be pre-cached of any queries on the internet. First-touch cache hit rates:

serpapi: 0.0%. exa: 1.3%. you.com: 4.7%. Brave showed meaningful residual warmth (29%). It could be that some labs were experimenting or benchmarking MSMARCO there.

We can now see why the cold column represents something closer to a real-world operating point, rather than a pessimistic estimate. Caches forget within the hour, fame doesn't keep a query warm, and agents never ask the same thing twice. The price list above, not the number on any pricing page, is what your agent will actually feel.

What the wait buys you

Latency is only half the invoice. The same "10 results with snippets" contract delivers very different amounts of material. Fast is not automatically good value, and slow is not automatically bad:

response size per call (decoded) download time shown where it exceeds 1ms — transfer, not thinking

tavily's 1.2s buys ~8KB; seltz's 0.32s buys 56KB; brave's 0.64s buys 52KB. Per kilobyte of material, the spread across providers is wider than the latency spread itself. Three providers (linkup, parallel, tavily) also ignore Accept-Encoding: gzip entirely and ship uncompressed responses. The others compress 2.6–4.5×.

When "snippet" secretly means "run an LLM"

Exa is the only API where snippets are opt-in, and it offers several kinds. We observed significant variance across them:

extractive / retrieval-only generative (LLM in the request path)

Extractive highlights arrive in 1.3s at $0.007 per call, which is statistically indistinguishable from requesting no text at all. Asking for the LLM-written summary field costs 6.8s and $0.017: a 5× latency, 2.4× price cliff for running a language model inside your search call, which is material your downstream model would happily read raw. Check what your "snippet" actually is.

The cost–latency plane

Latency and price turn out to be independent axes, so here they are as one picture — every provider under the same contract, cold median TTFB against price per 1,000 calls. Five of the nine sell at the same $5/1k list price, and at that identical price they differ 7.5× in speed. The efficient frontier is two providers: ceramic (two orders of magnitude cheaper than the field, at mid-pack speed) and seltz (fastest, at the standard price) — everything else is dominated, and the most expensive API is also the slowest. The LLM-summary route from the chart above lands exactly where you would fear: the expensive-and-slow corner. How each price was established — published price pages, live reads of the vendors' billing APIs, or billing the API reports in-band — is itemized under the chart.

cold median TTFB · n=145–150/provider p95 whisker — length = tail ratio exa LLM-summary route efficient frontier plan-price range (serpapi: $6–25 by plan) log scale · 2× per gridline
Where the prices come from

Every price is normalized to per 1,000 calls under this post's 10-results contract, August 2026, no volume discounts. Behind that normalization sit three kinds of number: published price pages, live reads of the vendors' own billing APIs, and billing the API reports inside each response.

provider$/1khow we know
brave · you.com · seltz$5one shared published rate — all three list $5/1k pay-as-you-go. (you.com adds $1 per crawled page; this post's contract crawls none)
linkup$5published rate for standard-depth, results-shaped output — the shape this post uses; answer-shaped output is $6/1k and deep search $50–55/1k
parallel$5published rate for its advanced mode — the API's default, and what we measured; turbo mode is $1/1k, and excerpts past 10 results bill extra (not triggered at this post's 10)
ceramic$0.05published pay-as-you-go rate: $0.00005 per request — two orders of magnitude below the field
exa$7measured, not list: exa reports the cost of every call in the response itself — $0.007/call on the extractive route, $0.017/call ($17/1k) when the LLM-written summary is requested
tavily$8the pay-as-you-go rate we measured on ($0.008/credit, one credit per basic search); a $500/mo volume plan brings it to $5/1k
serpapi$15monthly plans only — serpapi sells no pay-as-you-go at any price. $15/1k on the $75/5,000 plan we held (verified against its live account API); the entry plan is $25/1k, and sub-$6/1k exists only from $1,475/mo up

Cache anatomy: it's not a yes/no question

"Does this API cache?" turns out to be four separate questions, and providers differ on every axis independently:

  1. Admission: how many hits before it stores? Five providers served a warm response from the second sighting onward. Four providers — ceramic, linkup, parallel, seltz — showed no cache benefit even after ten consecutive hits on the same query.
  2. Hit consistency: tavily admitted every test query by the second or third hit (like the others), but its warm hits were intermittent: after a single prior hit, only 1–2 of 6 revisits came back fast, at every delay we tested.
  3. Depth (how much faster is a hit?): From 2.4× (brave) to 37× (serpapi, whose cached responses arrive in ~12–105ms. The fastest search responses we measured all experiment long came from the slowest cold provider).
  4. Lifetime: 5–60 minutes, as above.

Below, we see the same experiment side by side. Six fresh queries per provider, each hammered ten times; first request vs the settled repeat requests:

first-ever request (cold) same query, 6th–10th request
provideradmits?hits to admithit speed-uplifetimewhat we measured / how we read it
our interpretation — hypothesis, not established mechanism

tavily, the raw pattern:

admission (10-hit curve)warm depthfast revisits after a single warming hit
6/6 queries warm by hit 2–3 — same as the other caching providers ~10× 2/6 · 1/6 · 1/6 · 2/6 · 2/6 at delays of 1 / 5 / 15 / 30 / 60 min — flat in time, fractional in rate

A time-based cache can't produce that shape; a probabilistic one can (sampled admission, or a sharded store where only some replicas hold the entry). That's the reading most consistent with our data, and not a claim about tavily's implementation. Same posture for ceramic: its fast responses clustered in shared time windows across different queries (one 35-second window covered 5 of 6), which we read as a fast spell of the service, not a per-query cache. Both readings are falsifiable. We'd welcome corrections from either team.

One trap we fell into ourselves: small samples on bimodal distributions invent patterns. Early 4-query probes convinced us tavily's cache "takes 60 seconds to write" and brave's "decays in 3 minutes." However, both artifacts dissolved once 48- and 150-query samples arrived.

Concurrency: the second thing agents do that benchmarks don't

For an agent, concurrency is latency: a deep-research step fires its sub-queries at once and waits for the slowest, times however many rounds it runs (our harvested runs sent 2–4 per tool call). A provider that rejects concurrent requests stretches every loop. So — how many simultaneous requests does each one admit before it starts saying no?

And does the ceiling we measured match what each provider documents? Where a number is published and a burst can reach it, it holds almost exactly:

providerdocumented / self-reported limitvs. our measured ceiling
exa10 req/s — docs & the 429 body✅ exactly 10
linkup10 queries/s per org — docs✅ exactly 10
brave50 req/s — docs & x-ratelimit-policy: 50;w=1✅ ~50
ceramic20 QPS — docs✅ ~20
seltzx-ratelimit-limit: 50 header (no docs number)◽ cleared 64 (header's 50 isn't a hard gate; higher untested)
you.comnothing stated anywhere◽ cleared 64, no rejection
tavily · parallel · serpapiper-minute / hourly budgets, not a burst cap✅ no concurrency cap — all cleared 64

Per-minute and hourly limits can't be reached by a burst — those rows are marked consistent, not pinned. "cleared N" means every one of N concurrent requests succeeded — the highest burst we fired, not a wall; the true ceiling is at least that high.

Where it's allowed, concurrency is nearly free

The second half of the story is what parallelism does to the latency of the requests that succeed. Answer: for most providers, almost nothing:

median TTFB at highest passing level ÷ at C=1 ±30% band: within noise of the n=3 baseline

Six of nine providers sit inside the noise band. Sixteen parallel searches cost roughly the same per-request latency as one. exa (~1.4×) and parallel (~1.5×) show consistent mild elevation. serpapi's ratio is not interpretable either way (its cold-latency variance dwarfs the per-level samples). For an agent, this is the practically important half: where the gate allows it, fanning out is free speed.

The agent scorecard

No composite score here, as these axes don't collapse into one number honestly. Pick the column your workload cares about:

providercold p50p95cacheconcurrency
ceiling
rejection
signal
KB / callyou control
result count?
quota
visible?

A few readings of this table:

  • Building a latency-critical agent with fan-out?: The predictable providers (low tail ratio, no cache surprises) beat the nominally fast ones. seltz is both fastest and most deterministic (no observed cache — every request costs the same ~320ms).
  • Re-running the same queries all day: (monitoring, dashboards)? serpapi's 37× cache depth turns it from the slowest into by far the fastest, but only if your repeat interval beats its 30–60 min lifetime.
  • Fan-out breadth matters more than single-call speed?: Watch the concurrency ceiling and rejection-signal columns, not the latency column.

Method: how hard we tried not to fool ourselves

1 · One contract, one clock. Every number in this post comes from the same instrument: the cheapest request achieving "10 results + snippets" on each API, issued strictly serially, one fresh connection per request, timed in four phases so that network effects never contaminate provider time. Three properties we verified rather than assumed, and then we applied the same decomposition to all nine providers:

a · the clock decomposes exactly

Every request is timed as DNS+TCP → TLS → TTFB → download. The four phases sum to the wall-clock total with a maximum residual of 0.001ms across 5,213 requests, with nothing double-counted or lost. We report TTFB: the handshakes are subtracted from every figure. The request's own round-trip is not — it arrives inside TTFB and cannot be separated from server time by this instrument, which is what the tie band below is for.

b · our own hardware is not in the measurement

Same probe on 0.5 vs 2 vCPU: TLS handshake medians moved ≤1ms for 8 of 9 providers (brave's +10ms sits inside its own 111–138ms run-to-run spread). A 4× CPU change that changes nothing means the measuring box isn't the bottleneck.

c · geography is measured, then excluded

A TLS 1.3 handshake costs one network round-trip[6], giving us each provider's real network distance (3.7–89ms from our vantage). Subtracting the handshakes removes setup, not distance: one round-trip is still inside every TTFB we report. So we use the 85ms spread as a tie band instead: providers whose medians differ by less than the geography envelope are reported as ties, not ranked.

d · all nine, all four phases

The same decomposition applied to every provider, at median. Setup (DNS+TCP + TLS) is never more than 9% of the wall clock and usually under 2%, even for linkup, the most distant endpoint at 177ms of pure handshake. Download is similarly small: the largest, linkup's 81ms, is 4% of its total. What we rank on (TTFB, the grey segment) is 91–99.7% of every bar. The provider's own thinking time is the measurement; nothing here is an artifact of where we measured from or how much JSON came back.

2 · Fresh queries, provably. Queries came from a deterministic generator + seed[5] (compositional strings that have never existed) cross-checked against a ledger of every query ever consumed in the study (936 entries). A parallel set of real user queries (MS MARCO[3]) ran alongside it. Every query hit a given provider at most once, ever, except where measuring repetition was the experiment.

3 · Validated on real agent traffic. Ten research tasks run twice through a real agent harness produced 77 queries; replaying them cold reproduced the synthetic ranking (τ = 0.71–0.90) and turned the "agents never repeat" assumption into a measurement (0/77).

What we can and can't promise. The discipline above proved that early small-sample probes suggesting a tidy conclusion simply dissolved when we re-measured at 48 and 150 queries (the cache section keeps one example). Nothing reached this page without surviving that treatment. Disclaimer: This report was run using nine providers, using one vantage point, over one week of measurement, and may still have blind spots. If your numbers disagree with ours, please let us know.

References

  1. OpenAI — “Introducing deep research”, Feb 2, 2025. openai.com/index/introducing-deep-research. Source of “may take anywhere from 5 to 30 minutes”.
  2. Anthropic Engineering — “How we built our multi-agent research system”, Jun 2025. anthropic.com/engineering/multi-agent-research-system. Source of “parallel tool calls cut research time by up to 90% for complex queries”.
  3. Bajaj et al. — “MS MARCO: A Human Generated MAchine Reading COmprehension Dataset”, 2016. microsoft.github.io/msmarco · arXiv:1611.09268. We froze a uniform 300-query sample from queries.dev.tsv of the passage-ranking distribution (screening rules, sampling seed, and set hash published with our data; the main measurement used 150 of them).
  4. opencode — open-source terminal coding agent (SST / Anomaly). opencode.ai · github.com/sst/opencode. v1.18.14, used unmodified as the real-agent harness; its web-search tool calls our own search backend.
  5. TelemAI Research — S03 query generator, frozen query sets, and measurement data release. Deterministic template-×-entity-pool generator: five query shapes (fact lookup / definition / research question / troubleshooting / comparison, stratified 20–25% each) across nine subject domains; ~2,600 possible combinations. Seed 20260802; frozen-set SHA-256 — synthetic (n=800): 396a4624…e335fa1, MS MARCO sample (n=300): 0ba300b7…078765b. Release repository: github.com/TelemAI/web-search-latency-study — measurement data, generator, frozen sets, and a script that recomputes every number in this post.
  6. IETF — RFC 8446, “The Transport Layer Security (TLS) Protocol Version 1.3”, Aug 2018. datatracker.ietf.org/doc/html/rfc8446. Basis for treating one TLS 1.3 handshake as ≈ one network round-trip; all nine providers negotiated TLS 1.3 in our measurements.
  7. Rahmani, Craswell, Yilmaz, Mitra & Campos — “Synthetic Test Collections for Retrieval Evaluation”, SIGIR ’24. doi:10.1145/3626772.3657942 · arXiv:2405.07767. Evidence that fully synthetic test collections can reproduce the system rankings obtained from human-built collections.
  8. Rahmani, Ramineni, Yilmaz, Craswell & Mitra — “Towards Understanding Bias in Synthetic Data for Evaluation”, CIKM ’25. doi:10.1145/3746252.3760908 · arXiv:2506.10301. Evidence that LLM-generated queries differ systematically from real user queries (length, vocabulary) — i.e., absolute numbers shift even when rankings hold.
  9. Kendall, M. G. — “A New Measure of Rank Correlation”, Biometrika 30(1–2), 1938. doi:10.1093/biomet/30.1-2.81 · en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient. Kendall's τ measures rank agreement between two orderings: τ = 1 means identical rankings, 0 no association, −1 fully reversed.
Measured August 2026, from a single vantage point (AWS us-east-1).
Providers: brave, ceramic, exa, linkup, parallel, seltz, serpapi, tavily, you.com. Not measured: result quality/relevance (a different ground-truth problem, a different study).
TelemAI Research.