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:
| Method | Header | Example |
|---|---|---|
| Bearer Token | Authorization: Bearer <token> | Authorization: Bearer eyJ... |
| API Key | X-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:
| Parameter | Type | Default | Description |
|---|---|---|---|
status | string | -- | Filter by status: open, acknowledged, resolved |
topic | string | -- | Filter by topic name |
priority_min | integer | -- | Minimum priority (1-5) |
source | string | -- | Filter by alert source (e.g., alertmanager, grafana) |
search | string | -- | Full-text search across alert title and message |
limit | integer | 50 | Results per page (max: 100) |
offset | integer | 0 | Number of results to skip |
sort | string | last_received_at | Sort field: last_received_at, priority, status, count |
order | string | desc | Sort 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:
| Parameter | Description |
|---|---|
topic_name | The topic name |
alert_key | The 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:
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | 50 | Results per page (max: 100) |
offset | integer | 0 | Number 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:
| Header | Required | Description |
|---|---|---|
X-Alert-Key | Yes | Unique alert identifier within the topic (e.g., HighCPU_web-01) |
X-Alert-Status | No | Alert status: firing (default) or resolved |
X-Alert-Source | No | Source identifier (e.g., prometheus, custom-script) |
X-Priority | No | Priority 1-5 (default: 3) |
X-Tags | No | Comma-separated tags |
X-Title | No | Alert title |
Authorization | No | Required 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"
}
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:
| Parameter | Description |
|---|---|
topic | Target topic name |
type | Webhook type (see supported types below) |
token | Unique webhook authentication token |
Supported Webhook Types:
| Type | Source | Description |
|---|---|---|
alertmanager | Prometheus Alertmanager | Parses Alertmanager v2 webhook payloads |
grafana | Grafana Alerting | Parses Grafana unified alerting webhooks |
datadog | Datadog | Parses Datadog webhook notifications |
dynatrace | Dynatrace | Parses Dynatrace problem notifications |
zabbix | Zabbix | Parses Zabbix media type webhooks |
uptime_kuma | Uptime Kuma | Parses Uptime Kuma webhook notifications |
generic | Any source | Accepts a simple JSON format (see below) |
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"
}
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Descriptive name for the integration |
type | string | Yes | Webhook 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"
}
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 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
}
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"
}
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Descriptive rule name |
conditions | array | Yes | Array of condition objects |
conditions[].field | string | Yes | Field path (supports dot notation) |
conditions[].operator | string | Yes | Operator: equals, not_equals, contains, not_contains, regex, exists, not_exists |
conditions[].value | string | No | Value to compare (not required for exists/not_exists) |
action | string | Yes | Action: accept, drop, modify |
modifications | object | No | Required when action is modify |
modifications.priority | integer | No | Set priority (1-5) |
modifications.add_tags | array | No | Tags 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}
]
}
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
| Field | Type | Description |
|---|---|---|
id | uuid | Unique alert identifier |
topic_id | uuid | ID of the parent topic |
topic_name | string | Name of the parent topic |
alert_key | string | Unique alert key within the topic |
title | string | Alert title |
message | string | Most recent alert message |
priority | integer | Priority level (1-5, where 1 is highest) |
status | string | Current status: open, acknowledged, resolved |
source | string | Alert source (e.g., alertmanager, grafana, http) |
tags | array | List of tag strings |
labels | object | Key-value labels from the source payload |
count | integer | Number of times this alert has fired |
first_received_at | datetime | When the alert first fired |
last_received_at | datetime | When the most recent event was received |
acknowledged_at | datetime | When the alert was acknowledged (null if not) |
acknowledged_by | string | Username who acknowledged (null if not) |
resolved_at | datetime | When the alert was resolved (null if not) |
resolved_by | string | Username who resolved (null if not) |
resolve_reason | string | Resolution reason (null if not provided) |
Webhook Integration Object
| Field | Type | Description |
|---|---|---|
id | uuid | Unique webhook identifier |
topic_id | uuid | ID of the parent topic |
topic_name | string | Name of the parent topic |
name | string | Descriptive name for the integration |
type | string | Webhook type (e.g., alertmanager, grafana, generic) |
token | string | Authentication token (included in ingest URL) |
ingest_url | string | Full URL for sending events (only in create response) |
is_active | boolean | Whether the webhook is currently accepting events |
events_received | integer | Total events received |
events_dropped | integer | Events dropped by filter rules |
last_event_at | datetime | When the last event was received (null if never) |
created_at | datetime | When the webhook was created |
updated_at | datetime | When the webhook was last updated |
Filter Rule Object
| Field | Type | Description |
|---|---|---|
id | uuid | Unique rule identifier |
webhook_id | uuid | ID of the parent webhook integration |
name | string | Descriptive rule name |
order | integer | Evaluation order (1-based, lower = evaluated first) |
conditions | array | Array of condition objects |
conditions[].field | string | Field path in the payload (supports dot notation) |
conditions[].operator | string | Comparison operator |
conditions[].value | string | Value to compare against (null for exists/not_exists) |
action | string | Action to take: accept, drop, modify |
modifications | object | Modifications to apply (null unless action is modify) |
modifications.priority | integer | Priority override (1-5) |
modifications.add_tags | array | Tags to append |
match_count | integer | Number of times this rule has matched |
created_at | datetime | When the rule was created |
updated_at | datetime | When the rule was last updated |
Error Responses
All error responses follow this format:
{
"detail": "Error message describing the issue"
}
Common Error Codes
| Code | Meaning | Common Causes |
|---|---|---|
400 | Bad Request | Invalid JSON, missing required fields, invalid field values |
401 | Unauthorized | Missing or invalid authentication token/API key |
403 | Forbidden | Insufficient permissions (e.g., not the topic owner) |
404 | Not Found | Alert, topic, webhook, or rule does not exist |
409 | Conflict | Duplicate alert key, webhook name already exists |
422 | Validation Error | Invalid field values (e.g., priority out of range, invalid operator) |
429 | Rate Limit Exceeded | Too many requests -- see rate limiting headers in response |
500 | Internal Server Error | Unexpected 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
- Filter Rules Guide -- Learn how to configure and test filter rules
- Authentication Guide -- Set up tokens and API keys
- Message Priority -- Understand priority levels P1-P5
- API Reference -- Full API reference for all Notifer endpoints