Alert channels
A channel is a team-scoped destination for alerts. Create as many as you need; every alert AgentPing raises fans out to every enabled channel on the team. The one exception is spend budgets, which deliver to the single channel attached to the budget.
Configure channels in the dashboard under Team settings, Alerts. Each channel has a label, an enabled toggle, and a Test button that sends a channel.test event so you can verify the wiring before anything is on fire.
Channel types
| Type | You provide | Notes |
|---|---|---|
| An email address | Available on every tier, including Free. | |
| Slack | An incoming webhook URL (hooks.slack.com/...) |
Create one in Slack under Apps, Incoming Webhooks. |
| Discord | An incoming webhook URL (discord.com/api/webhooks/...) |
From the channel's Edit, Integrations, Webhooks menu. |
| Telegram | A tap on the connect link we generate | Opens the AgentPing bot; tap Start to link a chat or group. |
| Microsoft Teams | An incoming webhook URL (*.webhook.office.com) |
From the channel's Connectors menu. |
| PagerDuty | An Events API v2 integration key, plus a severity | Severity is critical, error, warning (default), or info. |
| Webhook | Any HTTPS URL, plus an optional signing secret | POST, JSON body. Secret must be at least 16 characters. |
Tier availability
| Tier | Channels |
|---|---|
| Free | |
| Starter | Email, Slack, Discord, Telegram, webhook |
| Team and above | Email, Slack, Discord, Telegram, webhook, PagerDuty, Microsoft Teams |
What fires an alert
Every event type is documented on its own page:
| Event | Fired when | Configured in |
|---|---|---|
agent.overdue / agent.recovered |
A scheduled agent misses its expected window, then comes back | Heartbeat freshness |
check.failing / check.recovered |
A check hits its fail streak, then passes again | Verify alerts |
rubric.failing / rubric.recovered |
A judge score drops below the pass threshold for the streak, then recovers | Verify alerts |
spend.anomaly |
An agent's daily spend breaks its own baseline | Spend alerts |
spend.budget_threshold |
Month-to-date spend crosses a budget threshold | Spend alerts |
channel.test |
You press Test | This page |
Delivery and retries
Every delivery is attempted up to 3 times with a 30-second backoff and a 10-second request timeout. The channel list shows each channel's last successful delivery and, if the most recent attempt failed, when and why. Webhook attempts are additionally logged with HTTP status and duration.
Webhook details
Webhook channels receive a POST with Content-Type: application/json and User-Agent: AgentPing-Alerts/1.0. The body always carries event, subject, body (a human-readable summary), and a url deep link into the dashboard; event-specific fields ride alongside.
{
"event": "agent.overdue",
"subject": "nightly-report is overdue",
"body": "No run received for 47 minutes past the expected window.",
"agent": { "slug": "nightly-report", "id": "agt_..." },
"run": null,
"last_seen_at": "2026-06-10T03:00:12Z",
"minutes_overdue": 47,
"url": "https://agentping.io/agents/agt_..."
}
check.failing and rubric.failing events instead carry failing_checks or failing_rubrics arrays with the name, the detail or score and threshold, and the judge's reasoning where there is one.
Verifying signatures
If you set a signing secret, every request includes:
X-AgentPing-Signature: sha256=<hex>
The value is an HMAC-SHA256 of the raw request body using your secret. Verify it before trusting the payload:
import hashlib, hmac
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
valid = hmac.compare_digest(expected, request.headers["X-AgentPing-Signature"])
Next: wire up heartbeat freshness, the alert most teams want first.