Skip to main content
Build with agents, calls, campaigns, your do-not-call list, and tools using one workspace API key.

Quickstart

Create a key, an agent, a call and a webhook in five minutes. Start here.

Agents

The reusable configuration a call runs. Reference.

Tools

Connect your APIs before, during, and after calls, with synchronous or background execution. Guide.

Calls

Place, inspect and abort outbound calls; read transcripts and recordings. Reference.

Campaigns

Dial a whole list with calling windows, retries, budgets and reports. Reference.

Do-not-call

Your suppression list. We check it at dial time. Reference.

Webhooks

Signed lifecycle events. Guide.

Live events

Show any call while it runs, phone calls included. Guide.

Realtime API

Point an OpenAI Realtime client, such as Pipecat, at Mirai and keep your pipeline. Guide.

API reference

Every endpoint, with examples you can send from the page and a Postman collection. Reference.

Authentication

Every request carries one header:
A secret key is sk_live_ followed by 32 hex characters. It is scoped to one workspace. A key created after your company goes live carries your plan’s tier: T5 (pay as you go) unless you have committed to T3 or T1. You create, rotate and revoke keys yourself in the console under Developers. If you run many brands as sub-workspaces, the same key also reaches each of them: add a Mirai-Workspace header with the brand’s sub-workspace id or your external_id for it. We store only the SHA-256 of your key, so we cannot recover a lost key. Rotate it instead. Never ship a secret key to a browser or a mobile app.

Conventions

JSON only. Send Content-Type: application/json on every request with a body. Responses are always JSON, including errors. IDs are minted by the server and prefixed by resource type. Treat them as opaque strings and don’t parse them. Errors normally use the envelope below. Tool validation returns a list of field errors. See the full error reference.
Timestamps are RFC 3339 in UTC: 2026-07-26T09:14:02Z. Money is in INR. cost.amount_inr, balance_inr and amount_inr are numbers, not strings. The one exception is campaigns, whose budget_paise and spent_paise are integer paise (100 paise = ₹1). No object mixes the two units. Phone numbers are E.164 with the leading +: +919876543210.

Pagination

List endpoints take limit and cursor and return a cursor-paginated envelope.
Pass next_cursor back as cursor to get the following page. Stop when has_more is false. Default limit is 20, maximum 100. The cursor is an opaque string. Send it back exactly as you received it, and don’t build or decode one yourself; its shape can change between releases. Lists are newest first by created_at. A call list shows inbound and outbound calls together in that order.

Idempotency

POST /v2/calls accepts an Idempotency-Key header. If you reuse a key, you get the original response back instead of a second phone call. We hold keys for 24 hours.
Derive the key from your own domain object, such as an order ID or a job ID, instead of generating a random UUID for each attempt. That way a retry sends the same key. See Calls.

Incoming calls and phone numbers

To receive inbound calls, buy a dedicated number through Mirai from Phone numbers → Add a number, or connect your own supported telco number. Then assign a published agent and activate incoming calls. Buying through Mirai does not require your own Plivo account. BYO currently supports Plivo; both options support Indian +91 numbers. The purchase flow shows available rentals, business verification requirements, and renewal terms. Follow the inbound calling cookbook for console and API setup.

Not built yet

These are the known gaps, so you can check them before you start building:
  • Knowledge base / RAG. For function calling, use v2 tools.
  • Wallet top-up over the API. Add credit from the Billing page of the console instead.
  • OAuth or user-scoped tokens. Secret keys only.
If one of these blocks you, tell us. Several are on the roadmap, and the order is not fixed.