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
| Exa | On typesearch |
|---|---|
query, numResults | Same. Up to 50 results (limited:numResults above that). |
type | instant → ultra · fast → fast · auto, neural, keyword, hybrid → normal · deep* → deep. |
includeDomains, excludeDomains | Same, up to 20. *.domain.com works too. |
startPublishedDate, endPublishedDate | Same. |
includeText, excludeText | Applied to title, standfirst and highlights (approximated:includeText). |
category | news or nothing. Any other category returns empty without searching or billing (unsupported:category). |
contents.highlights | Verbatim excerpts from the articles that were read; the standfirst for the others. |
contents.text | A short excerpt, never the full page (limited:text). |
contents.summary | Not generated: we don’t write summaries (unsupported:summary). |
/findSimilar | Articles in the index about the same story. excludeSourceDomain works. |
/contents | Metadata 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.