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.

On this page+

Planned triggers

TriggerFires when
Budget thresholdSpend crosses 50%, 80% or 100% of the daily budget
Low balanceThe wallet's USDC drops below an amount you set
New sellerThe first payment to a seller the agent has never paid before
BurstMore than N payments within M seconds
RefusalThe 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:

verify-webhook.ts
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

webhook body (draft)
{
  "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.