Documentation

    Alerts and ingest

    An alert is one problem that needs a person. This page covers how alerts come in, how repeats of the same problem are folded into one, what an alert’s life looks like, who may change it, and what the dashboard computes from all of them.

    Sending an alert

    Every alert is one HTTP POST to the team’s address. The credential is the team’s integration key, created under the team’s Integration keys tab in the console. It goes in the Authorization header as is, with no Bearer or other prefix. A key behind the wrong prefix is a 403, and a key in any other header is a 401.

    POST …/incident-management/{team}/alertscurl
    curl -X POST https://api.igniteops.io/v1/organizations/{org}/incident-management/{team}/alerts \
      -H "Authorization: ign_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
      -H "Content-Type: application/json" \
      -d '{
        "title": "Database connection pool exhausted on prod-db-01",
        "message": "PgBouncer reports 100% pool utilisation for 5 minutes. API latency p99 is above 4 s.",
        "source": "datadog",
        "severity": "P1",
        "alias": "db-pool-exhausted",
        "entity": "prod-db-01",
        "alert_url": "https://app.datadoghq.com/monitors/12345",
        "tags": { "env": "production", "service": "postgres" },
        "custom_fields": { "runbook": "https://wiki.example.com/runbooks/pgbouncer" }
      }'

    The answer is a 201 with the alert as stored. Two fields are worth reading: routing says whether the routing rules and the escalation policy were started (started) or whether the alert was stored without paging anyone (suppressed, with a routing_reason of quota_exceeded or team_disabled), and on the Free plan quota carries the month’s counter.

    201 CreatedJSON
    HTTP/1.1 201 Created
    {
      "alert_id": "0f1d2c3b-4a5e-4f60-9b7c-8d9e0f1a2b3c",
      "title": "Database connection pool exhausted on prod-db-01",
      "severity": "P1",
      "status": "open",
      "source": "datadog",
      "alias": "db-pool-exhausted",
      "count": 1,
      "routing": "started",
      "quota": { "plan": "free", "used": 12, "limit": 100, "resets_at": "2026-12-01T00:00:00.000Z" },
      "href": "https://api.igniteops.io/v1/organizations/acme/incident-management/platform/alerts/0f1d2c3b-…",
      "created_at": "2026-11-08T03:07:11.412Z"
    }

    A signed-in person can create an alert too: the Create alert button in the console and in the mobile app, for any team of the organization, whatever their team role. Such an alert carries source: manual and is routed and escalated exactly like one from a webhook, which makes it the easiest way to exercise a new routing rule or policy.

    The fields

    Only title and message are required. Text longer than a field’s limit is clipped to it and the alert is still created: an alert from a monitoring tool must page someone even when its description is long.

    FieldTypeRule
    titlerequiredstringWhat happened, in one line. Up to 500 characters.
    messagerequiredstringThe detail the responder needs. Up to 10,000 characters. Shown as the body of the push notification and the email.
    sourcestringWhere it came from, up to 256 characters. Left out, it is the integration key’s name for a webhook alert and manual for one created by a person. Routing rules can match on it.
    severityP1 | P2 | P3 | P4 | P5P1 is the most urgent. P3 when left out. See Severity below.
    aliasstringUp to 256 characters. Repeats with the same alias update the existing open alert instead of creating a new one. See Deduplication below.
    entitystringThe thing affected (a host, a service, a queue), up to 256 characters. Shown on the alert and matchable by rules.
    alert_urlstringA link back to the tool that raised the alert, http or https, up to 2,048 characters. Anything else is dropped.
    tagsobjectUp to 50 key-value pairs. Keys up to 100 characters (longer keys are dropped), values clipped to 500 and stored as text. Routing rules match them as tags.<key>, and the alerts list filters by them.
    custom_fieldsobjectUp to 50 entries with any JSON value, keys up to 100 characters. Beyond 20,000 characters of JSON the whole map is replaced by { "_truncated": true }. Routing rules match them as custom_fields.<key>.
    assigneestringThe user id of a member of the organization to assign the alert to. An alert created by a person is assigned to its creator unless this is null. An integration key assigns nobody by default.

    Deduplication by alias

    A monitor that fires every minute would create sixty alerts an hour and page the team sixty times. Send an alias with the alert, a stable name for the condition such as db-pool-exhausted or the monitor’s own id, and the repeats fold into one alert.

    • A request whose alias matches an alert that is open or acknowledged is answered 200 with deduplicated: true. The alert’s count goes up by one and its last-occurrence time is updated. Nothing new is created, and the repeat never counts against the monthly quota.
    • If that alert is open and no escalation is running for it any more (every step has fired, or the policy had no repeat), the repeat starts the routing again, so a problem that comes back after the team stopped being paged pages them again.
    • An alias that only matches a closed alert creates a new alert. A closed alert never absorbs new occurrences.
    • There is no time window. The alias is compared against the alerts of that team, whatever their age, until they are closed.
    200 OK, a repeatJSON
    HTTP/1.1 200 OK
    {
      "alert_id": "0f1d2c3b-4a5e-4f60-9b7c-8d9e0f1a2b3c",
      "deduplicated": true,
      "count": 2,
      "status": "open",
      "routing": "started"
    }
    The alerts list of a team in the IgniteOps console, with a P1 alert showing a repeat counter of three
    The list shows the counter next to an alert that was deduplicated: one row, one alert against the quota.

    Severity

    Five levels, named in the console as Critical, High, Medium, Low and Info. The severity decides the wording of the notifications (the push title starts with 🚨 CRITICAL:, the SMS with IgniteOps CRITICAL:, and so on for the other levels), it is the most common field a routing rule matches on, and it can be changed on the alert afterwards from the Properties panel.

    SeverityName in the consoleTypical use
    P1CriticalProduction is down or data is at risk. Route to a policy that calls people.
    P2HighA customer-facing degradation. Page the on-call now, escalate within minutes.
    P3MediumThe default. Something needs attention during the shift.
    P4LowCan wait for business hours. Many teams route these to an email step only.
    P5InfoA record for the timeline and the metrics rather than a page.

    There is no separate priority field. A rule that tries to match priority or status is refused when it is saved.

    The life of an alert

    An alert is open, acknowledged or closed. There is no other state. Acknowledging stops the escalation and assigns the alert to the person who acknowledged it. Closing records that the problem is over. A closed alert can be reopened, and an acknowledged one can be unacknowledged, which reopens it and removes the assignee.

    • Acknowledge, Unack, Close and Reopen each take an optional note of up to 2,000 characters, which goes on the timeline.
    • Comments are Markdown (paragraphs, lists, code, links, tables), up to 5,000 characters, and can be edited and deleted.
    • Properties: the source, the entity, the alias, the occurrence count, who acknowledged and closed it, the escalation that ran, the tags, the custom fields and the link to the tool.
    • The timeline records every routing decision, every notification with its delivery status, every acknowledgement and where it came from, and every comment, filterable by kind.

    Who may do what follows the team role: Owners, Managers and Responders acknowledge, close, comment and change an alert, Observers read. The roles page has the whole matrix. Through the API, PUT on the alert changes status, assignee, severity, tags, custom_fields and notes, with an optional expected_updated_at so two people editing at once cannot overwrite each other.

    The timeline of a P1 alert in the IgniteOps console: escalation steps, a push, an email, an SMS, a voice call, and the acknowledgement from the call keypad
    The timeline of the demo alert: step 1 paged two people by push and email, step 2 reached the on-call by SMS and voice, and she pressed 1.

    Ways to acknowledge

    FromHowNotes
    The phone callPress 1 on the keypad. Press 2 to escalate to the next step at once.The call reads the title aloud and repeats the prompt once.
    The emailThe Acknowledge button or link.A one-time link that needs no sign-in, valid for 24 hours and tied to the person it was sent to.
    The push notificationThe Acknowledge or Close button on the notification.iOS and Android apps.
    The console or the appThe Acknowledge button on the alert.With an optional note.
    The APIPOST …/alerts/{alertId}/ackWith a personal API key (PAT) or a signed-in session, never with an integration key.
    An SMSNot possible.The SMS carries no link and no reply is read. It is the shortest path to the call or the app.
    Acknowledge from a scriptcurl
    curl -X POST https://api.igniteops.io/v1/organizations/{org}/incident-management/{team}/alerts/{alertId}/ack \
      -H "Authorization: PAT <your personal API key>"

    Quota and limits

    On the Free plan a team may route 100 alerts a calendar month, counted in UTC. Beyond that, alerts are still stored and visible, the sender still gets a 201 with routing: suppressed and an X-IgniteOps-Quota header, and nobody is paged until the counter resets or the organization upgrades. The owner is emailed at 80% and at 100%. Repeats absorbed by an alias never count. Free organizations may also send at most 30 alerts a minute and 1,000 a day. Beyond that the API answers 429 with a Retry-After.

    On Pro every alert is routed. The first 100 each month are included and each one after that is $0.10.

    LimitFreePro
    Alerts routed per month100100 included, then $0.10 each
    Ingest rate per organization30 a minute, 1,000 a day (429 beyond)Not enforced
    Alias deduplicationYesYes
    Title / message / source500 / 10,000 / 256 characters, clippedThe same
    Tags / custom fields50 eachThe same

    During a service disruption

    An alert that arrives during a service disruption is still accepted and paged. Its answer carries degraded: true and no quota, and the alert appears in the list once the service recovers. Acknowledgements, updates and closes made during the disruption answer 503 with a Retry-After of 30 seconds and should be retried.

    Metrics

    The dashboard shows, for the organization and for each team: open and acknowledged alerts, the mean time to acknowledge (MTTA) and time to resolve (MTTR), the alerts by severity, the top sources and the busiest teams, all over the whole history. The numbers are recalculated in the background, so a brand-new organization sees them after the first run, and a figure older than an hour is flagged as stale.

    On Pro, a weekly review is written from the same data: findings, what to do next, and the evidence tables behind them (this week against last, MTTA median and 90th percentile, MTTR median, the noisiest alerts, duplicate storms, escalation and on-call coverage, the backlog). Hourly insights point out patterns, anomalies and recommendations, and each can be dismissed for 30 days.

    The IgniteOps dashboard: open and acknowledged counts, time to acknowledge, time to resolve, alerts by severity, top sources, busiest teams and the on-call card
    The dashboard of the demo organization, with the weekly review on the right.

    Checked against the product on November 8, 2026.