Start a call
const url = 'https://app.mondochat.io/v1/calls';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"conversation_id":"0199d6a0-2000-7000-8000-000000000001","video":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://app.mondochat.io/v1/calls \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "conversation_id": "0199d6a0-2000-7000-8000-000000000001", "video": true }'Starts a call in a conversation and rings the other user. Takes a session token. calls.enabled, the call policy flag, safety and bans are checked. Answers 409 conflict when the caller already has an open call, and 409 busy when the callee is in a ringing or active call or was rung in the last 45 seconds. The call is ringing, a call_invite card is posted, the callee is told, and the response carries what the caller needs to join the Agora channel. See https://docs.mondochat.io/guides/calls/.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”The conversation to call in.
object
The conversation to call in.
How the callee’s client rings.
Responses
Section titled “Responses”Successful Response
What a client needs to join the call’s Agora channel.
object
The Agora app id to join with.
The call.
object
The user who is called.
The user who started the call.
The conversation the call belongs to.
The call’s id.
When the call was started.
ringing until answered, then active; missed, declined and busy end it unanswered, ended after it was answered.
How the callee’s client rings; it changes nothing else.
The Agora channel of the call.
When the token stops working.
The other participant’s uid. React only to this uid in the channel.
The Agora token for this channel and uid.
The caller’s numeric Agora uid.
Example
{ "agora_app_id": "0123456789abcdef0123456789abcdef", "call": { "callee_id": "0199d6a0-1000-7000-8000-000000000002", "caller_id": "0199d6a0-1000-7000-8000-000000000001", "conversation_id": "0199d6a0-2000-7000-8000-000000000001", "id": "0199d6a0-5000-7000-8000-000000000001", "started_at": "2026-11-01T09:30:00Z", "state": "ringing", "video": true }, "channel": "0199d6a0-5000-7000-8000-000000000001", "expires_at": "2026-11-01T13:30:00Z", "peer_uid": 1002, "rtc_token": "example-rtc-token", "uid": 1001}Problem
An RFC 9457 problem: the body of every error answer.
object
The stable error code to branch on, such as policy_denied.
What went wrong this time, when there is more to say.
For validation, one entry per invalid field.
One invalid field.
object
The path to the field.
What is wrong with it.
The path of the request.
For policy_denied and limit_reached, the rule or limit that refused the request; for forbidden, a short cause such as you_blocked; for banned, temporary when the ban expires.
The HTTP status code.
A short summary of the problem.
A URL that names the problem, https://app.mondochat.io/problems/<code>.
Example
{ "code": "policy_denied", "detail": null, "instance": "/v1/conversations/0199d6a0-2000-7000-8000-000000000001", "reason": "pins", "status": 403, "title": "Policy denied", "type": "https://app.mondochat.io/problems/policy_denied"}