curl --request PATCH \
--url https://api.reply.io/v3/sequences/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"scheduleId": 2,
"emailAccounts": [
2
],
"linkedInAccounts": [
2
]
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}"
payload = {
"name": "<string>",
"scheduleId": 2,
"emailAccounts": [2],
"linkedInAccounts": [2]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', scheduleId: 2, emailAccounts: [2], linkedInAccounts: [2]})
};
fetch('https://api.reply.io/v3/sequences/{id}', 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/sequences/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'scheduleId' => 2,
'emailAccounts' => [
2
],
'linkedInAccounts' => [
2
]
]),
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/sequences/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"scheduleId\": 2,\n \"emailAccounts\": [\n 2\n ],\n \"linkedInAccounts\": [\n 2\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.reply.io/v3/sequences/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"scheduleId\": 2,\n \"emailAccounts\": [\n 2\n ],\n \"linkedInAccounts\": [\n 2\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"scheduleId\": 2,\n \"emailAccounts\": [\n 2\n ],\n \"linkedInAccounts\": [\n 2\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"ownerUserId": 42,
"name": "Sales Outreach 2024",
"created": "2024-03-08T14:30:00+00:00",
"status": "active",
"isArchived": false,
"health": "degraded",
"scheduleId": 1,
"emailAccounts": [
{
"id": 1,
"email": "sales@company.com"
},
{
"id": 2,
"email": "outreach@company.com"
}
],
"linkedInAccounts": [
{
"id": 42,
"name": "John Doe",
"profileUrl": "https://www.linkedin.com/in/johndoe",
"status": "enabled"
}
],
"settings": {
"emailsCountPerDay": 50,
"daysToFinishProspect": 14,
"emailSendingDelaySeconds": 30,
"dailyThrottling": 200,
"disableOpensTracking": false,
"repliesHandlingType": "markAsFinished",
"enableLinksTracking": true
},
"steps": [
{
"id": 1323,
"type": "email",
"delayInMinutes": 0,
"executionMode": "automatic",
"variants": [
{
"id": 1,
"subject": "Quick question about {{Company}}",
"message": "<p>Hi {{FirstName}},</p><p>I noticed you are leading initiatives at {{Company}} and wanted to reach out.</p><p>Best regards, John</p>"
}
]
},
{
"id": 43432,
"type": "linkedIn",
"actionType": "message",
"delayInMinutes": 2880,
"executionMode": "automatic",
"variants": [
{
"id": 2,
"message": "Hi {{FirstName}}, I noticed your great work at {{Company}}. Would love to connect!",
"isEnabled": true
}
]
}
]
}{
"title": "Validation failed",
"status": 400,
"detail": "One or more validation errors occurred.",
"errors": [
{
"pointer": "id",
"detail": "The field id must be between 1 and 2147483647."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "You do not have permission to view this sequence.",
"code": "sequence.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "Sequence with ID 42 is not found.",
"code": "sequence.notFound"
}{
"title": "Conflict",
"status": 409,
"detail": "Cannot update sequence with ID 42 because it is archived.",
"code": "sequence.archived"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "API calls quota exceeded! maximum admitted 100 per 1m."
}Update a sequence
sequences:write scope (or a broader one that includes it).
Change part of a sequence and leave the rest. settings merges key by key; account lists replace what’s there.
curl --request PATCH \
--url https://api.reply.io/v3/sequences/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"scheduleId": 2,
"emailAccounts": [
2
],
"linkedInAccounts": [
2
]
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}"
payload = {
"name": "<string>",
"scheduleId": 2,
"emailAccounts": [2],
"linkedInAccounts": [2]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', scheduleId: 2, emailAccounts: [2], linkedInAccounts: [2]})
};
fetch('https://api.reply.io/v3/sequences/{id}', 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/sequences/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'scheduleId' => 2,
'emailAccounts' => [
2
],
'linkedInAccounts' => [
2
]
]),
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/sequences/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"scheduleId\": 2,\n \"emailAccounts\": [\n 2\n ],\n \"linkedInAccounts\": [\n 2\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.reply.io/v3/sequences/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"scheduleId\": 2,\n \"emailAccounts\": [\n 2\n ],\n \"linkedInAccounts\": [\n 2\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"scheduleId\": 2,\n \"emailAccounts\": [\n 2\n ],\n \"linkedInAccounts\": [\n 2\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"ownerUserId": 42,
"name": "Sales Outreach 2024",
"created": "2024-03-08T14:30:00+00:00",
"status": "active",
"isArchived": false,
"health": "degraded",
"scheduleId": 1,
"emailAccounts": [
{
"id": 1,
"email": "sales@company.com"
},
{
"id": 2,
"email": "outreach@company.com"
}
],
"linkedInAccounts": [
{
"id": 42,
"name": "John Doe",
"profileUrl": "https://www.linkedin.com/in/johndoe",
"status": "enabled"
}
],
"settings": {
"emailsCountPerDay": 50,
"daysToFinishProspect": 14,
"emailSendingDelaySeconds": 30,
"dailyThrottling": 200,
"disableOpensTracking": false,
"repliesHandlingType": "markAsFinished",
"enableLinksTracking": true
},
"steps": [
{
"id": 1323,
"type": "email",
"delayInMinutes": 0,
"executionMode": "automatic",
"variants": [
{
"id": 1,
"subject": "Quick question about {{Company}}",
"message": "<p>Hi {{FirstName}},</p><p>I noticed you are leading initiatives at {{Company}} and wanted to reach out.</p><p>Best regards, John</p>"
}
]
},
{
"id": 43432,
"type": "linkedIn",
"actionType": "message",
"delayInMinutes": 2880,
"executionMode": "automatic",
"variants": [
{
"id": 2,
"message": "Hi {{FirstName}}, I noticed your great work at {{Company}}. Would love to connect!",
"isEnabled": true
}
]
}
]
}{
"title": "Validation failed",
"status": 400,
"detail": "One or more validation errors occurred.",
"errors": [
{
"pointer": "id",
"detail": "The field id must be between 1 and 2147483647."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "You do not have permission to view this sequence.",
"code": "sequence.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "Sequence with ID 42 is not found.",
"code": "sequence.notFound"
}{
"title": "Conflict",
"status": 409,
"detail": "Cannot update sequence with ID 42 because it is archived.",
"code": "sequence.archived"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "API calls quota exceeded! maximum admitted 100 per 1m."
}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
Sequence Id
x >= 1Body
Model for updating an existing sequence. All fields are optional — only include the fields you want to change (PATCH semantics).
Name of the sequence
ID of the schedule to use
x >= 1Settings configuration for a sequence
Show child attributes
Show child attributes
Array of email account IDs
x >= 1Array of LinkedIn account IDs
x >= 1Response
Sequence updated successfully
Full representation of a sequence, including its schedule and the email and LinkedIn accounts used to send from it.
Unique identifier for the sequence
Identifier of the user who owns the sequence
Name of the sequence
Sequence creation timestamp with timezone offset
Current status of the sequence
new, active, paused Indicates if the sequence is archived
Overall health status of the sequence. Indicates whether the sequence can operate normally or has issues that need attention.
healthy— Sequence is functioning normally with no issuesstalled— Sequence has stalled and is not progressingdegraded— Sequence is running but with reduced effectivenessblocked— Sequence cannot proceed due to critical issues
healthy, stalled, degraded, blocked Schedule ID
Email accounts used to send emails for this sequence
Show child attributes
Show child attributes
LinkedIn accounts linked to this sequence
Show child attributes
Show child attributes
Settings configuration for a sequence
Show child attributes
Show child attributes
Array of sequence steps, ordered by their position number in the sequence
Email step with variant configuration
- Email
- LinkedIn Message
- LinkedIn Connect
- LinkedIn InMail
- LinkedIn View Profile
- LinkedIn Endorse Skills
- LinkedIn Voice Message
- LinkedIn AI Voice Message
- LinkedIn Like Recent Posts
- LinkedIn Follow Profile
- LinkedIn Comment On Recent Post
- Call
- SMS
- WhatsApp
- Zapier
- Task
- Condition
Show child attributes
Show child attributes