curl --request POST \
--url https://api.reply.io/v3/inbox/threads/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channel": "email",
"message": "Thanks — does Tuesday at 10am work?",
"cc": [
"cc@example.com"
],
"applySignature": true,
"replyToMessageId": "<abc123@reply.example>"
}
'import requests
url = "https://api.reply.io/v3/inbox/threads/{id}/messages"
payload = {
"channel": "email",
"message": "Thanks — does Tuesday at 10am work?",
"cc": ["cc@example.com"],
"applySignature": True,
"replyToMessageId": "<abc123@reply.example>"
}
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({
channel: 'email',
message: 'Thanks — does Tuesday at 10am work?',
cc: ['cc@example.com'],
applySignature: true,
replyToMessageId: '<abc123@reply.example>'
})
};
fetch('https://api.reply.io/v3/inbox/threads/{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.reply.io/v3/inbox/threads/{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([
'channel' => 'email',
'message' => 'Thanks — does Tuesday at 10am work?',
'cc' => [
'cc@example.com'
],
'applySignature' => true,
'replyToMessageId' => '<abc123@reply.example>'
]),
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.reply.io/v3/inbox/threads/{id}/messages"
payload := strings.NewReader("{\n \"channel\": \"email\",\n \"message\": \"Thanks — does Tuesday at 10am work?\",\n \"cc\": [\n \"cc@example.com\"\n ],\n \"applySignature\": true,\n \"replyToMessageId\": \"<abc123@reply.example>\"\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.reply.io/v3/inbox/threads/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channel\": \"email\",\n \"message\": \"Thanks — does Tuesday at 10am work?\",\n \"cc\": [\n \"cc@example.com\"\n ],\n \"applySignature\": true,\n \"replyToMessageId\": \"<abc123@reply.example>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/inbox/threads/{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 \"channel\": \"email\",\n \"message\": \"Thanks — does Tuesday at 10am work?\",\n \"cc\": [\n \"cc@example.com\"\n ],\n \"applySignature\": true,\n \"replyToMessageId\": \"<abc123@reply.example>\"\n}"
response = http.request(request)
puts response.read_body{
"channel": "email",
"messageId": "<ghi789@reply.example>",
"date": "2026-05-08T08:14:33Z",
"body": "<p>Thanks — does Tuesday at 10am work?</p>",
"fromName": "Alex Johnson",
"isOutbound": true,
"subject": "Re: Pricing for Q3 rollout",
"fromAddress": "alex.johnson@reply.example",
"to": [
"daria.kovalenko@northwind.example"
],
"cc": [
"cc@example.com"
],
"bcc": null
}Send a reply within a thread
inbox:operate scope (or a broader one that includes it).
Reply to a contact inside an existing conversation. The channel in your body must match the thread’s, or it’s rejected.
curl --request POST \
--url https://api.reply.io/v3/inbox/threads/{id}/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channel": "email",
"message": "Thanks — does Tuesday at 10am work?",
"cc": [
"cc@example.com"
],
"applySignature": true,
"replyToMessageId": "<abc123@reply.example>"
}
'import requests
url = "https://api.reply.io/v3/inbox/threads/{id}/messages"
payload = {
"channel": "email",
"message": "Thanks — does Tuesday at 10am work?",
"cc": ["cc@example.com"],
"applySignature": True,
"replyToMessageId": "<abc123@reply.example>"
}
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({
channel: 'email',
message: 'Thanks — does Tuesday at 10am work?',
cc: ['cc@example.com'],
applySignature: true,
replyToMessageId: '<abc123@reply.example>'
})
};
fetch('https://api.reply.io/v3/inbox/threads/{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.reply.io/v3/inbox/threads/{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([
'channel' => 'email',
'message' => 'Thanks — does Tuesday at 10am work?',
'cc' => [
'cc@example.com'
],
'applySignature' => true,
'replyToMessageId' => '<abc123@reply.example>'
]),
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.reply.io/v3/inbox/threads/{id}/messages"
payload := strings.NewReader("{\n \"channel\": \"email\",\n \"message\": \"Thanks — does Tuesday at 10am work?\",\n \"cc\": [\n \"cc@example.com\"\n ],\n \"applySignature\": true,\n \"replyToMessageId\": \"<abc123@reply.example>\"\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.reply.io/v3/inbox/threads/{id}/messages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channel\": \"email\",\n \"message\": \"Thanks — does Tuesday at 10am work?\",\n \"cc\": [\n \"cc@example.com\"\n ],\n \"applySignature\": true,\n \"replyToMessageId\": \"<abc123@reply.example>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/inbox/threads/{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 \"channel\": \"email\",\n \"message\": \"Thanks — does Tuesday at 10am work?\",\n \"cc\": [\n \"cc@example.com\"\n ],\n \"applySignature\": true,\n \"replyToMessageId\": \"<abc123@reply.example>\"\n}"
response = http.request(request)
puts response.read_body{
"channel": "email",
"messageId": "<ghi789@reply.example>",
"date": "2026-05-08T08:14:33Z",
"body": "<p>Thanks — does Tuesday at 10am work?</p>",
"fromName": "Alex Johnson",
"isOutbound": true,
"subject": "Re: Pricing for Q3 rollout",
"fromAddress": "alex.johnson@reply.example",
"to": [
"daria.kovalenko@northwind.example"
],
"cc": [
"cc@example.com"
],
"bcc": null
}Authorizations
Authenticate every request with a Bearer token. Pass your Reply API key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get your API key from the Reply dashboard: Settings → API Key.
Path Parameters
x >= 1Body
- Inbox Email Message Request
- Inbox LinkedIn Message Request
Outbound email reply within an inbox thread.
email Message body. May contain HTML.
Recipient email address. When omitted, the reply is delivered to the contact's stored address. When set to a different address, link and open tracking are disabled automatically.
x >= 1When true, the sender's email-account signature is appended to the message body.
MessageId of a specific message in the thread to reply to. When omitted, the reply targets the last message in the thread.
Response
The newly created outbound message.
- Inbox Email Message
- Inbox LinkedIn Message
Email message within an inbox thread.
Discriminator — always email for this variant.
email Unique identifier of the message within the thread. Use this value as replyToMessageId when sending a reply to a specific message.
Message body. May contain HTML.
True when the message was sent from this account; false when received.
Per-message status. Populated for outbound messages that surfaced a delivery error; absent (null) on healthy inbound or successfully delivered outbound messages.
Show child attributes
Show child attributes
For a sent message, identifies that it was generated by AI. null when the message was not AI-generated.
aiGenerated, aiGeneratedEdited, autoSent