When to use
- Entity enrichment
- “Return structured intelligence on all input companies: recent brand partnerships, customer stories, and cloud provider investments”
- KYC / KYB intelligence
- “Provide a business profile for PepsiCo: legal name, HQ, revenue, key brands, segments, sourced from SEC filings and IR pages”
- List building
- “Find all engineering professors at UC Berkeley who specialize in AI or machine learning, with their lab name and recent publication”
- Deep research
- “Research the global R&D footprint of ArcelorMittal: every R&D site, center, lab, and university partnership worldwide with facility details and sources”
How it works
- Create a run with
POST /agent/runs. - The agent queues and starts the run, returning an
agent_runobject immediately unless you request streaming. - The run searches, reads, reasons, and writes until it completes, fails, is cancelled, or reaches the one-hour timeout.
- You poll
GET /agent/runs/{id}, stream creation events, or replay stored events withGET /agent/runs/{id}/events. - You can continue from a completed run by passing
previousRunIdto a new create request.
Endpoints
Run lifecycle
Runs progress through these statuses:stopReason: null. Terminal runs use one of these stop reasons:
Output
Each run returns anoutput object:
outputSchema supports JSON Schema draft-07, 2019-09, and 2020-12 via $schema. Standard formats are supported, plus phone.
To request contact information, include contact fields in outputSchema using standard JSON Schema string formats, for example { "type": "string", "format": "email" }. Bound arrays with maxItems when possible so the maximum contact-enrichment cost is predictable.
Create requests also accept effort, which controls the run’s cost and reasoning effort preference. Supported values are minimal, low, medium, high, xhigh, and auto; the default is auto.
Events and streaming
SetAccept: text/event-stream when you create a run to stream lifecycle events as they happen. You can also replay stored events later with GET /agent/runs/{id}/events.
Events use standard SSE framing:
agent_run.completed, agent_run.failed, and agent_run.cancelled.
Limits and pricing
Your Agent concurrency limit is one fifth of your account QPS. For pay-as-you-go accounts with default QPS, this means two active Agent runs at a time.Contact enrichment is separate from the core pricing components above: email contact enrichment is
$0.02 / email, and phone number contact enrichment is $0.07 / phone number.Effort
Useeffort to set a cost and reasoning effort preference for a run. Supported values are minimal, low, medium, high, xhigh, and auto; the default is auto. If a fixed effort is set, each run is charged at the following request price:
Choosing an effort mode
Fixed effort modes are best when you want predictable per-request cost on standard research tasks. Useauto for variable-scope tasks, especially list building or workflows where the number of entities can vary significantly from request to request.
Use
medium as the default starting point for standard single-entity research tasks. Move down to low or minimal when cost and latency matter more than completeness. Move up to high or xhigh when the output schema is larger, fields require verification, or the task needs deeper reasoning. Use auto when the task scope is not known ahead of time, such as list building or workflows where one request may return many entities.
Runtime varies by query difficulty, schema complexity, and external source availability. Treat effort modes as quality/cost/runtime tradeoffs rather than strict latency guarantees.
Zero Data Retention
Exa Agent supports Zero Data Retention (ZDR). ZDR is enabled per team — contact us to enable it for your account. When ZDR is enabled for your team:- Runs may be created with streaming (
Accept: text/event-stream). Consume the run’s output from the live SSE stream. It cannot be retrieved after the run completes. See Stream events for SDK and cURL examples and the complete event contract. - Alternatively, for use of Exa Agent asynchronously or within the Batch API, runs may be created without streaming and processing will be held open for up to 10 minutes to enable the final result to be collected via polling. The result cannot be retrieved if not collected within this time, as it is immediately deleted once processing completes.
- Exa does not retain your query, request, or output.
previousRunIdis not available on ZDR runs.- Creating a run with Exa Connect
dataSourcesset, returns a400error when ZDR is enabled.