One search call, several engines

Gaurav ShuklaPublished 10 November 2026 ยท benchmark data from 27 October 2026

In shortA multi-search-engine API sends one query to several search engines and returns one merged list. On 485 questions with a known answer page, four engines together held that page for 74% of questions, against 58% for the best engine alone. Removing any one of the four lost between 2.3 and 6.3 points. It costs about three times as much per search as the best single engine, and per answer found it is the most expensive option measured. This page gives the numbers for and against.

What a multi-search-engine API is

A multi-search-engine API takes one query, sends it to several search engines at the same time, and returns a single list in which each page appears once and says which engines found it. It is a fan-out: you make one call and hold one key, and the service makes the calls to each engine, waits for them, removes duplicates and merges.

Jevlin is one. Its balanced tier asks Exa, Brave, Parallel and Perplexity. fast asks two or three quick indexes, and max adds Serper and TinyFish. The engine list is on Providers and tiers. This page is about whether asking several engines is worth it, using measurements rather than argument, including the measurements that say when it is not.

One real call

This request was made on 10 November 2026. The response is shortened and otherwise unedited: two of the four pages, and each page's excerpt text, are left out.

curl https://api.jevlin.ai/v1/search \
  -H "Authorization: Bearer $JEVLIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "pydantic v2 limit maximum length of a string field",
       "tier": "balanced", "view": "merged", "merged_limit": 4, "page_chars": 200}'
{
  "request_id": "01a1c33f-ba85-7765-a20b-067506356db1",
  "merged": [            // 2 of 4 shown
    {
      "url": "https://stackoverflow.com/questions/61326020/how-can-i-set-max-string-field-length-constraint-in-pydantic",
      "title": "How can I set max string field length constraint in Pydantic?",
      "found_by": [
        {"provider": "exa", "rank": 4},
        {"provider": "brave", "rank": 1},
        {"provider": "parallel-search", "rank": 3}
      ],
      "votes": 3
    },
    {
      "url": "https://pydantic.dev/docs/validation/2.6/concepts/fields",
      "title": "Fields | Pydantic Docs",
      "found_by": [
        {"provider": "exa", "rank": 2},
        {"provider": "brave", "rank": 5},
        {"provider": "perplexity-search", "rank": 7}
      ],
      "votes": 3
    }
  ],
  "indexes": {
    "selected": 4,
    "ok": 4,
    "pending": 0,
    "by_provider": [
      {"provider": "exa", "status": "ok", "results": 8, "latency_ms": 1719},
      {"provider": "brave", "status": "ok", "results": 8, "latency_ms": 1321},
      {"provider": "parallel-search", "status": "ok", "results": 8, "latency_ms": 3176},
      {"provider": "perplexity-search", "status": "ok", "results": 8, "latency_ms": 1096}
    ]
  },
  "usage": {
    "cost_micros": 22000,
    "latency_ms": 3179,
    "cache_hit": false
  }
}

Three things to read off it. Each page carries found_by: the first was returned by three engines, at ranks 4, 1 and 3 in their own lists. indexes reports every engine asked, with its status and its own latency, so an engine that fails is named, not hidden. And the call took 3.2 seconds because the slowest engine, Parallel, took 3.2: a fan-out is as fast as its slowest member unless it is told to stop waiting.

The four engines returned 32 results between them, which were 27 distinct pages. The call cost $0.022 at the engines' list prices.

What each engine adds

The numbers in this section come from 485 developer and factual questions, each with one known answer page, sent to four engines on 27 October 2026. The headline result, that the four together hold the answer page for 73.5% of questions against 57.5% for Exa alone, is in the benchmark write-up. What that write-up does not show is what happens when you take one engine away.

engineanswer page in its own top tenreach of the other three without itpoints lost by removing itquestions only it answered
Exa57.5%67.3%6.3
4.3 to 8.5
35 of 485
Brave49.1%68.8%4.7
3.0 to 6.7
24 of 485
Parallel45.1%69.3%4.2
2.6 to 6.0
25 of 485
Perplexity44.5%71.3%2.3
1.1 to 3.6
13 of 485

Every engine pulls its weight, and none of the intervals reaches zero. Removing Exa costs the most, 6.3 points. Removing Perplexity costs the least, 2.3, but there are still 13 questions out of 485 that only Perplexity answered. An engine's value inside a fan-out is not its score alone. Brave and Parallel score within four points of each other on their own and each is worth more than four points to the group, because they find different pages.

If you only want two engines, the pair matters:

two enginesanswer page in either top ten
Exa + Brave65.4%
Exa + Parallel64.8%
Exa + Perplexity64.3%
Brave + Parallel62.6%
Brave + Perplexity59.5%
Parallel + Perplexity57.6%

The best pair, Exa with Brave, reaches 65.4%. All four reach 73.5%. The third and fourth engines are worth about eight points between them.

What the merged list is made of

The four raw lists agree on very little: 21% of the pages they return between them come from more than one engine (the overlap data is here). The merge orders pages by how many engines found them, so the ten pages it shows look different from the pool. Across 14,550 shown pages, 65% were found by two or more engines and 9% by all four.

That ordering is a deliberate bet that agreement is evidence, and it has a cost. A page only one engine found starts lower, and about a quarter of the answer pages the merged list did show (310 of 1,280) were single-engine finds. Reading only the top three would miss many of them.

What it costs

A fan-out pays every engine it asks. At list prices on the day of the test:

what you calllist cost per searchanswer page in the top tencost per 1,000 answers found
Exa$0.00757.5%$12.18
Brave$0.00549.1%$10.17
Parallel$0.003945.1%$8.74
Perplexity$0.00544.5%$11.19
All four, one call$0.020962.1%$33.66

This is the number that argues against us, so here it is plainly. Asking four engines found the answer page 4.6 points more often than asking Exa alone, and cost 3.0 times as much per search. Per answer found, the fan-out is the most expensive row in the table. Exa lite, at $0.004 a search and $8.05 per thousand answers found, was the cheapest route measured.

These are the engines' list prices, not what Jevlin charges. Jevlin's own price list, and the free credit every account gets, are on the pricing page.

What it buys besides coverage

An engine sometimes returns nothing at all. In the same test:

what you callcallscame back with no results
Exa4,3650.07%
Brave4,3650.09%
Parallel4,3651.44%
Perplexity4,3650.44%
All four, one call4,3650.00%

Parallel came back empty on about one call in seventy. The fan-out never did, in 4,365 calls, because the other engines answered.

The same thing showed up at larger scale on election night, 3 November 2026, when we polled six engines every five minutes for 156 races. TinyFish failed 2,178 polling rounds and Serper 23. The line that used all six recorded none, because some engine always answered. The election-night page has the full record.

When one engine is enough

  • You are optimising cost per answer. One good engine is about three to four times cheaper per answer found.
  • Your agent can search again. A second search with a different wording recovers much of what a second engine would. On this panel an engine shared only 3.4 of ten results with itself when the query was reworded.
  • Your questions are of one kind and one engine is good at it. Exa and Parallel were within two points of each other on library documentation.

Sending each query to one engine is what a web search router does, and that page compares the two approaches on the same questions.

A fan-out earns its cost when a missed page is expensive: an agent that will write code from whatever it reads first, a question with one authoritative source, or a task where you want to see that independent indexes agree before trusting a page.

Doing it yourself

Nothing here needs a service. To build the same thing you hold an account and a key with each engine, call them in parallel with your own deadline, map four response formats to one, decide when two URLs are the same page, and merge. The parts that take longer than expected are URL identity (tracking parameters, mobile hosts, trailing slashes), partial failure (what to return when one engine is slow), and rate limits that differ by engine. Exa's default is ten queries a second and Brave's is fifty.

A service is worth it if you would rather not maintain that, or if you want the per-engine record kept for you. That is the trade, and it is a convenience trade, not a capability one.

How to call Jevlin

From a coding agent. One install sets up Claude Code, Cursor, Codex, opencode, Pi and Hermes with a command-line search and the hooks that record each session. The agent runs a command by default; a host that prefers MCP runs jevlin mcp locally.

npm install -g @jevlinsearch/jevlin
jevlin setup

From your own application, with the AI SDK tool:

import { generateText, isStepCount } from 'ai';
import { superSearch } from '@jevlinsearch/ai-sdk';

const { text } = await generateText({
  model: 'openai/gpt-5-mini',
  prompt: 'What changed in the latest stable Kubernetes release?',
  tools: { superSearch: superSearch() },
  stopWhen: isStepCount(3),
});

Over HTTP, as in the call above. The request fields are on Request options.

Questions

Is this a metasearch engine?

In the old sense, yes: it queries other engines and has no index of its own. The difference from a consumer metasearch site is the output. It returns structured results for a program, keeps each engine's rank for every page, and reports each engine's status, latency and cost.

Does it rerank the results with a model?

No. The merged order is by how many engines found a page, then by the best rank any engine gave it. No model reads the pages.

Does it change what each engine returns?

No. Each engine's own list is in the response beside the merged one, in the order that engine gave it.

Which engines were measured here?

Exa, Brave, Parallel and Perplexity on the 485 questions. Serper and TinyFish were measured on election night only, so no number on this page from the 485 questions covers them.

Data, method and limits

The 485-question calls are in the supersearch-tests dataset, CC-BY-4.0. “Answer page in the top ten” means the question's known answer page, matched by URL after normalisation, appeared in the first ten results; each question was run three times and the figures are means over runs. Intervals are 95%, from a paired bootstrap over questions. The script and the numbers behind this page: fanout.py and data.json.

The limits are the same as for any single benchmark. It is one day, four engines, ten results, and questions about developer documentation, vendor APIs and hard facts. The answer page is one page, and another may hold the answer too. Prices are list prices on 27 October 2026 and change. And Jevlin sells this product, which is the reason every call is published.