micr.dev
Published on

I tested the best agentic web search tools in the market

Introduction

I have been using custom web search tools since around March, when I wired up Kagi to my Related to software agents that carry out tasks. setup. It's been super neat. But Kagi is human-first, not Designed for software agents to use directly, without a person operating the interface., which led me to think: am I using the best tool available for this? Would switching to a specialized web search tool be a substantial upgrade?

After I saw this tweet from Exa in my feed, it only reinforced this thought. So, as with any thought that stays in the back of my mind for a while, I decided to see what I could do to satisfy my curiosity. Consequently, I made websearch-bench in order to objectively test all of the most famous tools and see which one was the best and why. In this blog I will talk about how it works and the results that I obtained after testing eight of the most popular choices for agentic web search: Brave, Context, Exa, Kagi, Octen, Parallel, Perplexity, and Tavily.

Baselines

All providers were tested through their respective APIs from 05/08/2026 to 08/08/2026. I originally only tested four of these and slowly incorporated more.

Furthermore, all prices were taken and all tests were run with the most basic and plain Web Search option that each provider has, in order to make it as fair and equal as possible. For example, if a provider has Web Search Basic, Web Search Fast, Web Search Deep, and Web Search Extra, Web Search Basic will be the one used.

All calls requested 10 results, no more, no less. Some other stuff was collected as well, like latency and costs. All of the data that will be shown is public.

Tasks

What is the easiest way to test if a model is good at querying? You guessed it: doing queries. Multiple of them.

Show the full benchmark query set

1. Known Item (KI): Finding a specific canonical document

IDExact Query TextSuccess Criteria
KI01official RFC for HTTP semantics published as 9110Finds the canonical RFC 9110 on rfc-editor.org.
KI02Python proposal to make the global interpreter lock optional PEPFinds PEP 703 on the official Python PEP site.
KI03Rich Sutton essay arguing general methods that scale with computation beat hand-built knowledgeFinds Rich Sutton's essay The Bitter Lesson on incompleteideas.net.
KI04SQLite documentation explaining isolation between separate database connectionsFinds SQLite's canonical isolation documentation on sqlite.org.
KI05W3C Web Content Accessibility Guidelines 2.2 recommendationFinds the W3C Recommendation for WCAG 2.2 on w3.org.
KI06BurntSushi ripgrep source repositoryFinds the canonical ripgrep GitHub repository owned by BurntSushi.
KI07Google site reliability engineering book chapter about handling overloadFinds the Handling Overload chapter of Google's SRE book on sre.google.
KI08NIST AI Risk Management Framework 1.0 PDFFinds the official NIST AI RMF 1.0 publication or canonical PDF.

2. Primary Source (PS): Official government & institutional documents

IDExact Query TextSuccess Criteria
PS01European Union AI Act Regulation 2024/1689 official journal full textReturns official EU legal text for Regulation (EU) 2024/1689 on eur-lex.europa.eu.
PS02CISA known exploited vulnerabilities catalog officialReturns CISA's official Known Exploited Vulnerabilities Catalog.
PS03FDA cybersecurity in medical devices final guidance 2023Returns the official FDA final guidance document issued in 2023.
PS04WHO guideline on non-sugar sweeteners 2023Returns the official WHO guideline publication page on who.int.
PS05SEC NVIDIA 2025 annual report 10-KReturns NVIDIA's official SEC 10-K filing for fiscal year 2025.
PS06Federal Reserve March 2024 FOMC meeting minutesReturns official Federal Reserve minutes for the March 2024 FOMC meeting.
PS07NASA Artemis II mission official overviewReturns NASA's official Artemis II mission page.
PS08EDPB Opinion 08/2024 consent or pay large online platformsReturns European Data Protection Board's official Opinion 08/2024.

3. Technical Exact (TE): Exact error messages & troubleshooting

IDExact Query TextSuccess Criteria
TE01Python "TypeError: unhashable type: 'dict'"Finds pages that accurately explain and resolve this exact Python error.
TE02PostgreSQL SQLSTATE 40001 serialization_failureFinds authoritative documentation/troubleshooting for PostgreSQL serialization failures.
TE03Rust E0502 cannot borrow as mutable because it is also borrowed as immutableFinds the official Rust error explanation (E0502) or an accurate equivalent.
TE04OpenSSL error:0A00010B SSL routines wrong version numberFinds technically accurate explanations and fixes for this exact OpenSSL error.
TE05Kubernetes ImagePullBackOff ErrImagePull differenceAccurately distinguishes between the two K8s states and gives diagnostic steps.
TE06React "Hydration failed because the initial UI does not match what was rendered on the server"Finds directly relevant React or Next.js hydration mismatch troubleshooting.
TE07Python asyncio "Task exception was never retrieved"Finds directly relevant explanations and corrective patterns for this asyncio warning.
TE08Git "fatal: refusing to merge unrelated histories"Finds accurate troubleshooting for this exact Git merge error.

4. Semantic Long-Tail (SM): Concept descriptions without technical names

IDExact Query TextSuccess Criteria
SM01browser API that reports when an element enters or leaves the viewportIdentifies and substantively explains Intersection Observer API.
SM02Linux mechanism for receiving filesystem change notifications without pollingIdentifies and explains inotify.
SM03PostgreSQL command that runs a query and reports the actual execution plan and timingIdentifies and explains EXPLAIN ANALYZE.
SM04HTTP feature for resuming a download from a specific byte offsetIdentifies and explains HTTP Range requests (Range / Content-Range).
SM05CSS grid pattern that automatically fits as many equal-width cards as possible without media queriesIdentifies repeat(auto-fit, minmax(...)).
SM06safe file update technique that writes a temporary file and renames it over the originalIdentifies atomic file replacement (write-fsync-rename).
SM07retry strategy that adds randomness to exponential delays to prevent synchronized clientsIdentifies exponential backoff with jitter.
SM08browser security policy that limits which origins may load scripts images and framesIdentifies Content Security Policy (CSP).

5. Niche / Small Web (NW): Personal blogs & specialist write-ups

IDExact Query TextSuccess Criteria
NW01personal blog measuring keyboard input latency across computers and keyboardsFinds Dan Luu's independent keyboard latency measurements (danluu.com).
NW02reverse engineering the Intel 8087 floating point chip from microscope die photographsFinds Ken Shirriff's detailed chip die reverse engineering write-ups (righto.com).
NW03blog post implementing an arena allocator in C with alignment and out-of-memory handlingFinds Skeeto's detailed C arena allocator tutorial (nullprogram.com).
NW04write-up building a tiny debugger with ptrace in CFinds detailed independent tutorials/projects using Linux ptrace.
NW05detailed amateur radio guide decoding NOAA APT weather satellite images with a cheap SDRFinds first-hand amateur radio decoding setup guides with hardware/software steps.
NW06personal project restoring a Sun SPARCstation IPX power supply and NVRAMFinds detailed hardware restoration write-ups covering both PSU and NVRAM.
NW07graphics programming blog explaining image downsampling aliasing and the limits of bilinear filteringFinds deep graphics/signal-processing articles (e.g. Bart Wronski).
NW08homebrew 6502 computer build log memory map and address decodingFinds personal build logs detailing 6502 memory mapping and address decoder designs.

6. Multi-Constraint (MC): Queries with 4+ strict required criteria

IDExact Query TextSuccess Criteria
MC01open source vector database written in Rust Apache 2.0 HNSWFinds projects matching all 4 constraints (e.g., Qdrant).
MC02self-hosted web analytics AGPL cookieless PostgreSQLFinds products matching all 4 constraints (e.g., Plausible Analytics).
MC03embedded columnar OLAP database SQL reads Parquet without a serverFinds databases matching all constraints (e.g., DuckDB).
MC04static site generator written in Go multilingual taxonomies Apache 2.0Finds static site generators matching all constraints (e.g., Hugo).
MC05open source Kubernetes-native workflow engine written in Go supports DAGs and a web UIFinds workflow engines matching all constraints (e.g., Argo Workflows).
MC06Python ASGI framework dependency injection OpenAPI type hintsFinds Python frameworks matching all constraints (e.g., FastAPI).
MC07open source feature flag service written in Go self-hosted PostgreSQLFinds feature flag platforms matching all constraints (e.g., Flipt).
MC08low-profile split wireless mechanical keyboard open source ZMK firmwareFinds keyboard projects/guides matching all constraints.

7. Exploratory Diversity (EX): Multi-subtopic coverage

IDExact Query TextSubtopics It Tests For
EX01approaches to zero-downtime PostgreSQL schema migrationsCovers expand-contract, online index creation, backfill, dual-write, and lock avoidance.
EX02ways to model hierarchical data in SQLCovers adjacency lists, nested sets, materialized paths, closure tables, and recursive CTEs.
EX03distributed API rate limiting algorithmsCovers fixed window, sliding window, token bucket, leaky bucket, and distributed counters.
EX04strategies for handling out-of-order events in stream processingCovers event time, watermarks, buffering, retractions/corrections, and idempotency.
EX05monorepo versus polyrepo tradeoffsCovers dependency management, CI performance, ownership, access control, and tooling.
EX06offline-first web app synchronization approachesCovers CRDTs, operational transformation, local-first architecture, and service worker sync.
EX07database change data capture approachesCovers transaction log tailing, triggers, timestamp polling, snapshots, and Debezium.
EX08methods for preventing cache stampedeCovers locking, request coalescing, stale-while-revalidate, early expiration, and jitter.

8. Multilingual / Regional (ML): Non-English official information

IDExact Query TextLanguageSuccess Criteria
ML01cómo solicitar el certificado digital de persona física FNMTSpanishOfficial Spanish FNMT digital certificate procedure.
ML02factura electrónica obligatoria empresas ley crea y crece requisitos oficialesSpanishOfficial Spanish e-invoicing requirements under the Crea y Crece law.
ML03rupture conventionnelle délai de rétractation site officielFrenchOfficial French mutual termination agreement withdrawal period.
ML04Bundesurlaubsgesetz Mindesturlaub Vollzeit offizielle FassungGermanOfficial German Federal Leave Act text on statutory minimum leave.
ML05Portal das Finanças pedir certidão de dívida e não dívidaPortugueseOfficial Portuguese tax portal procedure for tax clearance certificates.
ML06マイナンバーカード 電子証明書 有効期限 公式JapaneseOfficial Japanese source for My Number Card electronic certificate validity period.
ML07Rijksoverheid vakantiegeld wanneer uitbetalenDutchOfficial Dutch government explanation of holiday allowance payout timing.
ML08com donar-se d'alta a l'idCAT Mòbil requisits oficialsCatalanOfficial Catalan registration requirements for idCAT Mòbil.

9. Robustness / Noisy (RB) & Reference Queries: Typos & colloquial noise

Measures quality degradation by comparing noisy queries against their clean reference counterparts:

IDNoisy QueryClean Reference QueryDegradation
RB01pyhton dataclass frozen hash not work mutable fieldPython frozen dataclass hash mutable fieldMisspellings ("pyhton") & missing grammar.
RB02ngnix 502 bad gateway upstream prematurely closed connectionnginx 502 Bad Gateway upstream prematurely closed connectionMisspelled technology name ("ngnix").
RB03kuberentes pod stuck terminatting finalizer remove safelyKubernetes pod stuck terminating safely remove finalizerMultiple misspellings ("kuberentes", "terminatting").
RB04postgres index for json not full text exact key valuePostgreSQL index JSONB exact key value queriesInformal phrasing & explicit negative constraint ("not full text").
RB05css cards same hight grid without javascriptCSS Grid equal-height cards without JavaScriptCommon typos ("hight").
RB06git undo last commit keep changes dont delete filesGit undo last commit keep changesVerbose, conversational search phrasing.
RB07whats the thing in http where browser asks server if cached file changed etag 304HTTP conditional request ETag 304 Not ModifiedConversational "what's the thing" queries.
RB08rust cant move out borrowed content option takeRust cannot move out of borrowed content Option::takeShorthand syntax without punctuation.

10. Freshness / Rolling (FR): Time-sensitive official releases

IDExact Query TextSuccess Criteria
FR01latest stable Rust release notes officialSurfaces the newest stable Rust release notes (blog.rust-lang.org).
FR02latest Python security release official announcementSurfaces the newest official Python security release announcement.
FR03latest Kubernetes release notes officialSurfaces the newest official stable K8s release notes.
FR04latest Mozilla Firefox release notes officialSurfaces the newest official Firefox release notes.
FR05latest PostgreSQL minor release announcement officialSurfaces the newest official PostgreSQL minor release announcement.
FR06latest CISA known exploited vulnerabilities additions officialSurfaces the newest official CISA KEV update notice.
FR07latest European Commission Digital Markets Act decision officialSurfaces the newest official EC decision or action under the DMA.
FR08latest GitHub Actions runner releaseSurfaces the newest release from github.com/actions/runner.

Results

Cost

Cost for 96 benchmark queriesVertical columns compare the estimated cost for 96 searches. Lower is cheaper.Cost for 96 benchmark queriesSelected comparison basis from the benchmark billing estimates.$0.000$0.250$0.500$0.750$1.000$1.250Estimated cost / 96 searches$0.480Brave$0.144Context$0.672Exa$1.152Kagi$0.096Octen$0.485Parallel$0.485Perplexity$0.768TavilyLower is cheaper

Let's be honest here: price is one of, if not the most important factor for any service, especially those that offer pay-per-usage. You probably wouldn't pay a $100 monthly sub solely for an agentic web search service.

The prices shown are calculated by taking each provider's pricing per search at the time of testing and just multiplying it by 96. Pretty simple, though we can already see some interesting data: Octen is the cheapest alongside Context, while Kagi takes the top spot, being ~12x more expensive. All of the other providers sit roughly the same, between 40 and 70 cents.

By this logic, Kagi should give the best results and Octen the worst, right? Let's look deeper into it.

Response latency

Response latencyPaired columns compare each provider's median and p95 latency. Shorter is faster.Response latencyMedian and p95 latency across the 96 requests for each provider.p50p9501s2s3s4sResponse latency427820Brave24003854Context11021792Exa12721640Kagi359941Octen9741755Parallel8151224Perplexity12962564TavilyShorter is faster
Latency distributionThe empirical cumulative distribution shows the fraction of successful requests completed by each latency.Latency distributionECDF of successful requests on a log-scaled latency axis. Earlier rises are faster.0%25%50%75%100%100ms300ms500ms1s2s4s7sBraveContextExaKagiOctenParallelPerplexityTavily

The latency distribution is an Empirical Cumulative Distribution Function. A function that shows the share of measurements at or below each value..

Seemingly unimportant at first glance, but bear with me. Let's take the difference between Context and Brave's median latency (The median value in a set of measurements.) as a reference: 1,973 ms. 1.97 seconds. As per my personal usage, let's say the average power user does 3,500 monthly queries:

If User A uses Context and User B uses Brave, User A would spend 115.09 minutes just waiting. Every month. 23.02 hours every year. Almost a full day just waiting.

It doesn't seem like much, because let's be real: in the grand scheme of things it's not. But would you like to spend 23.02 hours a year just staring at a wall?

Depth

Result depthVertical columns compare the mean number of returned result slots out of ten.Result depth10.00Brave9.22Context9.99Exa10.00Kagi10.00Octen9.99Parallel9.99Perplexity9.54Tavily
Short-list rateVertical columns compare the share of requests that returned fewer than ten results.Short-list rate0.0%Brave64.6%Context1.0%Exa0.0%Kagi0.0%Octen1.0%Parallel1.0%Perplexity31.3%Tavily

More results don't necessarily mean more value, but they mean you're letting the web search tool filter what it thinks might be important, instead of your A leading AI model with high capabilities..

As seen, Context is the primary offender, followed by Tavily. Respectively, on 64.6% and 31.2% of the 96 queries, they returned less than the 10 results the benchmark asked for. This seems more severe than it actually is, though, since they both have over 9 mean results per request, meaning they returned at least 9 results on each query.

Quality

Metadata-heuristic nDCG@10 by categoryMetadata-heuristic quality heatmap with one row per provider and one column per benchmark category.Metadata-heuristic nDCG@10 by categoryEach cell is the mean nDCG@10 across eight queries in that category.Known itemPrimary sourceTechnical exactSemantic long tailNiche small webMulti-constraintExploratory diversityMultilingual regionalRobustness noisyFreshness rollingBrave0.750.620.710.600.600.650.560.530.620.94Context0.710.620.610.430.480.620.590.510.460.67Exa0.780.740.500.370.400.320.510.530.300.79Kagi0.770.570.680.580.540.710.650.460.550.84Octen0.630.570.420.360.370.510.570.390.380.75Parallel0.630.540.740.710.640.700.710.580.590.90Perplexity0.740.610.550.480.550.570.540.470.400.87Tavily0.590.570.650.450.550.640.620.500.480.53Cell color encodes mean nDCG@10; higher is better

Normalized Discounted Cumulative Gain at rank 10. A score from 0 to 1 for ranking quality. It gives more weight to relevant results near the top and compares the ranking with the best possible order. measures how well each provider orders its top 10 results. I do this by judging whether the perfect answer is present and where it appears, or whether a result contains the required target keywords.

The system grades each of the top 10 links and adds all the points together into one total score, and it then divides the total score by the highest possible score. This turns the final score into a simple number between 0.0 (no useful links were found in the top 10) and 1.0 (a perfect search result list, with the best links at the top).

Parallel, Brave, and Kagi perform the best across the categories, being the only ones above an average nDCG@10 of 0.6. They are followed by Perplexity, Context, Tavily, and Exa, where they rank with an average ~0.55; though Octen falls short of the 0.5 barrier by scoring 0.495.

But this is 2026. We have AI agents now, right? Let's use them.

AI-judged nDCG@10 by categoryAI-judged quality heatmap with one row per provider and one column per benchmark category.AI-judged nDCG@10 by categoryEach cell is the mean nDCG@10 across eight queries in that category.Known itemPrimary sourceTechnical exactSemantic long tailNiche small webMulti-constraintExploratory diversityMultilingual regionalRobustness noisyFreshness rollingBrave0.680.600.970.810.750.680.830.790.860.66Context0.580.480.910.700.540.600.680.790.750.50Exa0.720.790.840.850.660.410.600.780.830.76Kagi0.630.510.970.800.610.700.760.780.800.58Octen0.500.460.800.730.480.510.820.770.690.47Parallel0.680.580.950.830.690.650.870.780.840.53Perplexity0.680.700.940.860.790.670.810.780.820.69Tavily0.490.430.820.740.650.590.750.640.710.50Cell color encodes mean nDCG@10; higher is better

This follows the same logic, but instead of being graded by a Producing the same output for the same input. system, it was graded by a blind AI judge. This judge reads the search question and the title and summary text of each result link. It does not know which search engine provided the link, so it doesn't have any biases. A page about "Urlaubstage" (German for vacation days) might get grade 0 from the A rule-based method that uses selected signals to make an estimate. if the query uses different words, but grade 1 from the AI because it knows they mean the same thing.

The results were judged by GPT 5.6 Luna Max, in the Codex harness, with the following prompt:

"Judge each result independently for the supplied query. Use only the query and result card. Do not search the web. Do not infer the provider or rank. Grade 3 = directly satisfies the query; 2 = relevant and useful; 1 = partial or weak match; 0 = irrelevant, wrong intent, spam, misleading, or clearly broken. Return one JSON object per result with result_id, grade, and a short reason."

For the evaluation I used a scale from 0-3 in order to be able to get a more gray and detailed answer. This is not exclusive to the AI judging; the heuristic scoring did this too. Each grade is converted to a "gain" via 2^grade - 1 (so 0 -> 0, 1 -> 1, 2 -> 3, 3 -> 7), then each gain is divided by a positional discount that shrinks the further down the list the result sits, and all ten discounted gains are summed into a single number called Discounted Cumulative Gain. A ranking score that gives more weight to useful results near the top.. That number on its own is meaningless, so it gets divided by the The highest possible DCG for a query, used to scale ranking scores., the DCG you would get if you took every result any provider found for that query and arranged them in the best possible order.

Each search result gets a score from 0 to 3, so the evaluation isn't black or white, since there are grays. Both the AI judge and the heuristic scorer use this scale. The score is changed into points using 2^grade - 1, so grades 0, 1, 2, and 3 become 0, 1, 3, and 7 points. Results near the top of the list count more than results near the bottom, so the points for all ten results are reduced by a A reduction applied to results farther down a ranked list. and then added together to make DCG.

DCG is not useful by itself because queries with more good results naturally get higher scores, so it is compared with the ideal DCG, the score produced by taking every result found by every provider and putting the best results first. The provider's DCG is divided by this ideal DCG to show how close its list is to the best possible list.

AI judge minus heuristic nDCG@10 by categoryAI judge minus heuristic quality heatmap with one row per provider and one column per benchmark category.AI judge minus heuristic nDCG@10 by categoryPositive values mean the blind AI judge scored higher than the metadata heuristic.Known itemPrimary sourceTechnical exactSemantic long tailNiche small webMulti-constraintExploratory diversityMultilingual regionalRobustness noisyFreshness rollingBrave-0.07-0.01+0.26+0.21+0.14+0.03+0.27+0.25+0.24-0.28Context-0.12-0.14+0.30+0.26+0.07-0.02+0.09+0.28+0.28-0.17Exa-0.06+0.05+0.34+0.48+0.26+0.10+0.09+0.25+0.53-0.03Kagi-0.14-0.06+0.29+0.23+0.07-0.01+0.11+0.32+0.24-0.26Octen-0.13-0.11+0.38+0.37+0.11-0.00+0.25+0.38+0.30-0.28Parallel+0.05+0.04+0.20+0.12+0.05-0.05+0.16+0.20+0.25-0.37Perplexity-0.06+0.09+0.39+0.38+0.25+0.10+0.27+0.32+0.42-0.17Tavily-0.10-0.15+0.17+0.29+0.10-0.04+0.13+0.14+0.24-0.04Difference in nDCG@10; zero is neutral

Positive means the AI score was higher, negative means the metadata score was higher.

So why is there such a big difference? Simply because the deterministic way might miss some stuff, just as I said earlier. It cannot reason and it cannot understand intent. This doesn't mean the AI judging is flawless either. Because Large language models. Systems trained to generate and analyze text. are not deterministic, they can produce different results even if the exact same input is going in and the same exact model is being used. But I think it's good enough for this benchmark.

Cost vs. quality

Metadata-heuristic nDCG@10 versus costMetadata-heuristic nDCG@10 plotted against estimated cost for 96 searches. Higher quality and lower cost are preferable.Metadata-heuristic nDCG@10 versus costOne point per provider. Cost is the selected estimate for 96 searches.illustrative target region0.000.250.500.751.00$0.000$0.250$0.500$0.750$1.000$1.250BraveContextExaKagiOctenParallelPerplexityTavilyLower cost is left. Higher quality is up.
AI-judged nDCG@10 versus costAI-judged nDCG@10 plotted against estimated cost for 96 searches. Higher quality and lower cost are preferable.AI-judged nDCG@10 versus costOne point per provider. Cost is the selected estimate for 96 searches.illustrative target region0.000.250.500.751.00$0.000$0.250$0.500$0.750$1.000$1.250BraveContextExaKagiOctenParallelPerplexityTavilyLower cost is left. Higher quality is up.

All of this data is cool, but you probably just want an answer on which one to use. I wish I had a concrete answer, but I'm going to have to go with the good ol' it depends. Objectively, Perplexity seems to be the best one as per the AI judgment, being replaced by Parallel on the heuristic one. Brave doesn't quite manage to get the top spot on either, but it's up there in a solid second place, so perhaps by the average position Brave would be the best one. I don't know. Anyhow, these three share the main spot.

On the other hand, top quality isn't necessarily always the best for everyone. Perhaps you just need something affordable, in which case Octen and Context seem preferable, with the latter being the only one crossing the illustrative target region barrier.

Much to my surprise, Exa and Kagi don't take any of the top spots, neither in quality nor affordability; I expected both of them to be on the podium. We don't talk about Tavily.

But despite all of this, this still doesn't give us an objective best provider. Not Perplexity, not Brave, not Parallel. So, how can you choose which one to go for, with so many options on the table?

Conclusion

Interactive 3D comparison of AI-judged quality, p95 latency, and costEach colored point is a search provider. Height shows mean AI-judged nDCG at 10, the horizontal axes show p95 latency and cost per 1,000 requests on logarithmic scales. Drag to rotate. Hover or select a point for exact values.ContextParallelPerplexityExaBraveOctenKagiTavily

Each provider has its pros and cons, and not only that, but most if not all of these have more features available than their simplest Web Search tool used for this benchmark. Some have deep research, if you have patience and want the best results. Some have fast mode, if you're in a hurry and value speed. Some have extraction capabilities and better Methods that help software access websites that block automated requests., so you can actually read the content of your results.

I did not test any of these features, and they are unique to each provider, so I would say: test yourself. Yes, that's the conclusion of a blog full of tests. You should look into each and see which one works best for your workflow, since I can't tell you which one would.

Provider results

Providerp50p95Mean resultsShort listsCost / 96Metadata-heuristic nDCG@10
Brave427 ms820 ms10.000 / 96 (0%)$0.4800.659
Context2,400 ms3,854 ms9.2262 / 96 (64.6%)$0.1440.569
Exa1,102 ms1,792 ms9.991 / 96 (1.0%)$0.6720.523
Kagi1,272 ms1,640 ms10.000 / 96 (0%)$1.1520.634
Octen359 ms941 ms10.000 / 96 (0%)$0.0960.496
Parallel974 ms1,755 ms9.991 / 96 (1.0%)$0.4850.675
Perplexity815 ms1,224 ms9.991 / 96 (1.0%)$0.4850.577
Tavily1,296 ms2,564 ms9.5430 / 96 (31.3%)$0.7680.557

I would also like to note that none of the providers paid for any of the results shown in this benchmark. All of these, except Kagi, were either covered by free credits or paid for out of my own pocket. Two of these companies (Exa and Octen), in fact, have made and published their own benchmarks: Exa's benchmark was really expensive to run, so I decided to pass on it, but Octen's...

Wait, There's More?

I know, I know... A conclusion is supposed to be where a blog finishes. But pacing and structuring are hard, okay? I'd be surprised if anyone has read this far and hasn't just scrolled to the conclusion to see the results (guilty).

Getting back to the topic, I decided to run Octen's own benchmark with the spare free credits that I had left, since I had everything set up and it wouldn't be much work.

Overall retrieval successDumbbell rows compare each provider's gold URL hit rate at rank 1 and rank 10.Overall retrieval successGold URL hit rate at rank 1 and anywhere in the first 10 results.0%20%40%60%80%100%hit@1hit@10OctenTavilyKagiBraveParallelContextExaPerplexityGold URL matching on the Octen anchor set

First off, that's funny: Octen scoring the least on their own benchmark. At least we know they don't Improving a benchmark score without improving general performance..

The rest of the providers score roughly the same, with one major exception: Context. Somehow, they managed to score third place? Let's look slightly deeper into it.

It works similarly to my own benchmark, which I'm happy about since it means I didn't just make some BS. I discovered the Exa and Octen benchmarks afterwards. They use an A fixed set of queries with known correct pages used to test retrieval. with a The URL expected to be the correct answer for a query. for each query, which is the expected correct page.

A measure of whether the correct page appeared as the first result. means the correct page was the first result, while A measure of whether the correct page appeared in the first ten results. means it appeared somewhere in the first ten results. The best result was Exa, achieving 82% at rank 1 and 100% in the top 10. This means that from 56 queries tested, it got the gold URL in its first result 82% of the time and 100% within the top 10.

Retrieval success versus tail latencyA scatter plot compares p95 latency with the share of anchor queries whose gold URL appeared in the first ten results.Retrieval success versus tail latencyEach point is one provider from the Octen anchor run. Lower latency and higher hit@10 are preferable.0%25%50%75%100%02s4s6sBraveContextExaKagiOctenParallelPerplexityTavilyp95 latency (lower is faster)

Latency wasn't a one-time issue for Context, as we can clearly see in their The slower end of a response-time distribution, often measured with p95., measured here with The value at or below which 95 percent of measurements fall. latency, while most of the other providers sit in the top-left corner, the optimal place to be.

If you're interested in each one's success on a specific category, feel free to look at the heatmaps below. I won't go into depth on each category since it's open source and you can just take a look at it yourself.

Gold URL hit@1 by categoryA heatmap of gold URL hit@1 rates by provider and Octen anchor category.Gold URL hit@1 by categoryThe anchor set has one or more gold URLs for each query. Higher cells mean more matches.Tech and codeAcademicFinanceMedical and legalLocalNewsEcommerceEntertainmentGeneralBrave83%88%50%100%63%75%75%100%50%Context100%100%75%100%63%100%75%75%50%Exa89%75%100%100%50%75%75%100%100%Kagi89%88%75%100%88%75%75%100%50%Octen61%25%25%75%25%0%75%75%0%Parallel39%75%50%75%25%50%25%25%0%Perplexity89%88%75%100%75%100%75%100%50%Tavily33%25%50%0%0%25%50%0%0%Cell color encodes gold URL hit rate; higher is better
Gold URL hit@10 by categoryA heatmap of gold URL hit@10 rates by provider and Octen anchor category.Gold URL hit@10 by categoryThe anchor set has one or more gold URLs for each query. Higher cells mean more matches.Tech and codeAcademicFinanceMedical and legalLocalNewsEcommerceEntertainmentGeneralBrave94%100%100%100%88%75%100%100%100%Context100%100%100%100%88%100%100%100%100%Exa100%100%100%100%100%100%100%100%100%Kagi89%100%100%100%88%100%75%100%100%Octen83%25%75%75%50%25%100%75%50%Parallel94%100%100%100%88%75%100%100%100%Perplexity100%100%100%100%100%100%100%100%100%Tavily94%88%100%100%75%100%100%100%50%Cell color encodes gold URL hit rate; higher is better

Extra

Yes. That's all, don't worry. You can leave now. But if you like data, here are some extra graphs that I couldn't narratively fit anywhere nicely.

Relevance by result positionLines show how the average relevance grade changes from the first to the tenth result position.Relevance by result positionMean metadata-heuristic grade at each rank across the 80 primary queries.012312345678910BraveContextExaKagiOctenParallelPerplexityTavily

The agreement graph uses A similarity score equal to shared items divided by total unique items. to compare how many top-ten URLs providers share.

Raw result agreementA matrix compares the overlap of each provider's top-ten URL set with every other provider.Raw result agreementMean Jaccard overlap between the top-ten URL sets returned by each provider.BraveContextExaKagiOctenParallelPerplexityTavilyBrave1.000.240.140.230.070.450.220.22Context0.241.000.170.340.060.160.250.53Exa0.140.171.000.150.050.110.160.14Kagi0.230.340.151.000.060.190.200.29Octen0.070.060.050.061.000.060.060.05Parallel0.450.160.110.190.061.000.160.15Perplexity0.220.250.160.200.060.161.000.21Tavily0.220.530.140.290.050.150.211.00Diagonal cells are self-overlap. Off-diagonal values describe shared URLs, not quality.
Source host ecologyStacked bars show how each provider's primary result list is distributed across common host groups and other hosts.Source host ecologyShare of primary result URLs by host group. This is source mix, not an authority score.0%25%50%75%100%BraveContextExaKagiOctenParallelPerplexityTavilygithub.comstackoverflow.comreddit.commedium.comyoutube.comdev.topostgresql.orgen.wikipedia.orgOther hosts
Paired win, tie, and lossEach row compares two providers across the same primary queries. Blue means the first provider scores higher, gray is a tie, and red means it scores lower.Paired win, tie, and lossSame-query comparisons using a +/-0.05 nDCG@10 tie threshold.first winstiefirst loses0%25%50%75%100%Brave vs Context63%Brave vs Exa63%Brave vs Kagi41%Brave vs Octen69%Brave vs Parallel35%Brave vs Perplexity60%Brave vs Tavily51%Context vs Exa50%Context vs Kagi19%Context vs Octen49%Context vs Parallel23%Context vs Perplexity35%Context vs Tavily33%Exa vs Kagi18%Exa vs Octen45%Exa vs Parallel26%Exa vs Perplexity26%Exa vs Tavily31%Kagi vs Octen64%Kagi vs Parallel28%Kagi vs Perplexity59%Kagi vs Tavily48%Octen vs Parallel18%Octen vs Perplexity25%Octen vs Tavily26%Parallel vs Perplexity61%Parallel vs Tavily55%Perplexity vs Tavily39%Counts across 80 primary queries