Send a message
const url = 'https://app.mondochat.io/v1/conversations/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/messages';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"client_msg_id":"c1f0a5e2-7d2b-4d57-9a53-0a6f5b6f1d10","kind":"text","text":"Hi Bob"}'};
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/conversations/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/messages \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "client_msg_id": "c1f0a5e2-7d2b-4d57-9a53-0a6f5b6f1d10", "kind": "text", "text": "Hi Bob" }'Sends a text message, or a photo that is already uploaded, as the caller. Takes a session token. Answers 201, or 200 with the stored message when the caller already used that client_msg_id in the conversation. Policy, safety, bans and the limits apply; text longer than chat.text_max_length answers 422. When the peer blocked the caller the message succeeds for the caller and is not delivered, unless chat.refuse_blocked_send is on, which answers 403 forbidden with reason undelivered and stores nothing. Cards cannot be sent here. See https://docs.mondochat.io/guides/messages/.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”A message to send.
object
An id you choose. Sending it again returns the stored message with 200.
Stored as you send it; marks the message as forwarded.
text or photo; cards cannot be sent here.
Responses
Section titled “Responses”Already exists
A message in a conversation, as the viewer sees it.
object
True for an away reply the server sent for its sender.
The conversation it belongs to.
When it was sent.
True when the sender deleted it for everyone. It has no text, caption, photo, card or quote.
True for the viewer’s own message once the peer received or read it, never for a silently dropped one.
True when the sender marked it forwarded, or it came from the forward route.
The message’s id.
text, photo, video, voice, system or card.
True for view-once media: it carries no links and no caption for anyone, and its recipient opens it through the open route.
A photo, video, voice note or avatar and the links to read it.
object
The media’s id.
What the media is.
pending until the upload is completed, held while it waits for the receiver’s consent or for moderation, rejected or deleted once it is gone.
The id of the user who uploaded it.
One entry per emoji in the order they were set; none on a deleted or redacted message.
One emoji on a message and how many users set it.
object
How many users reacted with it.
The emoji.
True when the viewer’s own reaction is this emoji.
True for the viewer’s own message once the peer read it; false while either participant has read_receipts off.
True when a moderator removed the content.
The message a message quotes.
The message’s place in its conversation’s sync order. Keep the copy with the higher seq.
held and rejected come from moderation or photo consent, and undelivered is a message dropped silently because the peer blocked the sender.
Example
{ "client_msg_id": "c1f0a5e2-7d2b-4d57-9a53-0a6f5b6f1d10", "conversation_id": "0199d6a0-2000-7000-8000-000000000001", "created_at": "2026-11-01T09:30:00Z", "delivered_to_peer": true, "id": "0199d6a0-3000-7000-8000-000000000001", "kind": "text", "reactions": [ { "count": 1, "emoji": "👍", "mine": false } ], "read_by_peer": false, "redacted": false, "sender_id": "0199d6a0-1000-7000-8000-000000000001", "seq": 12, "status": "sent", "text": "Hi Bob"}Successful Response
A message in a conversation, as the viewer sees it.
object
True for an away reply the server sent for its sender.
The conversation it belongs to.
When it was sent.
True when the sender deleted it for everyone. It has no text, caption, photo, card or quote.
True for the viewer’s own message once the peer received or read it, never for a silently dropped one.
True when the sender marked it forwarded, or it came from the forward route.
The message’s id.
text, photo, video, voice, system or card.
True for view-once media: it carries no links and no caption for anyone, and its recipient opens it through the open route.
A photo, video, voice note or avatar and the links to read it.
object
The media’s id.
What the media is.
pending until the upload is completed, held while it waits for the receiver’s consent or for moderation, rejected or deleted once it is gone.
The id of the user who uploaded it.
One entry per emoji in the order they were set; none on a deleted or redacted message.
One emoji on a message and how many users set it.
object
How many users reacted with it.
The emoji.
True when the viewer’s own reaction is this emoji.
True for the viewer’s own message once the peer read it; false while either participant has read_receipts off.
True when a moderator removed the content.
The message a message quotes.
The message’s place in its conversation’s sync order. Keep the copy with the higher seq.
held and rejected come from moderation or photo consent, and undelivered is a message dropped silently because the peer blocked the sender.
Example
{ "client_msg_id": "c1f0a5e2-7d2b-4d57-9a53-0a6f5b6f1d10", "conversation_id": "0199d6a0-2000-7000-8000-000000000001", "created_at": "2026-11-01T09:30:00Z", "delivered_to_peer": true, "id": "0199d6a0-3000-7000-8000-000000000001", "kind": "text", "reactions": [ { "count": 1, "emoji": "👍", "mine": false } ], "read_by_peer": false, "redacted": false, "sender_id": "0199d6a0-1000-7000-8000-000000000001", "seq": 12, "status": "sent", "text": "Hi Bob"}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"}