Wallet, pricing and billing
Everything is prepaid, in paise, and the ledger is the source of truth.
Tone is prepaid. Calls, number purchases, monthly rentals and compliance verdicts all debit one wallet, and everything is in paise (₹1 = 100 paise) because money in floating point is money lost.
curl "$TONE_API/v1/wallet" -H "Authorization: Bearer $TONE_KEY"
curl "$TONE_API/v1/wallet/transactions" -H "Authorization: Bearer $TONE_KEY"
curl "$TONE_API/v1/wallet/usage?period=30d" -H "Authorization: Bearer $TONE_KEY"What a call costs
Two plans, both pay as you go — no subscription and no included minutes:
| Plan | Rate | Itemised |
|---|---|---|
| Developer | ₹5.00/min | agent ₹3.00 + telephony ₹0.50 + platform ₹1.50 |
| Enterprise | from ₹4.00/min | agent ₹2.00 + telephony ₹0.50 + platform ₹1.50, discounted further at higher volume |
Every organization starts on Developer. Enterprise is a per-minute rate agreed
with us and set on your organization; GET /v1/wallet reports the rate you are
on as ratePaisePerMinute, and every call records the rate it was billed at.
The rate depends on what Tone runs for the call:
| Rate | What you get | |
|---|---|---|
| Full stack | ₹5.00/min (or your Enterprise rate) | Telephony + compliance + the agent |
| Bring your own voice | ₹2.00/min | Telephony + compliance |
| Your own SIP trunk | ₹4.50/min, or ₹1.50/min with your own voice | Compliance + the agent, or compliance alone |
| Compliance only | ₹0.10 per verdict | The gate, the ledger and the evidence |
Only answered calls are billed — per second, with a 30-second minimum. Phone numbers add a monthly rental, from ₹299/month, shown before you buy. Every rate here excludes GST, which is collected once, when you add money.
⚠️ The itemisation is display, not a billing model — a call produces exactly one wallet debit at the blended rate, not three.
🔴 A BYO or SIP-trunk call bills its component subset and ignores a negotiated full-stack rate. A negotiated rate is a discount on the whole stack; applying it to a call whose agent half we never ran would charge a discounted customer more than list.
Test mode is free by environment
A tone_test_ key produces calls with billedPaise: 0. It is the environment
that makes a call free, never the channel — so a sandbox call is priced through
the same path and simply reports zero.
The ledger is the truth
GET /v1/wallet/transactions is not a report derived from a balance; it is what
the balance is computed from. It is append-only: a correction is a new
compensating row, never an edit. If a balance and its ledger ever disagreed, the
ledger would be right.
| Entry type | |
|---|---|
topup, topup_reversal | Money in |
call_usage | One row per call |
number_purchase, number_rental, and their reversals | Numbers |
compliance_usage | Verdicts |
adjustment | Anything we corrected by hand |
Adding money
Funding runs through Razorpay Checkout in a browser, from the dashboard. There is deliberately no programmatic money-in path: a card flow needs a human and a redirect, and an API that pretended otherwise would only fail in more places.
GST (18%) is added at checkout, once. To add ₹1,000 you pay ₹1,180, and your balance grows by exactly ₹1,000. Nothing debited from the balance afterwards — calls, numbers, rentals, verdicts — carries GST of its own, because it was paid when the money came in. The dashboard shows the total before you pay. A refund returns what you paid, GST included, and takes back only the ₹1,000 that reached your balance.
Every top-up gets a GST tax invoice, emailed as a PDF to your organization's owners and admins and listed on the Billing page. It is made out to the billing name, address and GSTIN you save (the first top-up asks for them), with CGST and SGST when you are in Madhya Pradesh and IGST anywhere else, under SAC 998315. The QR code printed on it opens a page that shows the invoice's details and offers the original PDF, so whoever you hand it to can check it came from Tone.
Running out
Subscribe to wallet.balance.low rather than polling. It fires once per
crossing, not repeatedly, and emails owners and admins.
What happens at zero depends on what you were doing:
- A call is refused with
402 insufficient_fundsrather than placed, once the balance is below ₹12 (two minutes at the standard rate), or while the wallet is on hold for a payment dispute. Test-mode calls are never refused for money. - A campaign pauses itself with
pausedReason: "low_balance"and emitscampaign.pausedat the same point, or earlier at its ownautoPauseBelowPaiseif you set one. The recipient it was about to call keeps its attempt. Top up and resume. - A number renewal — charged a day before each anniversary — emails the
owners, emits
number.renewal_due, and gives you six hours. Add money in time and it renews; otherwise the number is released, permanently. See Phone numbers.