Skip to the page

Exa Contents compatible

Change the address, $0.80 per 1,000 pages.

Exa Contents costs $1 per 1,000 pages for each content type. SpecStream answers the same POST /contents in Exa's JSON for $0.80 per 1,000 pages, and a page with no text is not charged.

The switch is one line: Exa(api_key=KEY, base_url="https://api.specstream.ai/exa"). The same address answers Exa's search, so one setting moves both.

The Extract API behind this route scores 0.908 F1 on WCXB. Credit you buy never expires, and a new account starts with $10 of credit, no card.

New accounts get $10 of credit, no card. It covers 2,000 searches.

Exa Contents to SpecStream, parameter by parameter and field by field

SpecStreamExa Contents
AddressPOST https://api.specstream.ai/exa/contentsPOST https://api.exa.ai/contents
The keyA SpecStream key in x-api-key or as Authorization: BearerAn Exa key in x-api-key or as a Bearer token
Pages per call1 to 20 in urls or ids, not both. More than 20 gets Exa's 400 error bodyOne API call to an endpoint is one request
`text`true, or {"maxCharacters": n} to cut the text at n characters. Sent when you ask for no content, as exa-py doesThe page text is one content type, billed per page
Each resultid, url, title, publishedDate and text. Not returned: highlights, summary, image, favicon, subpages, extras and entitiesTitle, URL, published date and author
ErrorsExa's {requestId, error, tag}: 401 for a wrong key, 400 for urls with ids. A busy call gets 429 with Retry-After and is not chargedEach page's status in statuses[]
Price per 1,000 pages$0.80. A page that gives no text is not charged$1 per content type
Free to start$10 of credit, no card, which covers 12,500 pages. Credit never expires$10 in credits on sign up, reset to $10 on the first of every month, no payment method

The Exa Contents reference, on SpecStream

What else Exa Contents users price

How SpecStream scores

The same numbers as the benchmarks page, from the official tasks and scorers.

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 exa-py, add base_url="https://api.specstream.ai/exa" and the SpecStream key. Without the client, in Python:

import requests

reply = requests.post(
    "https://api.specstream.ai/exa/contents",  # was https://api.exa.ai/contents
    headers={"x-api-key": SPECSTREAM_KEY},
    json={"urls": ["https://en.wikipedia.org/wiki/Web_scraping"], "text": True},
    timeout=60,
)
reply.raise_for_status()
data = reply.json()
for result in data["results"]:
    print(result["title"], result["url"], len(result["text"]))
print(data["costDollars"]["total"])

3. In JavaScript:

const res = await fetch("https://api.specstream.ai/exa/contents", {
  method: "POST",
  headers: { "x-api-key": process.env.SPECSTREAM_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({ urls: ["https://en.wikipedia.org/wiki/Web_scraping"], text: true }),
});
const data = await res.json();
for (const result of data.results) console.log(result.title, result.text.slice(0, 300));

4. Check statuses for pages that could not be read, and read 429 as a call to send again after Retry-After. Neither is charged.

Frequently asked questions

Something we didn't answer? Talk to a human

Is there an Exa Contents compatible API?
Yes. SpecStream answers Exa's POST /contents at https://api.specstream.ai/exa in Exa's JSON, as measured on production on Nov 10, 2026 with exa-py 2.28.0. It costs $0.80 per 1,000 pages.
How do I migrate from Exa Contents?
Change one line: Exa(api_key=KEY, base_url="https://api.specstream.ai/exa"). Without the client, post the same body to https://api.specstream.ai/exa/contents with a SpecStream key in x-api-key.
How much does Exa Contents cost?
$1 per 1,000 pages for each content type, with $10 of free credits that reset on the first of every month. SpecStream costs $0.80 per 1,000 pages, and a page with no text is not charged.
Which apps and SDKs take the SpecStream address for Exa Contents?
Khoj: in the Django admin, set api_url on the Exa WebScraper row to https://api.specstream.ai/exa. EXA_API_URL only fills that row when it is first made.
Can I change the address in exa-py?
Yes, with base_url, tested with exa-py 2.28.0 on Nov 10, 2026. The client joins it to /contents and /search, so both calls move together.
How many pages can one call read?
Up to 20 in urls or ids. A call with more gets 400 in Exa's error body; send the rest in a second call.
Which Exa Contents fields does SpecStream not return?
highlights, summary, image, favicon, subpages, extras, entities and author on a result, and context on the reply. Each result has id, url, title, publishedDate and text.

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 comes from its code and the pass table measured on production.

  1. Exa pricingexa.ai/docs/admin/pricing.md, read Nov 10, 2026
  2. Exa search referenceexa.ai/docs/reference/search.md, read Nov 10, 2026
  3. SpecStream Exa Contents pass tablespecstream.ai/specstream/dialects/exa_contents.md, read Nov 10, 2026
  4. Tavily API creditsdocs.tavily.com/documentation/api-credits.md, read Nov 10, 2026
  5. Firecrawl pricingfirecrawl.dev/pricing, read Nov 10, 2026
  6. Jina Readerjina.ai/reader, read Nov 10, 2026
  7. SpecStream benchmarksspecstream.ai/benchmarks, read Nov 10, 2026
  8. SpecStream pricingspecstream.ai/pricing, read Nov 10, 2026
  9. SpecStream for agentsspecstream.ai/agents.md, read Nov 10, 2026