Skip to content
VaakyoDocs
Navigation
Open console →

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 reachedWhat happens
Outbound callIt waits in the queue and is dialled when a call ends.
Inbound callIt is rejected (the caller hears the line drop).
Browser callIt 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}
FieldMeaning
concurrency_limitCalls you may have live at once.
active_callsCalls ringing or in-progress now.
queued_callsOutbound calls waiting in the queue.
pending_requestYour 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 lines row 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/lines shows extra_lines, price_per_line_paise, lines_paid_until, concurrency_limit and how many more you can add (can_add). The owner buys with POST /api/v1/billing/lines and removes with POST /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):

PlanMonthly feeMinutes includedThen per minuteIn the browserNumbers includedConcurrent callsMembers
Starter (default, pay as you go)nonenone₹5.50₹4.00none55
Growth₹2,999600₹4.75₹4.7511520
Scale₹9,9992,500₹4.00₹4.002, and Truecaller verification40no limit
Enterprisecustomcustomfrom ₹3.00 with committed volumecustomcustomup to 100no 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’s null the 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 402 and 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, its cost_breakdown.plan_minutes says what the minutes covered, and the ledger row shows what credits paid (0 when 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.50 included 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’s cost_breakdown.plan_minutes shows the multiplier and allowance_seconds_used, and the agent’s price estimate shows plan_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/billing and GET /api/v1/billing/plans show plan_minutes_left_seconds, plan_minutes_total_seconds and plan_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.

ComponentMeasured asPriced
Transcriberminutes of caller audio sent to speech to text (usage.stt_seconds)per minute, for the transcriber’s model
LLMinput and output tokens (usage.llm_input_tokens, usage.llm_output_tokens, the hang-up check included)per million tokens, for the agent’s model
Voicecharacters spoken (usage.tts_characters)per 1,000 characters, for the voice’s model
Telephonyminutes of the phone call (duration_seconds); browser test calls have noneper minute
Platformminutes of the calla 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_paise as cost_breakdown lines with models transfer and transfer-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 call row 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, or failed before 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

MomentBalance at or below 0
Placing an outbound call402 out of credits: add credits in Billing
A queued call reaches the frontIt fails with out of credits.
Inbound callRejected.
Browser callRefused.

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:

AlertWhenRepeated
Credits running lowThe 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 upThe balance is ₹0 or less: new calls are refused.At most once a day.
Calls failingIn 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 unpaidA number’s monthly fee couldn’t be taken from credits (see Monthly fee).Once.
Plan fee unpaidYour 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:

KindWhat it does
creditAdds a fixed amount of credits at once (a grant ledger row naming the coupon). The response has the new balance in credits_paise.
topup_bonusWaits 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.
ErrorWhy
404 this coupon code is not validNo such code, or it was switched off.
409 this coupon can be used from ... / 409 this coupon has expiredOutside its dates.
409 this coupon has been fully redeemedIts total number of uses is reached.
409 your workspace has already used this couponMost coupons work once per workspace.
409 a top-up bonus ... is already waitingUse the waiting bonus on a top-up first.

Other limits

LimitDefault
API requests per key120 per minute. See Rate limits.
Agents per workspaceFrom your plan.
Agent versions kept10 per agent.
Webhook endpoints20 per workspace.
Call lengthmax_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.

Esc