Spend and limits

Monthly budgets per channel, spend alerts and a daily spend limit per API key.

The Spend and limits page shows what your wallet paid this month, lets a team admin set a monthly budget for each channel, and tells the people you choose when spend runs high. Open it from Deliverability and control in the menu.

Every team member can open the page. Only a team admin (the owner always is one) can add or change a budget, an alert or an API key's spend limit. Money figures are for admins only: spend per channel and per key, budget and alert amounts, the forecast, the plan charge and the wallet balance. A member sees "Spending figures are visible to team admins." with which channels have a budget and whether it stops sending, the texts and codes sent, the email units used, the alerts and who they tell, and each key's message limits. The email addresses an alert goes to, and each key's token and maker, are shown to admins only too.

What counts as spend

A month is the calendar month in UTC. It starts at 00:00 UTC on the 1st, and every budget resets then.

ChannelWhat is counted
SMSWhat your texts cost the wallet. A text that was refused or given back is not counted.
One-time codesWhat your one-time codes sent by text cost the wallet. Codes by email cost nothing from the wallet.
Email pay-as-you-goWhat the wallet paid for email past your plan's units.
PlanYour plan's monthly price when the wallet paid it. It never has a budget.

Spent this month adds all four. Forecast carries the month's pace to the end of the month, with the plan as it is.

Budgets

Each of SMS, one-time codes and email pay-as-you-go can have one monthly budget, in your wallet's currency.

  • Stop sending when it is reached (on by default): a text or code that would take the month past its budget is refused with 429 LIMIT_EXCEEDED. For email, sending carries on within your plan's units, and only pay-as-you-go stops.
  • With it off, sending carries on and the people on your alerts are told.

A budget never moves money and never stops a payment. Your plan renews as usual.

A budget for one-time codes stops your users' sign-in codes by text when it is reached. Set it with room to spare, or turn Stop sending off for codes.

Email pay-as-you-go budgets apply to teams that pay from the wallet. A team that pays by card is billed for pay-as-you-go on its Stripe invoice, so its email budget can only alert: a stopping email budget is refused.

If your wallet changes currency, a budget kept in the old currency cannot be compared any more. A stopping one refuses texts or codes until a team admin sets it again, and the page says so.

When a stopping budget or a key's daily spend limit refuses a send for the first time in a UTC day, every team admin is emailed.

Changes are recorded

Every change to a budget, an alert or a key's spend limit, from the dashboard or the API, is written to the team's billing change log with who made it, from where, and the before and after. When a budget is removed or raised, or Stop sending is turned off, every team admin is emailed. Every budget change made with an API key is emailed to every team admin too, and its record names the key.

Alerts

An alert emails the team admins you choose (the owner always counts as one). Its email carries spend and wallet figures, so it never goes to a member, and someone made a member after the alert was set stops getting it. Alerts are checked every 10 minutes.

AlertWhen it emails
Any channel reaches a percentOnce per channel and month, when that channel's spend reaches the percent of its budget.
Wallet below an amountOnce a day while the wallet stays below it.
One day spends over an amountOnce a day, when that UTC day's texts and codes cost more.

Switch an alert off from its row. Someone who leaves the team stops getting it.

Limits per API key

The table lists each API key with its daily message limits, its daily spend limit and what its texts and codes cost this month.

A daily spend limit is the most one key's texts and codes may cost in one UTC day. Past it, that key's texts and codes are refused with 429 LIMIT_EXCEEDED until 00:00 UTC. Set it from the key's row; leave it empty for no limit. Daily message limits are set on the API keys page.

A key's spend counts texts and codes it sent after Spend and limits went live.

From the API and your AI tools

  • GET /v1/billing/spend reads the page: spend by channel, budgets, the forecast, the wallet, alerts (recipients by name) and each key's limit.
  • PUT /v1/billing/spend/budgets/{channel} creates a budget or tightens one. channel is SMS, OTP or EMAIL; amountMinor is in your wallet currency's minor unit, so 15000000 is ₦150,000.
  • The MCP tool get_spend_limits reads the same figures.

The API can only tighten a budget: create one, lower its amount, or turn stopAtLimit on. Raising a budget, removing one (DELETE) or turning stopAtLimit off answers 403 FORBIDDEN with "Raising or removing a budget can only be done in the dashboard." This way a leaked key cannot lift the limits it is held to.

A one-time codes (OTP) budget set from the API only alerts: stopAtLimit defaults to false for it, and true is refused with 403. A budget that stops codes can stop your users signing in, so it is set in the dashboard.

The reads need a full access or read only key made by a team admin. Setting a budget needs a full access key made by a team admin. Send-only and live AI keys, and keys limited to one domain, cannot reach them.

curl -X PUT https://app.usenotix.dev/api/v1/billing/spend/budgets/SMS \
  -H "Authorization: Bearer $NOTIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amountMinor": 15000000, "stopAtLimit": true}'
Open in ClaudeOpen in ChatGPT