Calls
Limits and billing
Your workspace can run a fixed number of calls at once and pays for them from a prepaid balance, and this page explains both: concurrency, the queue, credits and how each one affects your calls.
Concurrency
The concurrency limit is how many calls your workspace may have live at the same time. A call is live while it is ringing or in-progress, and phone and browser calls both count.
| When the limit is reached | What happens |
|---|---|
| Outbound call | It waits in the queue and is dialled when a call ends. |
| Inbound call | It is rejected (the caller hears the line drop). |
| Browser call | It is refused with all N call slots are busy: try again when a call ends. |
Your limit comes from your plan, unless the Vaakyo team has set a different limit for your workspace, plus any extra call lines you buy.
Check your limit
In the console, open the account menu (your name at the bottom of the sidebar): Concurrent calls shows the calls live now against your limit. Click it to see past requests and to Request more.
With the API:
curl https://api.vaakyo.com/api/v1/workspace/limits -H "X-API-Key: $VAAKYO_API_KEY"
{"concurrency_limit": 5, "active_calls": 2, "queued_calls": 14, "pending_request": null}
| Field | Meaning |
|---|---|
concurrency_limit | Calls you may have live at once. |
active_calls | Calls ringing or in-progress now. |
queued_calls | Outbound calls waiting in the queue. |
pending_request | Your open request for a higher limit, or null. |
Ask for a higher limit
In the console, open Limits and ask for a new limit with a reason. The Vaakyo team reviews it. You need the owner or admin role; API keys can’t send this request. You can ask for up to 100 concurrent calls, and have one request open at a time.
Extra call lines
The owner can buy more concurrent calls at once on the Billing page (Add call lines): ₹600 per line per month, from your credits. Your limit becomes your plan’s (or your workspace’s own) limit plus your lines, up to 100 in all.
- Charged now. Your first lines pay a full month and start a 30-day cycle. Lines added during a running cycle pay only for what is left of it (by the day), then renew with the others. If your credits don’t cover it, the purchase is refused with
402. - Every 30 days all lines are charged together, as a
linesrow in the ledger with an invoice. If credits don’t cover it, Vaakyo tries again daily; after 7 days the lines are removed. - Removing lines is immediate, with no refund for the rest of the month.
GET /api/v1/billing/linesshowsextra_lines,price_per_line_paise,lines_paid_until,concurrency_limitand how many more you can add (can_add). The owner buys withPOST /api/v1/billing/linesand removes withPOST /api/v1/billing/lines/remove, both with{"quantity": 2}.
Plans
Your plan sets your price per minute, your concurrency limit and how many members you can invite. A plan can also have a monthly fee, and a plan with a fee can include call minutes, phone numbers and Truecaller verification every month. The plans Vaakyo starts with (prices exclude GST where it applies; telephony is included; calls are billed per second):
| Plan | Monthly fee | Minutes included | Then per minute | In the browser | Numbers included | Concurrent calls | Members |
|---|---|---|---|---|---|---|---|
| Starter (default, pay as you go) | none | none | ₹5.50 | ₹4.00 | none | 5 | 5 |
| Growth | ₹2,999 | 600 | ₹4.75 | ₹4.75 | 1 | 15 | 20 |
| Scale | ₹9,999 | 2,500 | ₹4.00 | ₹4.00 | 2, and Truecaller verification | 40 | no limit |
| Enterprise | custom | custom | from ₹3.00 with committed volume | custom | custom | up to 100 | no limit |
- Browser calls (test calls in the console and the web widget) can have their own, lower price per minute (
browser_price_per_minute_paise; when it’snullthe phone price applies). - Included numbers. On a plan with
included_numbers, the monthly fee of that many of your phone numbers is waived, oldest first. The Phone numbers page marks them Included in your plan. A setup fee for a number you rent is still charged. - Truecaller included (
includes_truecaller). The setup and monthly fees of Truecaller verification are waived for your verified numbers, up to the plan’s included numbers (at least one). - When you switch plans, what is included is worked out again; the fees follow from each number’s next monthly charge (no refund or catch-up).
Every workspace may have up to 200 agents, whatever its plan. The Vaakyo team can change plans and prices, so the Billing page and GET /api/v1/billing/plans are the source of truth. They list the plans on offer with yours marked current, priced in your billing currency: price_per_minute_paise, browser_price_per_minute_paise, monthly_fee_paise (0 means no monthly fee), included_minutes, included_numbers, includes_truecaller and icon (the pixel icon on the plan’s card). GET /api/v1/billing/plan returns yours.
Switch plans
The workspace owner can switch plans on the Billing page, or with POST /api/v1/billing/plan and {"plan_id": "..."}. The switch happens at once:
- A plan with a monthly fee takes the first month from your credits right away. If your credits don’t cover it, the switch is refused with
402and nothing changes. Top up first. - A plan without one stops the monthly charges.
- Included minutes reset. You get the new plan’s full allowance; minutes left on the old plan end.
- No proration and no refunds. The new plan’s 30 days start on the day you switch, and what you paid for the old plan isn’t returned.
- The new price per minute applies to calls from then on. If the Vaakyo team set your workspace its own price per minute, that price still applies.
Plans marked Custom (Enterprise) are arranged with the Vaakyo team: their button books a demo or emails sales. A plan’s can_switch says whether you can switch to it yourself; only owners can, and API keys can’t.
Monthly fees
A monthly fee is taken from your credits every 30 days, as a plan row in the ledger. Each charge has an invoice paid from credits (no GST line: any GST was paid when you bought the credits), listed under Billing → Invoices and emailed to the owner. GET /api/v1/billing/plans shows when the next charge is due in plan_paid_until, and its amount in next_charge_paise.
If your credits don’t cover a renewal, the plan becomes past due (plan_past_due_since), the owner gets an email, and Vaakyo tries again every day. Top up within 7 days and the next try charges the fee. Otherwise your workspace moves to the default plan (Starter) and the owner gets an email; you can switch back at any time.
Included minutes
A plan with a monthly fee can include call minutes, for example ₹2,999 a month with 600 minutes included, then ₹4.75 per minute. Each paid month (the first month when you switch, then each renewal) gives you the plan’s full allowance.
- Used before credits. A finished call’s seconds come out of your minutes first. Only the part they don’t cover is charged from credits, as the same share of the call’s normal charge. The call shows
plan_seconds_covered, itscost_breakdown.plan_minutessays what the minutes covered, and the ledger row shows what credits paid (0when the minutes covered the whole call). - Premium models use included minutes faster. A minute uses one included minute when the call costs Vaakyo up to ₹2.50 a minute to run (a typical agent costs about ₹2.30). A call on dearer models uses
cost per minute ÷ ₹2.50included minutes per minute: a call on Claude Sonnet with an ElevenLabs voice costing about ₹6.38 a minute uses about 2.55 included minutes for each minute. The call’scost_breakdown.plan_minutesshows themultiplierandallowance_seconds_used, and the agent’s price estimate showsplan_minutes_multiplier. - Phone and browser calls both use minutes. Transfer legs, post-call analytics, agent tests and Composer are always charged from credits.
- No credits needed while minutes last. A workspace with minutes left can place calls with an empty balance. A call can run for your minutes left plus what your credits pay for.
- No roll-over. Unused minutes end with the paid month. While a renewal is past due you get no new minutes.
GET /api/v1/billingandGET /api/v1/billing/plansshowplan_minutes_left_seconds,plan_minutes_total_secondsandplan_minutes_cycle_end.
The queue
- Every outbound call is queued first, oldest first per workspace. See The queue.
- There is no limit on how many calls you can queue.
- A call waits while all slots are busy, while the agent’s calling hours are closed, or while the workspace is not active.
- A call still queued after 24 hours is canceled with
expired in queue. - Queued calls are not charged. Cancel one with
POST /api/v1/calls/{id}/hangup.
Credits
Vaakyo is prepaid. Your balance is in your workspace’s billing currency, in its smallest unit: paise for rupees (100 paise = ₹1), cents for US dollars (100 cents = $1). New workspaces get welcome credits (₹250 by default).
Billing currency
A workspace is billed either in Indian rupees (INR, the default) or in US dollars (USD); the Vaakyo team chooses it for your workspace. Everything is then in that currency: your balance, call charges, the per-minute estimate, phone-number and Truecaller fees, credit packs, top-ups and invoices. API fields keep their _paise names but hold the smallest unit of your currency (cents for USD), and responses with money include currency:
{"currency": "USD", "credits_paise": 10500, "price_per_minute_paise": 5, "minutes_left": 2100.0, "low_balance": false}
Here the balance is $105.00 and the plan price $0.05 a minute. A dollar price per minute may hold fractions of a cent (4.375 is $0.04375); a call is still rounded up to the whole cent once.
For a USD workspace, Vaakyo’s per-model prices are converted from rupees at the day’s USD rate (European Central Bank reference rate, updated daily) when a call is charged, unless the Vaakyo team set a dollar price (plans, fees and packs can have one).
If the Vaakyo team moves your workspace to another currency, your balance is converted at that day’s rate in one step, shown as two conversion rows in the ledger (the old balance going out, the converted balance coming in, with a note like Converted ₹8,400.00 to $105.00 at ₹80.00/USD). Ledger rows, calls and invoices keep the currency they were made in (currency on each). It can’t happen while calls are live or a campaign is running.
Invoices are in your currency. A US-dollar invoice to a business outside India (no GSTIN and no Indian state in its verification details) is an export of services with no GST; an Indian business billed in dollars pays GST as with rupees.
How a call is charged
A call is charged for what it actually used, at Vaakyo’s prices for the models it ran on, but never less than your plan’s price per minute. A call that fails (it ends in an error at the start or mid-call, status: "failed") is free: no credits and no plan minutes are used. Its cost_breakdown has "total_paise": 0 and "waived": "failed", with waived_paise, what it would have cost.
| Component | Measured as | Priced |
|---|---|---|
| Transcriber | minutes of caller audio sent to speech to text (usage.stt_seconds) | per minute, for the transcriber’s model |
| LLM | input and output tokens (usage.llm_input_tokens, usage.llm_output_tokens, the hang-up check included) | per million tokens, for the agent’s model |
| Voice | characters spoken (usage.tts_characters) | per 1,000 characters, for the voice’s model |
| Telephony | minutes of the phone call (duration_seconds); browser test calls have none | per minute |
| Platform | minutes of the call | a flat fee per minute |
usage_paise = ceil(sum of the components)
floor_paise = ceil(duration_seconds × price_per_minute_paise / 60) # your plan's price, per second
cost_paise = max(usage_paise, floor_paise)
Browser calls use your plan’s browser price per minute as the floor. A 14.2-second browser call on a ₹4.00-per-minute browser price whose usage came to 61 paise costs max(61, ceil(14.2 × 400 / 60)) = 95 paise; a long call on an expensive LLM costs its usage. If a backup transcriber or voice took over mid-call, each part is priced at the provider and model that actually served it. The charge is taken when the call ends and saved on the call as cost_paise, with the details in cost_breakdown:
{
"components": {"transcriber": 18.5, "llm": 4.1, "voice": 140.3, "telephony": 0, "platform": 41.7},
"lines": [
{"component": "transcriber", "provider": "deepgram", "model": "nova-3", "quantity": 0.83, "unit": "minute", "rate_paise": 78.0, "amount_paise": 64.7}
],
"usage_paise": 205, "floor_per_minute_paise": 400, "floor_paise": 334, "floor_applied": true,
"total_paise": 334, "duration_seconds": 50.1, "channel": "web"
}
components and amount_paise are in paise with fractions (rounded only once, in usage_paise). Calls from before usage-based pricing have an empty cost_breakdown. The credit ledger row of a call lists its components, or says the plan minimum applied.
- Charged: outbound, inbound and browser calls that connected, for the time the agent was live.
- Transfers to a person: both phone legs are charged as telephony, per second: the person’s leg while bridged and your caller’s leg from the transfer until it ends (ringing included, also when nobody answers). They are added to the call’s
cost_paiseascost_breakdownlines with modelstransferandtransfer-caller. - Post-call analytics (a summary or extraction you set on the agent) are charged at your LLM’s price per token as their own
callrow in the ledger (Post-call analytics), also when you analyse a call again. - Not charged: time in the queue, ringing, and calls that never connected (
no-answer,busy,canceled, orfailedbefore connecting).
An agent’s price per minute
The agent editor shows Cost per min (approx) with a bar of the five components, updated as you change models. The same estimate is in the API, for a saved agent or for a configuration you haven’t saved (POST with the agent’s JSON; name is optional):
curl https://api.vaakyo.com/api/v1/agents/$AGENT_ID/pricing -H "X-API-Key: $VAAKYO_API_KEY"
curl -X POST "https://api.vaakyo.com/api/v1/agents/pricing?channel=web" -H "X-API-Key: $VAAKYO_API_KEY" \
-H "Content-Type: application/json" -d '{"llm": {"provider": "openai", "model": "gpt-4.1-mini"}}'
{"components": [{"key": "transcriber", "label": "Transcriber", "provider": "cartesia", "model": "ink-2", "paise_per_minute": 22.2}, "..."],
"usage_paise_per_minute": 320.2, "floor_paise_per_minute": 400, "total_paise_per_minute": 400, "floor_applied": true,
"assumptions": {"tts_characters_per_minute": 450, "llm_turns_per_minute": 4, "llm_input_tokens_per_minute": 5836, "...": "..."}}
The estimate assumes a typical minute: the caller’s audio is transcribed for the whole minute; the agent speaks about 450 characters; it replies about 4 times, each reply reading the system prompt (plus a knowledge base small enough to be given whole, or about 300 tokens of search results), about 350 tokens of built-in instructions and about 500 tokens of conversation, and writing about 40 tokens (a hang-up prompt adds its own check after each reply). channel=web leaves out telephony. When floor_applied is true, your plan’s price per minute is what a typical minute costs. Real calls are charged for what they really used.
Your prices
Vaakyo sets a price per unit for every model (its rate card). Your workspace may have its own prices, agreed with the Vaakyo team; the estimate and every charge use them. Your plan’s price per minute (or a custom price on your workspace) is the minimum a minute costs.
What happens when credits run low
| Moment | Balance at or below 0 |
|---|---|
| Placing an outbound call | 402 out of credits: add credits in Billing |
| A queued call reaches the front | It fails with out of credits. |
| Inbound call | Rejected. |
| Browser call | Refused. |
During a call, Vaakyo caps its length at what your balance can pay for when it starts, at the higher of the agent’s estimated price per minute and your plan’s price. If that is shorter than max_duration_seconds, the call ends when the money runs out, with hangup_reason: "credits ran out".
Each call’s cap is worked out from the balance when it starts. Several calls running at once can together take the balance below zero; new calls are then refused until you top up.
Email alerts
The workspace owner gets an email, with a link to the right console page, when:
| Alert | When | Repeated |
|---|---|---|
| Credits running low | The balance pays for fewer minutes than the low-balance warning (10 minutes at your price by default). | At most once a day while it stays low. |
| Credits used up | The balance is ₹0 or less: new calls are refused. | At most once a day. |
| Calls failing | In the last 15 minutes at least 5 calls finished and 30% or more of them failed. The email lists the most common errors. | At most once an hour, and an all-clear when it stops. |
| Phone number fee unpaid | A number’s monthly fee couldn’t be taken from credits (see Monthly fee). | Once. |
| Plan fee unpaid | Your plan’s monthly fee couldn’t be taken from credits (see Monthly fees). | Once. |
The thresholds are set by the Vaakyo team.
Check your balance
API keys can read the balance and the ledger:
curl https://api.vaakyo.com/api/v1/billing -H "X-API-Key: $VAAKYO_API_KEY"
{"credits_paise": 48210, "price_per_minute_paise": 400, "minutes_left": 120.5, "low_balance": false, "plan_name": "Starter", "plan_id": "4f1c...", "pending_bonus": null}
price_per_minute_paise is your plan’s price (the minimum a minute costs), and minutes_left is counted at it, so it’s the most minutes your balance pays for. low_balance is true when fewer than 10 minutes are left at that price. pending_bonus is a redeemed top-up bonus coupon waiting for your next top-up (see Coupons), or null.
curl "https://api.vaakyo.com/api/v1/billing/ledger?limit=20" -H "X-API-Key: $VAAKYO_API_KEY"
{
"items": [
{"id": "9c2e...", "at": "2026-10-01T14:44:16.300000+05:30", "kind": "call", "amount_paise": -95, "balance_after_paise": 48210, "note": "Appointment reminder · 14 s", "call_id": "00b1d622a8f04f4f8f3a3c2d9e5b7a11", "payment_id": "", "by_name": "phone"}
],
"total": 212
}
Ledger kind is grant (welcome credits), coupon (a coupon’s credits, naming it), topup (a payment), call (a call’s charge, its transfer or its post-call analytics, with its call_id), plan, number, caller_id and lines (monthly fees), composer, test, conversion or adjustment (a change by the Vaakyo team). Credits added carry funded: paid for a top-up (with paid_paise, and free_paise for a pack’s bonus) or free.
Minutes per month
The Billing page shows the minutes used in each calendar month (India time), with a bar per day. The same numbers come from the API:
curl "https://api.vaakyo.com/api/v1/billing/usage?month=2026-10" -H "X-API-Key: $VAAKYO_API_KEY"
{"month": "2026-10", "total_minutes": 312.4, "total_calls": 1040, "spent_paise": 124960, "daily": [{"day": "2026-10-01", "calls": 52, "minutes": 15.2, "spent_paise": 6080}], "first_month": "2026-08"}
daily has one row per day of the month (zeros on quiet days). Leave out month for the current one.
Top up
Top-ups are made in the console under Billing → Buy credits, by the workspace owner. Choose a credit pack (larger packs include bonus credits) or a custom amount. Each payment has an invoice (a GST invoice when Vaakyo charges GST; the checkout shows whether it does), listed by GET /api/v1/billing/invoices and downloadable as a PDF from GET /api/v1/billing/invoices/{id}/pdf.
Coupons
The Vaakyo team gives out coupon codes. Apply one under Billing → Apply coupon. It needs the billing.manage permission (the owner), so API keys can’t redeem coupons; the console calls POST /api/v1/billing/coupons/redeem with {"code": "WELCOME500"}.
Codes are not case-sensitive. There are two kinds:
| Kind | What it does |
|---|---|
credit | Adds a fixed amount of credits at once (a grant ledger row naming the coupon). The response has the new balance in credits_paise. |
topup_bonus | Waits for your next paid top-up and adds a percentage of it as extra credits, sometimes up to a cap or only for top-ups above a minimum (before GST). The checkout shows the bonus before you pay; it is added when the payment succeeds, as its own grant row. A failed payment keeps the bonus for later. One bonus can wait at a time. |
| Error | Why |
|---|---|
404 this coupon code is not valid | No such code, or it was switched off. |
409 this coupon can be used from ... / 409 this coupon has expired | Outside its dates. |
409 this coupon has been fully redeemed | Its total number of uses is reached. |
409 your workspace has already used this coupon | Most coupons work once per workspace. |
409 a top-up bonus ... is already waiting | Use the waiting bonus on a top-up first. |
Other limits
| Limit | Default |
|---|---|
| API requests per key | 120 per minute. See Rate limits. |
| Agents per workspace | From your plan. |
| Agent versions kept | 10 per agent. |
| Webhook endpoints | 20 per workspace. |
| Call length | max_duration_seconds, 30 to 3600 seconds per agent. |
The Vaakyo team can set different values for your workspace, for example a higher API rate limit, more knowledge bases or larger contact files; the new values apply within a minute.