Worked request and response samples
Copy a request as written, substitute your own ids, and compare the response envelope. Errors follow Devotel Orbit’s{ error, meta } envelope, shown under Error envelope.
Inbound message flow
An inbound message arrives on one of your channels (an SMS carrier webhook, a WhatsApp callback, an email ingest, the web-chat widget, and so on) and is folded onto one normalized shape. Every message you list or reply to below is the same object — the carrier differences are already folded out. For the webhook side of that flow — thedata.normalized block stamped on inbound message and opt-out envelopes, one kind discriminator, and the single normalized.inbound subscription that covers the whole inbound family — see Normalized inbound event envelope.
1. List conversations
GET /api/v1/conversations/2. Open one conversation
GET /api/v1/conversations/{id}GET /api/v1/conversations/{id}/messages. Each element of its data array looks like:
GET /api/v1/conversations/export?format=json&include_messages=true inlines each conversation’s full transcript in one response.
3. Post a reply
POST /api/v1/conversations/{id}/replybody and from are the usual pair; media_url works on its own when you are sending an attachment. channel optionally overrides the reply channel, and email replies can carry subject, cc, and bcc top-level.
A successful reply answers 202 Accepted with the message status set to queued — the message is accepted onto the conversation and delivery continues asynchronously, so poll GET /:id/messages or your message.delivered webhook for the final status:
4. Reply to a closed conversation
closed, archived, and snoozed conversations reject replies so a scripted caller cannot bill a send or disturb a deferred thread — reopen first with POST /api/v1/conversations/{id}/reopen. The message names the status so your client can point the operator at the next action:
422
Error envelope
Malformed input returns the standard validation envelope:422