Messages
A message is one entry in a ticket’s conversation: something the customer wrote, or a reply from your team. You read a
ticket’s messages to understand what the customer needs, or to collect your team’s replies for your own system, and you
send replies through POST /openapi/message/send. Replies are the messages with isFromCompany set to true.
Fields that matter
Section titled “Fields that matter”| Field | Meaning |
|---|---|
id |
The message’s id. Pass it as messageId to download its attachments; see Attachments. |
text |
The message as plain text. |
messageDate |
When the message was written or received. |
isFromCompany |
true for your team’s replies, false for the customer’s messages. |
status |
Where an outgoing message is in sending; see States. |
userId |
The user who wrote a reply. |
attachmentUrls |
The message’s attachments, as stored. Use the attachment operations to download them. |
autoresponseId, autoresponseName |
Set when an autoresponder sent the message. |
templateId, templateName |
Set when the reply was written from a template. |
translatedText, translatedTo |
The latest translation of the message and its language, when it has one. |
States
Section titled “States”status matters for the messages your team sends.
| State | Meaning |
|---|---|
1 (in progress) |
Saved and waiting to be sent. A reply sent through the API starts here. |
4 (delayed) |
Scheduled: it waits until sendingDate. |
0 (sent) |
Sent successfully. |
2 (failed) |
Sending failed; failMessage says why. |
3 (cancelled) |
Will not be sent, for example an autoresponder reply cancelled because your team answered. |
Listing and filtering
Section titled “Listing and filtering”GET /openapi/message/pagedthreadmessages/{threadId} returns one page of a ticket’s messages, ordered by messageDate.
| Parameter | What it does | Default | Limits |
|---|---|---|---|
asc |
false newest first, true oldest first. |
false |
— |
page |
The page to return, from 1. | 1 | Stop at pagesCount. |
count |
Messages per page. | 10 | — |
curl "https://open-api.replyco.com/openapi/message/pagedthreadmessages/7e9a1b3c-5d2f-4e6a-8b0c-1d2e3f4a5b6c?count=50" \ -H "Authorization: Bearer $ACCESS_TOKEN"{ "totalRecords": 2, "pageSize": 50, "pagesCount": 1, "currentPage": 1, "data": [ { "id": "2c4e6a8b-0d1f-4a3c-9e5b-7d9f1b3d5f7a", "text": "Thanks, the refund has been started. You will see it within five working days.", "messageDate": "2026-10-20T14:05:00Z", "isFromCompany": true, "userId": "6f1c0a2e-9d2b-4c1e-8a7f-2b3c4d5e6f70", "isDelayed": false, "totalRecords": 2 }, { "id": "9a4e1c7b-2d3f-4b8a-8e6c-1f0a2b3c4d5e", "text": "My parcel arrived damaged. Can I get a refund?", "messageDate": "2026-10-20T09:12:00Z", "isFromCompany": false, "isDelayed": false, "totalRecords": 2 } ]}A ticket id that matches no ticket gives an empty page. GET /openapi/message/threadmessages/{threadId} returns every
message of the ticket in one list, with the full message including htmlBody. That list has no set order; use the
paged operation when you need the messages by date.
Sending a reply
Section titled “Sending a reply”POST /openapi/message/send adds your team’s reply to a ticket. On a channel Replyco connects to, such as email or a
marketplace, Replyco sends it to the customer; on a custom integration your system collects it (see
Connect your own system). The reply is sent as the user your token belongs to, from the ticket’s own account, so you do not need to send
accountId. You can reply to any ticket that has at least one message.
curl -X POST https://open-api.replyco.com/openapi/message/send \ -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \ -d '{"threadId": "7e9a1b3c-5d2f-4e6a-8b0c-1d2e3f4a5b6c", "htmlBody": "<p>Your refund has been started.</p>", "text": "Your refund has been started.", "closeAfterSend": true}'{ "threadId": "7e9a1b3c-5d2f-4e6a-8b0c-1d2e3f4a5b6c", "htmlBody": "<p>Your refund has been started.</p>", "text": "Your refund has been started.", "closeAfterSend": true}| Field | What it does |
|---|---|
htmlBody |
The reply as HTML. |
text |
The reply as plain text. Tickets from eBay take plain text only: put the reply in text, at most 4000 characters. An eBay reply with htmlBody and no text is rejected with 400. |
attachments |
Files to send. Each needs a fileName with its extension, and either data (the file, base64-encoded) or url (a file Replyco already stores). |
isDelayed, sendingDate |
Schedule the reply for sendingDate instead of sending it now. |
closeAfterSend |
Resolve the ticket once the reply is saved. |
archiveAfterSend |
Archive the ticket once the reply is saved. |
Attachment limits depend on the ticket’s channel. A file over a limit, of a type the channel does not take, or without a
file name is rejected with 400, and the error field names the problem:
| Channel | File types | Per file | Per message | Files |
|---|---|---|---|---|
| eBay | jpg, jpeg, png, gif, bmp, tif, tiff (pdf only when the file converter is on for your user) | 12 MB | — | 5 |
| eBay REST | any type except executables | 10 MB | 25 MB | 5 |
| Amazon | any type except executables | 10 MB | 6 MB | — |
| Cdiscount | any type except executables | 10 MB | 4 MB | 3 |
| every other channel | any type except executables | 10 MB | 25 MB | — |
eBay also rejects an image whose width plus height is more than 12,000 pixels. Size limits apply to files sent as
data.
Sending a reply also takes the ticket out of snooze and cancels autoresponder replies on the ticket that are still in progress. When your company assigns tickets on reply and nobody is assigned, the ticket is assigned to the sending user. Each call adds a new message, so do not retry a send that succeeded.
Operations
Section titled “Operations”| Method | Path | Summary | Scopes |
|---|---|---|---|
| GET | /openapi/message/pagedthreadmessages/{threadId} |
Get paginated messages for a specific thread | — |
| POST | /openapi/message/send |
Send a new message to a thread | — |
| GET | /openapi/message/threadmessages/{threadId} |
Get all messages for a specific thread | — |
Errors
Section titled “Errors”| Status | Meaning | Returned by |
|---|---|---|
| 400 | Invalid pagination parameters; Invalid request - missing required fields, invalid thread, or an attachment that is too large, of a file type the integration does not accept, or missing its file name. The response body carries the reason in its ‘error’ field | GET /openapi/message/pagedthreadmessages/{threadId}, POST /openapi/message/send |
| 401 | User is not authenticated or authorized | GET /openapi/message/pagedthreadmessages/{threadId}, POST /openapi/message/send, GET /openapi/message/threadmessages/{threadId} |
| 403 | User does not have access to this thread; User does not have permission to send messages to this thread | GET /openapi/message/pagedthreadmessages/{threadId}, POST /openapi/message/send, GET /openapi/message/threadmessages/{threadId} |
| 404 | Thread with the specified ID was not found | GET /openapi/message/pagedthreadmessages/{threadId}, POST /openapi/message/send, GET /openapi/message/threadmessages/{threadId} |
- List operations return 10 items per page unless you send count; send the page size you need instead of paging through small pages.
Related
Section titled “Related”- Answer tickets from your own system: read a ticket and reply, or leave a draft.
- Connect your own system: collect your team’s replies for your customers.
- Attachments: download the files a message carries.
- Tickets: the tickets messages belong to.
- API reference:
CreateThreadMessageDTO,MessagePreviewModelandMessageModel.