curl --request GET \
--url https://api.onlyx.ai/v1/conversations/{conversationId}/messages/{messageId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.onlyx.ai/v1/conversations/{conversationId}/messages/{messageId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.onlyx.ai/v1/conversations/{conversationId}/messages/{messageId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"conversationId": "cnv_3d9e7b1a5c2f4e8d6a0b",
"createdAt": "2026-09-26T10:02:11.000Z",
"delivery": {
"reason": null,
"status": "queued"
},
"direction": "out",
"id": "msg_1a2b3c4d5e6f7a8b9c0d",
"media": [
{
"id": "4012345678",
"preview": true,
"type": "photo"
},
{
"id": "4012345679",
"preview": false,
"type": "photo"
}
],
"paid": {
"priceCents": 1500,
"purchased": false,
"purchasedAt": null
},
"sender": "team",
"text": "Made this one just for you 😘",
"tipCents": null
}Get a message
Returns one message. Use it to follow a message you sent: poll every few seconds until delivery.status leaves queued. On unconfirmed, never resend automatically: the fan usually received it. A message that is not in this conversation is 404 MESSAGE_NOT_FOUND.
Scope: requires inbox:read.
Rate limit: the general limit of 120 requests per 60 seconds per credential.
curl --request GET \
--url https://api.onlyx.ai/v1/conversations/{conversationId}/messages/{messageId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.onlyx.ai/v1/conversations/{conversationId}/messages/{messageId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.onlyx.ai/v1/conversations/{conversationId}/messages/{messageId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"conversationId": "cnv_3d9e7b1a5c2f4e8d6a0b",
"createdAt": "2026-09-26T10:02:11.000Z",
"delivery": {
"reason": null,
"status": "queued"
},
"direction": "out",
"id": "msg_1a2b3c4d5e6f7a8b9c0d",
"media": [
{
"id": "4012345678",
"preview": true,
"type": "photo"
},
{
"id": "4012345679",
"preview": false,
"type": "photo"
}
],
"paid": {
"priceCents": 1500,
"purchased": false,
"purchasedAt": null
},
"sender": "team",
"text": "Made this one just for you 😘",
"tipCents": null
}Authorizations
An API key (onx_sk_…) created in OnlyX under Settings → API & MCP, or an OAuth access token (onx_at_…) issued to a connected app. Send it as Authorization: Bearer <credential>. API keys may also be sent as X-API-Key: <key>.
Path Parameters
The conversation id (cnv_…).
40The message id (msg_…).
40Response
The message, with its delivery status if it is outgoing.
The conversation it belongs to.
When the message was sent (or, for a queued send, accepted).
Delivery of an outgoing message. null for incoming messages.
Show child attributes
Show child attributes
in from the fan, out to the fan.
in, out The message id (msg_…).
Media attached to the message.
Show child attributes
Show child attributes
Set on a paid message, otherwise null.
Show child attributes
Show child attributes
Who wrote it: the fan, the AI chatter, or your team (including anything sent through the API).
fan, ai, team The message text. May be empty when the message is media only.
A tip that came with this message, in cents, or null.