Alerts

Create and manage alerts for email, Slack, Discord, PagerDuty, and webhook notifications. Maximum 10 per team.

Alerts notify you when monitors detect issues. Each team can have up to 10 alerts with different notification strategies: email, webhook, Slack, Discord, or PagerDuty.

Sensitive data such as webhook URLs, signing secrets and PagerDuty integration keys are never returned in API responses for security.

Repeat Behaviour

cooldownMinutes controls how far apart repeat notifications are spaced while a monitor stays broken. For one outage an alert notifies:

  1. Immediately on the first failing check. The first notification of an outage ignores cooldownMinutes entirely, so no value you set can delay it.

  2. Again every cooldownMinutes for as long as the monitor stays broken. Nothing bounds the total number of notifications one outage produces.

  3. Once on recovery, when notifyOnRecovery is true.

Repeats are additionally floored at five minutes: however low cooldownMinutes is, repeats are never sent more often than once every five minutes. A cooldownMinutes of 0 therefore means "as often as allowed" (at most 12 notifications an hour), not one notification per check. The floor does not apply to the recovery notification, which is spaced only by the cooldownMinutes you set.

Omitting cooldownMinutes defaults it to 60 — one hour — matching the default an alert created in the dashboard gets. Send 0 explicitly if you want repeats as often as the floor allows.

GET /api/v1/alerts

Returns the alerts for your team. This endpoint is paginated; see Pagination for how to walk the whole list.

Required scope: alerts:read

Query Parameters

  • perPageinteger

    Results per page, 1-200 (default: 50)

  • cursorstring

    Page to fetch, taken from a Link header

Webhook URLs, secrets and integration keys stay out of config, so a Slack, Discord or PagerDuty alert reports only its strategy, and a webhook alert its strategy and signature scheme.

Errors (3)
StatusTypeMeaning
400bad-requestThe request is malformed
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • alertsAlert[]Required
      Show nested fields
      • idstringRequired
      • namestringRequired
      • notifyOnRecoverybooleanRequired
      • cooldownMinutesintegerRequired
      • configobjectRequired
      • monitorTypestring | nullRequired

        Monitor type the alert covers; null covers every type One of http, dns, tcp, cron, flow.

      • monitorIdstring | nullRequired

        The one monitor the alert covers; null covers the whole type

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

    • paginationobjectRequired
      Show nested fields
      • nextstring | nullRequired

        Cursor of the following page

      • prevstring | nullRequired

        Cursor of the preceding page

      • perPageintegerRequired
      • totalinteger

cURL

Terminal
curl "https://uptime.sergiodxa.com/api/v1/alerts?perPage=25" \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts?perPage=25", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"alerts": [
			{
				"id": "alt_abc123",
				"name": "Email Alert",
				"notifyOnRecovery": true,
				"cooldownMinutes": 5,
				"config": {
					"strategy": "email",
					"to": "ops@example.com",
					"subjectPrefix": "[Uptime]"
				},
				"monitorType": null,
				"monitorId": null,
				"createdAt": 1771070400000,
				"updatedAt": 1771070400000
			},
			{
				"id": "alt_def456",
				"name": "Slack Notifications",
				"notifyOnRecovery": true,
				"cooldownMinutes": 0,
				"config": {
					"strategy": "slack"
				},
				"monitorType": "http",
				"monitorId": "mon_abc123",
				"createdAt": 1771074000000,
				"updatedAt": 1771074000000
			}
		]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z",
		"pagination": {
			"next": null,
			"prev": null,
			"perPage": 25,
			"total": 2
		}
	}
}

POST /api/v1/alerts

Creates a new alert. The request body varies based on the notification strategy.

Required scope: alerts:write

Common Fields

  • namestringRequired

    Display name for the alert, 1-255 characters

  • strategystringRequired

    One of: email, webhook, slack, discord, pagerduty

  • notifyOnRecoveryboolean

    Send notification when monitor recovers (default: true)

  • cooldownMinutesinteger

    Minutes between repeat notifications while a monitor stays broken, 0-1440 (default: 60; repeats are floored at 5 minutes, and the first notification of an outage is never delayed — see Repeat Behaviour)

  • monitorTypestring

    Limit the alert to one kind of monitor: http, dns, tcp, cron or flow. Sent on its own, the alert covers every monitor of that kind, including ones created later.

  • monitorIdstring

    Limit the alert to a single monitor. Sent together with monitorType, the id is looked up in that kind's monitors; sent on its own it is read as an HTTP monitor, which is what it has always meant. The id carries the prefix of its kind: mon_ (HTTP), dns_, tcpm_, cron_ or flow_.

Strategy: Email

  • emailstringRequired

    Email address to notify

  • subjectPrefixstring

    Prefix for email subject lines, up to 100 characters

Strategy: Webhook

  • urlstringRequired

    Webhook URL to POST notifications to

  • secretstring

    Secret every delivery is signed with, up to 255 characters

  • signaturestring

    standard-webhooks (default) or legacy. See Verifying Webhook Signatures for both

Strategy: Slack

  • webhookUrlstringRequired

    Slack incoming webhook URL, starting https://hooks.slack.com/

The incoming webhook posts to the channel it was created for in Slack.

Strategy: Discord

  • webhookUrlstringRequired

    Discord webhook URL, starting https://discord.com/api/webhooks/

Strategy: PagerDuty

  • routingKeystringRequired

    Integration key of a PagerDuty service's Events API v2 integration, up to 255 characters, trimmed

Errors (8)
StatusTypeMeaning
400validation-errorThe request failed validation
400limit-exceededThe team has reached its limit for this resource
400idempotency-key-invalidThe Idempotency-Key header is not valid
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
409idempotency-key-in-useA request with this idempotency key is still being processed
422idempotency-key-reusedThis idempotency key was already used for a different request
Request body fields
  • strategy: emailobject
    Show nested fields
    • strategy"email"Required
    • emailstringRequired

      Format: email.

    • subjectPrefixstring

      0–100 characters.

    • namestringRequired

      1–255 characters.

    • notifyOnRecoverybooleanDefault true
    • cooldownMinutesnumberDefault 60

      0–1440.

    • monitorTypestring

      Defaults to http beside a monitorId One of http, dns, tcp, cron, flow.

    • monitorIdstring
  • strategy: webhookobject
    Show nested fields
    • strategy"webhook"Required
    • urlstringRequired

      Format: uri.

    • secretstring

      0–255 characters.

    • signaturestringDefault "standard-webhooks"

      standard-webhooks signs with webhook-id, webhook-timestamp and webhook-signature: v1,<base64>; legacy with Webhook-Signature: sha256=<hex> One of standard-webhooks, legacy.

    • namestringRequired

      1–255 characters.

    • notifyOnRecoverybooleanDefault true
    • cooldownMinutesnumberDefault 60

      0–1440.

    • monitorTypestring

      Defaults to http beside a monitorId One of http, dns, tcp, cron, flow.

    • monitorIdstring
  • strategy: slackobject
    Show nested fields
    • strategy"slack"Required
    • webhookUrlstringRequired

      A Slack incoming webhook URL on https://hooks.slack.com/ Format: uri.

    • namestringRequired

      1–255 characters.

    • notifyOnRecoverybooleanDefault true
    • cooldownMinutesnumberDefault 60

      0–1440.

    • monitorTypestring

      Defaults to http beside a monitorId One of http, dns, tcp, cron, flow.

    • monitorIdstring
  • strategy: discordobject
    Show nested fields
    • strategy"discord"Required
    • webhookUrlstringRequired

      A Discord webhook URL on https://discord.com/api/webhooks/ Format: uri.

    • namestringRequired

      1–255 characters.

    • notifyOnRecoverybooleanDefault true
    • cooldownMinutesnumberDefault 60

      0–1440.

    • monitorTypestring

      Defaults to http beside a monitorId One of http, dns, tcp, cron, flow.

    • monitorIdstring
  • strategy: pagerdutyobject
    Show nested fields
    • strategy"pagerduty"Required
    • routingKeystringRequired

      The integration key of a PagerDuty service's Events API v2 integration 0–255 characters.

    • namestringRequired

      1–255 characters.

    • notifyOnRecoverybooleanDefault true
    • cooldownMinutesnumberDefault 60

      0–1440.

    • monitorTypestring

      Defaults to http beside a monitorId One of http, dns, tcp, cron, flow.

    • monitorIdstring
Response fields (201)
  • dataobjectRequired
    Show nested fields
    • alertobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • notifyOnRecoverybooleanRequired
      • cooldownMinutesintegerRequired
      • monitorTypestring | nullRequired

        Monitor type the alert covers; null covers every type One of http, dns, tcp, cron, flow.

      • monitorIdstring | nullRequired

        The one monitor the alert covers; null covers the whole type

      • configobjectRequired
        Show nested fields
        • strategystringRequired

          One of email, webhook, slack, discord, pagerduty.

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

Example Request (Email)

cURL

Terminal
curl -X POST https://uptime.sergiodxa.com/api/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
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"name": "Team Email Alert",
		"strategy": "email",
		"email": "alerts@example.com",
		"subjectPrefix": "[Uptime]",
		"notifyOnRecovery": true,
		"cooldownMinutes": 5
	}),
});
let result = await response.json();

Example Request (Webhook)

cURL

Terminal
curl -X POST https://uptime.sergiodxa.com/api/v1/alerts \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Incident Webhook",
    "strategy": "webhook",
    "url": "https://example.com/hooks/uptime",
    "secret": "whsec_your_secret_key"
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"name": "Incident Webhook",
		"strategy": "webhook",
		"url": "https://example.com/hooks/uptime",
		"secret": "whsec_your_secret_key"
	}),
});
let result = await response.json();

Example Request (Slack)

cURL

Terminal
curl -X POST https://uptime.sergiodxa.com/api/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"
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"name": "Slack #incidents",
		"strategy": "slack",
		"webhookUrl": "https://hooks.slack.com/services/T00/B00/xxx"
	}),
});
let result = await response.json();

Example Request (Discord)

cURL

Terminal
curl -X POST https://uptime.sergiodxa.com/api/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"
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"name": "Discord Server Alert",
		"strategy": "discord",
		"webhookUrl": "https://discord.com/api/webhooks/123/abc"
	}),
});
let result = await response.json();

Example Request (PagerDuty)

cURL

Terminal
curl -X POST https://uptime.sergiodxa.com/api/v1/alerts \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "On-call Pager",
    "strategy": "pagerduty",
    "routingKey": "0123456789abcdef0123456789abcdef"
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts", {
	method: "POST",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		"name": "On-call Pager",
		"strategy": "pagerduty",
		"routingKey": "0123456789abcdef0123456789abcdef"
	}),
});
let result = await response.json();

Response

Returns 201 Created. The alert's config reports only its strategy.

json
{
	"data": {
		"alert": {
			"id": "alt_abc123",
			"name": "Team Email Alert",
			"notifyOnRecovery": true,
			"cooldownMinutes": 5,
			"monitorType": null,
			"monitorId": null,
			"config": { "strategy": "email" },
			"createdAt": 1771070400000,
			"updatedAt": 1771070400000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

GET /api/v1/alerts/:id

Returns a single alert by ID.

Required scope: alerts:read

Webhook URLs, secrets and integration keys stay out of config, so a Slack, Discord or PagerDuty alert reports only its strategy, and a webhook alert its strategy and signature scheme.

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • alertobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • notifyOnRecoverybooleanRequired
      • cooldownMinutesintegerRequired
      • configobjectRequired
      • monitorTypestring | nullRequired

        Monitor type the alert covers; null covers every type One of http, dns, tcp, cron, flow.

      • monitorIdstring | nullRequired

        The one monitor the alert covers; null covers the whole type

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

cURL

Terminal
curl https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123 \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"alert": {
			"id": "alt_abc123",
			"name": "Team Email Alert",
			"notifyOnRecovery": true,
			"cooldownMinutes": 5,
			"monitorType": null,
			"monitorId": null,
			"config": {
				"strategy": "email",
				"to": "alerts@example.com",
				"subjectPrefix": "[Uptime]"
			},
			"createdAt": 1771070400000,
			"updatedAt": 1771070400000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

PATCH /api/v1/alerts/:id

Updates an existing alert with a JSON merge patch.

Required scope: alerts:write

Request Body

Every field POST /api/v1/alerts accepts is accepted here, with the same limits. Include only the fields you want to change:

  • null resets notifyOnRecovery, cooldownMinutes and signature to their defaults, and clears subjectPrefix and secret.

  • {"signature": "standard-webhooks"} moves a webhook alert created with the legacy signature onto Standard Webhooks.

  • name, strategy and a strategy's required setting (email, url, webhookUrl or routingKey) cannot be removed.

  • A channel setting changes on its own, keeping the others: {"email": "oncall@example.com"} keeps the alert's subjectPrefix.

  • Switching strategy needs the new strategy's required setting in the same patch, {"strategy": "discord", "webhookUrl": "..."}, and drops the previous strategy's settings.

monitorType and monitorId are the alert's scope, and they move as a pair: change either one and both are rewritten, so narrowing an alert to a whole kind of monitor cannot leave the previous monitor's id behind it. Mention neither and the scope is left exactly as it is.

  • {"monitorType": "dns"} — every DNS monitor

  • {"monitorType": "dns", "monitorId": "..."} — that one DNS monitor

  • {"monitorId": null} or {"monitorType": null} — back to team-wide

  • {"monitorId": "..."} — that one HTTP monitor

A monitorId that does not belong to the team, or that belongs to a different kind of monitor than monitorType names, answers a 404 not-found problem.

Update With PUT

PUT /api/v1/alerts/:id updates name, notifyOnRecovery, cooldownMinutes, monitorType and monitorId, for integrations written before PATCH existed. Any other field, including strategy and the channel settings, is ignored, so the channel changes only through PATCH. A field you leave out keeps its value, and null is refused everywhere except monitorId. Sending either scope field rewrites both, as listed above: {"monitorType": "dns"} also clears a previous monitor id.

Required scope: alerts:write

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Request body fields
  • namestring

    1–255 characters.

  • notifyOnRecoveryboolean
  • cooldownMinutesnumber

    0–1440.

  • monitorTypestring

    One of http, dns, tcp, cron, flow.

  • monitorIdstring | null
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • alertobjectRequired
      Show nested fields
      • idstringRequired
      • namestringRequired
      • notifyOnRecoverybooleanRequired
      • cooldownMinutesintegerRequired
      • monitorTypestring | nullRequired

        Monitor type the alert covers; null covers every type One of http, dns, tcp, cron, flow.

      • monitorIdstring | nullRequired

        The one monitor the alert covers; null covers the whole type

      • configobjectRequired
        Show nested fields
        • strategystringRequired

          One of email, webhook, slack, discord, pagerduty.

      • createdAtintegerRequired

        Epoch milliseconds

      • updatedAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

cURL

Terminal
curl -X PATCH https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123 \
  -H "Authorization: Bearer uptime_your_api_key" \
  -H "Content-Type: application/merge-patch+json" \
  -d '{
    "name": "Updated Alert Name",
    "cooldownMinutes": 10,
    "notifyOnRecovery": false
  }'
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123", {
	method: "PATCH",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
		"Content-Type": "application/merge-patch+json",
	},
	body: JSON.stringify({
		"name": "Updated Alert Name",
		"cooldownMinutes": 10,
		"notifyOnRecovery": false
	}),
});
let result = await response.json();

Response

The alert's config reports only its strategy.

json
{
	"data": {
		"alert": {
			"id": "alt_abc123",
			"name": "Updated Alert Name",
			"notifyOnRecovery": false,
			"cooldownMinutes": 10,
			"monitorType": null,
			"monitorId": null,
			"config": { "strategy": "email" },
			"createdAt": 1771070400000,
			"updatedAt": 1771074000000
		}
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

DELETE /api/v1/alerts/:id

Deletes an alert.

Required scope: alerts:write

Errors (4)
StatusTypeMeaning
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • deletedtrueRequired
  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

cURL

Terminal
curl -X DELETE https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123 \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123", {
	method: "DELETE",
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

Returns 200 OK:

json
{
	"data": {
		"deleted": true
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z"
	}
}

GET /api/v1/alerts/:id/events

Returns the event history for an alert, newest first. The history is paginated; see Pagination for how to walk further back.

Required scope: alerts:read

Query Parameters

  • perPageinteger

    Results per page, 1-200 (default: 50)

  • cursorstring

    Page to fetch, taken from a Link header

Event Fields

  • idstring

    Unique event identifier

  • alertIdstring

    The alert the event belongs to

  • monitorIdstring

    The monitor that caused the event

  • eventTypestring

    What the monitor did: down, up, or degraded

  • statusstring

    Delivery outcome: pending while it waits to be sent, then sent, skipped_cooldown, skipped_cap, or failed

  • sentAtinteger

    Unix timestamp in milliseconds of when the notification was sent

  • errorMessagestring | null

    Why delivery failed, or null when it succeeded

  • createdAtinteger

    Unix timestamp in milliseconds of when the event was recorded

Errors (5)
StatusTypeMeaning
400bad-requestThe request is malformed
400validation-errorThe request failed validation
401unauthorizedThe API key is missing or invalid
403forbiddenThe API key lacks the required scope
404not-foundThe resource does not exist
Response fields (200)
  • dataobjectRequired
    Show nested fields
    • eventsAlertEvent[]Required
      Show nested fields
      • idstringRequired
      • alertIdstringRequired
      • monitorIdstringRequired
      • eventTypestringRequired

        One of down, up, degraded.

      • statusstringRequired

        One of pending, sent, skipped_cooldown, skipped_cap, failed.

      • sentAtintegerRequired

        Epoch milliseconds

      • errorMessagestring | nullRequired
      • createdAtintegerRequired

        Epoch milliseconds

  • metaobjectRequired
    Show nested fields
    • requestIdstringRequired

      Format: uuid.

    • timestampstringRequired

      Format: date-time.

    • paginationobjectRequired
      Show nested fields
      • nextstring | nullRequired

        Cursor of the following page

      • prevstring | nullRequired

        Cursor of the preceding page

      • perPageintegerRequired
      • totalinteger

cURL

Terminal
curl "https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123/events?perPage=10" \
  -H "Authorization: Bearer uptime_your_api_key"
request.js
let response = await fetch("https://uptime.sergiodxa.com/api/v1/alerts/alt_abc123/events?perPage=10", {
	headers: {
		"Authorization": "Bearer uptime_your_api_key",
	},
});
let result = await response.json();

Response

json
{
	"data": {
		"events": [
			{
				"id": "evt_abc123",
				"alertId": "alt_abc123",
				"monitorId": "mon_def456",
				"eventType": "down",
				"status": "sent",
				"sentAt": 1771072200000,
				"errorMessage": null,
				"createdAt": 1771072200000
			},
			{
				"id": "evt_def456",
				"alertId": "alt_abc123",
				"monitorId": "mon_def456",
				"eventType": "up",
				"status": "sent",
				"sentAt": 1771072500000,
				"errorMessage": null,
				"createdAt": 1771072500000
			}
		]
	},
	"meta": {
		"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
		"timestamp": "2026-02-14T12:00:00.000Z",
		"pagination": {
			"next": "eyJkIjoiYWZ0ZXIi",
			"prev": null,
			"perPage": 10
		}
	}
}
Documentation