Skip to main content

Overview

The generic webhook accepts simple JSON from any system that can POST — scripts, CI/CD, internal jobs, tools with no dedicated integration.
If your tool has a dedicated source type (Grafana, Prometheus, Datadog, CloudWatch, Zabbix, New Relic), prefer it — field mapping and recovery come ready-made. Use the generic webhook for scripts, in-house monitors and tools with no dedicated integration.

1. Create the alert source

Under Alert sources, create a source of type Generic. Copy the URL and the token.

2. Send the alert

Expected response: 202 Accepted.

Accepted fields

If status is absent, the alert is treated as a trigger. firing, alerting and resolved are case-insensitive. Any other value — including ok, normal, recovered or closed — is accepted with 202 but ignored: no incident is created or resolved.

Grouping

Repeated sends with the same externalId for the same service are aggregated into the open incident instead of creating duplicates. Use a stable externalId per problem — the job name, the check identifier, the rule key.
If you omit externalId, correlation falls back to a signature computed from the content. Changes to the title or description then produce separate incidents. Send an externalId whenever you can.

Automatic recovery

When the problem is over, send the same externalId with "status": "resolved". aciona.me resolves the incident opened by that source on its own — no person required. Example: a ping monitor opens an incident when the API stops responding and, a few minutes later, reports that it is back.
A recovery only needs status and externalId. Title, description and severity may be sent and may differ from the opening; they are not used to find the incident. service is not needed either. What happens:
  • The incident moves to resolved from any active state — including after someone acknowledged it or took responsibility for it. Nobody has to approve the resolution in the dashboard.
  • The timeline records the automatic resolution by the generic webhook, with no person attached. Earlier acknowledgement, owner and history are preserved.
  • Pending escalations and notifications stop. The recovery does not send a new resolution notice.
  • The incident is closed automatically 5 minutes after the resolution, as with the other integrations. See Resolve and close.
  • If the problem comes back — even during those 5 minutes — a new firing opens a new incident.
A recovery requires a valid externalId (non-empty text or a number). Without it the request is rejected with 400 and nothing is stored. aciona.me never resolves by title, service or content signature. To use recovery, send the externalId from the opening onwards.

Good practices and limits

  • Same key on opening and recovery. The value is compared exactly as sent, with no trimming or case change.
  • One key per problem. Use different identifiers for different problems or services on the same source: recovery does not use the service to disambiguate.
  • Correlation is per source. A recovery only resolves incidents opened by the same alert source, in the same organization.
  • A recovery with no open incident does nothing. The 202 confirms the alert was accepted, not that something was resolved. A repeated recovery is ignored.
  • Late recovery. If the same key is reused, an old recovery arriving after a new outage may resolve the new occurrence. To avoid it, use one key per episode (for example, ping-main-api-2026-10-15T10:00), stable across that episode’s opening, repeats and recovery.
  • Ordering under bursts. Under volume spikes, a recovery may be processed before its opening; it then finds nothing and the following trigger stays open. Space out the recovery or resolve it in the dashboard.
  • Old events are not replayed. Recoveries sent before this feature existed were discarded and do not resolve anything retroactively.

Examples

Troubleshooting

The status field probably has a value other than firing, alerting or resolved — in which case the alert is accepted and discarded. Send firing or omit the field. If it was a recovery (resolved), it never creates an incident.
The externalId is missing, empty, whitespace-only or not text/number. Send the same externalId used on the opening.
The externalId is changing between sends (for example, by including a timestamp). Use a stable identifier per problem.
The service field does not match any service in the organization, or the service has no responsible team with an active schedule.
Check that the externalId is exactly the same as on the opening and that the recovery was sent to the same source. Incidents opened without an externalId are not reliably resolved by the webhook — resolve them from the dashboard or the app.

Full payload reference