Alerts notify you when monitors detect issues. Each team can have up to 10 alerts with different notification strategies: email, webhook, Slack, or Discord.
Sensitive data such as webhook URLs and secrets are never returned in API responses for security.
GET /v1/alerts
Returns all alerts for your team.
Required Scope
alerts:read
Example Request
cURL
curl https://api.uptime.example.com/v1/alerts \
-H "Authorization: Bearer uptime_your_api_key"
Response
{
"alerts": [
{
"id": "alt_abc123",
"name": "Email Alert",
"strategy": "email",
"notifyOnRecovery": true,
"cooldownMinutes": 5,
"monitorId": null,
"createdAt": "2026-02-14T10:00:00Z",
"updatedAt": "2026-02-14T10:00:00Z"
},
{
"id": "alt_def456",
"name": "Slack Notifications",
"strategy": "slack",
"notifyOnRecovery": true,
"cooldownMinutes": 0,
"monitorId": "mon_abc123",
"createdAt": "2026-02-14T11:00:00Z",
"updatedAt": "2026-02-14T11:00:00Z"
}
]
}
Possible Errors
| Status | Code | Description |
|---|---|---|
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | API key doesn't have alerts:read scope |
| 429 | RATE_LIMITED | Too many requests |
| 500 | INTERNAL_ERROR | Server error |
Response Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["alerts"],
"properties": {
"alerts": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"strategy",
"notifyOnRecovery",
"cooldownMinutes",
"monitorId",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"pattern": "^alt_[a-zA-Z0-9]+$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"type": "string",
"enum": ["email", "webhook", "slack", "discord"]
},
"notifyOnRecovery": {
"type": "boolean"
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"monitorId": {
"type": ["string", "null"],
"pattern": "^mon_[a-zA-Z0-9]+$"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
}
}
}
POST /v1/alerts
Creates a new alert. The request body varies based on the notification strategy.
Required Scope
alerts:write
Common Fields
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the alert |
strategy | string | Yes | One of: email, webhook, slack, discord |
notifyOnRecovery | boolean | No | Send notification when monitor recovers (default: true) |
cooldownMinutes | integer | No | Minimum minutes between notifications, 0-1440 (default: 0) |
monitorId | string | No | Limit alert to a specific monitor |
Strategy: Email
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address to notify |
subjectPrefix | string | No | Prefix for email subject lines |
Strategy: Webhook
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Webhook URL to POST notifications to |
secret | string | No | Secret for HMAC signature verification |
Strategy: Slack
| Field | Type | Required | Description |
|---|---|---|---|
webhookUrl | string | Yes | Slack incoming webhook URL |
channel | string | No | Override the default channel |
Strategy: Discord
| Field | Type | Required | Description |
|---|---|---|---|
webhookUrl | string | Yes | Discord webhook URL |
Example Request (Email)
cURL
curl -X POST https://api.uptime.example.com/v1/alerts \
-H "Authorization: Bearer uptime_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Team Email Alert",
"strategy": "email",
"email": "alerts@example.com",
"subjectPrefix": "[Uptime]",
"notifyOnRecovery": true,
"cooldownMinutes": 5
}'
Example Request (Webhook)
cURL
curl -X POST https://api.uptime.example.com/v1/alerts \
-H "Authorization: Bearer uptime_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "PagerDuty Integration",
"strategy": "webhook",
"url": "https://events.pagerduty.com/integration/abc123/enqueue",
"secret": "whsec_your_secret_key"
}'
Example Request (Slack)
cURL
curl -X POST https://api.uptime.example.com/v1/alerts \
-H "Authorization: Bearer uptime_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Slack #incidents",
"strategy": "slack",
"webhookUrl": "https://hooks.slack.com/services/T00/B00/xxx",
"channel": "#incidents"
}'
Example Request (Discord)
cURL
curl -X POST https://api.uptime.example.com/v1/alerts \
-H "Authorization: Bearer uptime_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Discord Server Alert",
"strategy": "discord",
"webhookUrl": "https://discord.com/api/webhooks/123/abc"
}'
Response
{
"id": "alt_abc123",
"name": "Team Email Alert",
"strategy": "email",
"notifyOnRecovery": true,
"cooldownMinutes": 5,
"monitorId": null,
"createdAt": "2026-02-14T12:00:00Z",
"updatedAt": "2026-02-14T12:00:00Z"
}
Possible Errors
| Status | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR | Invalid request body or missing required fields |
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | API key doesn't have alerts:write scope |
| 409 | LIMIT_EXCEEDED | Team already has 10 alerts |
| 429 | RATE_LIMITED | Too many requests |
| 500 | INTERNAL_ERROR | Server error |
Request Body Schema (Email)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "strategy", "email"],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"const": "email"
},
"email": {
"type": "string",
"format": "email"
},
"subjectPrefix": {
"type": "string",
"maxLength": 50
},
"notifyOnRecovery": {
"type": "boolean",
"default": true
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"default": 0
},
"monitorId": {
"type": "string",
"pattern": "^mon_[a-zA-Z0-9]+$"
}
}
}
Request Body Schema (Webhook)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "strategy", "url"],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"const": "webhook"
},
"url": {
"type": "string",
"format": "uri"
},
"secret": {
"type": "string"
},
"notifyOnRecovery": {
"type": "boolean",
"default": true
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"default": 0
},
"monitorId": {
"type": "string",
"pattern": "^mon_[a-zA-Z0-9]+$"
}
}
}
Request Body Schema (Slack)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "strategy", "webhookUrl"],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"const": "slack"
},
"webhookUrl": {
"type": "string",
"format": "uri"
},
"channel": {
"type": "string"
},
"notifyOnRecovery": {
"type": "boolean",
"default": true
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"default": 0
},
"monitorId": {
"type": "string",
"pattern": "^mon_[a-zA-Z0-9]+$"
}
}
}
Request Body Schema (Discord)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "strategy", "webhookUrl"],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"const": "discord"
},
"webhookUrl": {
"type": "string",
"format": "uri"
},
"notifyOnRecovery": {
"type": "boolean",
"default": true
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440,
"default": 0
},
"monitorId": {
"type": "string",
"pattern": "^mon_[a-zA-Z0-9]+$"
}
}
}
Response Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": [
"id",
"name",
"strategy",
"notifyOnRecovery",
"cooldownMinutes",
"monitorId",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"pattern": "^alt_[a-zA-Z0-9]+$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"type": "string",
"enum": ["email", "webhook", "slack", "discord"]
},
"notifyOnRecovery": {
"type": "boolean"
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"monitorId": {
"type": ["string", "null"],
"pattern": "^mon_[a-zA-Z0-9]+$"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
GET /v1/alerts/:id
Returns a single alert by ID.
Required Scope
alerts:read
Example Request
cURL
curl https://api.uptime.example.com/v1/alerts/alt_abc123 \
-H "Authorization: Bearer uptime_your_api_key"
Response
{
"id": "alt_abc123",
"name": "Team Email Alert",
"strategy": "email",
"notifyOnRecovery": true,
"cooldownMinutes": 5,
"monitorId": null,
"createdAt": "2026-02-14T12:00:00Z",
"updatedAt": "2026-02-14T12:00:00Z"
}
Possible Errors
| Status | Code | Description |
|---|---|---|
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | API key doesn't have alerts:read scope |
| 404 | NOT_FOUND | Alert not found |
| 429 | RATE_LIMITED | Too many requests |
| 500 | INTERNAL_ERROR | Server error |
Response Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": [
"id",
"name",
"strategy",
"notifyOnRecovery",
"cooldownMinutes",
"monitorId",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"pattern": "^alt_[a-zA-Z0-9]+$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"type": "string",
"enum": ["email", "webhook", "slack", "discord"]
},
"notifyOnRecovery": {
"type": "boolean"
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"monitorId": {
"type": ["string", "null"],
"pattern": "^mon_[a-zA-Z0-9]+$"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
PUT /v1/alerts/:id
Updates an existing alert. You cannot change the strategy field.
Required Scope
alerts:write
Request Body
Include only the fields you want to update. The strategy field cannot be changed.
Example Request
cURL
curl -X PUT https://api.uptime.example.com/v1/alerts/alt_abc123 \
-H "Authorization: Bearer uptime_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Alert Name",
"cooldownMinutes": 10,
"notifyOnRecovery": false
}'
Response
{
"id": "alt_abc123",
"name": "Updated Alert Name",
"strategy": "email",
"notifyOnRecovery": false,
"cooldownMinutes": 10,
"monitorId": null,
"createdAt": "2026-02-14T12:00:00Z",
"updatedAt": "2026-02-14T13:00:00Z"
}
Possible Errors
| Status | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR | Invalid request body or attempted to change strategy |
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | API key doesn't have alerts:write scope |
| 404 | NOT_FOUND | Alert not found |
| 429 | RATE_LIMITED | Too many requests |
| 500 | INTERNAL_ERROR | Server error |
Request Body Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"email": {
"type": "string",
"format": "email"
},
"subjectPrefix": {
"type": "string",
"maxLength": 50
},
"url": {
"type": "string",
"format": "uri"
},
"secret": {
"type": "string"
},
"webhookUrl": {
"type": "string",
"format": "uri"
},
"channel": {
"type": "string"
},
"notifyOnRecovery": {
"type": "boolean"
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"monitorId": {
"type": ["string", "null"],
"pattern": "^mon_[a-zA-Z0-9]+$"
}
}
}
Response Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": [
"id",
"name",
"strategy",
"notifyOnRecovery",
"cooldownMinutes",
"monitorId",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"pattern": "^alt_[a-zA-Z0-9]+$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"strategy": {
"type": "string",
"enum": ["email", "webhook", "slack", "discord"]
},
"notifyOnRecovery": {
"type": "boolean"
},
"cooldownMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"monitorId": {
"type": ["string", "null"],
"pattern": "^mon_[a-zA-Z0-9]+$"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
}
}
}
DELETE /v1/alerts/:id
Deletes an alert.
Required Scope
alerts:write
Example Request
cURL
curl -X DELETE https://api.uptime.example.com/v1/alerts/alt_abc123 \
-H "Authorization: Bearer uptime_your_api_key"
Response
Returns 204 No Content on success.
Possible Errors
| Status | Code | Description |
|---|---|---|
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | API key doesn't have alerts:write scope |
| 404 | NOT_FOUND | Alert not found |
| 429 | RATE_LIMITED | Too many requests |
| 500 | INTERNAL_ERROR | Server error |
Response Schema
Returns 204 No Content with no response body on success.
GET /v1/alerts/:id/events
Returns the event history for an alert.
Required Scope
alerts:read
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Number of events to return, 1-200 (default: 50) |
Example Request
cURL
curl "https://api.uptime.example.com/v1/alerts/alt_abc123/events?limit=10" \
-H "Authorization: Bearer uptime_your_api_key"
Response
{
"events": [
{
"id": "evt_abc123",
"alertId": "alt_abc123",
"monitorId": "mon_def456",
"type": "triggered",
"status": "delivered",
"createdAt": "2026-02-14T10:30:00Z"
},
{
"id": "evt_def456",
"alertId": "alt_abc123",
"monitorId": "mon_def456",
"type": "recovered",
"status": "delivered",
"createdAt": "2026-02-14T10:35:00Z"
}
]
}
Event Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique event identifier |
alertId | string | The alert that was triggered |
monitorId | string | The monitor that caused the event |
type | string | Event type: triggered or recovered |
status | string | Delivery status: pending, delivered, or failed |
createdAt | string | ISO 8601 timestamp of when the event occurred |
Possible Errors
| Status | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR | Invalid limit parameter |
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | API key doesn't have alerts:read scope |
| 404 | NOT_FOUND | Alert not found |
| 429 | RATE_LIMITED | Too many requests |
| 500 | INTERNAL_ERROR | Server error |
Response Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["events"],
"properties": {
"events": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "alertId", "monitorId", "type", "status", "createdAt"],
"properties": {
"id": {
"type": "string",
"pattern": "^evt_[a-zA-Z0-9]+$"
},
"alertId": {
"type": "string",
"pattern": "^alt_[a-zA-Z0-9]+$"
},
"monitorId": {
"type": "string",
"pattern": "^mon_[a-zA-Z0-9]+$"
},
"type": {
"type": "string",
"enum": ["triggered", "recovered"]
},
"status": {
"type": "string",
"enum": ["pending", "delivered", "failed"]
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
}
}
}