Exa

Exa Monitors API

Schedule recurring Exa searches and receive webhook notifications when fresh matching content appears on the web. Supports create, list, get, update, delete, batch actions, manual trigger, and run history. Two API versions are exposed — the original /monitors namespace and the newer /v0/monitors surface aligned with Websets.

Exa Monitors API is one of 7 APIs that Exa publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include AI, Search, Monitors, Webhooks, and Scheduled. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, and 1 Naftiko capability spec.

OpenAPI Specification

exa-monitors-api-openapi.yml Raw ↑
openapi: 3.1.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: []
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'
  /monitors/{id}/runs:
    get:
      operationId: listRuns
      summary: List Runs
      description: Lists all runs for a monitor with cursor-based pagination. Runs are returned in reverse chronological order.
      tags:
      - Runs
      parameters:
      - in: path
        name: id
        schema:
          type: string
          description: The monitor ID
        required: true
        description: The monitor ID
      - 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
      responses:
        '200':
          description: A paginated list of runs
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSearchMonitorRunsResponse'
  /monitors/{id}/runs/{runId}:
    get:
      operationId: getRun
      summary: Get a Run
      description: Retrieves a single run by its ID, including the full output if the run is completed.
      tags:
      - Runs
      parameters:
      - in: path
        name: id
        schema:
          type: string
          description: The monitor ID
        required: true
        description: The monitor ID
      - in: path
        name: runId
        schema:
          type: string
          description: The run ID
        required: true
        description: The run ID
      responses:
        '200':
          description: The run
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchMonitorRun'
  /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\n\
          console.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")'
  /v0/monitors/{monitor}/runs:
    servers:
    - url: https://api.exa.ai/websets
    get:
      description: Lists all runs for the Monitor.
      operationId: monitors-runs-list
      parameters:
      - name: monitor
        required: true
        in: path
        description: The id of the Monitor to list runs for
        schema:
          type: string
      responses:
        '200':
          description: List of monitor runs
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListMonitorRunsResponse'
          headers:
            X-Request-Id:
              schema:
                type: string
              description: Unique identifier for the request.
              example: req_N6SsgoiaOQOPqsYKKiw5
              required: true
      summary: List Monitor Runs
      tags:
      - Monitors Runs
      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 runs\
          \ = await exa.websets.monitors.runs.list(\"monitor_id\");\n\nconsole.log(`Found ${runs.data.length} monitor runs`);\n\
          runs.data.forEach((run) => {\n  console.log(`- ${run.id}: ${run.status}`);\n});"
      - lang: python
        label: Python
        source: "# pip install exa-py\nfrom exa_py import Exa\n\nexa = Exa(\"YOUR_EXA_API_KEY\")\n\nruns = exa.websets.monitors.runs.list(\"\
          monitor_id\")\n\nprint(f\"Found {len(runs.data)} monitor runs\")\nfor run in runs.data:\n    print(f\"- {run.id}:\
          \ {run.status}\")"
  /v0/monitors/{monitor}/runs/{id}:
    servers:
    - url: https://api.exa.ai/websets
    get:
      description: Gets a specific monitor run.
      operationId: monitors-runs-get
      parameters:
      - name: monitor
        required: true
        in: path
        description: The id of the Monitor to get the run for
        schema:
          type: string
      - name: id
        required: true
        in: path
        schema:
          type: string
      responses:
        '200':
          description: Monitor run details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorRun'
          headers:
            X-Request-Id:
              schema:
                type: string
              description: Unique identifier for the request.
              example: req_N6SsgoiaOQOPqsYKKiw5
              required: true
      summary: Get Monitor Run
      tags:
      - Monitors Runs
      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 run = await exa.websets.monitors.runs.get("monitor_id", "run_id");


          console.log(`Monitor run: ${run.id} - ${run.status}`);'
      - lang: python
        label: Python
        source: '# pip install exa-py

          from exa_py import Exa


          exa = Exa("YOUR_EXA_API_KEY")


          run = exa.websets.monitors.runs.get("monitor_id", "run_id")


          print(f"Monitor run: {run.id} - {run.status}")'
components:
  schemas:
    ArticleEntity:
      type:
      - object
      properties:
        type:
          type: string
          const: article
          default: article
      required:
      - type
      title: Article
    BatchMonitorsRequest:
      type: object
      properties:
        action:
          type: string
          enum:
          - delete
          - pause
          - unpause
          description: The action to perform on matching monitors. `delete` permanently removes them, `pause` sets their status
            to paused, and `unpause` sets their status to active.
        filter:
          type: object
          properties:
            name:
              type: string
              maxLength: 250
              description: Filter by name (case-insensitive substring match)
            status:
              type: string
              enum:
              - active
              - paused
              - disabled
              description: Filter by monitor status
            metadata:
              type: object
              propertyNames:
                type: string
              additionalProperties:
                type: string
                maxLength: 1000
              description: Filter by metadata key-value pairs (exact match, AND semantics)
          description: At least one filter field must be provided to prevent accidental bulk operations.
        dry_run:
          type: boolean
          description: When `true`, returns the monitors that would be affected without performing the action. Defaults to
            `true`.
          default: true
        limit:
          type: integer
          minimum: 1
          maximum: 500
          description: Maximum number of monitors to process in a single request. Defaults to 50, maximum 500.
          default: 50
      required:
      - action
      - filter
    BatchMonitorsResponse:
      type: object
      properties:
        action:
          type: string
          enum:
          - delete
          - pause
          - unpause
          description: The action that was performed
        affected:
          type: integer
          description: The number of monitors affected by the action
        ids:
          type: array
          items:
            type: string
          description: The IDs of the monitors that were affected
        dry_run:
          type: boolean
          description: Whether this was a dry run
        has_more:
          type: boolean
          description: Whether there are more monitors matching the filter. If `true`, repeat the request to process the next
            batch.
      required:
      - action
      - affected
      - ids
      - dry_run
      - has_more
      additionalProperties: false
    CompanyEntity:
      type:
      - object
      properties:
        type:
          type: string
          const: company
          default: company
      required:
      - type
      title: Company
    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
    CreateSearchMonitorParameters:
      type: object
      properties:
        name:
          type: string
          description: An optional name for the monitor
        search:
          $ref: '#/components/schemas/SearchMonitorSearch'
        trigger:
          $ref: '#/components/schemas/SearchMonitorTrigger'
        outputSchema:
          $ref: '#/components/schemas/SearchMonitorOutputSchema'
        metadata:
          type: object
          propertyNames:
            type: string
          additionalProperties:
            type: string
          description: Optional key-value metadata. 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/SearchMonitorWebhook'
      required:
      - search
      - webhook
    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
    CustomEntity:
      type:
      - object
      properties:
        type:
          type: string
          const: custom
          default: custom
        description:
          type:
          - string
          minLength: 2
          maxLength: 200
      required:
      - type
      - description
      title: Custom
    Entity:
      oneOf:
      - type:
        - object
        $ref: '#/components/schemas/CompanyEntity'
      - type:
        - object
        $ref: '#/components/schemas/PersonEntity'
      - type:
        - object
        $ref: '#/components/schemas/ArticleEntity'
      - type:
        - object
        $ref: '#/components/schemas/ResearchPaperEntity'
      - type:
        - object
        $ref: '#/components/schemas/CustomEntity'
    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'
    ListMonitorRunsResponse:
      type:
      - object
      properties:
        data:
          type:
          - array
          items:
            type:
            - object
            $ref: '#/components/schemas/MonitorRun'
          description: The list of monitor runs
        hasMore:
          type:
          - bo

# --- truncated at 32 KB (82 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/exa-ai/refs/heads/main/openapi/exa-monitors-api-openapi.yml