Assign a reengagement flow to a contact
curl --request POST \
--url https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sequenceId": 2,
"contactId": 2
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign"
payload = {
"sequenceId": 2,
"contactId": 2
}
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({sequenceId: 2, contactId: 2})
};
fetch('https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign', 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/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign",
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([
'sequenceId' => 2,
'contactId' => 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/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign"
payload := strings.NewReader("{\n \"sequenceId\": 2,\n \"contactId\": 2\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/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sequenceId\": 2,\n \"contactId\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign")
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 \"sequenceId\": 2,\n \"contactId\": 2\n}"
response = http.request(request)
puts response.read_body{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/sequenceId",
"detail": "'sequenceId' must be greater than or equal to 1."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "AI SDR feature is not available for your team",
"code": "knowledgeBase.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "Reengagement flow 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' not found",
"code": "knowledgeBase.notFound"
}{
"title": "Bad Gateway",
"status": 502,
"detail": "Upstream service returned an unexpected error",
"code": "knowledgeBase.upstreamFailure"
}Knowledge Bases
Assign a reengagement flow to a contact
Requires the
ai-sdr:write scope (or a broader one that includes it).
Use this endpoint when you need to move one contact onto a specific reengagement flow — after a conversation suggests a different follow-up track, for instance. Provide sequenceId and contactId in the body, both positive; the flow must belong to this knowledge base and the sequence must already be connected to it, otherwise the call is rejected as not found. The assignment resets the contact’s reengagement timing and returns 204 with no body. The AI SDR feature must be enabled for your team.
POST
/
v3
/
ai-sdr
/
knowledge-bases
/
{knowledge_base_id}
/
reengagement-flows
/
{flow_id}
/
assign
Assign a reengagement flow to a contact
curl --request POST \
--url https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sequenceId": 2,
"contactId": 2
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign"
payload = {
"sequenceId": 2,
"contactId": 2
}
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({sequenceId: 2, contactId: 2})
};
fetch('https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign', 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/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign",
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([
'sequenceId' => 2,
'contactId' => 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/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign"
payload := strings.NewReader("{\n \"sequenceId\": 2,\n \"contactId\": 2\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/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sequenceId\": 2,\n \"contactId\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-flows/{flow_id}/assign")
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 \"sequenceId\": 2,\n \"contactId\": 2\n}"
response = http.request(request)
puts response.read_body{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/sequenceId",
"detail": "'sequenceId' must be greater than or equal to 1."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "AI SDR feature is not available for your team",
"code": "knowledgeBase.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "Reengagement flow 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' not found",
"code": "knowledgeBase.notFound"
}{
"title": "Bad Gateway",
"status": 502,
"detail": "Upstream service returned an unexpected error",
"code": "knowledgeBase.upstreamFailure"
}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
Required range:
x >= 1Body
application/json
Response
Reengagement flow assigned successfully