curl --request PUT \
--url https://api.reply.io/v3/sequences/{id}/steps/{step_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "email",
"delayInMinutes": 1,
"variants": [
{
"id": 123,
"subject": "<string>",
"message": "<string>",
"attachmentIds": [
123
]
}
],
"parentId": 123,
"ifConditionPositive": true
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/steps/{step_id}"
payload = {
"type": "email",
"delayInMinutes": 1,
"variants": [
{
"id": 123,
"subject": "<string>",
"message": "<string>",
"attachmentIds": [123]
}
],
"parentId": 123,
"ifConditionPositive": True
}
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({
type: 'email',
delayInMinutes: 1,
variants: [{id: 123, subject: '<string>', message: '<string>', attachmentIds: [123]}],
parentId: 123,
ifConditionPositive: true
})
};
fetch('https://api.reply.io/v3/sequences/{id}/steps/{step_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}/steps/{step_id}",
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([
'type' => 'email',
'delayInMinutes' => 1,
'variants' => [
[
'id' => 123,
'subject' => '<string>',
'message' => '<string>',
'attachmentIds' => [
123
]
]
],
'parentId' => 123,
'ifConditionPositive' => true
]),
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}/steps/{step_id}"
payload := strings.NewReader("{\n \"type\": \"email\",\n \"delayInMinutes\": 1,\n \"variants\": [\n {\n \"id\": 123,\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"attachmentIds\": [\n 123\n ]\n }\n ],\n \"parentId\": 123,\n \"ifConditionPositive\": true\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.reply.io/v3/sequences/{id}/steps/{step_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"email\",\n \"delayInMinutes\": 1,\n \"variants\": [\n {\n \"id\": 123,\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"attachmentIds\": [\n 123\n ]\n }\n ],\n \"parentId\": 123,\n \"ifConditionPositive\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/steps/{step_id}")
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 \"type\": \"email\",\n \"delayInMinutes\": 1,\n \"variants\": [\n {\n \"id\": 123,\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"attachmentIds\": [\n 123\n ]\n }\n ],\n \"parentId\": 123,\n \"ifConditionPositive\": true\n}"
response = http.request(request)
puts response.read_body{
"type": "email",
"delayInMinutes": 1,
"executionMode": "automatic",
"variants": [
{
"id": 123,
"subject": "<string>",
"message": "<string>",
"hasAttachments": true
}
],
"id": 123,
"parentId": 123,
"ifConditionPositive": true
}Update a sequence step
sequences:write scope (or a broader one that includes it).
Change what a step does. Send the whole step; give each variant an id, or it’s added as new, and omitted ones are dropped.
curl --request PUT \
--url https://api.reply.io/v3/sequences/{id}/steps/{step_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "email",
"delayInMinutes": 1,
"variants": [
{
"id": 123,
"subject": "<string>",
"message": "<string>",
"attachmentIds": [
123
]
}
],
"parentId": 123,
"ifConditionPositive": true
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/steps/{step_id}"
payload = {
"type": "email",
"delayInMinutes": 1,
"variants": [
{
"id": 123,
"subject": "<string>",
"message": "<string>",
"attachmentIds": [123]
}
],
"parentId": 123,
"ifConditionPositive": True
}
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({
type: 'email',
delayInMinutes: 1,
variants: [{id: 123, subject: '<string>', message: '<string>', attachmentIds: [123]}],
parentId: 123,
ifConditionPositive: true
})
};
fetch('https://api.reply.io/v3/sequences/{id}/steps/{step_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}/steps/{step_id}",
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([
'type' => 'email',
'delayInMinutes' => 1,
'variants' => [
[
'id' => 123,
'subject' => '<string>',
'message' => '<string>',
'attachmentIds' => [
123
]
]
],
'parentId' => 123,
'ifConditionPositive' => true
]),
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}/steps/{step_id}"
payload := strings.NewReader("{\n \"type\": \"email\",\n \"delayInMinutes\": 1,\n \"variants\": [\n {\n \"id\": 123,\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"attachmentIds\": [\n 123\n ]\n }\n ],\n \"parentId\": 123,\n \"ifConditionPositive\": true\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.reply.io/v3/sequences/{id}/steps/{step_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"email\",\n \"delayInMinutes\": 1,\n \"variants\": [\n {\n \"id\": 123,\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"attachmentIds\": [\n 123\n ]\n }\n ],\n \"parentId\": 123,\n \"ifConditionPositive\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/steps/{step_id}")
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 \"type\": \"email\",\n \"delayInMinutes\": 1,\n \"variants\": [\n {\n \"id\": 123,\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"attachmentIds\": [\n 123\n ]\n }\n ],\n \"parentId\": 123,\n \"ifConditionPositive\": true\n}"
response = http.request(request)
puts response.read_body{
"type": "email",
"delayInMinutes": 1,
"executionMode": "automatic",
"variants": [
{
"id": 123,
"subject": "<string>",
"message": "<string>",
"hasAttachments": true
}
],
"id": 123,
"parentId": 123,
"ifConditionPositive": true
}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.
Body
- Email (Update)
- LinkedIn Message (Update)
- LinkedIn Connect (Update)
- LinkedIn InMail (Update)
- 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
Email step with variant configuration for update operations
Step type discriminator
email Delay in minutes before executing this step
x >= 0Execution mode for the email step
automatic, manual Array of email variants (A/B test versions). Each variant must include its id for update operations.
Show child attributes
Show child attributes
ID of the parent step (for branching)
Whether this step is on the positive branch of a condition
Response
Sequence step updated successfully
- 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
Email step with variant configuration
Step type discriminator
email Delay in minutes before executing this step
x >= 0Execution mode for the email step
automatic, manual Array of email variants (A/B test versions)
Show child attributes
Show child attributes
Unique identifier for the step
ID of the parent step (for branching)
Whether this step is on the positive branch of a condition