---
title: "Create standing check"
method: POST
path: "/v1/ai/operators/{operator-id}/checks"
tags: ["AI Operators"]
---

# Create standing check

`POST /v1/ai/operators/{operator-id}/checks`

Create a standing check for the instance. The source is compiled before the check is stored; a compilation error is reported with status 400. Creation is refused with status 409 when the per-instance check limit (AIOperator.Checks.MaxPerInstance) is reached.

## Path parameters

- `operator-id` integer, required

## Request body

- AiOperatorCheckConfig — Standing check configuration. All fields are optional on update; "name" and "source" are required on creation.
  - `name` string — Check name (required on creation)
  - `description` string — What the check watches and why
  - `enabled` boolean — Enable or disable the check
  - `locked` boolean — Lock the check against modification by the operator
  - `source` string — NXSL source (required on creation). Contract: $object is bound to the check's object or null; return null or false when quiet; return a string (title) or a hash with title, severity, and details to fire; any other value is a check error.
  - `interval` integer — Run interval in seconds (floor 30)
  - `objectId` integer — Object bound as $object (0 = none); must be readable by the AI operator account
  - `action` 'wake' | 'observe' — Action applied when the check fires
  - `cooldown` integer — Minimum seconds between two action applications
  - `renotifyInterval` integer — Seconds after which the action is applied again while the check stays fired (0 = edge only)

## Response `201`

Check created

- AiOperatorCheck — Standing check of an AI operator instance
  - `id` integer — Unique check identifier
  - `instanceId` integer — Owning AI operator instance
  - `name` string — Check name
  - `description` string — What the check watches and why
  - `enabled` boolean — True if the check is scheduled
  - `locked` boolean — True if an administrator locked the check; the operator cannot modify or delete a locked check
  - `createdBy` 'model' | 'human' — Who created the check
  - `source` string — NXSL source code
  - `interval` integer — Run interval in seconds (minimum 30)
  - `objectId` integer — Object bound as $object (0 = none)
  - `action` 'wake' | 'observe' — Action applied when the check fires
  - `cooldown` integer — Minimum seconds between two action applications
  - `renotifyInterval` integer — Seconds after which the action is applied again while the check stays fired (0 = only on the quiet-to-fired edge)
  - `lastRun` string, date-time — Time of the last run
  - `lastVerdict` 'never' | 'quiet' | 'fired' | 'error' — Verdict of the last run
  - `lastFire` string, date-time — Time the check last fired
  - `lastPayload` string — JSON payload (title, severity, details) of the last fired run, or error of the last failed run
  - `consecutiveErrors` integer — Consecutive failed runs; the check is disabled when AIOperator.Checks.MaxConsecutiveErrors is reached
  - `runCount` integer — Total number of runs
  - `compileError` string — Compilation diagnostic if the stored source no longer compiles (empty otherwise)
  - `created` string, date-time — Creation time
  - `modified` string, date-time — Last modification time

## Other responses

- `400` — Invalid configuration or script compilation error
- `403` — Insufficient access rights
- `404` — Instance not found
- `409` — Check limit reached

## Changes

- **2026-09-17** `a203de7e5d7d` — 1 info
  - removed the non-success response with the status `503`
- **2026-09-17** `a81265c49fa9` — 1 info
  - added the non-success response with the status `503`
- **2026-09-07** `4390015280c9` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/netxms/apis/netxms-api/changes/v1/ai/operators/:operator-id/checks/post.md)

---

[API](https://skmtc.dev/netxms/apis/netxms-api.md) · [All operations](https://skmtc.dev/netxms/apis/netxms-api/llms.txt) · [OpenAPI document](https://skmtc.dev/netxms/apis/netxms-api/revisions/05f4250e90c7?raw)
