Skip to content
Discord

FAQ

How do I get a key? Email sneh@miraiminds.co with your company and use case. Keys are ops-issued during the pilot; self-serve signup is coming. You get a secret key, a webhook secret, and a starting wallet balance.

Is there a sandbox or test key? Not yet. There is no sk_test_ and no simulated call — every call is a real call and costs real money. Test against your own phone with a small wallet balance. The webhook test vector lets you build and verify your handler without placing a call at all.

Is there an SDK? No. The API is small enough that fetch and httpx are the SDK. Every page here carries copy-pasteable cURL, Python and Node.

Can I use v1 and v2 at the same time? Yes. Different hosts, different credentials, same workspace. Most people move calls to v2 and leave numbers, knowledge base and tools on v1. See Migrating from v1.

Why did POST /v2/calls return 202 and not 200? Because the phone has not rung yet. 202 means queued. The outcome arrives by webhook, or from GET /v2/calls/{id}.

How long until the phone rings? Normally a couple of seconds from 202. If you are at your concurrency ceiling the call sits in queued until a slot frees — it is queued, not rejected, so being over the ceiling never returns 429.

Can I do inbound calls? Not in v2. Inbound assistants live in v1.

Can I transfer a call to a human? Not on t1. Human handoff is a t3 feature and is not live yet.

Can I change the prompt or variables mid-call? No. variables are static per call. v1 had PUT /v2/call/{callId} for editing a queued call’s payload; v2 has no equivalent — create the call with what you want it to say.

Can I get the recording or transcript? Not through the v2 API. Recordings are retained 30 days; ask ops if you need access. If your use case requires that we do not record, tell us up front.

What happens if the customer does not answer? status: no_answer, a call.failed webhook, and no charge. v2 does not retry for you — retry from your own dialler if you want to.

One caveat: when the carrier gives us no verdict at all, an unanswered call is reported as failed with ended_reason: "no-media" instead. Both are free, and both mean “did not connect” — so treat no_answer, busy and failed + no-media as one bucket in retry logic. See ended reasons.

How do I stop a call I just started? POST /v2/calls/{id}/abort. It works while the call is queued, while it is ringing, and while it is live — a live call is hung up mid-conversation. Only a call that has already ended returns 409. Aborted calls are never billed.

Which languages work? Hindi and Indian English are what the stack is tuned for, including Hindi-English code-switching, which is how most real calls actually sound. Write the prompt in the language you want spoken — Devanagari for Hindi. Other languages: ask before you build on them.

Does the agent sound like a human? It sounds like a good phone voice. Callers usually work out it is a machine within a turn or two, which is why telling them up front costs you nothing and drops early hang-ups.

What does a call cost? ₹1 per minute on t1, rounded up to whole minutes, minimum one minute. A 96-second call costs ₹2. See Billing & tiers.

Am I charged for calls that do not connect? No. no_answer, busy, failed and aborted are free. completed, voicemail and timeout are billed.

Am I charged for a voicemail? Yes — media went live and audio was generated. An 18-second voicemail costs one minute.

What happens when I run out of credit? POST /v2/calls returns 402 insufficient_balance and nothing is dialled. Calls already in flight finish normally.

How do I top up? Email ops. Self-serve top-up is not built yet. Credits land as a credit row in GET /v2/wallet/transactions and take effect immediately.

When are t3 and t5 available? They are documented but not live. Requesting them returns 501 tier_unavailable. See the feature matrix for what they will include.

My signature never verifies. Why? Almost always because you signed a re-serialised body. Sign the raw bytes. See raw body. Second most common: the signed string is "<t>.<raw_body>" — the timestamp and the dot are part of it, not just the body.

Do you retry failed deliveries? Yes — six attempts with exponential backoff over roughly 36 minutes, then dead-letter. Any 2xx stops it. See retries.

Can events arrive out of order or twice? Yes to both. Dedupe on event.id and order your state machine by data.call.status, not by arrival time.

Can I have more than one webhook URL? One per call, set as webhook_url at create time. Fan out on your side.

What if my endpoint is down for an hour? The event lands in the dead-letter queue after ~36 minutes of retries. Ops can replay it. You can also reconcile from GET /v2/calls — that is what the list endpoint is for.

How many concurrent calls can I run? Pilot default is 5. It is a provisioning setting, not a code change — ask for more. See Limits.

Do you enforce the 9am–9pm calling window? No. Your scheduler does. We dial when you tell us to dial. See India calling rules.

Do you scrub DND numbers? No. That is your list and your obligation.

Do I have to tell people it is an AI? We strongly recommend it, and it belongs in first_message. Your legal obligations are your own to confirm.

What is your uptime target? The API and the call path are operated as a pilot service. Ask your account contact for the current SLA before you put a revenue-critical flow behind it.

Where does my data go? Media (audio, ASR, TTS, the model) runs in India. The control plane — workflow orchestration and the API — runs in Europe, off the audio path, so it adds no latency to what the caller hears.

Something is broken. What do you need from me? The call_id (or evt_id), the UTC timestamp, and what you expected. That is enough to pull the whole workflow history.