string
Conversations
Reply to Conversation
Send a reply or add an internal note
POST
/
api
/
v1
/
conversations
/
{conversationId}
/
messages
Reply to Conversation
curl --request POST \
--url https://api.sequenzy.com/api/v1/conversations/{conversationId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "<string>",
"subject": "<string>",
"bodyText": "<string>",
"bodyHtml": "<string>",
"senderProfileId": "<string>",
"attachments": [
{}
]
}
'import requests
url = "https://api.sequenzy.com/api/v1/conversations/{conversationId}/messages"
payload = {
"type": "<string>",
"subject": "<string>",
"bodyText": "<string>",
"bodyHtml": "<string>",
"senderProfileId": "<string>",
"attachments": [{}]
}
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({
type: '<string>',
subject: '<string>',
bodyText: '<string>',
bodyHtml: '<string>',
senderProfileId: '<string>',
attachments: [{}]
})
};
fetch('https://api.sequenzy.com/api/v1/conversations/{conversationId}/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.sequenzy.com/api/v1/conversations/{conversationId}/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([
'type' => '<string>',
'subject' => '<string>',
'bodyText' => '<string>',
'bodyHtml' => '<string>',
'senderProfileId' => '<string>',
'attachments' => [
[
]
]
]),
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.sequenzy.com/api/v1/conversations/{conversationId}/messages"
payload := strings.NewReader("{\n \"type\": \"<string>\",\n \"subject\": \"<string>\",\n \"bodyText\": \"<string>\",\n \"bodyHtml\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"attachments\": [\n {}\n ]\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.sequenzy.com/api/v1/conversations/{conversationId}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"<string>\",\n \"subject\": \"<string>\",\n \"bodyText\": \"<string>\",\n \"bodyHtml\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"attachments\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/conversations/{conversationId}/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 \"type\": \"<string>\",\n \"subject\": \"<string>\",\n \"bodyText\": \"<string>\",\n \"bodyHtml\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"attachments\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": {
"id": "msg_new123",
"conversationId": "conv_abc123",
"type": "outbound",
"subject": "Re: A quick update",
"bodyText": "Happy to help! Let me know if you have other questions.",
"bodyHtml": null,
"fromEmail": "support@example.com",
"fromName": null,
"fromUserId": "user_abc123",
"attachments": [],
"isRead": true,
"createdAt": "2026-06-11T10:00:00.000Z",
"deliveryStatus": "pending"
}
}
{
"error": "Message body is required"
}
{
"error": "Attachments can total at most 15 MB.",
"code": "invalid_attachment"
}
{
"error": "Attachments are not available on this server.",
"code": "attachments_unavailable"
}
{
"error": "The sending domain for hello@pending.example.com is not verified. Verify the domain before replying from this address.",
"code": "sender_domain_not_verified"
}
{
"success": false,
"error": "Unauthorized"
}
{
"error": "Conversation not found"
}
{
"error": "Sender profile sp_abc123 was not found for this company.",
"code": "sender_profile_not_found"
}
{
"error": "Failed to create message"
}
Send an email reply to the subscriber or add an internal team note. Replies are queued for delivery and reopen closed conversations. Notes are only visible to your team and do not reopen conversations.
Reply with an attachment:
If a stored attachment cannot be read when the reply is sent, the reply is
retried and then marked
Request
string
required
Conversation ID.
string
Message type:
outbound sends an email reply (default), note adds an
internal note.string
Message subject. Defaults to the conversation subject.
Plain text body. Outbound messages require
bodyText or bodyHtml.string
HTML body. Outbound messages require
bodyText or bodyHtml.string
Sender profile to send an outbound reply from, for example the address the
subscriber originally wrote to. Its sending domain must be verified. Ignored
for notes. When omitted, the reply is sent from the API key owner’s email
address, which must be on one of your verified sending domains. List profiles
with List Sender Profiles.
object[]
Files to attach, up to 10 and 15 MB total after decoding. Each item has a
filename, base64 content, and an optional contentType (inferred from the
file name when omitted). Attachments need attachment storage on the server:
check attachmentsAvailable from Get Inbox Address.
Attachments on notes are stored but never emailed.curl -X POST "https://api.sequenzy.com/api/v1/conversations/conv_abc123/messages" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"bodyText": "Happy to help! Let me know if you have other questions."}'
curl -X POST "https://api.sequenzy.com/api/v1/conversations/conv_abc123/messages" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"bodyText": "Invoice attached.", "attachments": [{"filename": "invoice.pdf", "content": "JVBERi0xLjQK..."}]}'
failed rather than sent without the file.
Reply from a specific sender profile:
curl -X POST "https://api.sequenzy.com/api/v1/conversations/conv_abc123/messages" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"bodyText": "Happy to help!", "senderProfileId": "sp_abc123"}'
Responses
{
"success": true,
"message": {
"id": "msg_new123",
"conversationId": "conv_abc123",
"type": "outbound",
"subject": "Re: A quick update",
"bodyText": "Happy to help! Let me know if you have other questions.",
"bodyHtml": null,
"fromEmail": "support@example.com",
"fromName": null,
"fromUserId": "user_abc123",
"attachments": [],
"isRead": true,
"createdAt": "2026-06-11T10:00:00.000Z",
"deliveryStatus": "pending"
}
}
{
"error": "Message body is required"
}
{
"error": "Attachments can total at most 15 MB.",
"code": "invalid_attachment"
}
{
"error": "Attachments are not available on this server.",
"code": "attachments_unavailable"
}
{
"error": "The sending domain for hello@pending.example.com is not verified. Verify the domain before replying from this address.",
"code": "sender_domain_not_verified"
}
{
"success": false,
"error": "Unauthorized"
}
{
"error": "Conversation not found"
}
{
"error": "Sender profile sp_abc123 was not found for this company.",
"code": "sender_profile_not_found"
}
{
"error": "Failed to create message"
}
⌘I
Reply to Conversation
curl --request POST \
--url https://api.sequenzy.com/api/v1/conversations/{conversationId}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "<string>",
"subject": "<string>",
"bodyText": "<string>",
"bodyHtml": "<string>",
"senderProfileId": "<string>",
"attachments": [
{}
]
}
'import requests
url = "https://api.sequenzy.com/api/v1/conversations/{conversationId}/messages"
payload = {
"type": "<string>",
"subject": "<string>",
"bodyText": "<string>",
"bodyHtml": "<string>",
"senderProfileId": "<string>",
"attachments": [{}]
}
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({
type: '<string>',
subject: '<string>',
bodyText: '<string>',
bodyHtml: '<string>',
senderProfileId: '<string>',
attachments: [{}]
})
};
fetch('https://api.sequenzy.com/api/v1/conversations/{conversationId}/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.sequenzy.com/api/v1/conversations/{conversationId}/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([
'type' => '<string>',
'subject' => '<string>',
'bodyText' => '<string>',
'bodyHtml' => '<string>',
'senderProfileId' => '<string>',
'attachments' => [
[
]
]
]),
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.sequenzy.com/api/v1/conversations/{conversationId}/messages"
payload := strings.NewReader("{\n \"type\": \"<string>\",\n \"subject\": \"<string>\",\n \"bodyText\": \"<string>\",\n \"bodyHtml\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"attachments\": [\n {}\n ]\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.sequenzy.com/api/v1/conversations/{conversationId}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"<string>\",\n \"subject\": \"<string>\",\n \"bodyText\": \"<string>\",\n \"bodyHtml\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"attachments\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/conversations/{conversationId}/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 \"type\": \"<string>\",\n \"subject\": \"<string>\",\n \"bodyText\": \"<string>\",\n \"bodyHtml\": \"<string>\",\n \"senderProfileId\": \"<string>\",\n \"attachments\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": {
"id": "msg_new123",
"conversationId": "conv_abc123",
"type": "outbound",
"subject": "Re: A quick update",
"bodyText": "Happy to help! Let me know if you have other questions.",
"bodyHtml": null,
"fromEmail": "support@example.com",
"fromName": null,
"fromUserId": "user_abc123",
"attachments": [],
"isRead": true,
"createdAt": "2026-06-11T10:00:00.000Z",
"deliveryStatus": "pending"
}
}
{
"error": "Message body is required"
}
{
"error": "Attachments can total at most 15 MB.",
"code": "invalid_attachment"
}
{
"error": "Attachments are not available on this server.",
"code": "attachments_unavailable"
}
{
"error": "The sending domain for hello@pending.example.com is not verified. Verify the domain before replying from this address.",
"code": "sender_domain_not_verified"
}
{
"success": false,
"error": "Unauthorized"
}
{
"error": "Conversation not found"
}
{
"error": "Sender profile sp_abc123 was not found for this company.",
"code": "sender_profile_not_found"
}
{
"error": "Failed to create message"
}