Post a message
Posts a message into a conversation you are in, as yourself. A bot run naming its bot in X-Fluid-Bot-Id posts as the bot instead, only into the conversation its run was started in and while the run is open, under its rules: the daily reply limit, approval, and a notice when a reply is withheld. A bot must send an Idempotency-Key, may send cards, and threads its reply where it was woken. Send an Idempotency-Key to make a retry answer the first post with 200. Needs messaging.update.
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "Your latest order shipped this morning."
}
'import requests
url = "https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages"
payload = { "text": "Your latest order shipped this morning." }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({text: 'Your latest order shipped this morning.'})
};
fetch('https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'text' => 'Your latest order shipped this morning.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages"
payload := strings.NewReader("{\n \"text\": \"Your latest order shipped this morning.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Your latest order shipped this morning.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"text\": \"Your latest order shipped this morning.\"\n}"
response = http.request(request)
puts response.read_body{
"message": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a93",
"conversation_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a92",
"sender": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a94",
"name": "Patrick Reeves",
"kind": "person"
},
"body": "Your latest order shipped this morning.",
"blocks": [],
"reply_to_id": null,
"run_id": null,
"created_at": "2026-11-09T09:31:00Z"
},
"status": 200,
"meta": {
"request_uuid": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a90",
"timestamp": "2026-11-09T09:31:00Z"
}
}{
"message": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a93",
"conversation_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a92",
"sender": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a95",
"name": "Order Helper",
"kind": "bot"
},
"body": "Your latest order shipped this morning.",
"blocks": [],
"reply_to_id": null,
"run_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a96",
"created_at": "2026-11-09T09:31:00Z"
},
"status": 201,
"meta": {
"request_uuid": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a90",
"timestamp": "2026-11-09T09:31:00Z"
}
}{}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
The session token of an admin of your company.
Headers
A bot you own or steward, or one whose run is acting for you (a mention run acts for whoever mentioned the bot), to act as it while that run is open. Opening a conversation or changing who is in one is refused with 403 bot_not_allowed, and an id that names no such bot with 403 unknown_bot.
Names this post, at most 255 characters; required for a bot.
1 - 255Path Parameters
The conversation's id (uuid; a numeric id is still accepted).
Body
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "Your latest order shipped this morning."
}
'import requests
url = "https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages"
payload = { "text": "Your latest order shipped this morning." }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({text: 'Your latest order shipped this morning.'})
};
fetch('https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'text' => 'Your latest order shipped this morning.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages"
payload := strings.NewReader("{\n \"text\": \"Your latest order shipped this morning.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Your latest order shipped this morning.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/messaging/conversations/{conversation_id}/messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"text\": \"Your latest order shipped this morning.\"\n}"
response = http.request(request)
puts response.read_body{
"message": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a93",
"conversation_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a92",
"sender": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a94",
"name": "Patrick Reeves",
"kind": "person"
},
"body": "Your latest order shipped this morning.",
"blocks": [],
"reply_to_id": null,
"run_id": null,
"created_at": "2026-11-09T09:31:00Z"
},
"status": 200,
"meta": {
"request_uuid": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a90",
"timestamp": "2026-11-09T09:31:00Z"
}
}{
"message": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a93",
"conversation_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a92",
"sender": {
"id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a95",
"name": "Order Helper",
"kind": "bot"
},
"body": "Your latest order shipped this morning.",
"blocks": [],
"reply_to_id": null,
"run_id": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a96",
"created_at": "2026-11-09T09:31:00Z"
},
"status": 201,
"meta": {
"request_uuid": "0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a90",
"timestamp": "2026-11-09T09:31:00Z"
}
}{}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}