<!-- twin of https://specstream.ai/migrate/tavily-extract -->
# Tavily Extract compatible: change the address, $0.80 per 1,000 pages

Compared on Nov 10, 2026. The page: https://specstream.ai/migrate/tavily-extract

On Tavily every 5 successful URL extractions cost 1 credit, $0.008 on pay as you go, so 1,000 pages cost $1.60. SpecStream answers the same `POST /extract` in Tavily's JSON for $0.80 per 1,000 pages.

The switch is one line: `TavilyClient(api_key=KEY, api_base_url="https://api.specstream.ai/tavily")`. The same address answers Tavily's search, so one setting moves both.

The Extract API behind this route scores 0.908 F1 on WCXB. A page that gives no text is not charged, and credit you buy never expires.

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

## Tavily Extract to SpecStream, parameter by parameter and field by field

| | SpecStream | Tavily Extract |
|---|---|---|
| Address | `POST https://api.specstream.ai/tavily/extract` | `POST https://api.tavily.com/extract` |
| The key | A SpecStream key as `Authorization: Bearer`, or `api_key` in the body | A Tavily key in a Bearer authentication header |
| `urls` | One URL or a list of 1 to 20. 21 URLs or an empty list get `400` | One URL or a batch of up to 20 in one request |
| `format` | `markdown`, the default, or `text` for plain text | `markdown`, the default, or `text` |
| The reply | `results[]` with `url` and `raw_content`, `failed_results[]` with `url` and `error`, `response_time` and `request_id`. Not returned: `usage`, and a result's `images` and `favicon` | `results` and `failed_results`: a `200` can carry failures for single URLs |
| Errors | Tavily's `{"detail": {"error": ...}}`: `401` for a wrong key, `432` when the balance is empty. A busy call gets `429` with `Retry-After` and is not charged | A failed URL extraction is never charged |
| Price per 1,000 pages | $0.80. A page that gives no text is not charged | $1.60 basic and $3.20 advanced at $0.008 a credit pay as you go: 1 or 2 credits for every 5 successful URLs |
| Free to start | $10 of credit, no card, which covers 12,500 pages. Credit never expires | 1,000 free credits a month, which reset on the first day of each month |

## The Tavily Extract reference, on SpecStream

### The call, before and after

```
# Before
from tavily import TavilyClient
client = TavilyClient(api_key="tvly-...")

# After
client = TavilyClient(api_key=SPECSTREAM_KEY, api_base_url="https://api.specstream.ai/tavily")

reply = client.extract(urls=["https://en.wikipedia.org/wiki/Web_scraping"])
for page in reply["results"]:
    print(page["url"], page["raw_content"][:300])
```

tavily-python 0.8.5 joins `api_base_url` to `/extract`, so `extract` and `search` both reach SpecStream. A call with an empty balance answers `432`, which the client raises as `ForbiddenError`, as it does on Tavily.

### 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-tavily` 0.2.18: pass `api_base_url="https://api.specstream.ai/tavily"` to `TavilyExtract`.

Open WebUI: set `WEB_LOADER_ENGINE=tavily` and `TAVILY_API_BASE_URL=https://api.specstream.ai/tavily` in the environment. This one has no field in the admin screen.

LibreChat: set `TAVILY_EXTRACT_URL` (config key `tavilyExtractUrl`) to the whole address, `https://api.specstream.ai/tavily/extract`.

OpenClaw: set `plugins.entries.tavily.config.webSearch.baseUrl`, or `TAVILY_BASE_URL`, to `https://api.specstream.ai/tavily`.

### What the route reads, and what it refuses

Read and applied: `urls` as one string or a list of up to 20, with a host that does not resolve listed in `failed_results`, and `format` as `markdown` or `text`. The key is read from the Bearer header or from `api_key` in the body.

Refused with `400`: 21 URLs or more, and an empty list. A wrong key gets `401`. Every parameter was measured on production on Nov 10, 2026 with tavily-python 0.8.5, and the full [pass table](https://specstream.ai/specstream/dialects/tavily_extract.md) lists each one and its result.

### Every field that comes back

The reply has `results[]`, each with `url` and `raw_content`, `failed_results[]`, each with `url` and `error`, `response_time` in seconds and `request_id`. The route does not return `usage`, or a result's `images` and `favicon`.

One field is added: `specstream`, with the call's `price_usd`. A parser that reads Tavily's fields never sees it.

### $0.80 per 1,000 pages, with no credits

Tavily counts 1 credit for every 5 successful URLs on basic and 2 on advanced, at $0.008 a credit on pay as you go. On SpecStream every page that gives text costs $0.0008, and a page with no text is not charged. A busy call gets `429` with `Retry-After` and charges nothing.

### 0.908 F1 on WCXB, and the search scores on the same key

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

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

Create the key with `zero_retention` and a page read made with it keeps no request text and no answer after the reply. `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 searches the live web with the [Search API](https://specstream.ai/search-api?utm_source=alternatives&utm_campaign=migrate-tavily-extract) at $5 per 1,000 searches of up to 10 results. [Deep Search](https://specstream.ai/deep-search?utm_source=alternatives&utm_campaign=migrate-tavily-extract) 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 [Tavily alternative](https://specstream.ai/alternatives/tavily?utm_source=alternatives&utm_campaign=migrate-tavily-extract) page.

## What else Tavily Extract users price

### Exa Contents

Page text from Exa at $1 per 1,000 pages for each content type you ask for, in Exa's own request and reply. SpecStream reads 1,000 pages for $0.80 and answers the Tavily call your code already sends.

### Firecrawl

A scrape API at 1 credit per page, with the Hobby plan at $19 a month and 1,000 free credits a month. SpecStream needs no plan and keeps Tavily's reply shape.

### Jina Reader

Page reads billed in tokens by content length, with 10M free tokens on a new key and no dollar rate on its Reader page. SpecStream charges $0.0008 a page, whatever its length.

## 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.

2. With tavily-python, add `api_base_url="https://api.specstream.ai/tavily"` and the SpecStream key. Without the client, in Python:

```
import requests

reply = requests.post(
    "https://api.specstream.ai/tavily/extract",  # was https://api.tavily.com/extract
    headers={"Authorization": f"Bearer {SPECSTREAM_KEY}"},
    json={"urls": ["https://en.wikipedia.org/wiki/Web_scraping"], "format": "markdown"},
    timeout=60,
)
reply.raise_for_status()
data = reply.json()
for page in data["results"]:
    print(page["url"], len(page["raw_content"]))
for failed in data["failed_results"]:
    print(failed["url"], failed["error"])
```

3. In JavaScript:

```
const res = await fetch("https://api.specstream.ai/tavily/extract", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SPECSTREAM_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ urls: ["https://en.wikipedia.org/wiki/Web_scraping"] }),
});
const data = await res.json();
for (const page of data.results) console.log(page.url, page.raw_content.slice(0, 300));
```

4. Read `432` as an empty balance and `429` as a call to send again after `Retry-After`. Neither is charged.

## Frequently asked questions

### Is there a Tavily Extract compatible API?

Yes. SpecStream answers Tavily's `POST /extract` at `https://api.specstream.ai/tavily` in Tavily's JSON, as measured on production on Nov 10, 2026 with tavily-python 0.8.5. It costs $0.80 per 1,000 pages.

### How do I migrate from Tavily Extract?

Change one line: `TavilyClient(api_key=KEY, api_base_url="https://api.specstream.ai/tavily")`. Without the client, post the same body to `https://api.specstream.ai/tavily/extract` with a SpecStream key as the Bearer token.

### How much does Tavily Extract cost?

1 credit for every 5 successful URLs on basic and 2 on advanced, at $0.008 a credit on pay as you go: $1.60 or $3.20 per 1,000 pages. SpecStream costs $0.80 per 1,000 pages.

### Which apps and SDKs take the SpecStream address for Tavily Extract?

LangChain, `langchain-tavily` 0.2.18: pass `api_base_url="https://api.specstream.ai/tavily"` to `TavilyExtract`. Open WebUI: set `WEB_LOADER_ENGINE=tavily` and `TAVILY_API_BASE_URL=https://api.specstream.ai/tavily` in the environment. This one has no field in the admin screen. LibreChat: set `TAVILY_EXTRACT_URL` (config key `tavilyExtractUrl`) to the whole address, `https://api.specstream.ai/tavily/extract`. OpenClaw: set `plugins.entries.tavily.config.webSearch.baseUrl`, or `TAVILY_BASE_URL`, to `https://api.specstream.ai/tavily`.

### Can I change the address in the Tavily Python client?

Yes, with `api_base_url`, tested with tavily-python 0.8.5 on Nov 10, 2026. The client joins it to `/extract` and `/search`, so both calls move together.

### How many URLs can one call extract?

Up to 20, as on Tavily. 21 URLs or an empty list get `400` in Tavily's error form, and a URL that cannot be read is listed in `failed_results` and not charged.

### Which Tavily Extract fields does SpecStream not return?

Three: `usage`, and a result's `images` and `favicon`. Each result has `url` and `raw_content`, and each failure `url` and `error`.

## Sources

SpecStream wrote this page. Each Tavily figure comes from Tavily's own pages, and each other provider's figure from that company's own page. The route's behavior comes from its code and the pass table measured on production.

- [Tavily API credits](https://docs.tavily.com/documentation/api-credits.md), read Nov 10, 2026
- [Tavily Extract reference](https://docs.tavily.com/documentation/api-reference/endpoint/extract.md), read Nov 10, 2026
- [Tavily pricing](https://tavily.com/pricing), read Nov 10, 2026
- [Tavily search reference](https://docs.tavily.com/documentation/api-reference/endpoint/search.md), read Nov 10, 2026
- [SpecStream Tavily Extract pass table](https://specstream.ai/specstream/dialects/tavily_extract.md), read Nov 10, 2026
- [Exa pricing](https://exa.ai/docs/admin/pricing.md), read Nov 10, 2026
- [Firecrawl pricing](https://www.firecrawl.dev/pricing), read Nov 10, 2026
- [Jina Reader](https://jina.ai/reader), read Nov 10, 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
