Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/exa-ai-monitors-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Exa Monitors API
version: 2.0.0
description: Exa Monitors API - subset of the Exa Public API.
servers:
- url: https://api.exa.ai
security:
- apiKey: []
- bearer: []
tags:
- name: Monitors
paths:
/monitors:
post:
operationId: createMonitor
summary: Create a Monitor
description: 'Creates a new Monitor to run recurring Exa searches on a schedule.
Monitors automatically execute your search query on a recurring schedule and deliver results to your webhook endpoint with automatic deduplication:
- **Date-based filtering** only fetches content since the last run
- **Semantic deduplication** tracks previous outputs to surface only new developments
The response includes a `webhookSecret` that is only returned once at creation time. Store it securely for webhook signature verification.'
tags:
- Monitors
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateSearchMonitorParameters'
responses:
'201':
description: The created monitor with webhook secret
content:
application/json:
schema:
$ref: '#/components/schemas/CreateSearchMonitorResponse'
get:
operationId: listMonitors
summary: List Monitors
description: Lists all monitors for the authenticated team. Supports filtering by status and cursor-based pagination.
tags:
- Monitors
parameters:
- in: query
name: status
schema:
type: string
enum:
- active
- paused
- disabled
description: Filter monitors by status
- in: query
name: cursor
schema:
type: string
description: Pagination cursor from a previous response
- in: query
name: limit
schema:
type: integer
minimum: 1
maximum: 100
description: Number of results per page
default: 50
- in: query
name: name
schema:
type: string
maxLength: 250
description: Filter monitors by name (case-insensitive substring match)
- in: query
name: metadata
schema:
description: 'Filter monitors by metadata key-value pairs (exact match, AND semantics). Use bracket notation: `metadata[key]=value`.'
type: object
propertyNames:
type: string
additionalProperties:
type: string
style: deepObject
explode: true
description: 'Filter monitors by metadata key-value pairs (exact match, AND semantics). Use bracket notation: `metadata[key]=value`.'
responses:
'200':
description: A paginated list of monitors
content:
application/json:
schema:
$ref: '#/components/schemas/ListSearchMonitorsResponse'
/monitors/batch:
post:
operationId: batchMonitors
summary: Batch Action on Monitors
description: 'Perform a batch action on monitors matching the provided filters.
Supported actions:
- **delete**: Permanently remove matching monitors
- **pause**: Pause matching monitors
- **unpause**: Unpause matching monitors
Use `dry_run: true` (the default) to preview which monitors would be affected before performing the action. Results are paginated via the `limit` parameter; loop until `has_more` is `false` to process all matching monitors.'
tags:
- Monitors
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BatchMonitorsRequest'
responses:
'200':
description: Batch action result
content:
application/json:
schema:
$ref: '#/components/schemas/BatchMonitorsResponse'
/monitors/{id}:
get:
operationId: getMonitor
summary: Get a Monitor
description: Retrieves a single monitor by its ID.
tags:
- Monitors
parameters:
- in: path
name: id
schema:
type: string
description: The monitor ID
required: true
description: The monitor ID
responses:
'200':
description: The monitor
content:
application/json:
schema:
$ref: '#/components/schemas/SearchMonitor'
patch:
operationId: updateMonitor
summary: Update a Monitor
description: Updates an existing monitor. All fields are optional. For `search`, you can send a partial object containing only the fields you want to change. Set `trigger` to `null` to remove the schedule.
tags:
- Monitors
parameters:
- in: path
name: id
schema:
type: string
description: The monitor ID
required: true
description: The monitor ID
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateSearchMonitorParameters'
responses:
'200':
description: The updated monitor
content:
application/json:
schema:
$ref: '#/components/schemas/SearchMonitor'
delete:
operationId: deleteMonitor
summary: Delete a Monitor
description: Deletes a monitor. This cannot be undone.
tags:
- Monitors
parameters:
- in: path
name: id
schema:
type: string
description: The monitor ID
required: true
description: The monitor ID
responses:
'200':
description: The deleted monitor
content:
application/json:
schema:
$ref: '#/components/schemas/SearchMonitor'
/monitors/{id}/trigger:
post:
operationId: triggerMonitor
summary: Trigger a Monitor
description: Triggers a run immediately, regardless of the schedule. Works for monitors with status `active` or `paused`.
tags:
- Monitors
parameters:
- in: path
name: id
schema:
type: string
description: The monitor ID
required: true
description: The monitor ID
responses:
'200':
description: Whether the monitor was triggered
content:
application/json:
schema:
$ref: '#/components/schemas/TriggerSearchMonitorResponse'
/v0/monitors:
servers:
- url: https://api.exa.ai/websets
post:
description: 'Creates a new `Monitor` to continuously keep your Websets updated with fresh data.
Monitors automatically run on your defined schedule to ensure your Websets stay current without manual intervention:
- **Find new content**: Execute `search` operations to discover fresh items matching your criteria
- **Update existing content**: Run `refresh` operations to update items contents and enrichments
- **Automated scheduling**: Configure `cron` expressions and `timezone` for precise scheduling control'
operationId: monitors-create
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateMonitorParameters'
responses:
'201':
description: Monitor created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Monitor'
headers:
X-Request-Id:
schema:
type: string
description: Unique identifier for the request.
example: req_N6SsgoiaOQOPqsYKKiw5
required: true
summary: Create a Monitor
tags:
- Monitors
security:
- apiKey: []
- bearer: []
x-codeSamples:
- lang: javascript
label: JavaScript
source: "// npm install exa-js\nimport Exa from \"exa-js\";\nconst exa = new Exa(\"YOUR_EXA_API_KEY\");\n\nconst monitor = await exa.websets.monitors.create({\n websetId: \"webset_id\",\n cadence: {\n cron: \"0 9 * * 1\", // Every Monday at 9 AM\n timezone: \"America/New_York\",\n },\n behavior: {\n type: \"search\",\n config: {\n behavior: \"append\",\n query: \"new companies to monitor\",\n count: 10,\n },\n },\n});\n\nconsole.log(`Created monitor: ${monitor.id}`);"
- lang: python
label: Python
source: "# pip install exa-py\nfrom exa_py import Exa\n\nexa = Exa(\"YOUR_EXA_API_KEY\")\n\nmonitor = exa.websets.monitors.create(\n params={\n \"websetId\": \"webset_id\",\n \"cadence\": {\n \"cron\": \"0 9 * * 1\", # Every Monday at 9 AM\n \"timezone\": \"America/New_York\",\n },\n \"behavior\": {\n \"type\": \"search\",\n \"config\": {\n \"behavior\": \"append\",\n \"query\": \"new companies to monitor\",\n \"count\": 10,\n },\n },\n }\n)\n\nprint(f\"Created monitor: {monitor.id}\")"
get:
description: Lists all monitors for the Webset.
operationId: monitors-list
parameters:
- name: cursor
required: false
in: query
description: The cursor to paginate through the results
schema:
minLength: 1
type: string
- name: limit
required: false
in: query
description: The number of results to return
schema:
minimum: 1
maximum: 200
default: 25
type: number
- name: websetId
required: false
in: query
description: The id of the Webset to list monitors for
schema:
type: string
responses:
'200':
description: List of monitors
content:
application/json:
schema:
$ref: '#/components/schemas/ListMonitorsResponse'
headers:
X-Request-Id:
schema:
type: string
description: Unique identifier for the request.
example: req_N6SsgoiaOQOPqsYKKiw5
required: true
summary: List Monitors
tags:
- Monitors
security:
- apiKey: []
- bearer: []
x-codeSamples:
- lang: javascript
label: JavaScript
source: "// npm install exa-js\nimport Exa from \"exa-js\";\nconst exa = new Exa(\"YOUR_EXA_API_KEY\");\n\nconst monitors = await exa.websets.monitors.list({\n webset_id: \"webset_id\",\n});\n\nconsole.log(`Found ${monitors.data.length} monitors`);\nmonitors.data.forEach((monitor) => {\n console.log(`- ${monitor.id}: ${monitor.status}`);\n});"
- lang: python
label: Python
source: "# pip install exa-py\nfrom exa_py import Exa\n\nexa = Exa(\"YOUR_EXA_API_KEY\")\n\nmonitors = exa.websets.monitors.list(webset_id=\"webset_id\")\n\nprint(f\"Found {len(monitors.data)} monitors\")\nfor monitor in monitors.data:\n print(f\"- {monitor.id}: {monitor.status}\")"
/v0/monitors/{id}:
servers:
- url: https://api.exa.ai/websets
get:
description: Gets a specific monitor.
operationId: monitors-get
parameters:
- name: id
required: true
in: path
description: The id of the Monitor
schema:
type: string
responses:
'200':
description: Monitor details
content:
application/json:
schema:
$ref: '#/components/schemas/Monitor'
headers:
X-Request-Id:
schema:
type: string
description: Unique identifier for the request.
example: req_N6SsgoiaOQOPqsYKKiw5
required: true
summary: Get Monitor
tags:
- Monitors
security:
- apiKey: []
- bearer: []
x-codeSamples:
- lang: javascript
label: JavaScript
source: '// npm install exa-js
import Exa from "exa-js";
const exa = new Exa("YOUR_EXA_API_KEY");
const monitor = await exa.websets.monitors.get("monitor_id");
console.log(`Monitor: ${monitor.id} - ${monitor.status}`);'
- lang: python
label: Python
source: '# pip install exa-py
from exa_py import Exa
exa = Exa("YOUR_EXA_API_KEY")
monitor = exa.websets.monitors.get("monitor_id")
print(f"Monitor: {monitor.id} - {monitor.status}")'
patch:
description: Updates a monitor configuration.
operationId: monitors-update
parameters:
- name: id
required: true
in: path
description: The id of the Monitor
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateMonitor'
responses:
'200':
description: Monitor updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Monitor'
headers:
X-Request-Id:
schema:
type: string
description: Unique identifier for the request.
example: req_N6SsgoiaOQOPqsYKKiw5
required: true
summary: Update Monitor
tags:
- Monitors
security:
- apiKey: []
- bearer: []
x-codeSamples:
- lang: javascript
label: JavaScript
source: "// npm install exa-js\nimport Exa from \"exa-js\";\nconst exa = new Exa(\"YOUR_EXA_API_KEY\");\n\nconst monitor = await exa.websets.monitors.update(\"monitor_id\", {\n cadence: {\n cron: \"0 14 * * *\", // Every day at 2 PM\n timezone: \"America/New_York\",\n },\n});\n\nconsole.log(`Updated monitor: ${monitor.id}`);"
- lang: python
label: Python
source: "# pip install exa-py\nfrom exa_py import Exa\n\nexa = Exa(\"YOUR_EXA_API_KEY\")\n\nmonitor = exa.websets.monitors.update(\n \"monitor_id\",\n params={\n \"cadence\": {\n \"cron\": \"0 14 * * *\", # Every day at 2 PM\n \"timezone\": \"America/New_York\",\n }\n },\n)\n\nprint(f\"Updated monitor: {monitor.id}\")"
delete:
description: Deletes a monitor.
operationId: monitors-delete
parameters:
- name: id
required: true
in: path
description: The id of the Monitor
schema:
type: string
responses:
'200':
description: Monitor deleted successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Monitor'
headers:
X-Request-Id:
schema:
type: string
description: Unique identifier for the request.
example: req_N6SsgoiaOQOPqsYKKiw5
required: true
summary: Delete Monitor
tags:
- Monitors
security:
- apiKey: []
- bearer: []
x-codeSamples:
- lang: javascript
label: JavaScript
source: '// npm install exa-js
import Exa from "exa-js";
const exa = new Exa("YOUR_EXA_API_KEY");
await exa.websets.monitors.delete("monitor_id");
console.log("Monitor deleted successfully");'
- lang: python
label: Python
source: '# pip install exa-py
from exa_py import Exa
exa = Exa("YOUR_EXA_API_KEY")
exa.websets.monitors.delete("monitor_id")
print("Monitor deleted successfully")'
components:
schemas:
MonitorRun:
type:
- object
properties:
id:
type:
- string
description: The unique identifier for the Monitor Run
object:
type:
- string
enum:
- monitor_run
description: The type of object
status:
type:
- string
enum:
- created
- running
- completed
- canceled
- failed
description: The status of the Monitor Run
monitorId:
type:
- string
description: The monitor that the run is associated with
type:
type:
- string
enum:
- search
- refresh
description: The type of the Monitor Run
completedAt:
type: string
format: date-time
description: When the run completed
nullable: true
failedAt:
type: string
format: date-time
description: When the run failed
nullable: true
failedReason:
type: string
description: The reason the run failed
nullable: true
canceledAt:
type: string
format: date-time
description: When the run was canceled
nullable: true
createdAt:
type:
- string
format: date-time
description: When the run was created
updatedAt:
type:
- string
format: date-time
description: When the run was last updated
required:
- id
- object
- monitorId
- status
- type
- completedAt
- failedAt
- failedReason
- canceledAt
- createdAt
- updatedAt
SearchMonitorWebhookOutput:
type: object
properties:
url:
type: string
format: uri
description: The HTTPS URL to receive webhook events. Must not point to localhost or private IP ranges.
events:
type: array
items:
type: string
enum:
- monitor.created
- monitor.updated
- monitor.deleted
- monitor.run.created
- monitor.run.completed
description: Which events to subscribe to. Defaults to all events if not specified.
required:
- url
additionalProperties: false
JsonValue:
description: Any JSON value.
oneOf:
- type: 'null'
- type: boolean
- type: number
- type: string
- type: array
items:
$ref: '#/components/schemas/JsonValue'
- type: object
propertyNames:
type: string
additionalProperties:
$ref: '#/components/schemas/JsonValue'
ListSearchMonitorsResponse:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/SearchMonitor'
description: The list of monitors
hasMore:
type: boolean
description: Whether there are more results
nextCursor:
anyOf:
- type: string
- type: 'null'
description: Cursor for the next page
required:
- data
- hasMore
additionalProperties: false
TriggerSearchMonitorResponse:
type: object
properties:
triggered:
type: boolean
description: Whether the monitor was successfully triggered
required:
- triggered
additionalProperties: false
CreateSearchMonitorResponse:
type: object
properties:
id:
type: string
description: The unique identifier for the monitor
name:
anyOf:
- type: string
- type: 'null'
description: An optional display name
status:
type: string
enum:
- active
- paused
- disabled
description: The status of the monitor. `active` monitors run on schedule and can be triggered manually. `paused` monitors can only be triggered manually. `disabled` monitors are auto-disabled after 10 consecutive authentication failures.
search:
$ref: '#/components/schemas/SearchMonitorSearchOutput'
trigger:
anyOf:
- $ref: '#/components/schemas/SearchMonitorTriggerOutput'
- type: 'null'
description: The interval-based schedule for automatic runs. Null if no schedule is set.
outputSchema:
$ref: '#/components/schemas/SearchMonitorOutputSchemaOutput'
metadata:
anyOf:
- type: object
propertyNames:
type: string
additionalProperties:
type: string
description: Caller-provided key-value metadata for your own tracking.
example:
slack_channel_id: C123ABC
slack_thread_id: '1745444400.123456'
user_id: U123ABC
- type: 'null'
description: Optional key-value metadata for your own tracking. Echoed back in webhook deliveries so you can route updates to systems like Slack.
example:
slack_channel_id: C123ABC
slack_thread_id: '1745444400.123456'
user_id: U123ABC
webhook:
$ref: '#/components/schemas/SearchMonitorWebhookOutput'
nextRunAt:
anyOf:
- type: string
format: date-time
- type: 'null'
description: When the next scheduled run will occur. Null if no trigger is set.
format: date-time
createdAt:
type: string
format: date-time
description: When the monitor was created
updatedAt:
type: string
format: date-time
description: When the monitor was last updated
webhookSecret:
type: string
description: The secret used to verify webhook signatures. This is only returned once at creation time. Store it securely.
required:
- id
- name
- status
- search
- trigger
- outputSchema
- metadata
- webhook
- nextRunAt
- createdAt
- updatedAt
- webhookSecret
additionalProperties: false
UpdateMonitor:
type:
- object
properties:
status:
type:
- string
enum:
- enabled
- disabled
description: The status of the monitor.
metadata:
type:
- object
additionalProperties:
type:
- string
cadence:
type:
- object
$ref: '#/components/schemas/MonitorCadence'
behavior:
type:
- object
$ref: '#/components/schemas/MonitorBehavior'
SearchMonitorTrigger:
type: object
properties:
type:
type: string
const: interval
description: The type of trigger. Currently only `interval` is supported.
default: interval
period:
type: string
description: A duration string specifying how often the monitor runs (e.g., "1h", "6h", "1d", "7d"). Single-unit only. Minimum interval is 1 hour. The schedule is anchored to the monitor's creation time (e.g., a daily monitor created at 2:30 PM runs daily around 2:30 PM).
example: 6h
required:
- type
- period
CustomEntity:
type:
- object
properties:
type:
type: string
const: custom
default: custom
description:
type:
- string
minLength: 2
maxLength: 200
required:
- type
- description
title: Custom
UpdateSearchMonitorParameters:
type: object
properties:
name:
anyOf:
- type: string
- type: 'null'
description: Update the monitor name
status:
type: string
enum:
- active
- paused
description: Update the monitor status (can only set to `active` or `paused`)
search:
type: object
properties:
query:
type: string
minLength: 1
description: The query string for the search.
example: Latest developments in LLM capabilities
numResults:
type: integer
minimum: 1
maximum: 100
description: Number of results to return. Limits vary by search type. The maximum public limit is 100 results. Contact sales (hello@exa.ai) to discuss higher limits.
example: 10
default: 10
contents:
$ref: '#/components/schemas/SearchMonitorContents'
description: Partial search params to merge. All fields are optional for updates.
trigger:
anyOf:
- type: object
properties:
type:
type: string
const: interval
description: The type of trigger. Currently only `interval` is supported.
default: interval
period:
type: string
description: A duration string specifying how often the monitor runs (e.g., "1h", "6h", "1d", "7d"). Single-unit only. Minimum interval is 1 hour.
- type: 'null'
description: Update the schedule. Set to null to remove the schedule.
outputSchema:
$ref: '#/components/schemas/SearchMonitorOutputSchema'
metadata:
anyOf:
- type: object
propertyNames:
type: string
additionalProperties:
type: string
description: Caller-provided key-value metadata for your own tracking.
example:
slack_channel_id: C123ABC
slack_thread_id: '1745444400.123456'
user_id: U123ABC
- type: 'null'
description: Update metadata. Set to null to remove. Echoed back in webhook deliveries so you can route updates to systems like Slack.
example:
slack_channel_id: C123ABC
slack_thread_id: '1745444400.123456'
user_id: U123ABC
webhook:
type: object
properties:
url:
type: string
format: uri
description: The HTTPS URL to receive webhook events. Must not point to localhost or private IP ranges.
events:
type: array
items:
type: string
enum:
- monitor.created
- monitor.updated
- monitor.deleted
- monitor.run.created
- monitor.run.completed
description: Which events to subscribe to. Defaults to all events if not specified.
description: Partial webhook params to merge. All fields are optional for updates.
CreateMonitorParameters:
type:
- object
properties:
websetId:
type:
- string
description: The id of the Webset
cadence:
type:
- object
properties:
cron:
description: Cron expression for monitor cadence (must be a valid Unix cron with 5 fields). The schedule must trigger at most once per day.
type:
- string
timezone:
description: IANA timezone (e.g., "America/New_York")
default: Etc/UTC
type:
- string
required:
- cron
description: How often the monitor will run
behavior:
type:
- object
properties:
type:
type: string
const: search
default: search
config:
type:
- object
properties:
query:
type:
- string
minLength: 2
maxLength: 10000
description: The query to search for. By default, the query from the last search is used.
criteria:
type:
- array
items:
type:
- object
properties:
description:
type:
- string
minLength: 2
maxLength: 1000
required:
- description
maxItems: 5
description: The criteria to search for. By default, the criteria from the last search is used.
entity:
$ref: '#/components/schemas/Entity'
title: Entity
description: The entity to search for. By default, the entity from the last search/import is used.
count:
type:
- number
exclusiveMinimum: 0
description: The maximum number of results to find
behavior:
default: append
type:
- string
enum:
- override
- append
description: The behaviour of the Search when it is added to a Webset.
required:
- count
description: 'Specify the search parameters for the Monitor.
By default, the search parameters (query, entity and criteria) from the last search are used when no parameters are provided.'
required:
- type
- config
description: Behavior to perform when monitor runs
metadata:
type:
- object
additionalProperties:
type:
- string
required:
- websetId
- cadence
- behavior
Monitor:
type:
- object
properties:
id:
type:
- string
description: The unique identifier for the Monitor
object:
type:
- string
enum:
- monitor
description: The type of object
status:
type:
- string
enum:
- enabled
- disabled
description: The status of the Monitor
websetId:
type:
- string
description: The id of the Webset the Monitor belongs to
cadence:
type:
- object
properties:
cron:
description: Cron expression for monitor cadence (must be a valid Unix cron with 5 fields). The schedule must trigger at most once per day.
type:
- string
timezone:
description: IANA timezone (e.g., "America/New_York")
default: Etc/UTC
type:
- string
required:
- cron
description: How often the monitor will run
behavior:
type:
- object
properties:
type:
type: string
const: search
default: search
config:
type:
- object
properties:
query:
type:
- string
minLength: 2
maxLength: 10000
description: The query to search for. By default, the query from the last search is used.
criteria:
type:
- array
items:
type:
- object
properties:
description:
type:
- string
minLength: 2
maxLength: 1000
required:
- description
maxItems: 5
description: The criteria to search for. By default, the criteria from the last search is used.
entity:
$ref: '#/components/schemas/Entity'
title: Entity
description: The ent
# --- truncated at 32 KB (70 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/exa-ai/refs/heads/main/openapi/exa-ai-monitors-api-openapi.yml