Metaplane Monitors API

The Monitors API from Metaplane — 12 operations for creating, updating, running and reading data quality monitors, their evaluation history and their status, plus historic-data import and datapoint ingestion.

Operations 12

POST /v2/monitors/bulk-fetch/tables/{connectionId} Bulk get monitors on tables #
POST /v1/monitors Create Monitor #
GET /v1/monitors/connection/{connectionId} List for connection #
POST /v1/monitors/evaluation-history/{monitorId} Evaluation History #
GET /v1/monitors/{monitorId} Get monitor #
POST /v1/monitors/{monitorId} Update monitor #
GET /v1/monitors/path/{connectionId}/{absolutePath} Get for database entity #
GET /v1/monitors/status/{monitorId} Status (deprecated) #
GET /v2/monitors/status/{monitorId} Status #
POST /v1/monitors/import-historic/{monitorId} Import Historic Data #
POST /v1/monitors/ingest-datapoint/{monitorId} Ingest Datapoint #
POST /v1/monitors/run Run #

Work with this as data

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/metaplane-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 Specification

metaplane-monitors-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Metaplane Monitors API
  description: 'The Monitors API from Metaplane — 12 operation(s) for monitors. Data observability: automated anomaly detection
    and data quality monitoring.'
  version: '1.0'
  contact:
    name: Metaplane
    url: https://docs.metaplane.dev/reference/getting-started
servers:
- url: https://dev.api.metaplane.dev
security:
- Authorization: []
tags:
- name: Monitors
paths:
  /v2/monitors/bulk-fetch/tables/{connectionId}:
    post:
      tags:
      - Monitors
      summary: Bulk get monitors on tables
      description: Get all monitors on the input table paths. Limit of 200 table paths per request.
      operationId: bulkGetTableMonitors
      parameters:
      - name: connectionId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - name: includeDisabled
        in: query
        schema:
          type: boolean
      - name: fetchGroups
        in: query
        schema:
          type: boolean
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkFetchMonitorTablesRequest'
        required: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorListResult'
  /v1/monitors:
    post:
      tags:
      - Monitors
      summary: Create Monitor
      description: Create a new monitor on a given absolute path like "{database}.{schema}.{table}.{column}"
      operationId: createMonitor
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitorEgg'
        required: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicMonitor'
  /v1/monitors/connection/{connectionId}:
    get:
      tags:
      - Monitors
      summary: List for connection
      description: List all monitors for a specific connection
      operationId: getAllMonitorsForSource
      parameters:
      - name: connectionId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - name: includeDisabled
        in: query
        schema:
          type: boolean
      - name: fetchGroups
        in: query
        schema:
          type: boolean
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorListResult'
  /v1/monitors/evaluation-history/{monitorId}:
    post:
      tags:
      - Monitors
      summary: Evaluation History
      description: Get historical evaluations of the monitor ordered by evaluation creation time descending. By default this
        will return pages of 500 evaluations. To page through all data, specify the `createdAt` request to get the next chunk
        of data. Even though this is a post request, no data is mutated.
      operationId: getEvaluationHistory
      parameters:
      - name: monitorId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EvaluationHistoryRequest'
        required: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/MonitorStatus'
  /v1/monitors/{monitorId}:
    get:
      tags:
      - Monitors
      summary: Get monitor
      description: Fetch an existing monitor
      operationId: getMonitor
      parameters:
      - name: monitorId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - name: fetchGroups
        in: query
        schema:
          type: boolean
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicMonitor'
    post:
      tags:
      - Monitors
      summary: Update monitor
      description: Update an existing monitor. Omitted update fields will not be change in the underlying monitor
      operationId: updateMonitor
      parameters:
      - name: monitorId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitorUpdate'
        required: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicMonitor'
  /v1/monitors/path/{connectionId}/{absolutePath}:
    get:
      tags:
      - Monitors
      summary: Get for database entity
      description: Get all monitors targeting a specific absolute path like "{database}.{schema}.{table}.{column}"
      operationId: getMonitors
      parameters:
      - name: connectionId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - name: absolutePath
        in: path
        required: true
        schema:
          type: string
      - name: entityType
        in: query
        schema:
          type: string
          enum:
          - TABLE
          - COLUMN
          - DATABASE
          - SCHEMA
      - name: includeDisabled
        in: query
        schema:
          type: boolean
      - name: fetchGroups
        in: query
        schema:
          type: boolean
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorListResult'
  /v1/monitors/status/{monitorId}:
    get:
      tags:
      - Monitors
      summary: Status (deprecated)
      description: Get the latest status of a monitor. Will return a 404 if the monitor has not yet been run and modeled
      operationId: getMonitorStatus
      parameters:
      - name: monitorId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorStatus'
  /v2/monitors/status/{monitorId}:
    get:
      tags:
      - Monitors
      summary: Status
      description: Get the latest status of a monitor. Will return a 404 if the monitor has not yet been run and modeled
      operationId: getMonitorStatus2
      parameters:
      - name: monitorId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorStatusResultV2'
  /v1/monitors/import-historic/{monitorId}:
    post:
      tags:
      - Monitors
      summary: Import Historic Data
      description: Import historic data for the monitor. Full documentation at https://docs.metaplane.dev/docs/importing-historical-data#limitations.
        Setting `isPreview` to  true will validate the import without actually inserting data.
      operationId: importHistoricDataForMonitor
      parameters:
      - name: monitorId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ImportHistoricDataRequest'
        required: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicImportResult'
  /v1/monitors/ingest-datapoint/{monitorId}:
    post:
      tags:
      - Monitors
      summary: Ingest Datapoint
      description: Sends a datapoint to add to the target monitorId with the current timestamp and then modeled. In private
        Beta, reach out for access.
      operationId: ingestDataPoint
      parameters:
      - name: monitorId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicSeriesPoint'
        required: false
      responses:
        '200':
          description: Success
  /v1/monitors/run:
    post:
      tags:
      - Monitors
      summary: Run
      description: Enqueue a list of existing monitors to be immediately run. Note that a success here just means that we
        have enqueued the monitors to be run, not that they have finished running
      operationId: runMonitors
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RunMonitorsRequest'
        required: false
      responses:
        '200':
          description: Success
components:
  schemas:
    AnnotatedPoint:
      type: object
      properties:
        annotationType:
          type: string
          enum:
          - FALSE_POSITIVE
          - FALSE_NEGATIVE
          - EXPECTED_OCCASIONALLY
          - NEW_BASELINE
          - TRUE_POSITIVE
        annotatedTimestamp:
          type: string
          format: date-time
        annotatingUserEmail:
          type: string
      description: Optional annotation that was applied to this specific datapoint
      nullable: true
    BulkFetchMonitorTablesRequest:
      type: object
      properties:
        tablePaths:
          uniqueItems: true
          type: array
          description: 'Set of table path string in format of: {database}.{schema}.{table}'
          items:
            type: string
            description: 'Set of table path string in format of: {database}.{schema}.{table}'
    EvaluationHistoryRequest:
      type: object
      properties:
        groupings:
          uniqueItems: true
          type: array
          description: Optional, only needed if you want the history for a specific group of a group by monitor
          nullable: true
          items:
            $ref: '#/components/schemas/LabelNameValue'
        createdAt:
          type: string
          description: Leaving empty gets starts at the most recent evaluation
          format: date-time
          nullable: true
        sortOrder:
          type: string
          default: DESC
          enum:
          - ASC
          - DESC
        limit:
          type: integer
          description: How many records to return. Max number per page is 500
          format: int32
          nullable: true
          default: 500
    ImportHistoricDataRequest:
      type: object
      properties:
        dataPoints:
          type: array
          items:
            $ref: '#/components/schemas/PublicSeriesPointWithTimestamp'
        isPreview:
          type: boolean
          description: Optional flag to allow previewing what the result of the import would be. Setting to true will validate
            the import without actually inserting data
          nullable: true
          default: false
    LabelNameValue:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
    MonitorConfig:
      type: object
      properties:
        customSql:
          type: string
          nullable: true
        customMetricUnitType:
          type: string
          description: Overrides the display type in the metaplane UI. Default to float if not specified. Only applies to
            custom sql monitors
          nullable: true
          enum:
          - INT
          - FLOAT
          - PERCENT
          - SECOND
          - BYTE
          - MILLISECOND
        incrementalClause:
          $ref: '#/components/schemas/PublicIncrementalClause'
        customWhereClause:
          type: string
          nullable: true
        alertRule:
          $ref: '#/components/schemas/PublicAlertRule'
        groupByColumns:
          type: array
          description: List of columns to group query by
          nullable: true
          items:
            type: string
            description: List of columns to group query by
            nullable: true
        timeZone:
          type: string
          description: 'Timezone identifier like: America/New_York'
          nullable: true
      nullable: true
    MonitorEgg:
      type: object
      properties:
        type:
          type: string
          enum:
          - ROW_COUNT
          - COLUMN_COUNT
          - CARDINALITY
          - UNIQUENESS
          - NULLNESS
          - PERCENT_ZERO
          - PERCENT_NEGATIVE
          - MIN
          - MAX
          - MEAN
          - STDDEV
          - FRESHNESS
          - CUSTOM
          - PUSH
          - SUM
          - DURATION
          - GENERIC_OBJECT
        cronTab:
          type: string
        config:
          $ref: '#/components/schemas/MonitorConfig'
        connectionId:
          type: string
          format: uuid
        entityType:
          type: string
          enum:
          - TABLE
          - COLUMN
          - DATABASE
          - SCHEMA
        absolutePathString:
          type: string
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
    MonitorGrouping:
      type: object
      properties:
        groupings:
          uniqueItems: true
          type: array
          items:
            $ref: '#/components/schemas/LabelNameValue'
      description: List of all groups that have seen at least one datapoint for this monitor
      nullable: true
    MonitorListResult:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PublicMonitor'
    MonitorStatus:
      type: object
      properties:
        result:
          type: number
          format: double
          nullable: true
        lowerBound:
          type: number
          format: double
          nullable: true
        upperBound:
          type: number
          format: double
          nullable: true
        predicted:
          type: number
          format: double
          nullable: true
        passed:
          type: boolean
          nullable: true
        createdAt:
          type: string
          format: date-time
        status:
          type: string
          nullable: true
          enum:
          - PASS
          - FAIL
          - IN_TRAINING
          - FAILED_TO_PREDICT
          - NOT_ENOUGH_DATA
          - ERROR
          - INVALID_INPUT
        openRelatedIncidents:
          uniqueItems: true
          type: array
          description: A list of currently active incidents
          items:
            type: integer
            description: A list of currently active incidents
            format: int64
        errorMessage:
          type: string
          description: Error message if the latest evaluation is failed
          nullable: true
        annotation:
          $ref: '#/components/schemas/AnnotatedPoint'
    MonitorStatusResultV2:
      type: object
      properties:
        statuses:
          type: array
          items:
            $ref: '#/components/schemas/SeriesStatus'
        isErrored:
          type: boolean
          description: Flag set to true if the group by query itself failed to run
        timestamp:
          type: string
          format: date-time
        errorMessage:
          type: string
          description: Error message if the latest evaluation is failed
          nullable: true
    MonitorUpdate:
      type: object
      properties:
        isEnabled:
          type: boolean
        cronTab:
          type: string
        config:
          $ref: '#/components/schemas/MonitorConfig'
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
    PublicAlertRule:
      type: object
      properties:
        type:
          type: string
          enum:
          - ANOMALY
          - MANUAL
        numFailuresBeforeAlert:
          type: integer
          description: Number of time a monitor can fail before an incident is created
          format: int32
          nullable: true
      description: Optional alert rule configuration. Defaults to ANOMALY
      nullable: true
      discriminator:
        propertyName: type
        mapping:
          MANUAL: '#/components/schemas/PublicManualThresholdRule'
          ANOMALY: '#/components/schemas/PublicAnomalyAlertRule'
      oneOf:
      - $ref: '#/components/schemas/PublicAnomalyAlertRule'
      - $ref: '#/components/schemas/PublicManualThresholdRule'
    PublicAnomalyAlertRule:
      type: object
      properties:
        sensitivity:
          type: number
          description: 'Control the bounds of the model. The default value is 3.0.

            0.3 high is the highest sensitivity correlating with smallest bounds.

            6.0 Is lowest sensitivity corresponding with the largest bounds.

            '
          format: double
          default: 3
        monitorTypeOverride:
          type: string
          enum:
          - ROW_COUNT
          - COLUMN_COUNT
          - CARDINALITY
          - UNIQUENESS
          - NULLNESS
          - PERCENT_ZERO
          - PERCENT_NEGATIVE
          - MIN
          - MAX
          - MEAN
          - STDDEV
          - FRESHNESS
          - CUSTOM
          - PUSH
          - SUM
          - DURATION
          - GENERIC_OBJECT
        modelClassType:
          type: string
          enum:
          - STATIONARY
          - NONE
        modelBoundsOverride:
          type: string
          description: Flags to completely override part of the model bounds
          nullable: true
          enum:
          - UPPER_ONLY
          - LOWER_ONLY
        minLowerBoundSize:
          type: number
          description: 'Controls the minimum size for the lower bound of the models predictive range

            '
          format: double
          nullable: true
          default: 3
        minUpperBoundSize:
          type: number
          description: 'Controls the minimum size for the upper bound of the models predictive range

            '
          format: double
          nullable: true
          default: 3
    PublicImportResult:
      type: object
      properties:
        totalDataPoints:
          type: integer
          format: int32
        totalValidDataPoints:
          type: integer
          format: int32
        groupByValues:
          uniqueItems: true
          type: array
          items:
            type: string
        filterReasonCounts:
          type: object
          additionalProperties:
            type: integer
            format: int64
    PublicIncrementalClause:
      type: object
      properties:
        columnName:
          type: string
        duration:
          $ref: '#/components/schemas/TimeDuration'
      nullable: true
    PublicManualThreshold:
      type: object
      properties:
        operatorType:
          type: string
          enum:
          - GREATER_THAN
          - GREATER_THAN_EQUALS
          - LESS_THAN
          - LESS_THAN_EQUALS
          - EQUAL
          - NOT_EQUAL
        value:
          type: number
          format: double
    PublicManualThresholdRule:
      type: object
      properties:
        thresholds:
          uniqueItems: true
          type: array
          items:
            $ref: '#/components/schemas/PublicManualThreshold'
    PublicMonitor:
      type: object
      properties:
        id:
          type: string
          format: uuid
        type:
          type: string
          enum:
          - ROW_COUNT
          - COLUMN_COUNT
          - CARDINALITY
          - UNIQUENESS
          - NULLNESS
          - PERCENT_ZERO
          - PERCENT_NEGATIVE
          - MIN
          - MAX
          - MEAN
          - STDDEV
          - FRESHNESS
          - CUSTOM
          - PUSH
          - SUM
          - DURATION
          - GENERIC_OBJECT
        genericObjectSubtype:
          type: string
        valueType:
          type: string
          enum:
          - METRIC
          - SOURCE_TO_TARGET
        cronTab:
          type: string
        name:
          type: string
          nullable: true
        description:
          type: string
          nullable: true
        isEnabled:
          type: boolean
        config:
          $ref: '#/components/schemas/MonitorConfig'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        absolutePath:
          type: string
        entityType:
          type: string
        connectionId:
          type: string
          format: uuid
        monitorTags:
          uniqueItems: true
          type: array
          items:
            type: string
        monitorGroups:
          type: array
          description: List of all groups that have seen at least one datapoint for this monitor
          nullable: true
          items:
            $ref: '#/components/schemas/MonitorGrouping'
    PublicSeriesPoint:
      type: object
      properties:
        value:
          type: number
          format: double
        groups:
          type: object
          additionalProperties:
            type: string
            description: Each key is a group name and each value should be the group by value. Omit the monitor has no groups
            nullable: true
          description: Each key is a group name and each value should be the group by value. Omit the monitor has no groups
          nullable: true
    PublicSeriesPointWithTimestamp:
      type: object
      properties:
        value:
          type: number
          format: double
        groups:
          type: object
          additionalProperties:
            type: string
            description: Each key is a group name and each value should be the group by value. Omit the monitor has no groups
            nullable: true
          description: Each key is a group name and each value should be the group by value. Omit the monitor has no groups
          nullable: true
        timestamp:
          type: string
          description: ISO 8601 date time offset e.g. 2023‐09‐07T06:18:56−07:00 or 2023‐09‐07T13:18:56Z
          format: date-time
    RunMonitorsRequest:
      type: object
      properties:
        testIds:
          uniqueItems: true
          type: array
          items:
            type: string
            format: uuid
    SeriesStatus:
      type: object
      properties:
        result:
          type: number
          format: double
          nullable: true
        lowerBound:
          type: number
          format: double
          nullable: true
        upperBound:
          type: number
          format: double
          nullable: true
        status:
          type: string
          enum:
          - PASS
          - FAIL
          - IN_TRAINING
          - FAILED_TO_PREDICT
          - NOT_ENOUGH_DATA
          - ERROR
          - INVALID_INPUT
        groups:
          uniqueItems: true
          type: array
          description: The distinct set of key-value labels that identify this group. An empty set means it is the default
            group
          items:
            $ref: '#/components/schemas/LabelNameValue'
        openRelatedIncidents:
          uniqueItems: true
          type: array
          description: A list of currently active incidents
          items:
            type: integer
            description: A list of currently active incidents
            format: int64
    TimeDuration:
      type: object
      properties:
        days:
          type: integer
          format: int64
        hours:
          type: integer
          format: int64
        minutes:
          type: integer
          format: int64
  securitySchemes:
    Authorization:
      type: apiKey
      description: Copy in your API key generated from metaplane
      name: Authorization
      in: header
x-api-evangelist:
  harvested: '2026-08-29'
  method: searched
  source: Split by tag from openapi/_original/metaplane-api-openapi.yml, itself the union of the 23 OpenAPI documents Metaplane
    publishes at https://docs.metaplane.dev/reference/<operation>.md