Control & safetyPlanned
Budget Alerts
Hear about it before an agent runs dry or runs wild. Budget alerts are planned; the delivery they will use, the in-app inbox and a signed webhook, already runs for price alerts.
Planned triggers
| Trigger | Fires when |
|---|---|
| Budget threshold | Spend crosses 50%, 80% or 100% of the daily budget |
| Low balance | The wallet's USDC drops below an amount you set |
| New seller | The first payment to a seller the agent has never paid before |
| Burst | More than N payments within M seconds |
| Refusal | The mandate blocked a payment |
What runs today
The Alerts page sets price alerts (above, below, or a move of some percent) on tokens. A fired alert lands in the inbox behind the bell in the top bar and, if you set one, is POSTed to your webhook. Alerts are evaluated only while an Axonpay tab is open, at each inbox poll (about every 30 seconds).
Webhooks are HTTPS only. Each POST carries x-axonpay-event (for example alert.fired) and x-axonpay-signature: sha256=<hex>, an HMAC-SHA256 of the raw body keyed with the secret Axonpay generates for your webhook. Check it before trusting the payload:
import { createHmac, timingSafeEqual } from "node:crypto";
/** x-axonpay-signature is "sha256=" + the hex HMAC-SHA256 of the raw request body, keyed with your webhook secret. */
export function isFromAxonpay(rawBody: string, signatureHeader: string | null, secret: string) {
const expected = Buffer.from("sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex"));
const given = Buffer.from(signatureHeader ?? "");
return given.length === expected.length && timingSafeEqual(given, expected);
}Telegram delivery is planned.
Planned budget event
{
"type": "budget.threshold",
"agent": "research-bot",
"wallet": "AGENT_WALLET_ADDRESS",
"threshold": 0.8,
"spentUsdc": "1.6",
"dailyBudgetUsdc": "2",
"sentAt": "2026-10-15T14:02:11.000Z"
}Choosing thresholds
- Set the low-balance alert at roughly one day of normal spend, so you hear about it while there is still time to top up.
- Treat the 100% budget alert as information, not an emergency: the mandate already stopped the spending. The 80% alert is the one worth acting on.
- The new-seller alert is the best early sign of prompt injection: an agent that suddenly tries a seller it has never paid is either exploring or being steered.
- Burst alerts catch retry loops long before they drain a budget.
Until then
Your agent can raise its own alerts. In agent-fetch.ts from Mandates, post to your own endpoint from the onBeforePaymentCreation hook when spent crosses 80% of the daily budget, and whenever a payment is refused.