Overview
Every call toPOST /api/messages creates a message document in Tuco. This
page describes the shape of that document, the lifecycle it moves through, and
how delivery works under the hood.
Messages sent via API appear in Unibox alongside manually sent and incoming
messages. Same recipient = same thread.
Message object
Unique message ID (MongoDB ObjectId)
Body text
"imessage" | "sms" | "email". Defaults to "imessage" when omitted from the API.Current lifecycle state. See Status lifecycle below.
Line used to send
Denormalized phone from the line
Denormalized email from the line
Recipient phone number
Recipient email address
Display name
Linked lead (if any)
Clerk organization ID
Clerk user ID who created the message
Scheduling & settings fields
Scheduling & settings fields
Delivery tracking fields
Delivery tracking fields
Error & fallback fields
Error & fallback fields
Integration fields
Integration fields
Creation timestamp
Last update timestamp
Status lifecycle
Pre-send checks (why a message stays queued)
These checks run before a message is sent. None of them cause an API error — the message is accepted and waits.You can check why a message is still queued by looking at your Loki/Grafana
logs for events like
individual.message.validation_failed,
message.queued_limit, individual.message.device_gap_not_met,
or individual.message.gap_not_met.Retries
The “app sync fallback” path only runs when the BullMQ queue is unreachable
(e.g. Redis down). In normal operation, the worker handles all sends.
Replying via API
There is no special “reply” endpoint. To reply to a conversation, send another message to the same recipient usingPOST /api/messages. Unibox groups
messages by recipient, so the new message appears in the existing thread.