List project monitors
GEThttps://api.spice.ai/v1/projects/{projectId}/monitors
Returns the project's monitors. Requires monitors:read. Monitors on a project that is not managed, or on a template that is not available to the organization, are omitted. An existing container_cpu monitor without an effective CPU limit remains visible with evaluation_unavailable_reason set to cpu_limit_missing.
Authorizations
AuthorizationstringRequiredBearer <token>. Authentication lists the tokens it accepts.
Path parameters
projectIdintegerRequiredThe ID of the project
Header parameters
X-Org-NamestringThe organization to act on, by handle. Omit it to act on the organization the credential is bound to; sending it blank is a 400, not the same as omitting it. A user credential may name any organization its owner belongs to; a machine credential is pinned to its own. A portal session token is bound to none, so it must send this header on every route but
GET /v1/orgs(400org_assertion_requiredotherwise).- Pattern:
^[A-Za-z0-9._-]{1,255}$
- Pattern:
Responses
200List of project monitorsapplication/json
monitorsarray of object18 properties
idstring (uuid)RequiredIdentifier of the monitor or reaction. This is the value the get, update and delete operations take.
org_idintegerRequiredOrganization that owns the project
app_idintegerRequiredProject the monitor or reaction belongs to
created_byinteger | nullRequiredUser who created it, when it was created by a user credential
namestringRequiredDisplay name, unique case-insensitively among the project's live monitors and data reactions
descriptionstring | nullRequiredkindstringRequiredThe monitors endpoints only ever return
runtime.- Value:
runtime
- Value:
statusstringRequiredWhether it is evaluating
- Allowed values:
active,disabled
- Allowed values:
template_idstringRequiredTemplate it was created from
specobjectRequiredMonitor parameters. Which properties are meaningful is decided by
template_id. The create operation's request body lists the properties each template reads.targetobjectRequiredThe primary sink (email, then slack, then http).
targetsis the full list. An HTTP sink'stokenis write-only and is never returned.3 options
One of
type: emailobject
typestringRequired- Value:
email
- Value:
recipientUserIdsarray of integeremailsarray of string (email)
type: httpobject
typestringRequired- Value:
http
- Value:
urlstring (uri) | ""RequiredThe sink's URL. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
methodstring- Allowed values:
POST,PUT,PATCH
- Allowed values:
type: slackobject
typestringRequired- Value:
slack
- Value:
channelIdstring | ""RequiredThe Slack channel ID. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
channelNamestring- Minimum length:
1 - Maximum length:
80
- Minimum length:
targetsarray of objectRequiredEvery configured sink, ordered email, then slack, then http.
targetis the first of these. An HTTP sink's token is never returned.- Minimum items:
1 - Maximum items:
3
3 options
One of
type: emailobject
typestringRequired- Value:
email
- Value:
recipientUserIdsarray of integeremailsarray of string (email)
type: httpobject
typestringRequired- Value:
http
- Value:
urlstring (uri) | ""RequiredThe sink's URL. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
methodstring- Allowed values:
POST,PUT,PATCH
- Allowed values:
type: slackobject
typestringRequired- Value:
slack
- Value:
channelIdstring | ""RequiredThe Slack channel ID. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
channelNamestring- Minimum length:
1 - Maximum length:
80
- Minimum length:
- Minimum items:
recipient_user_idsarray of integerRequiredOrganization members emailed when the monitor fires. Empty when there is no email sink, and for an email sink addressed only by
emails. When a created email sink named no recipients at all, the API stores the creating user; a machine credential has no user, so it stores none and the monitor emails the organization owner.last_fired_atstring (date-time) | nullRequiredWhen it last fired, or null if it never has
last_resolved_atstring (date-time) | nullRequiredWhen it last resolved, or null if it never has
created_atstring (date-time)Requiredupdated_atstring (date-time)Requiredevaluation_unavailable_reasonstringPresent when an existing Instance CPU monitor cannot evaluate because its CPU limit was removed.
- Value:
cpu_limit_missing
- Value:
400Invalid project ID
401Unauthorized
403Insufficient scope
404Project not found
500Internal server error
curl "https://api.spice.ai/v1/projects/<projectId>/monitors" \
-H "Authorization: Bearer <token>"GET /v1/projects/<projectId>/monitors HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>{
"monitors": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"org_id": 0,
"app_id": 0,
"created_by": 0,
"name": "string",
"description": "string",
"kind": "runtime",
"status": "active",
"template_id": "string",
"spec": {},
"target": {
"type": "email",
"recipientUserIds": [
0
],
"emails": [
"user@example.com"
]
},
"targets": [
{
"type": "email",
"recipientUserIds": [
0
],
"emails": [
"user@example.com"
]
}
],
"recipient_user_ids": [
0
],
"last_fired_at": "2026-01-01T00:00:00Z",
"last_resolved_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z",
"evaluation_unavailable_reason": "cpu_limit_missing"
}
]
}application/json
No response body
No response body
No response body
No response body
No response body
GEThttps://api.spice.ai/v1/orgs/{orgId}/projects/{projectId}/monitors
The org is orgId in the path. Returns the project's monitors. Requires monitors:read. Monitors on a project that is not managed, or on a template that is not available to the organization, are omitted. An existing container_cpu monitor without an effective CPU limit remains visible with evaluation_unavailable_reason set to cpu_limit_missing.
Authorizations
AuthorizationstringRequiredBearer <token>. Authentication lists the tokens it accepts.
Path parameters
orgIdintegerRequiredThe org id from GET /v1/orgs
- Minimum:
1
- Minimum:
projectIdintegerRequiredThe ID of the project
Header parameters
X-Org-NamestringWhen present, X-Org-Name must name the same org as orgId. Otherwise the request returns org_path_mismatch (400).
- Pattern:
^[A-Za-z0-9._-]{1,255}$
- Pattern:
Responses
200List of project monitorsapplication/json
monitorsarray of object18 properties
idstring (uuid)RequiredIdentifier of the monitor or reaction. This is the value the get, update and delete operations take.
org_idintegerRequiredOrganization that owns the project
app_idintegerRequiredProject the monitor or reaction belongs to
created_byinteger | nullRequiredUser who created it, when it was created by a user credential
namestringRequiredDisplay name, unique case-insensitively among the project's live monitors and data reactions
descriptionstring | nullRequiredkindstringRequiredThe monitors endpoints only ever return
runtime.- Value:
runtime
- Value:
statusstringRequiredWhether it is evaluating
- Allowed values:
active,disabled
- Allowed values:
template_idstringRequiredTemplate it was created from
specobjectRequiredMonitor parameters. Which properties are meaningful is decided by
template_id. The create operation's request body lists the properties each template reads.targetobjectRequiredThe primary sink (email, then slack, then http).
targetsis the full list. An HTTP sink'stokenis write-only and is never returned.3 options
One of
type: emailobject
typestringRequired- Value:
email
- Value:
recipientUserIdsarray of integeremailsarray of string (email)
type: httpobject
typestringRequired- Value:
http
- Value:
urlstring (uri) | ""RequiredThe sink's URL. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
methodstring- Allowed values:
POST,PUT,PATCH
- Allowed values:
type: slackobject
typestringRequired- Value:
slack
- Value:
channelIdstring | ""RequiredThe Slack channel ID. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
channelNamestring- Minimum length:
1 - Maximum length:
80
- Minimum length:
targetsarray of objectRequiredEvery configured sink, ordered email, then slack, then http.
targetis the first of these. An HTTP sink's token is never returned.- Minimum items:
1 - Maximum items:
3
3 options
One of
type: emailobject
typestringRequired- Value:
email
- Value:
recipientUserIdsarray of integeremailsarray of string (email)
type: httpobject
typestringRequired- Value:
http
- Value:
urlstring (uri) | ""RequiredThe sink's URL. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
methodstring- Allowed values:
POST,PUT,PATCH
- Allowed values:
type: slackobject
typestringRequired- Value:
slack
- Value:
channelIdstring | ""RequiredThe Slack channel ID. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
channelNamestring- Minimum length:
1 - Maximum length:
80
- Minimum length:
- Minimum items:
recipient_user_idsarray of integerRequiredOrganization members emailed when the monitor fires. Empty when there is no email sink, and for an email sink addressed only by
emails. When a created email sink named no recipients at all, the API stores the creating user; a machine credential has no user, so it stores none and the monitor emails the organization owner.last_fired_atstring (date-time) | nullRequiredWhen it last fired, or null if it never has
last_resolved_atstring (date-time) | nullRequiredWhen it last resolved, or null if it never has
created_atstring (date-time)Requiredupdated_atstring (date-time)Requiredevaluation_unavailable_reasonstringPresent when an existing Instance CPU monitor cannot evaluate because its CPU limit was removed.
- Value:
cpu_limit_missing
- Value:
400Bad Request
Invalid project ID. orgId is not a valid org id (invalid_org_id), or X-Org-Name does not name that org (org_path_mismatch).
401Unauthorized
403Forbidden
Insufficient scope. The caller is not a member of the org (org_forbidden). A machine credential named a different org (org_assertion_mismatch). The org is deleted (org_deleted).
404Project not found
500Internal server error
curl "https://api.spice.ai/v1/orgs/<orgId>/projects/<projectId>/monitors" \
-H "Authorization: Bearer <token>"GET /v1/orgs/<orgId>/projects/<projectId>/monitors HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>{
"monitors": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"org_id": 0,
"app_id": 0,
"created_by": 0,
"name": "string",
"description": "string",
"kind": "runtime",
"status": "active",
"template_id": "string",
"spec": {},
"target": {
"type": "email",
"recipientUserIds": [
0
],
"emails": [
"user@example.com"
]
},
"targets": [
{
"type": "email",
"recipientUserIds": [
0
],
"emails": [
"user@example.com"
]
}
],
"recipient_user_ids": [
0
],
"last_fired_at": "2026-01-01T00:00:00Z",
"last_resolved_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z",
"evaluation_unavailable_reason": "cpu_limit_missing"
}
]
}application/json
No response body
No response body
No response body
No response body
No response body
GEThttps://api.spice.ai/v1/apps/{appId}/monitorsDeprecated
Legacy alias of /v1/projects/{projectId}/monitors — projects were previously called apps. Returns the project's monitors. Requires monitors:read. Monitors on a project that is not managed, or on a template that is not available to the organization, are omitted. An existing container_cpu monitor without an effective CPU limit remains visible with evaluation_unavailable_reason set to cpu_limit_missing.
Authorizations
AuthorizationstringRequiredBearer <token>. Authentication lists the tokens it accepts.
Path parameters
appIdintegerRequiredThe ID of the project
Header parameters
X-Org-NamestringThe organization to act on, by handle. Omit it to act on the organization the credential is bound to; sending it blank is a 400, not the same as omitting it. A user credential may name any organization its owner belongs to; a machine credential is pinned to its own. A portal session token is bound to none, so it must send this header on every route but
GET /v1/orgs(400org_assertion_requiredotherwise).- Pattern:
^[A-Za-z0-9._-]{1,255}$
- Pattern:
Responses
200List of project monitorsapplication/json
monitorsarray of object18 properties
idstring (uuid)RequiredIdentifier of the monitor or reaction. This is the value the get, update and delete operations take.
org_idintegerRequiredOrganization that owns the project
app_idintegerRequiredProject the monitor or reaction belongs to
created_byinteger | nullRequiredUser who created it, when it was created by a user credential
namestringRequiredDisplay name, unique case-insensitively among the project's live monitors and data reactions
descriptionstring | nullRequiredkindstringRequiredThe monitors endpoints only ever return
runtime.- Value:
runtime
- Value:
statusstringRequiredWhether it is evaluating
- Allowed values:
active,disabled
- Allowed values:
template_idstringRequiredTemplate it was created from
specobjectRequiredMonitor parameters. Which properties are meaningful is decided by
template_id. The create operation's request body lists the properties each template reads.targetobjectRequiredThe primary sink (email, then slack, then http).
targetsis the full list. An HTTP sink'stokenis write-only and is never returned.3 options
One of
type: emailobject
typestringRequired- Value:
email
- Value:
recipientUserIdsarray of integeremailsarray of string (email)
type: httpobject
typestringRequired- Value:
http
- Value:
urlstring (uri) | ""RequiredThe sink's URL. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
methodstring- Allowed values:
POST,PUT,PATCH
- Allowed values:
type: slackobject
typestringRequired- Value:
slack
- Value:
channelIdstring | ""RequiredThe Slack channel ID. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
channelNamestring- Minimum length:
1 - Maximum length:
80
- Minimum length:
targetsarray of objectRequiredEvery configured sink, ordered email, then slack, then http.
targetis the first of these. An HTTP sink's token is never returned.- Minimum items:
1 - Maximum items:
3
3 options
One of
type: emailobject
typestringRequired- Value:
email
- Value:
recipientUserIdsarray of integeremailsarray of string (email)
type: httpobject
typestringRequired- Value:
http
- Value:
urlstring (uri) | ""RequiredThe sink's URL. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
methodstring- Allowed values:
POST,PUT,PATCH
- Allowed values:
type: slackobject
typestringRequired- Value:
slack
- Value:
channelIdstring | ""RequiredThe Slack channel ID. An empty string means the stored sink no longer passes validation. Update the sink to replace it.
channelNamestring- Minimum length:
1 - Maximum length:
80
- Minimum length:
- Minimum items:
recipient_user_idsarray of integerRequiredOrganization members emailed when the monitor fires. Empty when there is no email sink, and for an email sink addressed only by
emails. When a created email sink named no recipients at all, the API stores the creating user; a machine credential has no user, so it stores none and the monitor emails the organization owner.last_fired_atstring (date-time) | nullRequiredWhen it last fired, or null if it never has
last_resolved_atstring (date-time) | nullRequiredWhen it last resolved, or null if it never has
created_atstring (date-time)Requiredupdated_atstring (date-time)Requiredevaluation_unavailable_reasonstringPresent when an existing Instance CPU monitor cannot evaluate because its CPU limit was removed.
- Value:
cpu_limit_missing
- Value:
400Invalid project ID
401Unauthorized
403Insufficient scope
404Project not found
500Internal server error
OpenAPIapi.spice.ai/openapi.json
curl "https://api.spice.ai/v1/apps/<appId>/monitors" \
-H "Authorization: Bearer <token>"GET /v1/apps/<appId>/monitors HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>{
"monitors": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"org_id": 0,
"app_id": 0,
"created_by": 0,
"name": "string",
"description": "string",
"kind": "runtime",
"status": "active",
"template_id": "string",
"spec": {},
"target": {
"type": "email",
"recipientUserIds": [
0
],
"emails": [
"user@example.com"
]
},
"targets": [
{
"type": "email",
"recipientUserIds": [
0
],
"emails": [
"user@example.com"
]
}
],
"recipient_user_ids": [
0
],
"last_fired_at": "2026-01-01T00:00:00Z",
"last_resolved_at": "2026-01-01T00:00:00Z",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z",
"evaluation_unavailable_reason": "cpu_limit_missing"
}
]
}application/json
No response body
No response body
No response body
No response body
No response body