Skip to main content

Alert API Reference

Complete reference for all alert-related API endpoints, including alert management, webhook integrations, and filter rules.

Authentication

All alert API endpoints require authentication via one of the following methods:

MethodHeaderExample
Bearer TokenAuthorization: Bearer <token>Authorization: Bearer eyJ...
API KeyX-API-Key: <api_key>X-API-Key: noti_abc123...

See the Authentication Guide for details on obtaining tokens and API keys.

Base URL

https://app.notifer.io

Alerts

List Alerts

Retrieve a paginated list of alerts with optional filtering.

GET /api/alerts

Query Parameters:

ParameterTypeDefaultDescription
statusstring--Filter by status: open, acknowledged, resolved
topicstring--Filter by topic name
priority_mininteger--Minimum priority (1-5)
sourcestring--Filter by alert source (e.g., alertmanager, grafana)
searchstring--Full-text search across alert title and message
limitinteger50Results per page (max: 100)
offsetinteger0Number of results to skip
sortstringlast_received_atSort field: last_received_at, priority, status, count
orderstringdescSort order: asc, desc

Example:

curl "https://app.notifer.io/api/alerts?status=open&priority_min=1&limit=20" \
-H "Authorization: Bearer $TOKEN"

Response: 200 OK

{
"alerts": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"topic_id": "660e8400-e29b-41d4-a716-446655440001",
"topic_name": "server-alerts",
"alert_key": "HighCPU_web-01",
"title": "HighCPU",
"message": "CPU usage above 95% on web-01 for 5 minutes",
"priority": 1,
"status": "open",
"source": "alertmanager",
"tags": ["critical", "production", "cpu"],
"labels": {
"severity": "critical",
"env": "production",
"instance": "web-01"
},
"count": 3,
"first_received_at": "2026-02-14T08:00:00Z",
"last_received_at": "2026-02-14T08:15:00Z",
"acknowledged_at": null,
"acknowledged_by": null,
"resolved_at": null,
"resolved_by": null,
"resolve_reason": null
}
],
"total": 42
}

Get Alert Detail

Retrieve full details for a single alert.

GET /api/alerts/{topic_name}/{alert_key}

Path Parameters:

ParameterDescription
topic_nameThe topic name
alert_keyThe unique alert key within the topic

Example:

curl "https://app.notifer.io/api/alerts/server-alerts/HighCPU_web-01" \
-H "Authorization: Bearer $TOKEN"

Response: 200 OK

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"topic_id": "660e8400-e29b-41d4-a716-446655440001",
"topic_name": "server-alerts",
"alert_key": "HighCPU_web-01",
"title": "HighCPU",
"message": "CPU usage above 95% on web-01 for 5 minutes",
"priority": 1,
"status": "open",
"source": "alertmanager",
"tags": ["critical", "production", "cpu"],
"labels": {
"severity": "critical",
"env": "production",
"instance": "web-01"
},
"count": 3,
"first_received_at": "2026-02-14T08:00:00Z",
"last_received_at": "2026-02-14T08:15:00Z",
"acknowledged_at": null,
"acknowledged_by": null,
"resolved_at": null,
"resolved_by": null,
"resolve_reason": null
}

Acknowledge Alert

Mark an alert as acknowledged. This signals that someone is looking into the issue.

POST /api/alerts/{topic_name}/{alert_key}/ack

Example:

curl -X POST "https://app.notifer.io/api/alerts/server-alerts/HighCPU_web-01/ack" \
-H "Authorization: Bearer $TOKEN"

Response: 200 OK

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"topic_name": "server-alerts",
"alert_key": "HighCPU_web-01",
"status": "acknowledged",
"acknowledged_at": "2026-02-14T08:20:00Z",
"acknowledged_by": "john"
}

Resolve Alert

Mark an alert as resolved. You can optionally include a reason explaining the resolution.

POST /api/alerts/{topic_name}/{alert_key}/resolve

Request Body (optional):

{
"reason": "Fixed in deploy v2.1 - increased CPU allocation"
}

Example:

curl -X POST "https://app.notifer.io/api/alerts/server-alerts/HighCPU_web-01/resolve" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"reason": "Fixed in deploy v2.1 - increased CPU allocation"}'

Response: 200 OK

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"topic_name": "server-alerts",
"alert_key": "HighCPU_web-01",
"status": "resolved",
"resolved_at": "2026-02-14T09:00:00Z",
"resolved_by": "john",
"resolve_reason": "Fixed in deploy v2.1 - increased CPU allocation"
}

Get Alert Messages

Retrieve the message history for a specific alert. Each time an alert fires, a new message is recorded. This endpoint returns all messages associated with a given alert key.

GET /api/alerts/{topic_name}/{alert_key}/messages

Query Parameters:

ParameterTypeDefaultDescription
limitinteger50Results per page (max: 100)
offsetinteger0Number of results to skip

Example:

curl "https://app.notifer.io/api/alerts/server-alerts/HighCPU_web-01/messages?limit=10" \
-H "Authorization: Bearer $TOKEN"

Response: 200 OK

{
"messages": [
{
"id": "770e8400-e29b-41d4-a716-446655440010",
"alert_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "CPU usage above 95% on web-01 for 5 minutes",
"title": "HighCPU",
"priority": 1,
"tags": ["critical", "production", "cpu"],
"source": "alertmanager",
"raw_payload": {
"alertname": "HighCPU",
"severity": "critical",
"instance": "web-01"
},
"created_at": "2026-02-14T08:15:00Z"
},
{
"id": "770e8400-e29b-41d4-a716-446655440009",
"alert_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "CPU usage above 95% on web-01 for 5 minutes",
"title": "HighCPU",
"priority": 1,
"tags": ["critical", "production", "cpu"],
"source": "alertmanager",
"raw_payload": {
"alertname": "HighCPU",
"severity": "critical",
"instance": "web-01"
},
"created_at": "2026-02-14T08:10:00Z"
}
],
"total": 3,
"alert_id": "550e8400-e29b-41d4-a716-446655440000"
}

Sending Alerts

Send Alert via HTTP

Publish a message that is tracked as an alert by including the X-Alert-Key header. If an open alert with the same key already exists on the topic, the message is appended to it and the alert's count is incremented. Otherwise, a new alert is created.

POST /{topic_name}

Headers:

HeaderRequiredDescription
X-Alert-KeyYesUnique alert identifier within the topic (e.g., HighCPU_web-01)
X-Alert-StatusNoAlert status: firing (default) or resolved
X-Alert-SourceNoSource identifier (e.g., prometheus, custom-script)
X-PriorityNoPriority 1-5 (default: 3)
X-TagsNoComma-separated tags
X-TitleNoAlert title
AuthorizationNoRequired for private topics

Example -- Fire an alert:

curl -X POST https://app.notifer.io/server-alerts \
-H "Authorization: Bearer $TOKEN" \
-H "X-Alert-Key: HighCPU_web-01" \
-H "X-Alert-Status: firing" \
-H "X-Alert-Source: custom-script" \
-H "X-Priority: 1" \
-H "X-Tags: critical,cpu,production" \
-H "X-Title: High CPU on web-01" \
-d "CPU usage at 98% for the last 10 minutes on web-01"

Example -- Resolve an alert:

curl -X POST https://app.notifer.io/server-alerts \
-H "Authorization: Bearer $TOKEN" \
-H "X-Alert-Key: HighCPU_web-01" \
-H "X-Alert-Status: resolved" \
-d "CPU usage returned to normal (45%)"

Response: 200 OK

{
"id": "880e8400-e29b-41d4-a716-446655440020",
"topic": "server-alerts",
"message": "CPU usage at 98% for the last 10 minutes on web-01",
"title": "High CPU on web-01",
"priority": 1,
"tags": ["critical", "cpu", "production"],
"alert_key": "HighCPU_web-01",
"alert_status": "firing",
"timestamp": "2026-02-14T10:30:00Z"
}
Alert Key Best Practices

Choose alert keys that are stable and descriptive. A good pattern is {AlertName}_{Instance}, for example HighCPU_web-01 or DiskFull_db-primary. This ensures repeated firings of the same alert are grouped together rather than creating duplicate alerts.


Webhook Ingestion

Receive alerts from external monitoring tools via pre-configured webhook endpoints. Each webhook type has a parser that understands the tool's native payload format.

POST /api/topics/{topic}/webhooks/ingest/{type}/{token}

Path Parameters:

ParameterDescription
topicTarget topic name
typeWebhook type (see supported types below)
tokenUnique webhook authentication token

Supported Webhook Types:

TypeSourceDescription
alertmanagerPrometheus AlertmanagerParses Alertmanager v2 webhook payloads
grafanaGrafana AlertingParses Grafana unified alerting webhooks
datadogDatadogParses Datadog webhook notifications
dynatraceDynatraceParses Dynatrace problem notifications
zabbixZabbixParses Zabbix media type webhooks
uptime_kumaUptime KumaParses Uptime Kuma webhook notifications
genericAny sourceAccepts a simple JSON format (see below)
No Authentication Header Required

Webhook ingestion endpoints authenticate via the {token} in the URL path, not via headers. This makes them compatible with monitoring tools that do not support custom headers.

Example -- Alertmanager webhook URL:

https://app.notifer.io/api/topics/server-alerts/webhooks/ingest/alertmanager/whk_a1b2c3d4e5f6

Configure this URL in your Alertmanager alertmanager.yml:

receivers:
- name: notifer
webhook_configs:
- url: "https://app.notifer.io/api/topics/server-alerts/webhooks/ingest/alertmanager/whk_a1b2c3d4e5f6"
send_resolved: true

Example -- Generic webhook payload:

curl -X POST "https://app.notifer.io/api/topics/server-alerts/webhooks/ingest/generic/whk_a1b2c3d4e5f6" \
-H "Content-Type: application/json" \
-d '{
"alert_key": "HighMemory_app-01",
"title": "High Memory Usage",
"message": "Memory usage at 92% on app-01",
"severity": "warning",
"status": "firing",
"labels": {
"env": "production",
"instance": "app-01"
}
}'

Response: 200 OK

{
"status": "accepted",
"alerts_processed": 1,
"topic": "server-alerts"
}

Webhook Management

List Webhooks

Retrieve all webhook integrations for a topic.

GET /api/topics/{topic}/webhooks

Example:

curl "https://app.notifer.io/api/topics/server-alerts/webhooks" \
-H "Authorization: Bearer $TOKEN"

Response: 200 OK

[
{
"id": "990e8400-e29b-41d4-a716-446655440030",
"topic_id": "660e8400-e29b-41d4-a716-446655440001",
"topic_name": "server-alerts",
"name": "Production Alertmanager",
"type": "alertmanager",
"token": "whk_a1b2c3d4e5f6",
"is_active": true,
"events_received": 156,
"events_dropped": 23,
"last_event_at": "2026-02-14T08:15:00Z",
"created_at": "2026-01-15T10:00:00Z",
"updated_at": "2026-02-14T08:15:00Z"
}
]

Create Webhook

Create a new webhook integration for a topic.

POST /api/topics/{topic}/webhooks

Request Body:

{
"name": "Production Alertmanager",
"type": "alertmanager"
}
FieldTypeRequiredDescription
namestringYesDescriptive name for the integration
typestringYesWebhook type: alertmanager, grafana, datadog, dynatrace, zabbix, uptime_kuma, generic

Example:

curl -X POST "https://app.notifer.io/api/topics/server-alerts/webhooks" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Production Alertmanager", "type": "alertmanager"}'

Response: 201 Created

{
"id": "990e8400-e29b-41d4-a716-446655440030",
"topic_id": "660e8400-e29b-41d4-a716-446655440001",
"topic_name": "server-alerts",
"name": "Production Alertmanager",
"type": "alertmanager",
"token": "whk_a1b2c3d4e5f6",
"ingest_url": "https://app.notifer.io/api/topics/server-alerts/webhooks/ingest/alertmanager/whk_a1b2c3d4e5f6",
"is_active": true,
"events_received": 0,
"events_dropped": 0,
"last_event_at": null,
"created_at": "2026-02-14T10:30:00Z",
"updated_at": "2026-02-14T10:30:00Z"
}
Copy the Ingest URL

The ingest_url in the response is the full URL you need to configure in your monitoring tool. Copy it directly into your Alertmanager, Grafana, or other tool's webhook configuration.


Update Webhook

Update a webhook integration's settings.

PUT /api/topics/{topic}/webhooks/{id}

Request Body:

{
"name": "Production Alertmanager (v2)",
"is_active": true
}

Example:

curl -X PUT "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Production Alertmanager (v2)", "is_active": true}'

Response: 200 OK (updated webhook object)


Delete Webhook

Delete a webhook integration. All associated filter rules are also deleted.

DELETE /api/topics/{topic}/webhooks/{id}

Example:

curl -X DELETE "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030" \
-H "Authorization: Bearer $TOKEN"

Response: 204 No Content

Deleting a Webhook

Deleting a webhook immediately invalidates its ingest URL. Any monitoring tool still sending events to the old URL will receive 404 Not Found responses. Make sure to update your monitoring configuration before deleting.


Rotate Webhook Token

Generate a new authentication token for a webhook. The old token is immediately invalidated.

POST /api/topics/{topic}/webhooks/{id}/rotate

Example:

curl -X POST "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030/rotate" \
-H "Authorization: Bearer $TOKEN"

Response: 200 OK

{
"id": "990e8400-e29b-41d4-a716-446655440030",
"token": "whk_x9y8z7w6v5u4",
"ingest_url": "https://app.notifer.io/api/topics/server-alerts/webhooks/ingest/alertmanager/whk_x9y8z7w6v5u4",
"previous_token_invalidated": true
}
Update Your Monitoring Tools

After rotating the token, you must update the webhook URL in all monitoring tools that send events to this integration. The old URL will stop working immediately.


Filter Rules

Manage filter rules for webhook integrations. See the Filter Rules Guide for a detailed explanation of how rules work.

List Filter Rules

Retrieve all filter rules for a webhook integration, in evaluation order.

GET /api/topics/{topic}/webhooks/{id}/rules

Example:

curl "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030/rules" \
-H "Authorization: Bearer $TOKEN"

Response: 200 OK

[
{
"id": "aa0e8400-e29b-41d4-a716-446655440040",
"webhook_id": "990e8400-e29b-41d4-a716-446655440030",
"name": "Drop info-level alerts",
"order": 1,
"conditions": [
{
"field": "severity",
"operator": "equals",
"value": "info"
}
],
"action": "drop",
"modifications": null,
"match_count": 47,
"created_at": "2026-01-20T10:00:00Z",
"updated_at": "2026-01-20T10:00:00Z"
},
{
"id": "bb0e8400-e29b-41d4-a716-446655440041",
"webhook_id": "990e8400-e29b-41d4-a716-446655440030",
"name": "Escalate critical to P1",
"order": 2,
"conditions": [
{
"field": "severity",
"operator": "equals",
"value": "critical"
}
],
"action": "modify",
"modifications": {
"priority": 1,
"add_tags": ["escalated"]
},
"match_count": 12,
"created_at": "2026-01-20T10:05:00Z",
"updated_at": "2026-01-20T10:05:00Z"
}
]

Create Filter Rule

Add a new filter rule to a webhook integration. The rule is appended to the end of the evaluation order.

POST /api/topics/{topic}/webhooks/{id}/rules

Request Body:

{
"name": "Drop test alerts",
"conditions": [
{
"field": "alertname",
"operator": "contains",
"value": "test"
}
],
"action": "drop"
}
FieldTypeRequiredDescription
namestringYesDescriptive rule name
conditionsarrayYesArray of condition objects
conditions[].fieldstringYesField path (supports dot notation)
conditions[].operatorstringYesOperator: equals, not_equals, contains, not_contains, regex, exists, not_exists
conditions[].valuestringNoValue to compare (not required for exists/not_exists)
actionstringYesAction: accept, drop, modify
modificationsobjectNoRequired when action is modify
modifications.priorityintegerNoSet priority (1-5)
modifications.add_tagsarrayNoTags to add

Example:

curl -X POST "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030/rules" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Escalate production critical",
"conditions": [
{"field": "labels.env", "operator": "equals", "value": "production"},
{"field": "severity", "operator": "equals", "value": "critical"}
],
"action": "modify",
"modifications": {
"priority": 1,
"add_tags": ["production", "critical"]
}
}'

Response: 201 Created

{
"id": "cc0e8400-e29b-41d4-a716-446655440042",
"webhook_id": "990e8400-e29b-41d4-a716-446655440030",
"name": "Escalate production critical",
"order": 3,
"conditions": [
{"field": "labels.env", "operator": "equals", "value": "production"},
{"field": "severity", "operator": "equals", "value": "critical"}
],
"action": "modify",
"modifications": {
"priority": 1,
"add_tags": ["production", "critical"]
},
"match_count": 0,
"created_at": "2026-02-14T10:30:00Z",
"updated_at": "2026-02-14T10:30:00Z"
}

Update Filter Rule

Update an existing filter rule's conditions, action, or name.

PUT /api/topics/{topic}/webhooks/{id}/rules/{rule_id}

Request Body:

{
"name": "Escalate all critical (updated)",
"conditions": [
{"field": "severity", "operator": "equals", "value": "critical"}
],
"action": "modify",
"modifications": {
"priority": 1,
"add_tags": ["critical", "escalated"]
}
}

Example:

curl -X PUT "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030/rules/cc0e8400-e29b-41d4-a716-446655440042" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Escalate all critical (updated)",
"conditions": [
{"field": "severity", "operator": "equals", "value": "critical"}
],
"action": "modify",
"modifications": {"priority": 1, "add_tags": ["critical", "escalated"]}
}'

Response: 200 OK (updated rule object)


Delete Filter Rule

Delete a filter rule. Remaining rules retain their relative order.

DELETE /api/topics/{topic}/webhooks/{id}/rules/{rule_id}

Example:

curl -X DELETE "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030/rules/cc0e8400-e29b-41d4-a716-446655440042" \
-H "Authorization: Bearer $TOKEN"

Response: 204 No Content


Reorder Filter Rules

Set the evaluation order for all filter rules on a webhook. Provide the complete list of rule IDs in the desired order.

PUT /api/topics/{topic}/webhooks/{id}/rules/reorder

Request Body:

{
"rule_ids": [
"bb0e8400-e29b-41d4-a716-446655440041",
"aa0e8400-e29b-41d4-a716-446655440040"
]
}

Example:

curl -X PUT "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030/rules/reorder" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"rule_ids": ["bb0e8400-e29b-41d4-a716-446655440041", "aa0e8400-e29b-41d4-a716-446655440040"]}'

Response: 200 OK

{
"reordered": true,
"order": [
{"id": "bb0e8400-e29b-41d4-a716-446655440041", "order": 1},
{"id": "aa0e8400-e29b-41d4-a716-446655440040", "order": 2}
]
}
Include All Rule IDs

The rule_ids array must include every rule ID for the webhook. Omitting a rule ID will result in a 400 Bad Request error.


Test Filter Rules

Test filter rules against a sample payload without creating an actual alert. Returns which rule would match and what action would be taken.

POST /api/topics/{topic}/webhooks/{id}/rules/test

Request Body:

{
"payload": {
"alertname": "HighCPU",
"severity": "critical",
"status": "firing",
"labels": {
"env": "production",
"instance": "web-01",
"team": "backend"
},
"annotations": {
"summary": "CPU usage above 95% for 5 minutes"
}
}
}

Example:

curl -X POST "https://app.notifer.io/api/topics/server-alerts/webhooks/990e8400-e29b-41d4-a716-446655440030/rules/test" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"payload": {
"alertname": "HighCPU",
"severity": "critical",
"labels": {"env": "production", "instance": "web-01"}
}
}'

Response: 200 OK

{
"matched_rule": {
"id": "bb0e8400-e29b-41d4-a716-446655440041",
"name": "Escalate critical to P1",
"order": 2
},
"action": "modify",
"result": {
"would_create_alert": true,
"priority": 1,
"tags": ["escalated"],
"title": "HighCPU",
"message": "CPU usage above 95% for 5 minutes"
}
}

When no rule matches:

{
"matched_rule": null,
"action": "accept",
"result": {
"would_create_alert": true,
"priority": 3,
"tags": [],
"title": "HighCPU",
"message": "CPU usage above 95% for 5 minutes"
}
}

Object Schemas

Alert Object

FieldTypeDescription
iduuidUnique alert identifier
topic_iduuidID of the parent topic
topic_namestringName of the parent topic
alert_keystringUnique alert key within the topic
titlestringAlert title
messagestringMost recent alert message
priorityintegerPriority level (1-5, where 1 is highest)
statusstringCurrent status: open, acknowledged, resolved
sourcestringAlert source (e.g., alertmanager, grafana, http)
tagsarrayList of tag strings
labelsobjectKey-value labels from the source payload
countintegerNumber of times this alert has fired
first_received_atdatetimeWhen the alert first fired
last_received_atdatetimeWhen the most recent event was received
acknowledged_atdatetimeWhen the alert was acknowledged (null if not)
acknowledged_bystringUsername who acknowledged (null if not)
resolved_atdatetimeWhen the alert was resolved (null if not)
resolved_bystringUsername who resolved (null if not)
resolve_reasonstringResolution reason (null if not provided)

Webhook Integration Object

FieldTypeDescription
iduuidUnique webhook identifier
topic_iduuidID of the parent topic
topic_namestringName of the parent topic
namestringDescriptive name for the integration
typestringWebhook type (e.g., alertmanager, grafana, generic)
tokenstringAuthentication token (included in ingest URL)
ingest_urlstringFull URL for sending events (only in create response)
is_activebooleanWhether the webhook is currently accepting events
events_receivedintegerTotal events received
events_droppedintegerEvents dropped by filter rules
last_event_atdatetimeWhen the last event was received (null if never)
created_atdatetimeWhen the webhook was created
updated_atdatetimeWhen the webhook was last updated

Filter Rule Object

FieldTypeDescription
iduuidUnique rule identifier
webhook_iduuidID of the parent webhook integration
namestringDescriptive rule name
orderintegerEvaluation order (1-based, lower = evaluated first)
conditionsarrayArray of condition objects
conditions[].fieldstringField path in the payload (supports dot notation)
conditions[].operatorstringComparison operator
conditions[].valuestringValue to compare against (null for exists/not_exists)
actionstringAction to take: accept, drop, modify
modificationsobjectModifications to apply (null unless action is modify)
modifications.priorityintegerPriority override (1-5)
modifications.add_tagsarrayTags to append
match_countintegerNumber of times this rule has matched
created_atdatetimeWhen the rule was created
updated_atdatetimeWhen the rule was last updated

Error Responses

All error responses follow this format:

{
"detail": "Error message describing the issue"
}

Common Error Codes

CodeMeaningCommon Causes
400Bad RequestInvalid JSON, missing required fields, invalid field values
401UnauthorizedMissing or invalid authentication token/API key
403ForbiddenInsufficient permissions (e.g., not the topic owner)
404Not FoundAlert, topic, webhook, or rule does not exist
409ConflictDuplicate alert key, webhook name already exists
422Validation ErrorInvalid field values (e.g., priority out of range, invalid operator)
429Rate Limit ExceededToo many requests -- see rate limiting headers in response
500Internal Server ErrorUnexpected server error -- contact support if persistent

Example error response:

{
"detail": "Alert not found: topic=server-alerts, key=NonExistent_alert"
}

Validation error response (422):

{
"detail": [
{
"loc": ["body", "conditions", 0, "operator"],
"msg": "value is not a valid enumeration member; permitted: 'equals', 'not_equals', 'contains', 'not_contains', 'regex', 'exists', 'not_exists'",
"type": "value_error.enum"
}
]
}

Next Steps