Migrate from Exa

Keep exa-py or exa-js. Change the base URL and the key.

typesearch has a compatibility layer that speaks Exa’s API — same parameters, same response shape, same errors. With the official SDKs, migrating is two lines.

from exa_py import Exa

# before: exa = Exa(api_key=EXA_API_KEY)
exa = Exa(api_key=TYPESEARCH_API_KEY, base_url="https://api.typesearch.ai/compat/exa")

results = exa.search("el dólar", num_results=10, type="fast", include_domains=["infobae.com"])
similar = exa.find_similar(results.results[0].url, exclude_source_domain=True)
pages = exa.get_contents([r.url for r in results.results], highlights=True)

Supported: /search, /findSimilar and /contents. The key goes in the header the SDK already uses.

Parameters

ExaOn typesearch
query, numResultsSame. Up to 50 results (limited:numResults above that).
typeinstantultra · fastfast · auto, neural, keyword, hybridnormal · deep*deep.
includeDomains, excludeDomainsSame, up to 20. *.domain.com works too.
startPublishedDate, endPublishedDateSame.
includeText, excludeTextApplied to title, standfirst and highlights (approximated:includeText).
categorynews or nothing. Any other category returns empty without searching or billing (unsupported:category).
contents.highlightsVerbatim excerpts from the articles that were read; the standfirst for the others.
contents.textA short excerpt, never the full page (limited:text).
contents.summaryNot generated: we don’t write summaries (unsupported:summary).
/findSimilarArticles in the index about the same story. excludeSourceDomain works.
/contentsMetadata and short excerpts. With highlights.query, the model picks them.

Nothing breaks silently

What we don’t support is accepted and reported in the X-Compat-Warnings response header — ignored:…, limited:…, approximated:… or unsupported:… — so migrated code keeps running. Only what would change the meaning of a request is an error, in Exa’s format: { requestId, error, tag }.

Our extras

Add a typesearch field to the request body for what Exa doesn’t have — tone, essentials, a mode or a cost cap. It comes back in a typesearch field of the response. Any client that lets you add fields to the JSON body works:

curl https://api.typesearch.ai/compat/exa/search \
  -H "x-api-key: $TYPESEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "el dólar", "numResults": 5, "typesearch": { "tone": true, "mode": "normal" } }'

For everything else, the native API and our SDKs expose all of it.

What stays with Exa

People, company and research-paper indexes, full page text, and generated answers or summaries are not part of typesearch. If your product depends on them, keep those calls on Exa and move the rest.

On this page