Drafts
Save a draft message
Create or update a draft message in a conversation. If the body, attachments, and replied_to_id are all blank after the update, the draft is automatically destroyed.
PUT
/
api
/
v1
/
messaging
/
conversations
/
{conversation_id}
/
save_draft
Save a draft message
curl --request PUT \
--url https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"draft_message": {
"body": "Draft: Q4 paper pricing for Robert California"
}
}
'import requests
url = "https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft"
payload = { "draft_message": { "body": "Draft: Q4 paper pricing for Robert California" } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
draft_message: {body: JSON.stringify('Draft: Q4 paper pricing for Robert California')}
})
};
fetch('https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft', 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/v1/messaging/conversations/{conversation_id}/save_draft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'draft_message' => [
'body' => 'Draft: Q4 paper pricing for Robert California'
]
]),
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/v1/messaging/conversations/{conversation_id}/save_draft"
payload := strings.NewReader("{\n \"draft_message\": {\n \"body\": \"Draft: Q4 paper pricing for Robert California\"\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"draft_message\": {\n \"body\": \"Draft: Q4 paper pricing for Robert California\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"draft_message\": {\n \"body\": \"Draft: Q4 paper pricing for Robert California\"\n }\n}"
response = http.request(request)
puts response.read_body{
"attachments": [],
"body": "Draft: Q4 paper pricing for Robert California",
"conversation": {
"id": 7731,
"name": "Scranton Sales Team",
"avatar_url": "https://cdn.fluid.app/conversations/dunder-mifflin/scranton-sales.png"
},
"created_at": "2026-09-16T09:11:05Z",
"id": 90471,
"mentioned_recipients": [],
"metadata": null,
"replied_to_message": null,
"scheduled_at": null,
"sender_recipient": {
"avatar_background": "4F46E5",
"blocked": false,
"blocker": false,
"discarded_at": null,
"first_name": "Dwight",
"id": 48217,
"image_url": "https://cdn.fluid.app/avatars/dunder-mifflin/dwight-schrute.jpg",
"last_name": "Schrute",
"pro_user": false
},
"subject": null,
"updated_at": "2026-09-16T09:14:52Z"
}{
"message": "<string>"
}Authorizations
Bearer token authentication
Path Parameters
Body
application/json
Show child attributes
Show child attributes
Response
The saved draft, or an empty object when the update left the draft blank and it was discarded.
- MessagingDraftMessage
- Option 2
Show child attributes
Show child attributes
Any valid JSON value for provider, integration, theme, metadata, or other dynamic payloads whose keys are not fixed by the API contract.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Any valid JSON value for provider, integration, theme, metadata, or other dynamic payloads whose keys are not fixed by the API contract.
Show child attributes
Show child attributes
⌘I
Save a draft message
curl --request PUT \
--url https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"draft_message": {
"body": "Draft: Q4 paper pricing for Robert California"
}
}
'import requests
url = "https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft"
payload = { "draft_message": { "body": "Draft: Q4 paper pricing for Robert California" } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
draft_message: {body: JSON.stringify('Draft: Q4 paper pricing for Robert California')}
})
};
fetch('https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft', 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/v1/messaging/conversations/{conversation_id}/save_draft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'draft_message' => [
'body' => 'Draft: Q4 paper pricing for Robert California'
]
]),
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/v1/messaging/conversations/{conversation_id}/save_draft"
payload := strings.NewReader("{\n \"draft_message\": {\n \"body\": \"Draft: Q4 paper pricing for Robert California\"\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"draft_message\": {\n \"body\": \"Draft: Q4 paper pricing for Robert California\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v1/messaging/conversations/{conversation_id}/save_draft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"draft_message\": {\n \"body\": \"Draft: Q4 paper pricing for Robert California\"\n }\n}"
response = http.request(request)
puts response.read_body{
"attachments": [],
"body": "Draft: Q4 paper pricing for Robert California",
"conversation": {
"id": 7731,
"name": "Scranton Sales Team",
"avatar_url": "https://cdn.fluid.app/conversations/dunder-mifflin/scranton-sales.png"
},
"created_at": "2026-09-16T09:11:05Z",
"id": 90471,
"mentioned_recipients": [],
"metadata": null,
"replied_to_message": null,
"scheduled_at": null,
"sender_recipient": {
"avatar_background": "4F46E5",
"blocked": false,
"blocker": false,
"discarded_at": null,
"first_name": "Dwight",
"id": 48217,
"image_url": "https://cdn.fluid.app/avatars/dunder-mifflin/dwight-schrute.jpg",
"last_name": "Schrute",
"pro_user": false
},
"subject": null,
"updated_at": "2026-09-16T09:14:52Z"
}{
"message": "<string>"
}