Skip to article

Exa

Web search with separate highlights and native relevance, plus native content, answer, and workflow surfaces.

On this page

Normalized search

The normalized adapter uses automatic search and requests highlights. Highlight arrays remain separate from snippets. Native numeric scores are preserved. requestId contributes provenance and costDollars.total contributes USD usage.

exa-search.ts · server
import { createSearch } from '@belweave/search-sdk';
import { exa } from '@belweave/search-sdk/exa';

const apiKey = process.env.EXA_API_KEY;
if (!apiKey) throw new Error('EXA_API_KEY is required');

const client = createSearch({ provider: exa({ apiKey }) });
const response = await client.web.search({
  query: 'SQLite write concurrency',
  limit: 5,
});
console.log(response.results, response.attempts);

Native extracted text, answer generation, Websets, monitors, and team management have distinct response and credential requirements. They are not implicitly invoked by normalized search. Provider-native streaming data is not a SearchResponse.

1,200 include / 1,200 exclude.

Provider-native client

exa-native.ts · server
import { createExaClient } from '@belweave/search-sdk/native-exa';

const apiKey = process.env.EXA_API_KEY;
if (!apiKey) throw new Error('EXA_API_KEY is required');

const client = createExaClient({ apiKey, timeoutMs: 10_000 });
const response = await client.search({ body: { query: 'SQLite write concurrency', type: 'auto', numResults: 5 } });
console.log(response.data, response.metadata);

Read provider data from response.data and sanitized transport details from response.metadata. Native TypeScript response types are not runtime schema validation. Preserve the operation's native response and source identities.

Native operation inventory

Methods available on this native client. Paths are relative to each operation's fixed base; a provider may use more than one origin. Eligible operations retry only when you opt into a client retry policy.

74 / 74
MethodHTTP / relative pathResponse / retry eligibility
searchPOST /searchjson · no automatic retry
searchStreamPOST /searchSSE stream · no automatic retry
getContentsPOST /contentsjson · no automatic retry
answerPOST /answerjson · no automatic retry
answerStreamPOST /answerSSE stream · no automatic retry
findSimilarPOST /findSimilarjson · no automatic retry
createMonitorPOST /monitorsjson · no automatic retry
listMonitorsGET /monitorsjson · eligible
batchMonitorsPOST /monitors/batchjson · no automatic retry
getMonitorGET /monitors/{id}json · eligible
updateMonitorPATCH /monitors/{id}json · no automatic retry
deleteMonitorDELETE /monitors/{id}json · no automatic retry
triggerMonitorPOST /monitors/{id}/triggerjson · no automatic retry
listMonitorRunsGET /monitors/{id}/runsjson · eligible
getMonitorRunGET /monitors/{id}/runs/{runId}json · eligible
createAgentRunPOST /agent/runsjson · no automatic retry
createAgentRunStreamPOST /agent/runsSSE stream · no automatic retry
listAgentRunsGET /agent/runsjson · eligible
getAgentRunGET /agent/runs/{id}json · eligible
deleteAgentRunDELETE /agent/runs/{id}json · no automatic retry
cancelAgentRunPOST /agent/runs/{id}/canceljson · no automatic retry
stopAgentRunPOST /agent/runs/{id}/stopjson · no automatic retry
listAgentRunEventsGET /agent/runs/{id}/eventsjson · eligible
listAgentRunEventsStreamGET /agent/runs/{id}/eventsSSE stream · no automatic retry
createBatchPOST /batchesjson · no automatic retry
listBatchesGET /batchesjson · eligible
getBatchGET /batches/{id}json · eligible
deleteBatchDELETE /batches/{id}json · no automatic retry
cancelBatchPOST /batches/{id}/canceljson · no automatic retry
getTeamInfoGET /v0/teams/mejson · eligible
createWebsetPOST /v0/websetsjson · no automatic retry
listWebsetsGET /v0/websetsjson · eligible
getWebsetGET /v0/websets/{id}json · eligible
updateWebsetPOST /v0/websets/{id}json · no automatic retry
deleteWebsetDELETE /v0/websets/{id}json · no automatic retry
cancelWebsetPOST /v0/websets/{id}/canceljson · no automatic retry
createWebsetSearchPOST /v0/websets/{webset}/searchesjson · no automatic retry
getWebsetSearchGET /v0/websets/{webset}/searches/{id}json · eligible
cancelWebsetSearchPOST /v0/websets/{webset}/searches/{id}/canceljson · no automatic retry
createWebsetEnrichmentPOST /v0/websets/{webset}/enrichmentsjson · no automatic retry
updateWebsetEnrichmentPATCH /v0/websets/{webset}/enrichments/{id}text · no automatic retry
getWebsetEnrichmentGET /v0/websets/{webset}/enrichments/{id}json · eligible
deleteWebsetEnrichmentDELETE /v0/websets/{webset}/enrichments/{id}json · no automatic retry
cancelWebsetEnrichmentPOST /v0/websets/{webset}/enrichments/{id}/canceljson · no automatic retry
getWebsetItemGET /v0/websets/{webset}/items/{id}json · eligible
deleteWebsetItemDELETE /v0/websets/{webset}/items/{id}json · no automatic retry
listWebsetItemsGET /v0/websets/{webset}/itemsjson · eligible
previewWebsetPOST /v0/websets/previewjson · no automatic retry
createWebsetMonitorPOST /v0/monitorsjson · no automatic retry
listWebsetMonitorsGET /v0/monitorsjson · eligible
getWebsetMonitorGET /v0/monitors/{id}json · eligible
updateWebsetMonitorPATCH /v0/monitors/{id}json · no automatic retry
deleteWebsetMonitorDELETE /v0/monitors/{id}json · no automatic retry
listWebsetMonitorRunsGET /v0/monitors/{monitor}/runsjson · eligible
getWebsetMonitorRunGET /v0/monitors/{monitor}/runs/{id}json · eligible
createImportPOST /v0/importsjson · no automatic retry
listImportsGET /v0/importsjson · eligible
getImportGET /v0/imports/{id}json · eligible
updateImportPATCH /v0/imports/{id}json · no automatic retry
deleteImportDELETE /v0/imports/{id}json · no automatic retry
createWebhookPOST /v0/webhooksjson · no automatic retry
listWebhooksGET /v0/webhooksjson · eligible
getWebhookGET /v0/webhooks/{id}json · eligible
updateWebhookPATCH /v0/webhooks/{id}json · no automatic retry
deleteWebhookDELETE /v0/webhooks/{id}json · no automatic retry
listWebhookAttemptsGET /v0/webhooks/{id}/attemptsjson · eligible
listEventsGET /v0/eventsjson · eligible
getEventGET /v0/events/{id}json · eligible
createApiKeyPOST /api-keysjson · no automatic retry
listApiKeysGET /api-keysjson · eligible
getApiKeyGET /api-keys/{id}json · eligible
updateApiKeyPUT /api-keys/{id}json · no automatic retry
deleteApiKeyDELETE /api-keys/{id}json · no automatic retry
getApiKeyUsageGET /api-keys/{id}/usagejson · eligible

Limits and operation lifecycle

  • Pass signal and per-call timeoutMs on native request input when needed.
  • Persist a returned job identifier before explicitly reading or polling the same job. Native clients do not automatically poll.
  • SSE data is incremental provider event text. Parse and validate terminal or error events according to the provider contract; there is no reconnect or replay.
  • Native operations may create, delete, ingest, or incur charges. A successful HTTP response is not proof that a remote job completed.

Official sources

Use the official reference for current schemas, account access, and operation-specific requirements.