<!-- twin of https://specstream.ai/migrate/exa -->
# Migrate from Exa: the same POST /search, from $0.005 a call

Compared on Nov 10, 2026. The page: https://specstream.ai/migrate/exa

An Exa search costs $7 per 1,000 requests on `auto` and adds $1 per 1,000 results above 10. SpecStream answers the same `POST /search` in Exa's JSON for $0.005. This guide maps each parameter and each field.

The switch is one line: `https://api.specstream.ai/exa` in place of `https://api.exa.ai`, and a SpecStream key in `x-api-key`. Your code reads `results[].url`, `title` and `publishedDate` as before.

SpecStream scores 97.9 F-score on all 1,000 SimpleQA Verified questions and 64.0 item F1 on all 200 WideSearch tasks. A call of 10 results costs $0.005 and a call of 100 costs $0.059.

[Get an API key](https://specstream.ai/signup?src=alternatives-migrate-exa&utm_source=alternatives-md&utm_campaign=migrate-exa&returnTo=%2Fworkspace%2Fsearch%3Froute%3Dexa) New accounts get $10 of credit, no card. It covers 2,000 searches.

## Exa search to SpecStream, parameter by parameter and field by field

| | SpecStream | Exa |
|---|---|---|
| Address | `POST https://api.specstream.ai/exa/search` | `POST https://api.exa.ai/search` |
| The key | A SpecStream key in `x-api-key` or as a Bearer token | An Exa key in `x-api-key` or as a Bearer token |
| `numResults` | 1 to 100, and 10 when you send none. A value outside that range gets `400` | 1 to 100. The maximum public limit is 100 results |
| `type` | A type that starts with `deep` runs the default search; `auto`, `fast`, `lite` and the rest run the fast search for up to 10 results without page text. All cost the same | `lite` costs $4 and `auto` and `fast` $7 per 1,000 requests, for up to 10 results |
| `contents.text` | Fills `text` with the text of each page closest to the query, cut to `maxCharacters` when you send it, at no extra cost. `text` at the top of the body works too | Contents costs $1 per 1,000 pages per content type |
| Filters and what is searched | Read and used: `includeDomains`, `excludeDomains`, `includeText`, `excludeText`, `startPublishedDate` and `endPublishedDate`. Accepted and not used: `category`, `userLocation`, `contents.summary`, `livecrawl` and the rest | Searched on Exa's own index, which tracks over 2 trillion URLs and serves 100 billion pages as of October 2026 |
| The reply | `requestId`, `results[]`, `searchTime` in milliseconds, and `costDollars.total`, the price of the call in dollars | A list of results with `costDollars` |
| Each result | `id` (the URL), `url`, `title`, `publishedDate` (null when the page has no date), `author` (null), `text` when asked, and `highlights` when asked. Not returned: `score`, `summary`, `image` and `favicon` | Title, URL, published date and author, with text, highlights or summary when `contents` asks for them |
| Errors | Exa's body: `requestId`, `error` and `tag`, with the HTTP status. A `429` comes with `Retry-After` and charges nothing | One API call to an endpoint is one request, priced per 1,000 requests |
| Price of 10 results | $0.005, which is $5 per 1,000 searches | $0.007 on `auto` and $0.004 on `lite` |
| Price of 100 results | $0.059. Each started block of 10 results above 10 adds $0.006 | $0.097 on `auto` and $0.094 on `lite`: every result above 10 adds $1 per 1,000 results |
| Free to start | $10 of credit, no card, which covers 2,000 searches. A top-up never expires | $10 in credits on sign up, reset to $10 on the first of every month, no payment method |

## The Exa reference, on SpecStream

### The call, before and after

```
# Before
curl -X POST https://api.exa.ai/search \
  -H "x-api-key: $EXA_API_KEY" -H "Content-Type: application/json" \
  -d '{"query": "open source vector databases", "numResults": 10}'

# After
curl -X POST https://api.specstream.ai/exa/search \
  -H "x-api-key: $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"query": "open source vector databases", "numResults": 10}'
```

The body, the header name and the parser stay. The base address gains `/exa`, and the key changes. Code that tracks spend with `costDollars.total` keeps working, because the field holds the price of the call.

### Apps and SDKs that take the address as a setting

Each line was run on production on November 10, 2026 through that client's own request and reply code. Put your SpecStream key wherever the client takes its key.

LangChain, `langchain-exa` 1.1.0: set `exa_base_url="https://api.specstream.ai/exa"` on `ExaSearchRetriever`.

### Every parameter, and what the route does with it

Read and used in the search: `query`, `numResults` (1 to 100), `includeDomains` and `excludeDomains`, `includeText` and `excludeText` (searched as exact phrases), and `startPublishedDate` and `endPublishedDate`.

Read to choose the search: a `type` that starts with `deep`, `contents.text` and a `numResults` above 10 run the default search; every other call runs the fast search. The price is the same on both.

Read to shape the reply: `contents.text` (`true`, or an object with `maxCharacters`) and `contents.highlights`. Both also work at the top of the body, as older clients send them. Accepted and not used: `category`, `userLocation`, `contents.summary`, `livecrawl` and the rest, so a client that sends them is never refused.

### Every field that comes back

The reply has `requestId`, `results`, `searchTime` in milliseconds and `costDollars` with `total`. Each result has `id`, which is its URL, `url`, `title`, `publishedDate` and `author`. `publishedDate` is null when the page has no date, and `author` is always null.

With `contents.text`, each result carries `text`: the text of its page closest to your query, up to about 3,500 characters, cut to `maxCharacters` when you send it. With `contents.highlights`, it carries `highlights`, a list with the result's snippet. The route does not return `score`, `summary`, `image` or `favicon`.

One field is added: `specstream`, with what the Search API returns beyond Exa's fields. A parser that reads Exa's fields never sees it.

### $5 per 1,000 searches, and 100 results for $0.059

On Exa 1,000 `auto` searches of 10 results cost $7, every result above 10 adds $1 per 1,000 results, and page text is $1 per 1,000 pages per content type. On SpecStream a call of up to 10 results costs $0.005 with the page text included, and each started block of 10 more adds $0.006, so 100 results cost $0.059 against $0.097 on `auto`. A call stopped by a `429` charges nothing.

### The most accurate web search API, in about one second

On SimpleQA Verified the SpecStream Search API scores 97.9 F-score on all 1,000 official questions, 978 of them correct. On WideSearch it scores 64.0 item F1 and 43.4 row F1 on all 200 official tasks. The Extract API scores 0.908 F1 on WCXB. Every score and its method is on the [benchmarks](https://specstream.ai/benchmarks?utm_source=alternatives&utm_campaign=migrate-exa) page.

An Exa call of up to 10 results without page text or a `deep` type runs the fast search. Measured on production on November 9, 2026, its median was 0.82 s at 1 search a second and 1.07 s at 20 a second, the 95th percentile stayed between 1.09 and 1.73 s, and it answered 718 of 720. It takes up to 8,800 searches a minute on one account.

### You decide what is kept, on each key

Create the key with `zero_retention` and a search made with it keeps no request text and no answer after the reply: it is not in the history, its answer is not reused for another call, and its log lines carry neither. Every account can set it. `spend_cap_cents` is the most the key can spend.

```
curl -X POST https://api.specstream.ai/v1/account/keys \
  -H "Authorization: Bearer $SPECSTREAM_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "production", "scopes": ["account:read", "finds:spend"], "spend_cap_cents": 500000, "zero_retention": true}'
```

### Search, pages and rows on one key

The same key reads up to 20 pages or documents a call with the [Extract API](https://specstream.ai/extract-api?utm_source=alternatives&utm_campaign=migrate-exa) at $0.80 per 1,000 pages, and a page with no text is not charged. [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=migrate-exa) returns every match for a request in plain words as structured rows, at 5¢, 15¢ or $1 a row, with a source URL on every value. The most a run can cost is approved before it starts. The full comparison is on the [Exa alternative](https://specstream.ai/alternatives/exa?utm_source=alternatives&utm_campaign=migrate-exa) page.

## What else Exa users price

### Tavily

A search API billed in credits: $0.008 a credit pay as you go, 1 credit for a basic search and 2 for an advanced one, up to 20 results a call. SpecStream returns up to 100 results in one Exa call, for $0.059.

### Brave Search API

A search API on Brave's own index at $5 per 1,000 requests, with $5 in free credits every month and 50 queries per second, in Brave's own reply shape. SpecStream costs the same per call and answers in Exa's shape.

### Parallel

A Search API that starts at $1 per 1,000 requests, with 600 Search calls a minute on the Developer plan. Its migration guide maps Exa search types to Parallel's own modes. SpecStream answers the Exa call as it is, and takes up to 8,800 searches a minute on one account.

### Serper

Google results as JSON, sold in credit packs from $1.00 per 1,000 for 50,000 credits to $0.30 per 1,000 for 12.5 million, valid for 6 months. A top-up on SpecStream never expires, and the call your code sends to Exa keeps working.

## How to migrate, step by step

1. Create a key under Agents & API in the workspace. A new account gets $10 of credit, no card, which covers 2,000 searches.

2. Set the base address to `https://api.specstream.ai/exa` where your code has `https://api.exa.ai`, and put the SpecStream key in `x-api-key`. In Python:

```
import requests

BASE = "https://api.specstream.ai/exa"  # was https://api.exa.ai

reply = requests.post(
    f"{BASE}/search",
    headers={"x-api-key": SPECSTREAM_KEY},
    json={"query": "open source vector databases", "numResults": 10, "contents": {"text": {"maxCharacters": 2000}}},
    timeout=30,
)
reply.raise_for_status()
data = reply.json()
print(data["costDollars"]["total"])
for result in data["results"]:
    print(result["title"], result["url"], result["publishedDate"])
```

3. In JavaScript:

```
const res = await fetch("https://api.specstream.ai/exa/search", {
  method: "POST",
  headers: { "x-api-key": process.env.SPECSTREAM_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({ query: "open source vector databases", numResults: 10 }),
});
const data = await res.json();
for (const result of data.results) console.log(result.title, result.url);
```

4. If your code sorts by `score` or reads `summary`, `image` or `favicon`, keep the order the results arrive in, which is the rank, and drop those fields. On a `429`, wait the seconds in `Retry-After` and send the call again; nothing was charged.

5. When your product needs every match in place of a results page, write the request in plain words. SpecStream reads it back as the conditions every row must meet and the facts to bring back, quotes the most it can cost, and delivers the rows after you approve.

## Frequently asked questions

### What is the best Exa API alternative?

SpecStream, at $5 per 1,000 searches of up to 10 results. It answers Exa's own `POST /search` at `https://api.specstream.ai/exa` in Exa's JSON, and scores 97.9 F-score on all 1,000 SimpleQA Verified questions.

### How much does an Exa search cost?

$7 per 1,000 requests on `auto` and `fast` and $4 on `lite`, for up to 10 results, plus $1 per 1,000 results above 10. The same call on SpecStream costs $0.005 for 10 results and $0.059 for 100.

### Which Exa fields does SpecStream not return?

Four: `score`, `summary`, `image` and `favicon`, and `author` is always null. Each result has `id`, `url`, `title` and `publishedDate`, with `text` and `highlights` when `contents` asks for them.

### Which apps and SDKs take the SpecStream address for Exa?

LangChain, `langchain-exa` 1.1.0: set `exa_base_url="https://api.specstream.ai/exa"` on `ExaSearchRetriever`.

### How do I get the page text?

Send `contents.text`, as on Exa, at no extra cost. Each result's `text` holds the text of its page closest to your query, up to about 3,500 characters or your `maxCharacters`; the call takes about 3 s in place of 1 s.

### Does the Exa search type change the price?

No. Every call of up to 10 results costs $0.005, whatever its `type`. A `type` that starts with `deep` runs the default search, and the other types run the fast search unless the call asks for page text.

### Do I keep my Exa key header?

Yes. The SpecStream key goes in the same `x-api-key` header, or as a Bearer token. New accounts get $10 of credit with no card, which covers 2,000 searches.

## Sources

SpecStream wrote this page. Each Exa figure comes from Exa's own pages, and each other provider's figure from that company's own page. The route's behavior is taken from its code.

- [Exa pricing](https://exa.ai/docs/admin/pricing.md), read Nov 9, 2026
- [Exa search reference](https://exa.ai/docs/reference/search.md), read Nov 9, 2026
- [Exa FAQ](https://exa.ai/docs/admin/faqs.md), read Nov 9, 2026
- [Tavily API credits](https://docs.tavily.com/documentation/api-credits.md), read Nov 9, 2026
- [Tavily search reference](https://docs.tavily.com/documentation/api-reference/endpoint/search.md), read Nov 9, 2026
- [Brave Search API](https://brave.com/search/api/), read Nov 9, 2026
- [Parallel pricing](https://parallel.ai/pricing), read Nov 9, 2026
- [Parallel, migrate to Parallel](https://docs.parallel.ai/search/migrate-to-parallel), read Nov 9, 2026
- [Serper](https://serper.dev/), read Nov 9, 2026
- [SpecStream benchmarks](https://specstream.ai/benchmarks), read Nov 10, 2026
- [SpecStream pricing](https://specstream.ai/pricing), read Nov 10, 2026
- [SpecStream for agents](https://specstream.ai/agents.md), read Nov 10, 2026
