Deep search on SimpleQA
1,000 seeded questions from OpenAI's SimpleQA, each resolved live by Keiro's fact-resolution engine — the open web treated as its only database. One mechanical check per question: the gold answer must appear in the evidence we return. No reader model, no LLM judge. 953 of 1,000 passed.1
The leaderboard
SimpleQA accuracy (%)The result
The headline number is 95.3%: 953 of 1,000 seeded SimpleQA questions had the gold answer present in the data the pipeline returned. The raw normalized substring score is 87.9%; a hand audit of every raw miss — date and comma variants, abbreviations, transliterations, split compounds — rescues 7.6 points. 43 misses stay misses.
Every question in the sample is deterministic: seed 42, a Fisher–Yates shuffle over OpenAI's 4,326-question SimpleQA set.6 Every returned payload — snippets and full page text — is preserved in results.json in the repo, so any judged call can be re-audited by hand.1
Where the score comes from
Accuracy (%) by stageStages 1–2 measured on the merged run of 1,141 records across 32 result files; stage 3 on the curated 1,000-question sample (seed 42), where the raw score is 87.9%.
The reverse framework
Search was built to find documents. Ask a search engine a question and it returns ten places the answer might live — the reading is left to you.
Keiro resolves facts. The question is compiled into the fact it asks for; the fact is located on the pages carrying it right now; every candidate is read end-to-end until the fact is proven; the response returns the answer with its evidence ranked. Search runs forward, from words to documents. Resolution runs in reverse, from the fact back to the web.
| Standard search API | Keiro deep search |
|---|---|
| 1A query is matched against a prebuilt index | 1A question is compiled into the fact it asks for |
| 2Ten links with two-line snippets return | 2The pages that carry the fact are located on the live web |
| 3You retrieve and read the pages yourself | 3Every candidate is read end-to-end until the fact is proven |
| 4You parse and extract the answer yourself | 4The response carries the fact with its proof, ranked |
| 5The API's job ends at the URL | 5The API's job ends at the fact, with its provenance |
On this benchmark the reversal is worth 22.9 points: 72.4% when the gold answer has to appear in SERP snippets alone, 95.3% when every candidate is read in full and ranked by the evidence it carries.
The resolution engine
Most infrastructure answers one question: which URLs match. Ours answers the reverse question: where does the fact live right now. One POST to /v1/search in, one proven answer out — no index to build, no corpus to maintain, nothing cached. The database is the live web itself. Four stages take a question to its fact:
Consistency
Accuracy (%) per chunk of 50results.json for audit.What counts as a hit
The raw check is mechanical: a normalized substring test over everything returned. The judged pass adds a hand audit of every miss, and it is deliberately stingy about rescues.
| Verdict | Rule |
|---|---|
| Counts as a hit | Variant forms of the same fact: date-order and comma variants · abbreviations (km/kilometers, TX/Texas) · transliterations (Jung/Jang) · numerals vs words · ordinal suffixes · non-English date renderings · split compounds where every element appears verbatim in one page. |
| Stays a miss | Deliberately strict — no credit for almost: derived answers (durations or conversions the page lets you compute but never states) · paywalled numerics · half-missing compounds · contested golds where sources contradict SimpleQA's answer. |
Benchmarks
Each provider's strongest published SimpleQA result we could find, with the harness that produced it. The harnesses differ — answer models, judges, question counts — so treat the gaps as directional. The cost column is each provider's published list price per 1,000 requests (refs 7–16; detail in the next section). The structural difference that favors Keiro: every other score gets a reader LLM to repair retrieval mistakes; ours does not.
| Provider | SimpleQA (%) | Δ vs Keiro | Cost / 1k | Harness | Ref |
|---|---|---|---|---|---|
| 95.30 | — | $4.447 | Own harness · retrieval-only judged check · n=1,000, seed 42 | [1] | |
Firecrawl | 94.7 | −0.6 | $10.008 | GPT-5.4 agent, high reasoning, ≤20 search/extraction calls, official grader | [2] |
Tavily | 93.3 | −2.0 | $8.009 | GPT-4.1 answers from retrieved docs, official SimpleQA classifier · full 4,326-question set · self-published | [3] |
you.com | 92.09 | −3.2 | $5.0010 | GPT-5.4 nano synthesis + GPT-5.4 mini judge · open-source harness | [4] |
Exa | 91.9 | −3.4 | $12.0011 | GPT-5.4 agent (also 90.06% on you.com's harness) | [2] |
Parallel | 91.0 | −4.3 | $1.0012 | GPT-5.4 agent (also 89.78% on you.com's harness) | [2] |
| 90.5 | −4.8 | $10.0013 | GPT-5.4 agent, native search tool | [2] | |
| 85.92 | −9.4 | $5.0014 | GPT-4.1 answers, official SimpleQA classifier | [5] | |
| 82.15 | −13.2 | $5.0015 | SERP via Serper, GPT-4.1 answers (80.17% on you.com's harness) | [5] | |
| 76.05 | −19.3 | $5.0016 | GPT-4.1 answers, official SimpleQA classifier | [5] |
What a request costs
Deep search is $4.44 per 1,000 requests, list price — one flat meter that covers the entire pipeline this page describes: live-web resolution, full-page reading (an average of 7.9 pages per query in this benchmark), proof scoring and re-rank.
That sits between the cheapest raw-search tier and the $5–10 band where most search APIs return ranked links and excerpts. The difference is what the meter covers: the full-page layer behind +15.3 of the 95.3 points is, for most of the field, a second product with its own metering — scrape credits, contents endpoints, or LLM tokens.
Cost per 1,000 requests
USD, list priceThe 43 true misses
After judging, 43 of 1,000 questions were true misses. They cluster into four failure classes — in three of them the fact is not on the reachable open web at all.
Derived answers
Durations and unit conversions the returned pages let you compute but never state outright. A retrieval check does not do math.
Paywalled numerics
Book-chapter values and subscription data sources — the fact exists, but behind a login rather than on the open web.
Deep-lookup facts
Episode credits, award lists, docket dates, niche article specifics: the long tail that no index ranks first.
Contested golds
Sources contradict SimpleQA's stated answer — wrong year, wrong season. We stay with the sources and take the miss.
Reproduce this
testbench.js is a standalone, zero-dependency Node ≥ 18 script — no npm install. It seeds a deterministic Fisher–Yates sample of SimpleQA, runs each question through the pipeline, and writes every record — including the full returned payload — to results.json.
$ SAMPLE_SIZE=1000 SAMPLE_SEED=42 node testbench.js
# SimpleQA retrieval eval: 1000 questions (of 4326), seed=42
# per-question records (payload included, for judging) -> results_simpleqa.json
# { hit_rate: 0.8773, content_hit_rate: 0.7932, top1: 0.737, retries: 267 }--- testbench.js (core) ---
// SimpleQA retrieval eval for the Keiro search API.
// The API's one job: surface the gold answer in the returned snippets/content.
// No reader model, no answer extraction - retrieval, ranked.
// seeded RNG (mulberry32) + Fisher-Yates sample: deterministic per seed
function mulberry32(seed) {
return function () {
seed |= 0; seed = (seed + 0x6d2b79f5) | 0;
let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
// normalize: lowercase, strip articles, strip non-alnum, collapse whitespace
function normalize2(s) {
return String(s || "")
.toLowerCase()
.replace(/\b(a|an|the)\b/g, " ")
.replace(/[^a-z0-9 ]/g, " ")
.replace(/\s+/g, " ")
.trim();
}
const goldIn = (text, gold) =>
!!text && normalize2(gold) !== "" && normalize2(text).includes(normalize2(gold));
async function runOne(q) {
const res = await fetch(API_URL, {
method: "POST",
headers: { "Authorization": "Bearer " + KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: q.question, max_results: 10 }),
});
const payload = await res.json();
const results = payload.results || [];
const fetched = results.filter((r) => r.content);
const rec = {
snippet_hit: goldIn(results.map((r) => r.snippet || "").join(" "), q.gold),
content_hit: goldIn(fetched.map((r) => r.content || "").join(" "), q.gold),
gold_rank: firstRankHit(results, q.gold), // top-1 tracking
latency_ms: payload.meta ? payload.meta.latency_ms : 0,
// full returned payload kept, so every judged call is auditable
snippets: results.map((r) => ({ title: r.title, snippet: r.snippet })),
content: fetched.map((r) => ({ title: r.title, text: r.content.slice(0, 8000) })),
};
rec.hit = rec.snippet_hit || rec.content_hit;
return rec;
}SAMPLE_SIZEquestions per run — default 100, this report used 1,000SAMPLE_SEEDseed for the Fisher–Yates sample (default 42)SAMPLE_OFFSETslice deeper into the 4,326-question setBENCH_OUTresults file (default results_simpleqa.json)
Each question costs ~1 Keiro credit and ~2.2 s of pacing at the starter tier's 30 req/min. The full 1,000-question results file — every snippet and resolved page — is in the repo.1
Method notes
What is SimpleQA?
SimpleQA is OpenAI's benchmark of 4,326 short factual questions written to elicit hallucinations, each with a verified short answer. Our runs sample it with a fixed seed (42): 100 questions by default, 1,000 for the headline run, deterministic per seed.
Why is Keiro's score retrieval-only while competitors answer?
The Keiro API returns ranked data — snippets and full page content — and this benchmark checks whether the gold answer text appears in that data. No reader model writes an answer, no LLM judge grades it. That is a stricter test: an answering pipeline gets an LLM that can rephrase, merge and fix; our number only counts answers that were literally present in what we returned.
Is 95.3% comparable to Tavily's 93.3%?
Directionally, not apples-to-apples. Every third-party number in the leaderboard comes from a different harness with a different answer model and judge (GPT-4.1, GPT-5.4 agent, GPT-5.4 nano/mini). Each is the provider's best published SimpleQA run, linked to its source. Keiro's number is the only retrieval-only one — read the gap as ours being measured the harder way.
How exactly is a hit judged?
Two stages. First a normalized substring check (lowercased, articles and punctuation stripped) of the gold answer across all returned snippets and resolved page state. Then every raw miss is hand-audited for legitimate variant forms — date and comma variants, abbreviations, transliterations, split compounds. The audit does not accept derived answers or contested golds, which is why 43 of the raw misses stayed misses on the 1,000-question run.
Can I reproduce this?
Yes. The benchmark script is a single zero-dependency Node file (Node ≥ 18). It seeds a deterministic Fisher–Yates sample of SimpleQA, runs each question through the pipeline, and writes every record — including the full returned payload — to results.json, so any judged call can be re-audited. Each question costs about 1 Keiro credit.
What is deep search good for?
Any agent flow that needs the fact to actually be in the context: research agents, verification steps, citation-grounded answers, RAG ingestion. The +15.3 points from reading pages in full is the step link-only APIs skip — snippets alone hit 72.4% on this benchmark.
How much does Keiro deep search cost?
$4.44 per 1,000 requests at list pricing — one flat meter for the whole pipeline (live-web resolution, full-page reads, proof scoring, re-rank). Competitors quoted in Fig. 4 bill $1–10 per 1,000 for ranked links and excerpts; the full-page layer behind +15.3 of the 95.3 points sits on a second meter for most of them (scrape or contents credits, or LLM tokens).
Use the same pipeline
The endpoint behind this report returns ranked snippets and full page content for any query — the same data this benchmark scored.
References
- 1.Keirolabs. Deep endpoint benchmark results — script, all 1,141 records, full returned payloads. GitHub (2026). link ↗
- 2.Van Zyl, J. (ecosystem.Ai). “I tested Firecrawl, Exa, Parallel and Claude Search on SimpleQA.” GPT-5.4 answering agent, official grader (2026). link ↗
- 3.Tavily. “Tavily achieves SOTA on SimpleQA benchmark.” GPT-4.1 answering, official classifier, full 4,326-question set (2026). link ↗
- 4.You.com. web-search-api-evals — open-source harness, GPT-5.4 nano synthesis and mini judge. GitHub (2026). link ↗
- 5.Tavily. tavily-search-evals — GPT-4.1 answering pipeline, official SimpleQA classifier. GitHub (2026). link ↗
- 6.OpenAI. “Measuring short-form factuality in large language models with SimpleQA.” Wei et al. (2024); benchmark sample n=1,000 drawn with seed 42. link ↗
- 7.Keirolabs. Pricing — deep search at $4.44 per 1,000 requests, full pipeline included. link ↗
- 8.Firecrawl. Pricing — Search 2 credits per 10 results; pay-as-you-go top-ups $5 per 1,000 credits (Hobby). link ↗
- 9.Tavily. Credits & pricing — basic search 1 credit, pay-as-you-go $0.008 per credit. link ↗
- 10.You.com. Search API — $5 per 1,000 calls, pay-as-you-go. link ↗
- 11.Exa. Pricing — Deep Search $12 per 1,000 requests (Deep-Reasoning $15); base search $7 per 1,000 with up to 10 results. link ↗
- 12.Parallel. Pricing — Search API $1 per 1,000 requests (Turbo, 10 results); deeper modes up to $5. link ↗
- 13.Anthropic. Web search tool — $10 per 1,000 searches, plus standard token costs. link ↗
- 14.Perplexity. API docs — Search API $5 per 1,000 requests; model tokens billed separately. link ↗
- 15.Google. Custom Search JSON API — $5 per 1,000 queries; 100 queries per day free. link ↗
- 16.Brave. Search API pricing — Search plan $5 per 1,000 requests; $5 monthly free credit. link ↗
Firecrawl
Tavily
you.com
Exa
Parallel