Budgets and alerts
Limits on AI spend per organization, customer, feature, user or project, with alerts at 50, 80 and 100 percent and SDK enforcement that stops calls before they are made.
Two kinds of budget
| SDK budget | Cloud budget | |
|---|---|---|
| Set with | veqen.budget(...) in code |
The Budgets page, the MCP set_budget tool |
| Counts spend | In this process | Across every process sending to your organization |
| Enforced | Before a wrapped call, using recorded spend | After ingestion, budget evaluation and SDK polling (every 30 seconds by default) |
| Alerts | – | Email, Slack and webhook at 50%, 80% and 100% |
Use both: SDK budgets check spend in one process; cloud budgets combine the usage received across your organization. Neither guarantees a spending cap. A call can cross the limit before its cost is recorded, and concurrent or in-flight calls can add more spend. Local counters reset when the process restarts. Delayed or failed ingestion and polling delay cloud enforcement; SDKs retain their last known cloud state when polling fails.
Scopes
| Scope | Value | Meaning |
|---|---|---|
| Organization | – | All spend |
| Customer | * |
Every customer gets the limit separately |
| Customer | acme |
Only Acme |
| Feature | * or a name |
Per feature |
| User | * or an id |
Per end user, the usual guard for free plans |
| Project | * or a name |
Per team, program, pipeline or cost center |
Periods are calendar months or days, in UTC. Calls without the tag in question don't count toward a * budget for that tag.
Modes
- Alert: notifies at 50%, 80% and 100%. Calls continue.
- Block: also lists the value as breached at 100%. Every SDK using your key then raises
BudgetExceededfor calls with that tag, before the request is sent, until the period resets or you raise the limit.
try:
client.responses.create(model="gpt-5-mini", input=prompt)
except veqen.BudgetExceeded as exc:
return f"You've used this month's AI allowance (${exc.limit_usd:.2f}). Upgrade for more."
try {
await client.responses.create({ model: "gpt-5-mini", input: prompt });
} catch (error) {
if (error instanceof BudgetExceeded) return upgradePrompt(error.limitUsd);
throw error;
}
Spend that arrives through OpenTelemetry or record() counts toward budgets, but only the SDK wrappers can stop a call before it happens.
Where alerts go
Owners and admins get email. On Pro and Team, add a Slack incoming webhook and a signed webhook under Settings › Alerts. Webhook bodies look like:
{"type": "budget.threshold", "org_id": 42, "subject": "Budget Free users at 80%",
"text": "Spent this month, of $5.00: customer acme: $4.00.",
"data": {"budget_id": 7, "scope": "customer", "limit_usd": 5.0, "threshold": 80, "blocking": false,
"crossed": [{"value": "acme", "spent_usd": 4.0}]},
"url": "https://veqen-app.com/app/budgets"}
Each alert is sent once; a failed delivery is logged, not retried. Verify the Veqen-Signature: t=<unix>,v1=<hex> header: compute HMAC-SHA256 of <t>.<raw body> with your webhook secret and compare in constant time.
The same channels carry spend-spike alerts (a day at twice the previous week's average and over $25), credit-expiry warnings, connection failures and the Monday digest.