On-Call API › Alerts
Raise an alert
Raises an alert by hand and starts its escalation, exactly as an alert from an integration would: people are paged and notifications are billed.
fingerprint deduplicates: when an open alert in the organization already
carries it, no new alert is created — the existing one is counted as a
retrigger and returned. team_id defaults to the caller's first team.
To send alerts from a monitoring tool, use an integration instead
(see the Alert ingest API reference).
Permission (API-key scope): oncall:alert:write.
Authorization
bearerAuth(oncall:alert:write)apiKeyHeader(oncall:alert:write)
Request body required
titlestring requiredseverityAlertSeverity requireddescriptionstringsourcestringDefaults tomanual.fingerprintstringDeduplication key; a random one when omitted.escalation_policy_idstringThe policy that pages for it.team_idstringDefaults to the caller's first team.labelsobjectannotationsobject
Responses
201
The alert that was created, or the open alert with the same fingerprint.
dataAlert requiredShow Alert properties
idstring requiredorg_idstring requiredteam_idstringOwning team; empty for an organization-wide alert.escalation_policy_idstringEmpty when no policy pages for it.incident_idstringintegration_idstringThe integration that opened it; empty for alerts raised by hand or by another EvoHub product.fingerprintstringDeduplication key: while an alert with it is open, the same fingerprint retriggers it instead of opening another.titlestring requireddescriptionstringseverityAlertSeverity requiredstatusAlertStatus requiredsourcestring requiredWhere it came from: an integration kind such asprometheus,api,webhook, ormanual.labelsobjectannotationsobjectcurrent_escalation_stepintegerThe escalation step reached so far.acknowledged_bystringacknowledged_atstring (date-time)resolved_bystringresolved_atstring (date-time)snoozed_untilstring (date-time)snoozed_bystringassigned_tostringUser id of the assignee; empty when unassigned.notification_countintegerretrigger_countintegerHow many times the same fingerprint arrived again while it was open.created_atstring (date-time) requiredupdated_atstring (date-time) required
successboolean required
400
The body is not JSON (INVALID_BODY); title or severity is missing, or escalation_policy_id names no policy of the organization (VALIDATION_FAILED).
errorobject requiredcodestring requiredmessagestring requireddetailsarray of object requiredfieldstringmessagestring
401
No API key was sent, or it is unknown, revoked or expired (UNAUTHORIZED).
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.
403
The key lacks the scope this endpoint needs (FORBIDDEN).
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.
429
Too many requests (RATE_LIMITED). Wait Retry-After seconds.
Retry-AfterintegerSeconds to wait.
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.
500
Something went wrong on EvoHub's side (INTERNAL_ERROR). Retry later.
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.
Example request
curl -X POST 'https://evohub.io/api/v1/alerts' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
-d '{
"title": "Checkout error budget exhausted",
"labels": {
"service": "checkout"
},
"severity": "high",
"description": "Raised from the deploy pipeline",
"fingerprint": "checkout-error-budget",
"escalation_policy_id": "3f8a0b2c-4d6e-4f8a-b1c3-d5e7f9a1b3c5"
}'