Tonedocs

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:

PlanRateItemised
Developer₹5.00/minagent ₹3.00 + telephony ₹0.50 + platform ₹1.50
Enterprisefrom ₹4.00/minagent ₹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:

RateWhat you get
Full stack₹5.00/min (or your Enterprise rate)Telephony + compliance + the agent
Bring your own voice₹2.00/minTelephony + compliance
Your own SIP trunk₹4.50/min, or ₹1.50/min with your own voiceCompliance + the agent, or compliance alone
Compliance only₹0.10 per verdictThe 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_reversalMoney in
call_usageOne row per call
number_purchase, number_rental, and their reversalsNumbers
compliance_usageVerdicts
adjustmentAnything 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_funds rather 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 emits campaign.paused at the same point, or earlier at its own autoPauseBelowPaise if 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.
Was this page helpful?

On this page