Billing
Billing
One rate, prepaid in USD#
GET /console/v2/billing/rate returns the rate on its own: rate_nano_usd_per_minute: "5000000" ($0.005 per connected minute — half a cent), metering_basis: "connected_minute_rounded_up", and a rate_version. Every call rounds up to the next full minute. Cost is ceil(connected_seconds / 60) × rate in integer nano-USD; a 59-second call costs $0.005 (1 minute), a 61-second call costs $0.01 (2 minutes), and a 10-minute call costs $0.05.
Read the rate from this route rather than hard-coding it. A published rate change is a new rate_version; sessions already admitted keep the version they froze.
Pure pay as you go#
There is no monthly platform fee, no minimum spend, no seat fee, no commitment, and no contract. You top up a prepaid wallet with whatever amount you want, you spend what you use, and whatever is left stays yours.
Connected voice minutes are the only metered thing on this platform. Dvaarik charges nothing for:
- creating projects, agents, or API keys;
- the console;
- the SDKs (
@dvaarik/node,dvaarik,@dvaarik/web); - webhook delivery, retries, and dead letters;
- the playground, beyond its own connected minutes — a playground call is a real call, billed at the same rate as any other;
- post-call analysis. Insights run on your model under your provider account, so that provider bills you for those tokens and Dvaarik adds nothing on top;
- text and chat. We sell voice minutes only. A website chat bot built on your own model costs you nothing from us.
GET /console/v2/billing/summary?project_id=… returns the account wallet — balance_nano_usd, held_nano_usd, spendable_nano_usd, lifetime_topup_nano_usd, low_balance_threshold_nano_usd, low_balance — together with the rate and the project's concurrency, request-rate, and maximum-session limits. The wallet belongs to the account; it is reported against one project.
Holds and settlement#
A session places a hold for its maximum duration when admitted. It is refused with 402 when the spendable balance cannot cover that hold. When the session ends, the hold is released and the connected seconds are settled exactly once. GET /console/v2/billing/transactions?limit=50&offset=0 lists the ledger newest first; amount_nano_usd is null on archival rows from before USD.
Top up#
1. GET /console/v2/billing/quote?amount_usd_cents=2500 — no fee, no markup: one cent buys exactly 10,000,000 nano-USD. Bounds are $10 to $2,000. 2. POST /console/v2/billing/topup with { "amount_usd_cents", "project_id" } creates a Razorpay USD order and records it first; the response carries order_id and razorpay_key_id, which the console hands to Razorpay Checkout. 502 means the gateway did not create an order; 503 means the order could not be recorded and no checkout was returned. 3. The payment webhook credits the wallet. The console polls the summary until lifetime_topup_nano_usd grows; a successful Checkout alone is never treated as credit.
Whether international cards are accepted depends on Razorpay international-payment enablement for the Dvaarik merchant account; the console reports the gateway's answer rather than assuming it.
Receipts#
GET /console/v2/billing/invoices lists receipts for paid top-ups; GET /console/v2/billing/invoices/{invoice_id}.pdf returns the PDF. A receipt exists only once a payment has landed.
What we store#
Storage is not a line on your bill here, because there is almost nothing of yours on our disks.
Call recordings live in your own phone company's account. When an agent has record_calls enabled, Dvaarik asks your carrier to record the call. The audio is written into your own carrier account under your own carrier plan. Dvaarik stores only the carrier's reference to that recording, so you fetch the audio from your carrier with your own credentials. We pay nothing to store it, and you are not charged twice for storing it.
Browser calls have no recording. A browser call has no carrier in the path, so there is no carrier to record it and no recording reference on the call.
Transcripts live in the Dvaarik database for 90 days and are then deleted. store_transcript controls whether one is written at all; retention_days cannot extend a transcript past that 90-day window. Pull anything you need to keep — through the API or your call webhook — inside it.
The insight block survives the transcript. The short post-call summary produced by insight_config stays on the call record after the transcript is deleted: it is small, and it is your business record of what the call was about. It is generated on your own model, on your own provider account.
Estimate the per-minute cost before you build#
The platform fee is exact and published — $0.005 per connected minute, rounded up to the next minute. What you cannot know from this API alone is what your *chosen* speech, language-model, voice, or realtime provider will charge for that same minute, because that is billed by them, on your account, at whatever rate you negotiated.
The console's cost-estimate card (agent create/edit, the agent list, and the pricing calculator) renders a breakdown — Listen / Think / Speak or Realtime, your carrier's rate typed in by hand, and the platform fee — from a small table of public list prices in src/lib/providerListPrices.ts, dated and sourced per provider. It is always an estimate: only the platform fee row is exact, computed from the same nano-USD constants as the rest of this page; every provider row can drift the moment that provider changes its own price list.
Use one project per boundary
Provider secrets stay encrypted and project API keys stay on your server.