Update monitor
PATCH /v1/monitors/{id}
A PATCH that newly enables webhook signing (turns notify_webhook on, or sets a webhook_url where no secret existed before) returns the signing secret (monitor.webhook_secret) in this response. Store it securely. A retry with the original Idempotency-Key recovers the same secret for up to 24 hours while it remains the current secret or the valid previous secret. An expired or displaced secret returns 409 idempotency_result_expired without rotating again. Reads do not expose the secret. Unrelated PATCHes expose only webhook_secret_set and webhook_secret_hint. PATCHing notify_webhook: true also re-enables a webhook that was auto-disabled after repeated failures and resets its failure counter.
Parameters
| Name | Location | Description |
|---|
| id (required) | path | Monitor id. |
| Idempotency-Key | header | One key per intent, 1 to 255 printable ASCII characters (0x21 to 0x7E); anything else is 400 invalid_idempotency_key. Keys are scoped to the account, credential and resource family. The same key and normalized method, path and body returns the committed response with Idempotency-Replayed: true. A changed intent within the same family returns 409 idempotency_conflict. Monitor and tracker families have independent namespaces. Secret recovery is limited as described by the operation. |
Request body
{
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Display name (1-100 characters). Required on create."
},
"notify_emails": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"maxItems": 20,
"description": "Desired email recipients. External recipients must confirm before delivery. Free includes one additional recipient per monitor; paid plans allow up to 20 total. Default []."
},
"notify_frequency": {
"type": "string",
"enum": [
"realtime",
"hourly",
"daily"
],
"description": "Delivery cadence. Default realtime. Values: realtime (as analysis completes), hourly (hourly digest), daily (daily digest)."
},
"digest_day": {
"type": "string",
"description": "Digest day of week. Default \"monday\". Consulted only by weekly digests, which are dashboard-configured today; inert for API-set frequencies."
},
"digest_time": {
"type": "string",
"description": "Digest send hour as HH:MM (account timezone). Default \"09:00\". Applies to daily digests."
},
"notify_webhook": {
"type": "boolean",
"description": "Enable HMAC-signed webhook delivery (paid plans). When enabled together with webhook_url, the response returns the signing secret (monitor.webhook_secret), recoverable with the original Idempotency-Key during the valid recovery window. PATCHing true also re-enables an auto-disabled webhook and resets its failure counter."
},
"webhook_url": {
"type": "string",
"description": "Destination URL for webhook alert deliveries."
},
"notify_slack": {
"type": "boolean",
"description": "Enable Slack delivery. Requires a Slack integration connected in the dashboard."
},
"slack_integration_id": {
"type": "string",
"description": "Slack integration id from the dashboard OAuth flow."
},
"slack_channel_id": {
"type": "string",
"description": "Slack channel id to deliver to."
},
"paused": {
"type": "boolean",
"description": "Paused monitors accept config changes but do not deliver; alerts that would have fired are not queued."
}
},
"additionalProperties": false
}
}
}
}
Responses
200 Success
{
"description": "Success",
"headers": {
"X-Request-Id": {
"$ref": "#/components/headers/X-Request-Id"
},
"X-Arcmira-Version": {
"$ref": "#/components/headers/X-Arcmira-Version"
},
"RateLimit-Limit": {
"$ref": "#/components/headers/RateLimit-Limit"
},
"RateLimit-Remaining": {
"$ref": "#/components/headers/RateLimit-Remaining"
},
"RateLimit-Reset": {
"$ref": "#/components/headers/RateLimit-Reset"
},
"Idempotency-Replayed": {
"$ref": "#/components/headers/Idempotency-Replayed"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MonitorMutationResponse"
}
}
}
}
400 InvalidRequest
{
"$ref": "#/components/responses/InvalidRequest"
}
401 AuthenticationError
{
"$ref": "#/components/responses/AuthenticationError"
}
403 PermissionError
{
"$ref": "#/components/responses/PermissionError"
}
404 NotFound
{
"$ref": "#/components/responses/NotFound"
}
409 Conflict. idempotency_conflict means the Idempotency-Key was finalized with a different request intent.
{
"description": "Conflict. idempotency_conflict means the Idempotency-Key was finalized with a different request intent.",
"headers": {
"X-Request-Id": {
"$ref": "#/components/headers/X-Request-Id"
},
"X-Arcmira-Version": {
"$ref": "#/components/headers/X-Arcmira-Version"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
429 RateLimited
{
"$ref": "#/components/responses/RateLimited"
}
500 ServerError
{
"$ref": "#/components/responses/ServerError"
}
Operation definition
{
"tags": [
"Monitors"
],
"operationId": "update_monitor",
"summary": "Update monitor",
"description": "A PATCH that newly enables webhook signing (turns notify_webhook on, or sets a webhook_url where no secret existed before) returns the signing secret (monitor.webhook_secret) in this response. Store it securely. A retry with the original Idempotency-Key recovers the same secret for up to 24 hours while it remains the current secret or the valid previous secret. An expired or displaced secret returns 409 idempotency_result_expired without rotating again. Reads do not expose the secret. Unrelated PATCHes expose only webhook_secret_set and webhook_secret_hint. PATCHing notify_webhook: true also re-enables a webhook that was auto-disabled after repeated failures and resets its failure counter.",
"security": [
{
"bearerAuth": []
}
],
"parameters": [
{
"schema": {
"type": "string",
"description": "Monitor id."
},
"required": true,
"description": "Monitor id.",
"name": "id",
"in": "path"
},
{
"schema": {
"type": "string"
},
"required": false,
"name": "Idempotency-Key",
"in": "header",
"example": "8b2f6c3e-4d1a-4e7b-9c05-2f6a1b7d3e90",
"description": "One key per intent, 1 to 255 printable ASCII characters (0x21 to 0x7E); anything else is 400 invalid_idempotency_key. Keys are scoped to the account, credential and resource family. The same key and normalized method, path and body returns the committed response with Idempotency-Replayed: true. A changed intent within the same family returns 409 idempotency_conflict. Monitor and tracker families have independent namespaces. Secret recovery is limited as described by the operation."
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Display name (1-100 characters). Required on create."
},
"notify_emails": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"maxItems": 20,
"description": "Desired email recipients. External recipients must confirm before delivery. Free includes one additional recipient per monitor; paid plans allow up to 20 total. Default []."
},
"notify_frequency": {
"type": "string",
"enum": [
"realtime",
"hourly",
"daily"
],
"description": "Delivery cadence. Default realtime. Values: realtime (as analysis completes), hourly (hourly digest), daily (daily digest)."
},
"digest_day": {
"type": "string",
"description": "Digest day of week. Default \"monday\". Consulted only by weekly digests, which are dashboard-configured today; inert for API-set frequencies."
},
"digest_time": {
"type": "string",
"description": "Digest send hour as HH:MM (account timezone). Default \"09:00\". Applies to daily digests."
},
"notify_webhook": {
"type": "boolean",
"description": "Enable HMAC-signed webhook delivery (paid plans). When enabled together with webhook_url, the response returns the signing secret (monitor.webhook_secret), recoverable with the original Idempotency-Key during the valid recovery window. PATCHing true also re-enables an auto-disabled webhook and resets its failure counter."
},
"webhook_url": {
"type": "string",
"description": "Destination URL for webhook alert deliveries."
},
"notify_slack": {
"type": "boolean",
"description": "Enable Slack delivery. Requires a Slack integration connected in the dashboard."
},
"slack_integration_id": {
"type": "string",
"description": "Slack integration id from the dashboard OAuth flow."
},
"slack_channel_id": {
"type": "string",
"description": "Slack channel id to deliver to."
},
"paused": {
"type": "boolean",
"description": "Paused monitors accept config changes but do not deliver; alerts that would have fired are not queued."
}
},
"additionalProperties": false
}
}
}
},
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"$ref": "#/components/headers/X-Request-Id"
},
"X-Arcmira-Version": {
"$ref": "#/components/headers/X-Arcmira-Version"
},
"RateLimit-Limit": {
"$ref": "#/components/headers/RateLimit-Limit"
},
"RateLimit-Remaining": {
"$ref": "#/components/headers/RateLimit-Remaining"
},
"RateLimit-Reset": {
"$ref": "#/components/headers/RateLimit-Reset"
},
"Idempotency-Replayed": {
"$ref": "#/components/headers/Idempotency-Replayed"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MonitorMutationResponse"
}
}
}
},
"400": {
"$ref": "#/components/responses/InvalidRequest"
},
"401": {
"$ref": "#/components/responses/AuthenticationError"
},
"403": {
"$ref": "#/components/responses/PermissionError"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"409": {
"description": "Conflict. idempotency_conflict means the Idempotency-Key was finalized with a different request intent.",
"headers": {
"X-Request-Id": {
"$ref": "#/components/headers/X-Request-Id"
},
"X-Arcmira-Version": {
"$ref": "#/components/headers/X-Arcmira-Version"
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"$ref": "#/components/responses/RateLimited"
},
"500": {
"$ref": "#/components/responses/ServerError"
}
}
}