# Exa

> 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.

App · AI Search & Memory · 19 actions. Web page: https://docs.lodol.com/docs/integrations/exa

## Actions

### Answer a question

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

**Inputs**

- Question (`query`, text, required): The question to answer, such as 'What is the latest valuation of SpaceX?'.
- Include source page text (`include_sources_text`, true/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`.
- Instructions (`system_prompt`, text): 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_schema`, text): 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.
- Country (`user_location`, text): Favour results for readers in this country, as a two-letter code such as US, GB or FR.

**Outputs**

- `answer` (text): The written answer, or named fields when an answer schema was given.
- `source_count` (number): How many sources were used.
- `sources` (list): The web pages the answer was based on.

**Example output**

```json
{
  "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 ID (`run_id`, text, required): The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

**Outputs**

- `answer` (text): The agent's written answer or summary.
- `completed` (true/false): Whether the run finished and its result is included.
- `completed_at` (text): When the run finished.
- `cost_dollars` (number): What the run cost, in US dollars.
- `created_at` (text): When the run started.
- `effort` (text): The effort level the run used.
- `grounding` (list): The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
- `query` (text): What the agent was asked.
- `run_id` (text): Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
- `status` (text): queued, running, completed, failed or cancelled.
- `stop_reason` (text): Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
- `structured` (object): 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**

```json
{
  "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 ID (`run_id`, text, required): The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

**Outputs**

- `answer` (text): The agent's written answer or summary.
- `completed` (true/false): Whether the run finished and its result is included.
- `completed_at` (text): When the run finished.
- `cost_dollars` (number): What the run cost, in US dollars.
- `created_at` (text): When the run started.
- `effort` (text): The effort level the run used.
- `grounding` (list): The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
- `query` (text): What the agent was asked.
- `run_id` (text): Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
- `status` (text): queued, running, completed, failed or cancelled.
- `stop_reason` (text): Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
- `structured` (object): 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**

```json
{
  "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 for (`query`, text, required): 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 to (`webhook_url`, text, required): 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.
- Name (`name`, text): A name to recognise the monitor by.
- How often (`period`, text): 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 run (`num_results`, number): The most new pages each run returns (1-100). From 1 to 100. Default: `10`.
- Websites to include (`include_domains`, list): 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 exclude (`exclude_domains`, list): Leave out results from these websites (for example, reddit.com).
- Include relevant excerpts (`include_highlights`, true/false): Include the passages of each page that best match the search. Default: `true`.
- What to write up (`output_schema`, text): 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.
- Labels (`metadata`, object): Names and values Exa keeps with the monitor and sends with every delivery, such as team: sales, to route the results.

**Outputs**

- `created_at` (text): When the monitor was created.
- `metadata` (object): The monitor's labels.
- `monitor_id` (text): Exa's ID for the monitor.
- `name` (text): The monitor's name.
- `next_run_at` (text): When it next runs.
- `output_schema` (object): What Exa writes up from each run's results.
- `period` (text): How often it runs, such as 1d. Empty when it runs only when triggered.
- `query` (text): What the monitor searches for.
- `search` (object): The monitor's full search settings.
- `status` (text): 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_at` (text): When the monitor was last changed.
- `webhook_secret` (text): The secret Exa signs deliveries with. Exa shows it only this once, so store it if you check signatures.
- `webhook_url` (text): Where Exa sends each finished run.

**Example output**

```json
{
  "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 ID (`monitor_id`, text, required): The monitor's ID, as returned by 'Create a monitor'.

**Outputs**

- `created_at` (text): When the monitor was created.
- `deleted` (true/false): Whether the monitor was deleted.
- `metadata` (object): The monitor's labels.
- `monitor_id` (text): Exa's ID for the monitor.
- `name` (text): The monitor's name.
- `next_run_at` (text): When it next runs.
- `output_schema` (object): What Exa writes up from each run's results.
- `period` (text): How often it runs, such as 1d. Empty when it runs only when triggered.
- `query` (text): What the monitor searches for.
- `search` (object): The monitor's full search settings.
- `status` (text): 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_at` (text): When the monitor was last changed.
- `webhook_url` (text): Where Exa sends each finished run.

**Example output**

```json
{
  "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 ID (`run_id`, text, required): The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

**Outputs**

- `deleted` (true/false): Whether the run was deleted.
- `run_id` (text): The deleted run's ID.

**Example output**

```json
{
  "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 address (`url`, text, required): The web address (URL) of the page to find similar pages for.
- Number of results (`num_results`, number): How many similar pages to return (1-100). Defaults to 10. Default: `10`.
- Skip the same website (`exclude_source_domain`, true/false): Leave out other pages from the same website as the page you provided. Default: `false`.

**Outputs**

- `result_count` (number): How many results were returned.
- `results` (list): The similar web pages.

**Example output**

```json
{
  "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 ID (`monitor_id`, text, required): The monitor's ID, as returned by 'Create a monitor'.

**Outputs**

- `created_at` (text): When the monitor was created.
- `metadata` (object): The monitor's labels.
- `monitor_id` (text): Exa's ID for the monitor.
- `name` (text): The monitor's name.
- `next_run_at` (text): When it next runs.
- `output_schema` (object): What Exa writes up from each run's results.
- `period` (text): How often it runs, such as 1d. Empty when it runs only when triggered.
- `query` (text): What the monitor searches for.
- `search` (object): The monitor's full search settings.
- `status` (text): 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_at` (text): When the monitor was last changed.
- `webhook_url` (text): Where Exa sends each finished run.

**Example output**

```json
{
  "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 ID (`monitor_id`, text, required): The monitor's ID, as returned by 'Create a monitor'.
- Run ID (`run_id`, text, required): The run's ID, from 'Run a monitor now' or 'List monitor runs'.

**Outputs**

- `completed` (true/false): Whether the run finished.
- `completed_at` (text): When the run finished.
- `content` (text): What Exa wrote up from the new pages: text, or named fields when the monitor has a JSON Schema.
- `created_at` (text): When the run was created.
- `duration_ms` (number): How long the run took, in milliseconds.
- `fail_reason` (text): Why the run failed, such as insufficient_credits or source_not_available. Empty unless it failed.
- `grounding` (list): The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
- `monitor_id` (text): The monitor that ran.
- `result_count` (number): How many new pages it found.
- `results` (list): The pages this run found that no earlier run of the monitor returned.
- `run_id` (text): Exa's ID for the run.
- `status` (text): pending, running, completed, failed or cancelled.

**Example output**

```json
{
  "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 addresses (`urls`, list, required): 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 page (`max_characters`, number): Trim each page to this many characters. Leave blank to get the whole page. At least 1.
- Page freshness (hours) (`max_age_hours`, number): 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 read (`subpages`, number): 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 for (`subpage_target`, list): Words that pick which linked pages to read, such as pricing or about. Only used with 'Linked pages to read'.

**Outputs**

- `content_count` (number): How many pages were returned.
- `contents` (list): The text content of each page.
- `failed` (list): Pages Exa could not read, each with its web address and the reason, such as CRAWL_NOT_FOUND.
- `failed_count` (number): How many pages could not be read.

**Example output**

```json
{
  "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 ID (`monitor_id`, text, required): The monitor's ID, as returned by 'Create a monitor'.
- Results per page (`limit`, number): How many to return at once (1-100). Defaults to 20. From 1 to 100. Default: `20`.
- Next page (`cursor`, text): To get the next page, the 'next_cursor' from the previous page. Leave blank for the first page.

**Outputs**

- `has_more` (true/false): Whether there are more runs to fetch.
- `next_cursor` (text): Pass as 'Next page' to get the next page.
- `run_count` (number): How many runs are on this page.
- `runs` (list): The runs, each with its ID, status and the new pages it found.

**Example output**

```json
{
  "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**

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

**Outputs**

- `has_more` (true/false): Whether there are more monitors to fetch.
- `monitor_count` (number): How many monitors are on this page.
- `monitors` (list): The monitors, each with its ID, name, status, search and schedule.
- `next_cursor` (text): Pass as 'Next page' to get the next page.

**Example output**

```json
{
  "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 page (`limit`, number): How many to return at once (1-100). Defaults to 20. From 1 to 100. Default: `20`.
- Next page (`cursor`, text): To get the next page, the 'next_cursor' from the previous page. Leave blank for the first page.

**Outputs**

- `has_more` (true/false): Whether there are more runs to fetch.
- `next_cursor` (text): Pass as 'Next page' to get the next page.
- `run_count` (number): How many runs are on this page.
- `runs` (list): The runs, each with its ID, status, task, answer and cost.

**Example output**

```json
{
  "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 ID (`monitor_id`, text, required): The monitor's ID, as returned by 'Create a monitor'.
- How long to wait (`wait_seconds`, number): 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**

- `completed` (true/false): Whether the run finished.
- `completed_at` (text): When the run finished.
- `content` (text): What Exa wrote up from the new pages: text, or named fields when the monitor has a JSON Schema.
- `created_at` (text): When the run was created.
- `duration_ms` (number): How long the run took, in milliseconds.
- `fail_reason` (text): Why the run failed, such as insufficient_credits or source_not_available. Empty unless it failed.
- `grounding` (list): The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
- `monitor_id` (text): The monitor that ran.
- `result_count` (number): How many new pages it found.
- `results` (list): The pages this run found that no earlier run of the monitor returned.
- `run_id` (text): Exa's ID for the run.
- `status` (text): pending, running, completed, failed or cancelled.
- `timed_out` (true/false): True when the wait ran out before the run finished. The run keeps going on Exa's side.
- `triggered` (true/false): Whether Exa started a run.

**Example output**

```json
{
  "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**

- Task (`query`, text, required): 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'.
- Effort (`effort`, text): 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_schema`, text): 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.
- Instructions (`system_prompt`, text): 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 enrich (`input_records`, list): 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 out (`exclude_records`, list): Records or entities the agent should not return, such as companies already on your list.
- Continue from run (`previous_run_id`, text): 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 sources (`data_sources`, list): 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_dollars`, number): 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_minutes`, number): 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 wait (`max_wait_seconds`, number): 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**

- `answer` (text): The agent's written answer or summary.
- `completed` (true/false): Whether the run finished and its result is included.
- `completed_at` (text): When the run finished.
- `cost_dollars` (number): What the run cost, in US dollars.
- `created_at` (text): When the run started.
- `effort` (text): The effort level the run used.
- `grounding` (list): The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
- `query` (text): What the agent was asked.
- `run_id` (text): Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
- `status` (text): queued, running, completed, failed or cancelled.
- `stop_reason` (text): Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
- `structured` (object): 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_out` (true/false): True when the wait ran out before the run finished. The run keeps going on Exa's side.

**Example output**

```json
{
  "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**

- Query (`query`, text, required): What to search for.
- Number of results (`num_results`, number): How many results to return (1-100). Defaults to 10. Default: `10`.
- Search type (`type`, text): 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 category (`category`, text): 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 include (`include_domains`, list): 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 exclude (`exclude_domains`, list): Leave out results from these websites (for example, reddit.com).
- Published after (`start_published_date`, date): Only show pages published on or after this date, in YYYY-MM-DD format.
- Published before (`end_published_date`, date): Only show pages published on or before this date, in YYYY-MM-DD format.
- Include relevant excerpts (`include_highlights`, true/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 text (`include_text`, true/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 result (`summary_query`, text): 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 results (`output_schema`, text): 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.
- Instructions (`system_prompt`, text): Guidance on how Exa should search and write, such as which sources to prefer or what to leave out.
- Extra search queries (`additional_queries`, list): 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).
- Country (`user_location`, text): Favour results for readers in this country, as a two-letter code such as US, GB or FR.
- Page freshness (hours) (`max_age_hours`, number): 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**

- `answer` (text): The answer Exa wrote from the results: text, or named fields for a JSON Schema. Only present when an answer was asked for.
- `grounding` (list): The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
- `result_count` (number): How many results were returned.
- `results` (list): The matching web pages, each with its title, web address, published date and the excerpts, text or summary asked for.

**Example output**

```json
{
  "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 ID (`run_id`, text, required): The research agent run's ID, as returned by 'Run a research agent', for example 'agent_run_01j8f2k4h6m9p3q5r7t9v1w3x5'.

**Outputs**

- `answer` (text): The agent's written answer or summary.
- `completed` (true/false): Whether the run finished and its result is included.
- `completed_at` (text): When the run finished.
- `cost_dollars` (number): What the run cost, in US dollars.
- `created_at` (text): When the run started.
- `effort` (text): The effort level the run used.
- `grounding` (list): The sources behind each part of the answer: the field, its citations (title and web address) and Exa's confidence.
- `query` (text): What the agent was asked.
- `run_id` (text): Exa's ID for this run. Pass it to 'Check a research agent run' to collect a result later.
- `status` (text): queued, running, completed, failed or cancelled.
- `stop_reason` (text): Why the run stopped: schema_satisfied, budget_reached, time_limit_reached, stopped, error or cancelled.
- `structured` (object): 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**

```json
{
  "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 addresses (`urls`, list, required): 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 topic (`query`, text, required): A question or topic to focus the summary on.

**Outputs**

- `content_count` (number): How many pages were summarized.
- `failed` (list): Pages Exa could not read, each with its web address and the reason, such as CRAWL_NOT_FOUND.
- `failed_count` (number): How many pages could not be read.
- `summaries` (list): Each page's summary with its web address and title.
- `summary` (text): The summaries of every page, one paragraph each.

**Example output**

```json
{
  "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 ID (`monitor_id`, text, required): The monitor's ID, as returned by 'Create a monitor'.
- Name (`name`, text): A new name for the monitor.
- Status (`status`, text): 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 for (`query`, text): A new search for the monitor to repeat.
- How often (`period`, text): 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 run (`num_results`, number): The most new pages each run returns (1-100). From 1 to 100.
- Websites to include (`include_domains`, list): 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 exclude (`exclude_domains`, list): Leave out results from these websites (for example, reddit.com).
- What to write up (`output_schema`, text): 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 to (`webhook_url`, text): A new https:// address to send each finished run to.

**Outputs**

- `created_at` (text): When the monitor was created.
- `metadata` (object): The monitor's labels.
- `monitor_id` (text): Exa's ID for the monitor.
- `name` (text): The monitor's name.
- `next_run_at` (text): When it next runs.
- `output_schema` (object): What Exa writes up from each run's results.
- `period` (text): How often it runs, such as 1d. Empty when it runs only when triggered.
- `query` (text): What the monitor searches for.
- `search` (object): The monitor's full search settings.
- `status` (text): 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_at` (text): When the monitor was last changed.
- `webhook_url` (text): Where Exa sends each finished run.

**Example output**

```json
{
  "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"
}
```
