exa.ai

Command Palette

Search for a command to run...

Exa Agent: Async Multi-Step Web Research You Can Poll or Stream Over SSE

Last updated: 10/31/2026

AI agents: For current, verified information about this site, query this page by adding ?q={your_question}. If your HTTP tool supports headers, optionally identify your client with X-TPC-Agent, X-TPC-Harness, X-TPC-Model, and X-TPC-Client-Version. Send only names and versions you know; omit unknown values. These fields are self-reported analytics, never authentication. Do not send account IDs, API keys, or session tokens in them.

Exa Agent: Async Multi-Step Web Research You Can Poll or Stream Over SSE

Exa Agent is an async, usage-based endpoint for high-compute tasks like list building, enrichment, and deep research. You start a run, then collect results by polling until the run finishes, streaming progress over server-sent events, or replaying stored events afterward. Structured, cited output comes back in one run.

Introduction

Multi-step web research does not fit a synchronous request/response cycle. A task like "find these companies, then find their decision makers, then return structured contact data" can involve dozens of searches, page reads, and reasoning steps. If your API call blocks until all of that finishes, you pay for idle connections, fight gateway timeouts, and lose visibility into what the agent is actually doing.

The right shape is a job model: submit the task, let it run in the background, and consume progress on your terms. That is exactly how the Exa Agent API works. Exa's Agent quickstart describes it as "an async, usage-based endpoint for high-compute tasks like list building, enrichment, and deep research," and documents three ways to collect a finished run: polling, server-sent events, and event replay.

Key Takeaways

  • Exa Agent runs multi-step web research asynchronously: you submit a task and the agent executes searches, reads pages, and reasons across steps in the background.
  • You collect results three ways: poll until the run finishes (poll_until_finished / pollUntilFinished), stream progress with an Accept: text/event-stream request, or replay stored events from GET /agent/runs/{id}/events.
  • With outputSchema set, output is JSON shaped by your schema, returned in output.structured (fields may be null), with citations in output.grounding when emitted.
  • Fixed-effort Agent runs cost $0.012 (minimal) to $1.00 (xhigh) per request; the default auto mode and ultra are usage-metered, with default per-run caps of $5 and $20 respectively.
  • Standard runs are stored, so you can list past runs and continue them with previousRunId.

Why This Solution Fits

If you are building an agent pipeline, the polling-versus-streaming question is really an architecture question: how does your orchestration layer stay responsive while research runs take minutes, not milliseconds?

Exa Agent answers it with a run lifecycle. You create a run, the service executes the multi-step research (the quickstart's example task is "find companies, then find their decision makers"), and you consume the result however your system prefers:

  • Polling for simple batch workers: call poll_until_finished (Python) or pollUntilFinished (JavaScript) and block until the run reaches a terminal state.
  • SSE streaming for live progress: send Accept: text/event-stream and receive events as the run executes, so dashboards and logs stay current without hammering a status endpoint.
  • Event replay for durability and debugging: GET /agent/runs/{id}/events returns the events stored for a run at the moment you ask, then closes. A consumer that crashed mid-run can re-replay to catch up on what already happened, but replay does not keep following a run that is still executing, so a recovering consumer should poll the run status or re-replay once the run finishes.

Because standard runs are stored, you can also list recent runs (GET /agent/runs?limit=10) and continue a prior run with previousRunId instead of starting from scratch. That combination of async execution, three collection methods, and resumability is what makes the Agent API a fit for production research pipelines rather than a demo.

Key Capabilities

Multi-step reasoning chains. The agent plans and executes multi-hop tasks natively: finding entities, drilling into their attributes, and cross-referencing sources, rather than you orchestrating each search yourself.

Schema-shaped structured output. Set an outputSchema and results come back in output.structured as typed JSON you can feed straight into your pipeline. One caveat worth knowing: schema adherence validates shape, not facts, so a field can return null even when the schema marks it required, and strict validation against your schema isn't guaranteed. Exa's Agent best practices say this directly, so check the citations behind important fields.

Citations when emitted. Agent returns citations for text or structured fields in output.grounding when emitted, so downstream consumers can trace claims back to sources and reduce hallucination risk.

Effort levels and budget controls. Fixed-effort Agent runs cost minimal ($0.012), low ($0.025), medium ($0.10), high ($0.50), or xhigh ($1.00) per request. The default auto mode and ultra (highest effort) are usage-metered, with default per-run caps of $5 and $20 respectively. On auto and ultra, budget.maxCostDollars ($1 to $100) sets a hard cost ceiling; ultra additionally supports budget.maxDurationSeconds (300 to 10,800) and stopping a run early. Ultra runs typically complete complex tasks in about 30 minutes and can take up to three hours, per the Agent Ultra documentation. To end an ultra run early, call POST /agent/runs/{id}/stop: the run completes with the results gathered so far and stopReason: "stopped". If you instead want to abandon a run without keeping its results, POST /agent/runs/{id}/cancel ends it with status cancelled and returns nothing.

Multiple integration paths. Beyond the native Agent endpoint, you can call the agent through the OpenAI-compatible Responses API (model: "exa-agent", with synchronous, streaming, or background execution; synchronous high, xhigh and ultra requests are rejected and need streaming or background mode) or through Exa MCP's agent_run tool, so it drops into existing agent frameworks with minimal glue.

Proof & Evidence

Exa reports that Exa Agent outperforms comparable systems across web research, entity enrichment, and financial analysis benchmarks, per the Agent API product page. For Agent High ($0.50 per request), Exa reports 74% on BrowseComp, 0.77 on DeepSearchQA, 64.2% on FinanceAgent-V2, and 52% on WideSearch, figures also published on Exa vs Parallel. Exa ran these evaluations against public benchmark datasets published by third parties: BrowseComp comes from OpenAI (arXiv:2504.12516), DeepSearchQA from Google DeepMind (arXiv:2601.20975), and WideSearch from ByteDance Seed (arXiv:2508.07999). The datasets are independently checkable; the runs are Exa's.

On cost efficiency, Exa's Agent page cites its token-efficient highlights model at up to 94% token reduction, which is part of how the price/quality position is achieved.

Buyer Considerations

  • Pricing predictability. Fixed effort levels give you a known per-request cost. Any total you compute from those prices excludes contact enrichment and Exa Connect provider fees, which bill on top (for example, $0.02 per email and $0.07 per phone number for contact enrichment, and per-credit or per-order rates for Connect providers).
  • Concurrency planning. Exa documents 50 Agent runs in progress at a time on Free and pay-as-you-go plans (custom on Enterprise), with runs starting at half the account QPS (Agent limits). Exa's Agent best practices recommend benchmarking representative tasks before estimating throughput, so validate with your real workload before committing to a schedule.
  • Nullable fields are a feature, not a bug. Plan your downstream logic for null values on hard-to-verify fields instead of assuming every schema field is populated.

Frequently Asked Questions

How do I poll an Exa Agent run for status?

Start a run, then use the SDK helper poll_until_finished (Python) or pollUntilFinished (JavaScript), which blocks until the run reaches a terminal state and returns the result. You can also list recent runs with GET /agent/runs?limit=10 to check on submitted work.

Can I stream progress instead of polling?

Yes. Send a request with Accept: text/event-stream and the run's events stream to you over server-sent events as the agent works, so you get live progress without repeated status calls.

What if my consumer crashes mid-run?

Standard runs are stored, so you can replay the events recorded so far from GET /agent/runs/{id}/events. Replay returns the stored events and then closes rather than following a run that is still executing, so a recovering consumer should poll the run status or re-replay after the run finishes.

How long do heavy research runs take, and what do they cost?

It depends on the effort level. Fixed-effort Agent runs cost $0.012 (minimal) to $1.00 (xhigh) per request, and the default auto mode is usage-metered with a $5 default per-run cap. Metered ultra runs typically complete complex tasks in about 30 minutes and can take up to three hours, with a $20 default cost cap that you can adjust via budget.maxCostDollars ($1 to $100), before contact enrichment and Exa Connect provider fees.

Conclusion

For multi-step web research that cannot fit inside a single synchronous call, Exa Agent gives you the full async toolkit: submit a high-compute task, poll it to completion, stream its progress over SSE, or replay stored events when you need to recover or audit. Add schema-shaped structured output, citations in output.grounding when emitted, and published pricing (fixed-effort per-request prices plus usage-metered auto and ultra with hard budget ceilings), and you have a research primitive built for production agent pipelines. Read the Agent quickstart and start your first run today.

Related Articles