Skip to main content
Agent creates long-running tasks that can search, read, reason, enrich rows, and return answers with source grounding. Use it when a workflow needs more than a single search or contents call: open-ended research, list building, structured extraction, entity enrichment, or follow-up questions over previous results. For implementation examples and workflow guidance, start with the Agent guide.

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

  1. Create a run with POST /agent/runs.
  2. The agent queues and starts the run, returning an agent_run object immediately unless you request streaming.
  3. The run searches, reads, reasons, and writes until it completes, fails, is cancelled, or reaches the one-hour timeout.
  4. You poll GET /agent/runs/{id}, stream creation events, or replay stored events with GET /agent/runs/{id}/events.
  5. You can continue from a completed run by passing previousRunId to a new create request.

Endpoints

Run lifecycle

Runs progress through these statuses:
Completed, failed, and cancelled runs are terminal. Running or queued runs have stopReason: null. Terminal runs use one of these stop reasons:

Output

Each run returns an output object: outputSchema supports JSON Schema draft-07, 2019-09, and 2020-12 via $schema. Standard formats are supported, plus phone.
Agents return null for fields they cannot support from evidence rather than inventing values, even when your schema marks them as required or non-nullable. stopReason: schema_satisfied means the output matched the schema’s shape with those nulls allowed, not that it passes strict validation against your submitted schema. Treat fields as potentially nullable and skip records missing what you need.
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

Set Accept: 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:
Terminal event names are 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

Use effort 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. Use auto 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.
  • previousRunId is not available on ZDR runs.
  • Creating a run with Exa Connect dataSources set, returns a 400 error when ZDR is enabled.

Next steps