Bulk add contacts to sequence
curl --request POST \
--url https://api.reply.io/v3/sequences/{id}/contact-links/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contactIds": [
123
],
"removeFromExisting": false,
"startStepId": 123,
"ignoreStepDelay": false,
"startFrom": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/contact-links/bulk"
payload = {
"contactIds": [123],
"removeFromExisting": False,
"startStepId": 123,
"ignoreStepDelay": False,
"startFrom": "2023-11-07T05:31:56Z"
}
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({
contactIds: [123],
removeFromExisting: false,
startStepId: 123,
ignoreStepDelay: false,
startFrom: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.reply.io/v3/sequences/{id}/contact-links/bulk', 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}/contact-links/bulk",
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([
'contactIds' => [
123
],
'removeFromExisting' => false,
'startStepId' => 123,
'ignoreStepDelay' => false,
'startFrom' => '2023-11-07T05:31:56Z'
]),
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}/contact-links/bulk"
payload := strings.NewReader("{\n \"contactIds\": [\n 123\n ],\n \"removeFromExisting\": false,\n \"startStepId\": 123,\n \"ignoreStepDelay\": false,\n \"startFrom\": \"2023-11-07T05:31:56Z\"\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/sequences/{id}/contact-links/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contactIds\": [\n 123\n ],\n \"removeFromExisting\": false,\n \"startStepId\": 123,\n \"ignoreStepDelay\": false,\n \"startFrom\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/contact-links/bulk")
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 \"contactIds\": [\n 123\n ],\n \"removeFromExisting\": false,\n \"startStepId\": 123,\n \"ignoreStepDelay\": false,\n \"startFrom\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"added": [
123
],
"notProcessed": {}
}Sequence Contacts
Bulk add contacts to sequence
Requires the
sequences:operate scope (or a broader one that includes it).
Enroll contacts in a sequence — up to 10,000 ids per call. Set removeFromExisting to pull them out of their current ones.
POST
/
v3
/
sequences
/
{id}
/
contact-links
/
bulk
Bulk add contacts to sequence
curl --request POST \
--url https://api.reply.io/v3/sequences/{id}/contact-links/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contactIds": [
123
],
"removeFromExisting": false,
"startStepId": 123,
"ignoreStepDelay": false,
"startFrom": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/contact-links/bulk"
payload = {
"contactIds": [123],
"removeFromExisting": False,
"startStepId": 123,
"ignoreStepDelay": False,
"startFrom": "2023-11-07T05:31:56Z"
}
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({
contactIds: [123],
removeFromExisting: false,
startStepId: 123,
ignoreStepDelay: false,
startFrom: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.reply.io/v3/sequences/{id}/contact-links/bulk', 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}/contact-links/bulk",
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([
'contactIds' => [
123
],
'removeFromExisting' => false,
'startStepId' => 123,
'ignoreStepDelay' => false,
'startFrom' => '2023-11-07T05:31:56Z'
]),
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}/contact-links/bulk"
payload := strings.NewReader("{\n \"contactIds\": [\n 123\n ],\n \"removeFromExisting\": false,\n \"startStepId\": 123,\n \"ignoreStepDelay\": false,\n \"startFrom\": \"2023-11-07T05:31:56Z\"\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/sequences/{id}/contact-links/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contactIds\": [\n 123\n ],\n \"removeFromExisting\": false,\n \"startStepId\": 123,\n \"ignoreStepDelay\": false,\n \"startFrom\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/contact-links/bulk")
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 \"contactIds\": [\n 123\n ],\n \"removeFromExisting\": false,\n \"startStepId\": 123,\n \"ignoreStepDelay\": false,\n \"startFrom\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"added": [
123
],
"notProcessed": {}
}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
Body
application/json
Array of contact IDs to add
If true, contacts will be removed from their current sequences before being added to this one
Optional step ID to start from
If true, skip the configured delay before the first step and start processing immediately
Optional date when contact processing should begin. If not provided, processing starts immediately.
Response
Contacts added to sequence.
Per-item failures use the SequenceContactError enum. Common per-item slugs:
| Slug | Meaning |
|---|---|
invalidInput | Generic validation failure for this contact |
contactLimitExceeded | Plan limit reached |
contactAlreadyInSequence | Contact is already enrolled |
contactNotFound | Contact does not exist |
forbidden | Caller lacks permission for this contact |