Sends a reply to the guest as the host.
Replying marks the conversation read. A host who has answered has by definition read what they were answering, so there is no separate mark-as-read call: after a successful reply, unreadMessages on that conversation is 0.
Hosts reply to conversations a guest started. Starting one is not something this API does.
POST /v2/messaging/conversations/{conversationId}/messages
Content-Type: application/json
{ "body": "On its way — thanks for your patience." }
Request
ConversationId (Route Param) - The conversation the message belongs to
| Field | Type | Description |
|---|---|---|
body | string | Required. The text of the reply. It cannot be empty |
The reply is addressed to the conversation. It arrives in the thread as a Conversation message sent by the host, and Plum delivers it to the guest the same way a reply typed into the Plum inbox is delivered — you do not send the notification yourself
To send files with the reply, use the attachments route described in Attachments instead. A reply sent this way carries text only.
Response
messageId is the id of the message that was created. Read it back on List Messages, where it will now be the first entry.
| Status | When it happens |
|---|---|
200 | The conversation belongs to this host. A thread with nothing readable left is an empty data array with a total of 0, not an error |
400 | The token carries no usable user id |
401 | The Authorization header is missing, malformed or expired |
404 | No conversation with that id belongs to the authenticated host |
5xx | A transient failure reaching the messaging back end. Safe to retry, because this endpoint only reads |
Sending is not idempotent. There is no request key to deduplicate on, so a retry of a call that actually succeeded sends the guest a second message. After a 5xx or a timeout, read the thread back and check whether your reply is already there before trying again.
