The platform uses prepaid balance with holds on message sends. Every successful POST /v1/messages returns billing metadata; dedicated endpoints expose balance, usage, and tier.

How top-up works

RuleDetail
Minimum top-up€10 per transaction
Maximum balance€5,000 (grows with account history; Enterprise can be raised manually)
AmountFree-form — enter any amount ≥ €10, no fixed packages
Payment methodsCredit card or SEPA direct debit
Balance expiryNever — unused balance stays on the account indefinitely

Steps

1

Check balance

curl -sS "https://api.arowana.app/v1/billing/balance" \
  -H "Authorization: Bearer $API_KEY"
{
  "free": 48.20,
  "reserved": 1.80,
  "total": 50.00
}
The balance check before every send runs against free only, not total. Reserved balance is not available for new sends.
2

Add balance

Add balance manually from the Billing section of the dashboard (card or SEPA), or via API:
curl -sS -X POST "https://api.arowana.app/v1/billing/topup" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount": 100.00, "currency": "EUR"}'
Minimum €10 per transaction. The new balance is available immediately.
3

Configure auto-reload

Auto-reload tops up automatically when free balance drops below your threshold:
curl -sS -X PUT "https://api.arowana.app/v1/billing/auto-reload" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true,
    "trigger_threshold": 20.00,
    "reload_amount": 100.00
  }'
Auto-reload fires at most 3 times per day (loop protection). On payment failure, it retries once after 24 hours, then notifies you.
4

Set a low-balance alert

curl -sS -X PUT "https://api.arowana.app/v1/billing/alerts" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"low_balance_threshold": 25.00}'
The billing.balance_low webhook fires when free balance crosses this threshold.
5

Read billing metadata on every send

Every send response includes the billing object — inspect it to track real-time balance and tier progress. The tier object reflects the channel-specific tier for the message you just sent (email, RCS, and SMS each have independent tiers):
{
  "message_id": "msg_a1b2c3d4",
  "status": "queued",
  "billing": {
    "channel": "EMAIL",
    "message_type": "basic_message",
    "hold_amount": 0.09,
    "message_price": 0.09,
    "balance": {
      "free": 48.11,
      "reserved": 1.89,
      "total": 50.00
    },
    "tier": {
      "channel": "EMAIL",
      "current": "tier_1",
      "volume_used": 1251
    }
  }
}
Current tier thresholds and prices for each channel are visible in the Billing section of your dashboard.

Balance exhaustion and campaigns

When a campaign pauses because free balance hit €0 (PAUSED_BALANCE), auto-reload fires and tops up your balance — but the campaign does not resume automatically. You must call POST /v1/campaigns/{id}/resume explicitly after funds are available.

Learn more