Exa

App · AI Search & Memory · 19 actions

Search the web, read and summarize pages, answer questions with cited sources, run research agents that build and enrich lists, and monitor the web for new results, using Exa.

Actions

ActionWhat it does
Answer a questionAsk a question and get a written answer from Exa, along with the web pages the answer was based on.
Cancel a research agent runCancel a queued or running research agent run straight away, without its results.
Check a research agent runCheck a research agent run by its ID and get the result once it has finished.
Create a monitorHave Exa run a search on a schedule and send only what is new since the last run to a web address, such as news about a competitor or new funding rounds in a market.
Delete a monitorDelete a monitor for good.
Delete a research agent runPermanently delete a stored research agent run and its result.
Find similar pagesFind web pages that are similar to a page you provide.
Get a monitorGet a monitor's search, schedule and status by its ID.
Get a monitor runGet one run of a monitor by its ID, with what it found.
Get page contentsGet the full text of one or more web pages by their web address.
List monitor runsList a monitor's runs, newest first, with what each found.
List monitorsList your team's monitors.
List research agent runsList your team's research agent runs, newest first.
Run a monitor nowRun a monitor straight away, whatever its schedule, and get the pages it finds that no earlier run returned.
Run a research agentHand Exa Agent a research task, such as building a list of companies or enriching records you already have, and get back a cited answer or structured data.
Search the webSearch the web with Exa and get a list of matching pages, and optionally a written answer drawn from them.
Stop a research agent run earlyHave an Ultra research agent run finish now and keep what it has found so far.
Summarize web pagesSummarize one or more web pages by their web address, focused on a question or topic you provide.
Update a monitorChange a monitor's search, schedule or destination, or pause and resume it.

Answer a question

Ask a question and get a written answer from Exa, along with the web pages the answer was based on.

Inputs

QuestionquerytextRequired
The question to answer, such as 'What is the latest valuation of SpaceX?'.
Include source page textinclude_sources_texttrue/false
Also return the text of each source page alongside the answer. Leave off unless a later step needs to read the sources.Default: false.
Instructionssystem_prompttext
Guidance on how to answer, such as the sources to prefer, the tone, or how long the answer should be.
Answer fields (JSON Schema)output_schematext
A JSON Schema for the answer, to get named fields back instead of text, for example {"type": "object", "properties": {"valuation": {"type": "string"}, "date": {"type": "string"}}}. Leave blank for a written answer.
Countryuser_locationtext
Favour results for readers in this country, as a two-letter code such as US, GB or FR.

Outputs

answertext
The written answer, or named fields when an answer schema was given.
source_countnumber
How many sources were used.
sourceslist
The web pages the answer was based on.
Example output
{
  "answer": "SpaceX was most recently valued at $350 billion.",
  "source_count": 1,
  "sources": [
    {
      "id": "https://example.com/spacex-valuation",
      "title": "SpaceX valuation report",
      "url": "https://example.com/spacex-valuation"
    }
  ]
}

Cancel a research agent run

Cancel a queued or running research agent run straight away, without its results. Usage so far is still billed. A run that already finished is returned as it is.

Inputs

Run IDrun_idtextRequired
The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

Outputs

answertext
The agent's written answer or summary.
completedtrue/false
Whether the run finished and its result is included.
completed_attext
When the run finished.
cost_dollarsnumber
What the run cost, in US dollars.
created_attext
When the run started.
efforttext
The effort level the run used.
groundinglist
The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
querytext
What the agent was asked.
run_idtext
Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
statustext
queued, running, completed, failed or cancelled.
stop_reasontext
Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
structuredobject
The result in the shape the output schema asked for. Empty when no schema was given. Fields the evidence could not support are empty.
Example output
{
  "answer": null,
  "completed": false,
  "completed_at": "2026-10-14T09:01:12.000Z",
  "cost_dollars": 0.1,
  "created_at": "2026-10-14T09:00:00.000Z",
  "effort": "medium",
  "grounding": [],
  "query": "Find three open source vector databases and who maintains each.",
  "run_id": "agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5",
  "status": "cancelled",
  "stop_reason": "cancelled",
  "structured": null
}

Check a research agent run

Check a research agent run by its ID and get the result once it has finished. Use this to collect a run that outlasted the wait on 'Run a research agent'.

Inputs

Run IDrun_idtextRequired
The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

Outputs

answertext
The agent's written answer or summary.
completedtrue/false
Whether the run finished and its result is included.
completed_attext
When the run finished.
cost_dollarsnumber
What the run cost, in US dollars.
created_attext
When the run started.
efforttext
The effort level the run used.
groundinglist
The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
querytext
What the agent was asked.
run_idtext
Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
statustext
queued, running, completed, failed or cancelled.
stop_reasontext
Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
structuredobject
The result in the shape the output schema asked for. Empty when no schema was given. Fields the evidence could not support are empty.
Example output
{
  "answer": "Milvus (Zilliz), Qdrant (Qdrant Solutions) and Weaviate (Weaviate B.V.).",
  "completed": true,
  "completed_at": "2026-10-14T09:01:12.000Z",
  "cost_dollars": 0.1,
  "created_at": "2026-10-14T09:00:00.000Z",
  "effort": "medium",
  "grounding": [
    {
      "citations": [
        {
          "title": "Milvus",
          "url": "https://milvus.io/docs/overview.md"
        }
      ],
      "confidence": "high",
      "field": "databases[0].maintainer"
    }
  ],
  "query": "Find three open source vector databases and who maintains each.",
  "run_id": "agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5",
  "status": "completed",
  "stop_reason": "schema_satisfied",
  "structured": {
    "databases": [
      {
        "maintainer": "Zilliz",
        "name": "Milvus"
      },
      {
        "maintainer": "Qdrant Solutions",
        "name": "Qdrant"
      },
      {
        "maintainer": "Weaviate B.V.",
        "name": "Weaviate"
      }
    ]
  }
}

Create a monitor

Have Exa run a search on a schedule and send only what is new since the last run to a web address, such as news about a competitor or new funding rounds in a market.

Inputs

What to watch forquerytextRequired
The search to repeat, describing the ongoing news or pages to track, for example 'new battery recycling plants announced in North America'. Don't add dates: each run only returns what earlier runs did not.
Send results towebhook_urltextRequired
The https:// address Exa sends each finished run to. It must be public: Exa refuses localhost, private addresses and example.com. Exa signs every delivery with the 'webhook_secret' this step returns.
Namenametext
A name to recognise the monitor by.
How oftenperiodtext
How often the monitor runs. Runs can start up to 30 minutes late. Choose 'Only when run from a workflow' to run it with 'Run a monitor now' alone.One of: 1h (Every hour), 6h (Every 6 hours), 12h (Every 12 hours), 1d (Every day), 7d (Every week), manual (Only when run from a workflow). Default: 1d.
Results per runnum_resultsnumber
The most new pages each run returns (1-100).From 1 to 100. Default: 10.
Websites to includeinclude_domainslist
Only show results from these websites (for example, nytimes.com). A path such as exa.ai/blog or a wildcard such as *.substack.com also works.
Websites to excludeexclude_domainslist
Leave out results from these websites (for example, reddit.com).
Include relevant excerptsinclude_highlightstrue/false
Include the passages of each page that best match the search.Default: true.
What to write upoutput_schematext
Describe what Exa should write up from each run's new results, for example 'Each announcement with the company and where it is'. Or paste a JSON Schema whose "type" is "object" to get named fields back. Leave blank for a short text summary.
Labelsmetadataobject
Names and values Exa keeps with the monitor and sends with every delivery, such as team: sales, to route the results.

Outputs

created_attext
When the monitor was created.
metadataobject
The monitor's labels.
monitor_idtext
Exa's ID for the monitor.
nametext
The monitor's name.
next_run_attext
When it next runs.
output_schemaobject
What Exa writes up from each run's results.
periodtext
How often it runs, such as 1d. Empty when it runs only when triggered.
querytext
What the monitor searches for.
searchobject
The monitor's full search settings.
statustext
active (runs on its schedule and when run now), paused (does not run at all until made active again) or disabled (Exa turned it off after repeated failures).
updated_attext
When the monitor was last changed.
webhook_secrettext
The secret Exa signs deliveries with. Exa shows it only this once, so store it if you check signatures.
webhook_urltext
Where Exa sends each finished run.
Example output
{
  "created_at": "2026-10-14T09:00:00.000Z",
  "metadata": null,
  "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
  "name": "Battery recycling expansion",
  "next_run_at": "2026-10-15T09:00:00.000Z",
  "output_schema": {
    "type": "text"
  },
  "period": "1d",
  "query": "new battery recycling facilities announced in North America",
  "search": {
    "contents": {
      "highlights": true
    },
    "numResults": 10,
    "query": "new battery recycling facilities announced in North America"
  },
  "status": "active",
  "updated_at": "2026-10-14T09:00:00.000Z",
  "webhook_secret": "whsec_example",
  "webhook_url": "https://example.com/webhooks/exa"
}

Delete a monitor

Delete a monitor for good. Its schedule stops at once.

Inputs

Monitor IDmonitor_idtextRequired
The monitor's ID, as returned by 'Create a monitor'.

Outputs

created_attext
When the monitor was created.
deletedtrue/false
Whether the monitor was deleted.
metadataobject
The monitor's labels.
monitor_idtext
Exa's ID for the monitor.
nametext
The monitor's name.
next_run_attext
When it next runs.
output_schemaobject
What Exa writes up from each run's results.
periodtext
How often it runs, such as 1d. Empty when it runs only when triggered.
querytext
What the monitor searches for.
searchobject
The monitor's full search settings.
statustext
active (runs on its schedule and when run now), paused (does not run at all until made active again) or disabled (Exa turned it off after repeated failures).
updated_attext
When the monitor was last changed.
webhook_urltext
Where Exa sends each finished run.
Example output
{
  "created_at": "2026-10-14T09:00:00.000Z",
  "deleted": true,
  "metadata": null,
  "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
  "name": "Battery recycling expansion",
  "next_run_at": "2026-10-15T09:00:00.000Z",
  "output_schema": {
    "type": "text"
  },
  "period": "1d",
  "query": "new battery recycling facilities announced in North America",
  "search": {
    "contents": {
      "highlights": true
    },
    "numResults": 10,
    "query": "new battery recycling facilities announced in North America"
  },
  "status": "active",
  "updated_at": "2026-10-14T09:00:00.000Z",
  "webhook_url": "https://example.com/webhooks/exa"
}

Delete a research agent run

Permanently delete a stored research agent run and its result.

Inputs

Run IDrun_idtextRequired
The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

Outputs

deletedtrue/false
Whether the run was deleted.
run_idtext
The deleted run's ID.
Example output
{
  "deleted": true,
  "run_id": "agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5"
}

Find similar pages

Find web pages that are similar to a page you provide. Exa has deprecated this in favour of search, so for new workflows use 'Search the web' with a query describing the page.

Inputs

Web page addressurltextRequired
The web address (URL) of the page to find similar pages for.
Number of resultsnum_resultsnumber
How many similar pages to return (1-100). Defaults to 10.Default: 10.
Skip the same websiteexclude_source_domaintrue/false
Leave out other pages from the same website as the page you provided.Default: false.

Outputs

result_countnumber
How many results were returned.
resultslist
The similar web pages.
Example output
{
  "result_count": 1,
  "results": [
    {
      "id": "similar-123",
      "score": 0.87,
      "title": "Related Article",
      "url": "https://similar-site.com/article"
    }
  ]
}

Get a monitor

Get a monitor's search, schedule and status by its ID.

Inputs

Monitor IDmonitor_idtextRequired
The monitor's ID, as returned by 'Create a monitor'.

Outputs

created_attext
When the monitor was created.
metadataobject
The monitor's labels.
monitor_idtext
Exa's ID for the monitor.
nametext
The monitor's name.
next_run_attext
When it next runs.
output_schemaobject
What Exa writes up from each run's results.
periodtext
How often it runs, such as 1d. Empty when it runs only when triggered.
querytext
What the monitor searches for.
searchobject
The monitor's full search settings.
statustext
active (runs on its schedule and when run now), paused (does not run at all until made active again) or disabled (Exa turned it off after repeated failures).
updated_attext
When the monitor was last changed.
webhook_urltext
Where Exa sends each finished run.
Example output
{
  "created_at": "2026-10-14T09:00:00.000Z",
  "metadata": null,
  "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
  "name": "Battery recycling expansion",
  "next_run_at": "2026-10-15T09:00:00.000Z",
  "output_schema": {
    "type": "text"
  },
  "period": "1d",
  "query": "new battery recycling facilities announced in North America",
  "search": {
    "contents": {
      "highlights": true
    },
    "numResults": 10,
    "query": "new battery recycling facilities announced in North America"
  },
  "status": "active",
  "updated_at": "2026-10-14T09:00:00.000Z",
  "webhook_url": "https://example.com/webhooks/exa"
}

Get a monitor run

Get one run of a monitor by its ID, with what it found.

Inputs

Monitor IDmonitor_idtextRequired
The monitor's ID, as returned by 'Create a monitor'.
Run IDrun_idtextRequired
The run's ID, from 'Run a monitor now' or 'List monitor runs'.

Outputs

completedtrue/false
Whether the run finished.
completed_attext
When the run finished.
contenttext
What Exa wrote up from the new pages: text, or named fields when the monitor has a JSON Schema.
created_attext
When the run was created.
duration_msnumber
How long the run took, in milliseconds.
fail_reasontext
Why the run failed, such as insufficient_credits or source_not_available. Empty unless it failed.
groundinglist
The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
monitor_idtext
The monitor that ran.
result_countnumber
How many new pages it found.
resultslist
The pages this run found that no earlier run of the monitor returned.
run_idtext
Exa's ID for the run.
statustext
pending, running, completed, failed or cancelled.
Example output
{
  "completed": true,
  "completed_at": "2026-10-14T09:00:21.000Z",
  "content": "A recycler opened a 20,000-tonne battery plant in Nevada.",
  "created_at": "2026-10-14T09:00:00.000Z",
  "duration_ms": 21000,
  "fail_reason": null,
  "grounding": [
    {
      "citations": [
        {
          "title": "Recycler opens Nevada battery plant",
          "url": "https://example.com/news/nevada-battery-plant"
        }
      ],
      "confidence": "high",
      "field": "content"
    }
  ],
  "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
  "result_count": 1,
  "results": [
    {
      "highlights": [
        "The plant will process 20,000 tonnes a year."
      ],
      "publishedDate": "2026-10-13T00:00:00.000Z",
      "title": "Recycler opens Nevada battery plant",
      "url": "https://example.com/news/nevada-battery-plant"
    }
  ],
  "run_id": "01k4da2b7c9d1e3f5g7h9j1k3m",
  "status": "completed"
}

Get page contents

Get the full text of one or more web pages by their web address.

Inputs

Web page addressesurlslistRequired
A list of web addresses (URLs) of the pages to read, such as those from an earlier search. Pass a list even when there is only one page.
Character limit per pagemax_charactersnumber
Trim each page to this many characters. Leave blank to get the whole page.At least 1.
Page freshness (hours)max_age_hoursnumber
Use Exa's stored copy of a page only when it is younger than this many hours; otherwise Exa fetches the page again. 0 always fetches a fresh copy (slower) and -1 never does. Leave blank for Exa's default.From -1 to 720.
Linked pages to readsubpagesnumber
Also read up to this many pages linked from each page, such as a company's About and Pricing pages (0-100). They come back under each page's 'subpages'.From 0 to 100.
Linked pages to look forsubpage_targetlist
Words that pick which linked pages to read, such as pricing or about. Only used with 'Linked pages to read'.

Outputs

content_countnumber
How many pages were returned.
contentslist
The text content of each page.
failedlist
Pages Exa could not read, each with its web address and the reason, such as CRAWL_NOT_FOUND.
failed_countnumber
How many pages could not be read.
Example output
{
  "content_count": 1,
  "contents": [
    {
      "id": "https://example.com/article",
      "text": "Full article content here...",
      "title": "Example Article",
      "url": "https://example.com/article"
    }
  ],
  "failed": [],
  "failed_count": 0
}

List monitor runs

List a monitor's runs, newest first, with what each found.

Inputs

Monitor IDmonitor_idtextRequired
The monitor's ID, as returned by 'Create a monitor'.
Results per pagelimitnumber
How many to return at once (1-100). Defaults to 20.From 1 to 100. Default: 20.
Next pagecursortext
To get the next page, the 'next_cursor' from the previous page. Leave blank for the first page.

Outputs

has_moretrue/false
Whether there are more runs to fetch.
next_cursortext
Pass as 'Next page' to get the next page.
run_countnumber
How many runs are on this page.
runslist
The runs, each with its ID, status and the new pages it found.
Example output
{
  "has_more": false,
  "next_cursor": null,
  "run_count": 1,
  "runs": [
    {
      "completed": true,
      "completed_at": "2026-10-14T09:00:21.000Z",
      "content": "A recycler opened a 20,000-tonne battery plant in Nevada.",
      "created_at": "2026-10-14T09:00:00.000Z",
      "duration_ms": 21000,
      "fail_reason": null,
      "grounding": [
        {
          "citations": [
            {
              "title": "Recycler opens Nevada battery plant",
              "url": "https://example.com/news/nevada-battery-plant"
            }
          ],
          "confidence": "high",
          "field": "content"
        }
      ],
      "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
      "result_count": 1,
      "results": [
        {
          "highlights": [
            "The plant will process 20,000 tonnes a year."
          ],
          "publishedDate": "2026-10-13T00:00:00.000Z",
          "title": "Recycler opens Nevada battery plant",
          "url": "https://example.com/news/nevada-battery-plant"
        }
      ],
      "run_id": "01k4da2b7c9d1e3f5g7h9j1k3m",
      "status": "completed"
    }
  ]
}

List monitors

List your team's monitors.

Inputs

Statusstatustext
Only list monitors in this state. Leave blank for all.One of: active, paused, disabled.
Name containsnametext
Only list monitors whose name contains this text.
Results per pagelimitnumber
How many to return at once (1-100). Defaults to 20.From 1 to 100. Default: 20.
Next pagecursortext
To get the next page, the 'next_cursor' from the previous page. Leave blank for the first page.

Outputs

has_moretrue/false
Whether there are more monitors to fetch.
monitor_countnumber
How many monitors are on this page.
monitorslist
The monitors, each with its ID, name, status, search and schedule.
next_cursortext
Pass as 'Next page' to get the next page.
Example output
{
  "has_more": false,
  "monitor_count": 1,
  "monitors": [
    {
      "created_at": "2026-10-14T09:00:00.000Z",
      "metadata": null,
      "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
      "name": "Battery recycling expansion",
      "next_run_at": "2026-10-15T09:00:00.000Z",
      "output_schema": {
        "type": "text"
      },
      "period": "1d",
      "query": "new battery recycling facilities announced in North America",
      "search": {
        "contents": {
          "highlights": true
        },
        "numResults": 10,
        "query": "new battery recycling facilities announced in North America"
      },
      "status": "active",
      "updated_at": "2026-10-14T09:00:00.000Z",
      "webhook_url": "https://example.com/webhooks/exa"
    }
  ],
  "next_cursor": null
}

List research agent runs

List your team's research agent runs, newest first.

Inputs

Results per pagelimitnumber
How many to return at once (1-100). Defaults to 20.From 1 to 100. Default: 20.
Next pagecursortext
To get the next page, the 'next_cursor' from the previous page. Leave blank for the first page.

Outputs

has_moretrue/false
Whether there are more runs to fetch.
next_cursortext
Pass as 'Next page' to get the next page.
run_countnumber
How many runs are on this page.
runslist
The runs, each with its ID, status, task, answer and cost.
Example output
{
  "has_more": false,
  "next_cursor": null,
  "run_count": 1,
  "runs": [
    {
      "answer": "Milvus (Zilliz), Qdrant (Qdrant Solutions) and Weaviate (Weaviate B.V.).",
      "completed": true,
      "completed_at": "2026-10-14T09:01:12.000Z",
      "cost_dollars": 0.1,
      "created_at": "2026-10-14T09:00:00.000Z",
      "effort": "medium",
      "grounding": [
        {
          "citations": [
            {
              "title": "Milvus",
              "url": "https://milvus.io/docs/overview.md"
            }
          ],
          "confidence": "high",
          "field": "databases[0].maintainer"
        }
      ],
      "query": "Find three open source vector databases and who maintains each.",
      "run_id": "agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5",
      "status": "completed",
      "stop_reason": "schema_satisfied",
      "structured": {
        "databases": [
          {
            "maintainer": "Zilliz",
            "name": "Milvus"
          },
          {
            "maintainer": "Qdrant Solutions",
            "name": "Qdrant"
          },
          {
            "maintainer": "Weaviate B.V.",
            "name": "Weaviate"
          }
        ]
      }
    }
  ]
}

Run a monitor now

Run a monitor straight away, whatever its schedule, and get the pages it finds that no earlier run returned. The results also go to the monitor's web address. The monitor must be active: Exa refuses to run a paused one.

Inputs

Monitor IDmonitor_idtextRequired
The monitor's ID, as returned by 'Create a monitor'.
How long to waitwait_secondsnumber
How long this step waits for the run's results, in seconds (default 120, maximum 600; 0 starts the run without waiting). If the run is still going when the wait runs out, use 'Get a monitor run' later.From 0 to 600. Default: 120.

Outputs

completedtrue/false
Whether the run finished.
completed_attext
When the run finished.
contenttext
What Exa wrote up from the new pages: text, or named fields when the monitor has a JSON Schema.
created_attext
When the run was created.
duration_msnumber
How long the run took, in milliseconds.
fail_reasontext
Why the run failed, such as insufficient_credits or source_not_available. Empty unless it failed.
groundinglist
The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
monitor_idtext
The monitor that ran.
result_countnumber
How many new pages it found.
resultslist
The pages this run found that no earlier run of the monitor returned.
run_idtext
Exa's ID for the run.
statustext
pending, running, completed, failed or cancelled.
timed_outtrue/false
True when the wait ran out before the run finished. The run keeps going on Exa's side.
triggeredtrue/false
Whether Exa started a run.
Example output
{
  "completed": true,
  "completed_at": "2026-10-14T09:00:21.000Z",
  "content": "A recycler opened a 20,000-tonne battery plant in Nevada.",
  "created_at": "2026-10-14T09:00:00.000Z",
  "duration_ms": 21000,
  "fail_reason": null,
  "grounding": [
    {
      "citations": [
        {
          "title": "Recycler opens Nevada battery plant",
          "url": "https://example.com/news/nevada-battery-plant"
        }
      ],
      "confidence": "high",
      "field": "content"
    }
  ],
  "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
  "result_count": 1,
  "results": [
    {
      "highlights": [
        "The plant will process 20,000 tonnes a year."
      ],
      "publishedDate": "2026-10-13T00:00:00.000Z",
      "title": "Recycler opens Nevada battery plant",
      "url": "https://example.com/news/nevada-battery-plant"
    }
  ],
  "run_id": "01k4da2b7c9d1e3f5g7h9j1k3m",
  "status": "completed",
  "timed_out": false,
  "triggered": true
}

Run a research agent

Hand Exa Agent a research task, such as building a list of companies or enriching records you already have, and get back a cited answer or structured data. The agent runs many searches, reads the pages and checks what it finds.

Inputs

TaskquerytextRequired
What the agent should find, written as a self-contained request: the kind of thing, how many, the criteria and the evidence needed. For example, 'Find 10 US fintech companies that raised a Series A this year, with their website and lead investor'.
Effortefforttext
How much research to do, and so what the run costs. Medium suits most single-topic research. Automatic adapts to the task, which suits lists of unknown size, and Ultra is the most thorough; both are billed by use up to a cap. Longer runs can outlast the wait below, in which case this step hands back a run ID to collect later.One of: minimal (Minimal ($0.012 per run)), low (Low ($0.025 per run)), medium (Medium ($0.10 per run, recommended)), high (High ($0.50 per run)), xhigh (Extra high ($1 per run)), auto (Automatic (billed by use, up to $5)), ultra (Ultra (billed by use, up to $20, slowest)). Default: medium.
Result fields (JSON Schema)output_schematext
A JSON Schema for the result, to get named fields back in 'structured', for example a list of companies with a name and website each. Set 'maxItems' on lists to bound the cost. Leave blank for a written answer.
Instructionssystem_prompttext
Guidance on how the agent should research and present the result, such as the sources to trust or what counts as a match.
Records to enrichinput_recordslist
Records you already have for the agent to research or fill in, such as the rows from an earlier step. Each record is a set of named values.
Records to leave outexclude_recordslist
Records or entities the agent should not return, such as companies already on your list.
Continue from runprevious_run_idtext
The ID of an earlier run to follow up on, for example with 'Find 10 more'. The new run gets its own ID.
Premium data sourcesdata_sourceslist
Exa Connect partners the agent may also query, alongside the web. Their use is billed on top of the run.One or more of: fiber (Fiber.ai (companies and people)), financial_datasets (Financial Datasets (US stocks and filings)), similarweb (Similarweb (web traffic)), baselayer (Baselayer (US business verification)), affiliate (Affiliate.com (products)), particle (Particle (podcast transcripts)), jinko (Jinko (flights and hotels)), polymarket (Polymarket (prediction markets)), macrobond (Macrobond (economic data)).
Spending cap (US dollars)max_cost_dollarsnumber
The most this run may spend, $1-$100. Leave blank for Exa's default cap ($5 for Automatic, $20 for Ultra).Only when Effort is Automatic (billed by use, up to $5) or Ultra (billed by use, up to $20, slowest). From 1 to 100.
Time limit (minutes)max_duration_minutesnumber
Have the run wrap up with what it has found after this many minutes (5-180).Only when Effort is Ultra (billed by use, up to $20, slowest). From 5 to 180.
How long to waitmax_wait_secondsnumber
How long this step waits for the run to finish, in seconds (default 300, maximum 900; 0 starts the run without waiting). If the run is still going when the wait runs out, the step succeeds and returns its run ID, so use 'Check a research agent run' later to collect the result.From 0 to 900. Default: 300.

Outputs

answertext
The agent's written answer or summary.
completedtrue/false
Whether the run finished and its result is included.
completed_attext
When the run finished.
cost_dollarsnumber
What the run cost, in US dollars.
created_attext
When the run started.
efforttext
The effort level the run used.
groundinglist
The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
querytext
What the agent was asked.
run_idtext
Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
statustext
queued, running, completed, failed or cancelled.
stop_reasontext
Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
structuredobject
The result in the shape the output schema asked for. Empty when no schema was given. Fields the evidence could not support are empty.
timed_outtrue/false
True when the wait ran out before the run finished. The run keeps going on Exa's side.
Example output
{
  "answer": "Milvus (Zilliz), Qdrant (Qdrant Solutions) and Weaviate (Weaviate B.V.).",
  "completed": true,
  "completed_at": "2026-10-14T09:01:12.000Z",
  "cost_dollars": 0.1,
  "created_at": "2026-10-14T09:00:00.000Z",
  "effort": "medium",
  "grounding": [
    {
      "citations": [
        {
          "title": "Milvus",
          "url": "https://milvus.io/docs/overview.md"
        }
      ],
      "confidence": "high",
      "field": "databases[0].maintainer"
    }
  ],
  "query": "Find three open source vector databases and who maintains each.",
  "run_id": "agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5",
  "status": "completed",
  "stop_reason": "schema_satisfied",
  "structured": {
    "databases": [
      {
        "maintainer": "Zilliz",
        "name": "Milvus"
      },
      {
        "maintainer": "Qdrant Solutions",
        "name": "Qdrant"
      },
      {
        "maintainer": "Weaviate B.V.",
        "name": "Weaviate"
      }
    ]
  },
  "timed_out": false
}

Search the web

Search the web with Exa and get a list of matching pages, and optionally a written answer drawn from them.

Inputs

QueryquerytextRequired
What to search for.
Number of resultsnum_resultsnumber
How many results to return (1-100). Defaults to 10.Default: 10.
Search typetypetext
How hard Exa works on the search. 'Automatic' suits almost every case; the faster types trade some quality for speed, and the deep types research across several steps and can take up to a minute.One of: auto (Automatic (recommended)), fast, instant (Instant (lowest quality)), deep-lite (Deep (lightweight)), deep (Deep (multi-step research)), deep-reasoning (Deep (maximum reasoning, slowest)). Default: auto.
Focus on a categorycategorytext
Narrow results to a specific type of page. Leave blank to search everything. Companies and People are drawn from Exa's own indexes and don't support the date filters or 'Websites to exclude'.One of: company (Companies), people (People (professional profiles)), publication (Publications (research papers)), news, personal site (Personal sites), financial report (Financial reports).
Websites to includeinclude_domainslist
Only show results from these websites (for example, nytimes.com). A path such as exa.ai/blog or a wildcard such as *.substack.com also works.
Websites to excludeexclude_domainslist
Leave out results from these websites (for example, reddit.com).
Published afterstart_published_datedate
Only show pages published on or after this date, in YYYY-MM-DD format.
Published beforeend_published_datedate
Only show pages published on or before this date, in YYYY-MM-DD format.
Include relevant excerptsinclude_highlightstrue/false
Include the passages of each page that best match the search, so later steps can read the findings without fetching every page.Default: true.
Include page textinclude_texttrue/false
Also include the text of each page, trimmed to 8,000 characters. Leave off unless a later step needs the full page, since the excerpts above are usually enough.Default: false.
Summarize each resultsummary_querytext
Have Exa write a short summary of each result, focused on this question or topic, for example 'What does the company sell?'. Summaries are billed per result. Leave blank for none.
Answer to write from the resultsoutput_schematext
Describe the answer Exa should write from what it finds, for example 'A short comparison of each tool's pricing'. Or paste a JSON Schema whose "type" is "object" to get named fields back instead (at most 10 fields, two levels deep). Exa returns it as 'answer', with the sources behind each part in 'grounding'. Leave blank for results only.
Instructionssystem_prompttext
Guidance on how Exa should search and write, such as which sources to prefer or what to leave out.
Extra search queriesadditional_querieslist
Up to 10 more queries the deep search should also run, each a genuinely different angle on the question (not a rewording).Only when Search type is Deep (multi-step research), Deep (lightweight) or Deep (maximum reasoning, slowest).
Countryuser_locationtext
Favour results for readers in this country, as a two-letter code such as US, GB or FR.
Page freshness (hours)max_age_hoursnumber
Use Exa's stored copy of a page only when it is younger than this many hours; otherwise Exa fetches the page again. 0 always fetches a fresh copy (slower) and -1 never does. Leave blank for Exa's default.From -1 to 720.

Outputs

answertext
The answer Exa wrote from the results: text, or named fields for a JSON Schema. Only present when an answer was asked for.
groundinglist
The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
result_countnumber
How many results were returned.
resultslist
The matching web pages, each with its title, web address, published date and the excerpts, text or summary asked for.
Example output
{
  "result_count": 1,
  "results": [
    {
      "highlights": [
        "The most relevant passage of the page."
      ],
      "id": "https://example.com/article",
      "publishedDate": "2026-09-30T00:00:00.000Z",
      "title": "Example Article",
      "url": "https://example.com/article"
    }
  ]
}

Stop a research agent run early

Have an Ultra research agent run finish now and keep what it has found so far. Exa can only stop Ultra runs early; cancel any other run instead. A run that already finished is returned as it is.

Inputs

Run IDrun_idtextRequired
The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

Outputs

answertext
The agent's written answer or summary.
completedtrue/false
Whether the run finished and its result is included.
completed_attext
When the run finished.
cost_dollarsnumber
What the run cost, in US dollars.
created_attext
When the run started.
efforttext
The effort level the run used.
groundinglist
The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
querytext
What the agent was asked.
run_idtext
Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
statustext
queued, running, completed, failed or cancelled.
stop_reasontext
Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
structuredobject
The result in the shape the output schema asked for. Empty when no schema was given. Fields the evidence could not support are empty.
Example output
{
  "answer": "Milvus (Zilliz), Qdrant (Qdrant Solutions) and Weaviate (Weaviate B.V.).",
  "completed": true,
  "completed_at": "2026-10-14T09:01:12.000Z",
  "cost_dollars": 0.1,
  "created_at": "2026-10-14T09:00:00.000Z",
  "effort": "ultra",
  "grounding": [
    {
      "citations": [
        {
          "title": "Milvus",
          "url": "https://milvus.io/docs/overview.md"
        }
      ],
      "confidence": "high",
      "field": "databases[0].maintainer"
    }
  ],
  "query": "Find three open source vector databases and who maintains each.",
  "run_id": "agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5",
  "status": "completed",
  "stop_reason": "stopped",
  "structured": {
    "databases": [
      {
        "maintainer": "Zilliz",
        "name": "Milvus"
      },
      {
        "maintainer": "Qdrant Solutions",
        "name": "Qdrant"
      },
      {
        "maintainer": "Weaviate B.V.",
        "name": "Weaviate"
      }
    ]
  }
}

Summarize web pages

Summarize one or more web pages by their web address, focused on a question or topic you provide.

Inputs

Web page addressesurlslistRequired
A list of web addresses (URLs) of the pages to summarize, such as those from an earlier search. Pass a list even when there is only one page.
Focus question or topicquerytextRequired
A question or topic to focus the summary on.

Outputs

content_countnumber
How many pages were summarized.
failedlist
Pages Exa could not read, each with its web address and the reason, such as CRAWL_NOT_FOUND.
failed_countnumber
How many pages could not be read.
summarieslist
Each page's summary with its web address and title.
summarytext
The summaries of every page, one paragraph each.
Example output
{
  "content_count": 1,
  "failed": [],
  "failed_count": 0,
  "summaries": [
    {
      "summary": "This is a summary of the requested documents...",
      "title": "Example Article",
      "url": "https://example.com/article"
    }
  ],
  "summary": "This is a summary of the requested documents..."
}

Update a monitor

Change a monitor's search, schedule or destination, or pause and resume it. Only the settings you fill in change.

Inputs

Monitor IDmonitor_idtextRequired
The monitor's ID, as returned by 'Create a monitor'.
Namenametext
A new name for the monitor.
Statusstatustext
Pause the monitor or make it active again. Exa does not run a paused monitor, on its schedule or on demand.One of: active, paused.
What to watch forquerytext
A new search for the monitor to repeat.
How oftenperiodtext
A new schedule for the monitor.One of: 1h (Every hour), 6h (Every 6 hours), 12h (Every 12 hours), 1d (Every day), 7d (Every week), manual (Only when run from a workflow).
Results per runnum_resultsnumber
The most new pages each run returns (1-100).From 1 to 100.
Websites to includeinclude_domainslist
Only show results from these websites (for example, nytimes.com). A path such as exa.ai/blog or a wildcard such as *.substack.com also works.
Websites to excludeexclude_domainslist
Leave out results from these websites (for example, reddit.com).
What to write upoutput_schematext
Describe what Exa should write up from each run's new results, for example 'Each announcement with the company and where it is'. Or paste a JSON Schema whose "type" is "object" to get named fields back. Leave blank for a short text summary.
Send results towebhook_urltext
A new https:// address to send each finished run to.

Outputs

created_attext
When the monitor was created.
metadataobject
The monitor's labels.
monitor_idtext
Exa's ID for the monitor.
nametext
The monitor's name.
next_run_attext
When it next runs.
output_schemaobject
What Exa writes up from each run's results.
periodtext
How often it runs, such as 1d. Empty when it runs only when triggered.
querytext
What the monitor searches for.
searchobject
The monitor's full search settings.
statustext
active (runs on its schedule and when run now), paused (does not run at all until made active again) or disabled (Exa turned it off after repeated failures).
updated_attext
When the monitor was last changed.
webhook_urltext
Where Exa sends each finished run.
Example output
{
  "created_at": "2026-10-14T09:00:00.000Z",
  "metadata": null,
  "monitor_id": "01k4d9w6y3h7p2m8n5q1r0s4tv",
  "name": "Battery recycling expansion",
  "next_run_at": "2026-10-15T09:00:00.000Z",
  "output_schema": {
    "type": "text"
  },
  "period": "1d",
  "query": "new battery recycling facilities announced in North America",
  "search": {
    "contents": {
      "highlights": true
    },
    "numResults": 10,
    "query": "new battery recycling facilities announced in North America"
  },
  "status": "paused",
  "updated_at": "2026-10-14T09:00:00.000Z",
  "webhook_url": "https://example.com/webhooks/exa"
}

On this page