Messaging
Send, receive, and follow customer conversations across connected channels. For outbound messaging, choose an inbox, optionally upload media, send a message, then poll the message resource for delivery state when you are not using webhooks.
11 generated endpoints in this resource group.
Send flow
- Choose the sender inbox with GET /inboxes.
- Upload media first with POST /media/uploads when sending a file.
- Send POST /messages with a recipient and one concrete content variant.
- Poll GET /messages/{id} or conversation messages to follow delivery.
/messagesSend a message#
Starts or continues a customer conversation by recipient. Choose an inbox first with `GET /inboxes`, optionally prepare WhatsApp template or media content, then send with a recipient that points to an existing conversation, a known contact, or a channel recipient. The response uses `202 Accepted`; poll `GET /messages/{id}` or the conversation messages endpoint to follow delivery state without webhooks.
Authorization
Scheme
- bearerAuth
Required scopes
- message:create
Allowed roles
- owner
- admin
- agent
Send an outbound message in an authorized conversation context.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
recipient- Type
- MessageRecipient
- Description
- Required request attribute.
- Name
content- Type
- MessageContent
- Description
- Required request attribute.
Optional attributes
- Name
inboxId- Type
- string
- Description
- Sender inbox ID. Required for first-message sends to a channel recipient.
Responses
- Name
202- Type
- application/json
- Description
- Message accepted for delivery
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- CreateMessageRequest
- MessageRecipient
- ConversationRecipient
- ContactRecipient
- MessageRecipientChannel
- ChannelRecipient
- MessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- SendMessageResponse
- Message
- Reaction
- Conversation
Request
curl -X POST "https://api.flownally.com/v1/messages" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"recipient": {
"type": "channel",
"externalId": "+48123456789",
"channel": "whatsapp"
},
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
}
}'Response
{
"message": {
"id": "msg_01HV8Z2G8Z3H5M9K2S6A1N0P4",
"createdAt": "2026-04-30T10:36:00Z",
"updatedAt": "2026-04-30T10:36:00Z",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"conversationId": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"senderType": "user",
"senderId": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"content": {
"type": "template",
"template": {
"name": "order_ready",
"language": "en"
}
},
"deliveryStatus": "pending"
},
"conversation": {
"id": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"externalId": "48123456789",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"name": "Anna Kowalska",
"contactId": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"contactName": "Anna Kowalska",
"lastMessageAt": "2026-04-30T10:36:00Z",
"lastMessagePreview": "order_ready",
"lastMessageSender": "user"
}
}/messages/{id}Get message#
Returns delivery state and conversation context for polling integrations.
Authorization
Scheme
- bearerAuth
Required scopes
- conversation:read
Allowed roles
- owner
- admin
- agent
Read a message through its conversation context.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
200- Type
- application/json
- Description
- Message
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- MessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- Message
- Reaction
- Conversation
- GetMessageResponse
Request
curl -X GET "https://api.flownally.com/v1/messages/{id}" \
-H "Authorization: Bearer {token}"Response
{
"message": {
"id": "msg_01HV8Z2G8Z3H5M9K2S6A1N0P4",
"createdAt": "2026-04-30T10:36:00Z",
"updatedAt": "2026-04-30T10:36:02Z",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"conversationId": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"senderType": "user",
"senderId": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"deliveryStatus": "delivered",
"channelMessageId": "wamid.HBgLMjQxMjM0NTY3ODkVAgARGBI"
},
"conversation": {
"id": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"externalId": "48123456789",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"name": "Anna Kowalska",
"contactId": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"contactName": "Anna Kowalska",
"lastMessageAt": "2026-04-30T10:35:00Z",
"lastMessagePreview": "Thanks, I will check it now.",
"lastMessageSender": "customer"
}
}/media/uploadsUpload message media#
Uploads a file and returns a `mediaId` handle for later message sends. Pass the handle as `content.media.mediaId` when sending media content. Use the same Idempotency-Key when retrying the same upload request.
Authorization
Scheme
- bearerAuth
Required scopes
- message:create
Allowed roles
- owner
- admin
- agent
Upload media for a future message send.
Request body
Send a multipart/form-data body. The body is required for this operation.
Required attributes
- Name
file- Type
- string
- Description
- Image, document, video, or audio file to make available for message sending.
Responses
- Name
201- Type
- application/json
- Description
- Media uploaded
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/media/uploads" \
-H "Authorization: Bearer {token}" \
-F "file=@invoice.pdf"Response
{
"mediaId": "mda_01HV8Z6K9D2R4S7T8P5N3Q1M0",
"mediaType": "document",
"mimeType": "application/pdf",
"filename": "invoice-4827.pdf",
"fileSize": 184201,
"url": "/media/tn_01HV8Z6K9D2R4S7T8P5N3Q1M0/uploads/mda_01HV8Z6K9D2R4S7T8P5N3Q1M0"
}/conversationsList conversations#
Returns conversations visible to the authenticated user. Use this before polling message history or assigning work to a teammate.
Authorization
Scheme
- bearerAuth
Required scopes
- conversation:list
Allowed roles
- owner
- admin
- agent
List conversations in the caller's conversation scope.
Optional parameters
- Name
pageSize- Type
- query integer
- Description
- Optional parameter.
- Name
pageToken- Type
- query string
- Description
- Optional parameter.
- Name
interacted- Type
- query boolean
- Description
- Optional parameter.
- Name
status- Type
- query array<enum>
- Description
- Optional parameter.
- Name
sort- Type
- query enum
- Description
- Optional parameter.
Responses
- Name
200- Type
- application/json
- Description
- List of conversations
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -G "https://api.flownally.com/v1/conversations" \
-H "Authorization: Bearer {token}" \
-d pageSize="{pageSize}" \
-d pageToken="{pageToken}" \
-d interacted="{interacted}" \
-d status="{status}" \
-d sort="{sort}"Response
{
"conversations": [
{
"id": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"externalId": "48123456789",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"name": "Anna Kowalska",
"contactId": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"contactName": "Anna Kowalska",
"lastMessageAt": "2026-04-30T10:35:00Z",
"lastMessagePreview": "Thanks, I will check it now.",
"lastMessageSender": "customer"
}
],
"nextPageToken": "string"
}/conversations/{id}Get conversation#
Returns the current conversation context, including the sendability window that tells whether an agent or bot can reply right now.
Authorization
Scheme
- bearerAuth
Required scopes
- conversation:read
Allowed roles
- owner
- admin
- agent
Read a conversation in the caller's conversation scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
200- Type
- application/json
- Description
- Conversation details
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X GET "https://api.flownally.com/v1/conversations/{id}" \
-H "Authorization: Bearer {token}"Response
{}/conversations/{id}/messagesList conversation messages#
Returns the message history for a conversation, newest-page token included when more messages are available.
Authorization
Scheme
- bearerAuth
Required scopes
- conversation:read
Allowed roles
- owner
- admin
- agent
List messages for a conversation in scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Optional parameters
- Name
pageSize- Type
- query integer
- Description
- Optional parameter.
- Name
pageToken- Type
- query string
- Description
- Optional parameter.
Responses
- Name
200- Type
- application/json
- Description
- List of messages
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- MessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- Message
- Reaction
- ListMessagesResponse
Request
curl -G "https://api.flownally.com/v1/conversations/{id}/messages" \
-H "Authorization: Bearer {token}" \
-d pageSize="{pageSize}" \
-d pageToken="{pageToken}"Response
{
"messages": [
{
"id": "msg_01HV8Z2G8Z3H5M9K2S6A1N0P4",
"createdAt": "2026-04-30T10:36:00Z",
"updatedAt": "2026-04-30T10:36:02Z",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"conversationId": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"senderType": "user",
"senderId": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"content": {
"type": "text",
"text": {
"body": "Hi Anna, your order is ready for pickup."
}
},
"deliveryStatus": "delivered",
"channelMessageId": "wamid.HBgLMjQxMjM0NTY3ODkVAgARGBI"
}
],
"nextPageToken": "string"
}/conversations/{id}/messagesSend message in a conversation#
Sends a reply in an existing conversation. Pass `inboxId` when you want to choose the sender explicitly; otherwise Flownally uses the latest open session for that conversation. The response is returned as soon as the message is accepted, so poll the message resource to follow delivery state when you are not using webhooks.
Authorization
Scheme
- bearerAuth
Required scopes
- message:create
Allowed roles
- owner
- admin
- agent
Send a message in a conversation in scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
content- Type
- MessageContent
- Description
- Required request attribute.
Optional attributes
- Name
inboxId- Type
- string
- Description
- Sender inbox ID. Required for first-message sends to a channel recipient.
Responses
- Name
202- Type
- application/json
- Description
- Message accepted for delivery
- Name
default- Type
- application/json
- Description
- Error
Related schemas
- ProblemDetails
- FieldViolation
- Window
- MessageContent
- TextMessageContent
- TextContent
- MessageContent
- Content
- TemplateMessageContent
- WhatsAppTemplateContent
- TemplateComponent
- TemplateParameter
- Parameter
- CurrencyParameter
- DateTimeParameter
- RichMessageContent
- RichMessage
- Card
- CardHeader
- CardBody
- CardFooter
- CardAction
- SendMessageResponse
- Message
- Reaction
- Conversation
- SendMessageRequest
Request
curl -X POST "https://api.flownally.com/v1/conversations/{id}/messages" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"content": {
"type": "text",
"text": {
"body": "Thanks for reaching out. I am checking this now."
}
}
}'Response
{
"message": {
"id": "msg_01HV8Z2G8Z3H5M9K2S6A1N0P4",
"createdAt": "2026-04-30T10:36:00Z",
"updatedAt": "2026-04-30T10:36:00Z",
"tenantId": "tn_01HV8Y1N3QPY9X2HBQ1M9E8D0",
"conversationId": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"senderType": "user",
"senderId": "usr_01HV8Y3K2R6G7K3F5B9N8M1Q0",
"content": {
"type": "template",
"template": {
"name": "order_ready",
"language": "en"
}
},
"deliveryStatus": "pending"
},
"conversation": {
"id": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"externalId": "48123456789",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"name": "Anna Kowalska",
"contactId": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"contactName": "Anna Kowalska",
"lastMessageAt": "2026-04-30T10:36:00Z",
"lastMessagePreview": "order_ready",
"lastMessageSender": "user"
}
}/messages/{id}/reactionsAdd or remove a reaction on a message#
Authorization
Scheme
- bearerAuth
Required scopes
- message:create
Allowed roles
- owner
- admin
- agent
Add or remove a reaction in an authorized conversation context.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
emoji- Type
- string
- Description
- Required request attribute.
Optional attributes
- Name
removed- Type
- boolean
- Description
- Optional request attribute.
Responses
- Name
200- Type
- application/json
- Description
- Reaction sent
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/messages/{id}/reactions" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"emoji": "string",
"removed": true
}'Response
{
"reaction": {
"id": "string",
"messageId": "string",
"senderType": "string",
"senderId": "string",
"emoji": "string",
"createdAt": "2026-04-27T00:00:00.000Z"
}
}/conversations/{id}/reassignReassign conversation#
Reassigns a conversation to a different user
Authorization
Scheme
- bearerAuth
Required scopes
- conversation:assign
Allowed roles
- owner
- admin
- agent
Reassign a conversation in scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
userId- Type
- string
- Description
- Required request attribute.
Responses
- Name
204- Description
- Conversation reassigned
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/conversations/{id}/reassign" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"userId": "string"
}'Response
204 Conversation reassigned/conversations/{id}/readMark conversation as read#
Marks messages up to the specified message as read for the authenticated user
Authorization
Scheme
- bearerAuth
Required scopes
- conversation:read
Allowed roles
- owner
- admin
- agent
Mark a conversation in scope as read.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Request body
Send a application/json body. The body is required for this operation.
Required attributes
- Name
lastMessageId- Type
- string
- Description
- Required request attribute.
Responses
- Name
200- Type
- application/json
- Description
- Conversation marked as read
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/conversations/{id}/read" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"lastMessageId": "string"
}'Response
{
"id": "cnv_01HV8Y7YF5J4Y7M9M7T3H3X2A1",
"channel": "whatsapp",
"externalId": "48123456789",
"inboxId": "ibx_01HV8Y4QH7C8H1K5K0C8A2B9E4",
"name": "Anna Kowalska",
"contactId": "con_01HV8Y5R5RFMS0TFK6PKF9H2S8",
"contactName": "Anna Kowalska",
"lastMessageAt": "2026-04-30T10:35:00Z",
"lastMessagePreview": "Thanks, I will check it now.",
"lastMessageSender": "customer"
}/conversations/{id}/closeClose conversation#
Closes the active session for the conversation
Authorization
Scheme
- bearerAuth
Required scopes
- conversation:close
Allowed roles
- owner
- admin
- agent
Close a conversation in scope.
Required parameters
- Name
id- Type
- path string
- Description
- Required parameter.
Responses
- Name
200- Description
- Conversation closed
- Name
default- Type
- application/json
- Description
- Error
Related schemas
Request
curl -X POST "https://api.flownally.com/v1/conversations/{id}/close" \
-H "Authorization: Bearer {token}"Response
200 Conversation closed