Order Messages API
v1Send chat messages to the driver assigned to an order and read the conversation on the order, by Zendera order ID or by your own order number.
Every order has a chat shared with the driver assigned to it — the driver reads and answers it in the mobile app. These endpoints let your integration take part: post a message to the driver, and read the whole conversation back.
Where this fits in your operation
- Customer service relays a request: the receiver calls your service desk (“please use the back entrance”) — post it straight into the order chat so the driver sees it on the stop.
- Your systems flag a change: an ERP or webshop event that matters on the road (gate code changed, goods short-shipped) becomes a message to the driver.
- Keep a record: read the conversation into your CRM or ticket alongside the order.
Interactive API Explorer
Loading API Documentation...
Authentication
Authorization: apikey YOUR_API_KEY_HEREBase URLs
- Production:
https://app.zenderatms.com/api/ - Staging:
https://staging.zenderatms.com/api/
Identifying the order
Both endpoints take exactly one of:
orderId— the Zendera order ID, orinternalOrderNumber— your own order number, as set on import.
Sending both, or neither, returns 400. An order that doesn’t exist in your organization returns 404.
Endpoints
Send a message
POST /v1/order-messages
{
"internalOrderNumber": "ERP-001",
"text": "Please use the back entrance — the front is closed today.",
"senderUserId": 314
}| Field | Notes |
|---|---|
orderId / internalOrderNumber | Exactly one is required. |
text | Required. Leading and trailing whitespace is trimmed; an empty message returns 400. |
senderUserId | A user in your organization to attribute the message to — their name is shown as the sender in the driver app. The API accepts a message without it, but the driver app only shows messages that have a sender, so send it whenever the driver should see the message. A user who isn’t an active member of your organization returns 400. |
If a driver is assigned to the order, the driver gets a push notification about the new message.
Response:
{
"orderId": 5335569,
"message": {
"messageId": 88430,
"text": "Please use the back entrance — the front is closed today.",
"createdByUserId": 314,
"createdByUserName": "Anna Hansen",
"createdAt": "2026-10-01T09:42:17Z"
}
}Read the conversation
GET /v1/order-messages?internalOrderNumber=ERP-001
or
GET /v1/order-messages?orderId=5335569
Returns orderId and messages[], oldest first — the messages sent through this API as well as the rest of the order’s chat. Each message has the same shape as above. createdByUserId and createdByUserName are left out when the message has no sender attribution.
Common gotchas
- One identifier, not two. Send
orderIdorinternalOrderNumber, never both. - No feed. This is a per-order read — there is no endpoint that lists new messages across orders, so poll the orders you care about.
- camelCase JSON (
internalOrderNumber,senderUserId,createdAt).
Chat messages also appear among an order’s driver-recorded events as type message — see Order Documentations.
Related documentation
- Order Documentations — every event recorded on an order, including chat messages
- Orders — per-order operations