Skip to main content
This documents the v1 product. It is kept for integrations already running on it. If you are building something new, start with the Quickstart.
All call endpoints are workspace-scoped — send the workspace header.
These paths are named /v2/call/… but they belong to the v1 API on api.voice-agents.miraiminds.co. See hosts, not prefixes.

Initiate a call

200 OK
This endpoint returns 200, not 201, and the body is not wrapped in { status_code, message, data }. Read callId and status off the top level.

payload by variant

custom — a flat (or nested) object whose keys match the variables you declared in variant.config.inputSchema:
abandoned_cart — the Shopify abandoned-checkout object: id, abandonedCheckoutUrl, customer, lineItems, totalPriceSet, discountCodes, shippingAddress, and so on. Pass Shopify’s payload through largely unchanged. There is no GET for a call in v1 — outcomes arrive by webhook only. If you need to read call state on demand, that is GET /v2/calls/{id} in v2.

metadata

Whatever you put here comes back on every event for that call:
Use it to join the webhook to your own records without keeping a callId table. v2 dropped metadata — correlate on call.id there.

Initiate a web call

Starts a browser-based call and returns a join token.
201 Created
Note the 201 here versus 200 on /v2/call/initiate.

Abort a call

The call ID goes in the body, not the path.
200 OK
A bare message — no status_code, no data. Allowed when the call has no status yet (initial queue) or is busy, failed, no-answer, rescheduled or validation-failed. Rejected with 400 when it is in-progress, completed, ended, timeout or already aborted. Aborting a retryable call is how you stop the whole retry chain — otherwise retryProtocol keeps dialling.

Update a queued call’s payload

Replaces the payload of a call that has not been attempted yet.
200 OK
The payload is replaced, not merged. Send the whole object.

Call statuses

Each status has a matching call.<status> webhook event.