curl --request POST \
--url https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "30-day silent prospect",
"instructions": "Gentle nudge with new case study; no hard ask.",
"sendAfter": 30,
"toneOfVoice": "empathetic",
"responseLength": "short",
"links": [
"https://example.com/case-study-northstar"
],
"isEnabled": true,
"deliveryMode": "draft"
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards"
payload = {
"name": "30-day silent prospect",
"instructions": "Gentle nudge with new case study; no hard ask.",
"sendAfter": 30,
"toneOfVoice": "empathetic",
"responseLength": "short",
"links": ["https://example.com/case-study-northstar"],
"isEnabled": True,
"deliveryMode": "draft"
}
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({
name: '30-day silent prospect',
instructions: 'Gentle nudge with new case study; no hard ask.',
sendAfter: 30,
toneOfVoice: 'empathetic',
responseLength: 'short',
links: ['https://example.com/case-study-northstar'],
isEnabled: true,
deliveryMode: 'draft'
})
};
fetch('https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards', 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-cards",
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([
'name' => '30-day silent prospect',
'instructions' => 'Gentle nudge with new case study; no hard ask.',
'sendAfter' => 30,
'toneOfVoice' => 'empathetic',
'responseLength' => 'short',
'links' => [
'https://example.com/case-study-northstar'
],
'isEnabled' => true,
'deliveryMode' => 'draft'
]),
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-cards"
payload := strings.NewReader("{\n \"name\": \"30-day silent prospect\",\n \"instructions\": \"Gentle nudge with new case study; no hard ask.\",\n \"sendAfter\": 30,\n \"toneOfVoice\": \"empathetic\",\n \"responseLength\": \"short\",\n \"links\": [\n \"https://example.com/case-study-northstar\"\n ],\n \"isEnabled\": true,\n \"deliveryMode\": \"draft\"\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-cards")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"30-day silent prospect\",\n \"instructions\": \"Gentle nudge with new case study; no hard ask.\",\n \"sendAfter\": 30,\n \"toneOfVoice\": \"empathetic\",\n \"responseLength\": \"short\",\n \"links\": [\n \"https://example.com/case-study-northstar\"\n ],\n \"isEnabled\": true,\n \"deliveryMode\": \"draft\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards")
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 \"name\": \"30-day silent prospect\",\n \"instructions\": \"Gentle nudge with new case study; no hard ask.\",\n \"sendAfter\": 30,\n \"toneOfVoice\": \"empathetic\",\n \"responseLength\": \"short\",\n \"links\": [\n \"https://example.com/case-study-northstar\"\n ],\n \"isEnabled\": true,\n \"deliveryMode\": \"draft\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9c1f8a7e-0b3a-4d11-9b9c-2c4f8a7e0b3a",
"name": "30-day silent prospect",
"instructions": "Gentle nudge with new case study; no hard ask.",
"sampleAnswer": "Hi {{firstName}}, just sharing a quick case study...",
"sendAfter": 30,
"toneOfVoice": "empathetic",
"responseLength": "short",
"links": [
"https://example.com/case-study-northstar"
],
"media": [
{
"id": 12345,
"fileName": "case-study-thumbnail.png",
"size": 248
}
],
"isEnabled": true,
"deliveryMode": "draft",
"createdAt": "2026-05-10T14:32:11Z"
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/name",
"detail": "'name' must not be empty."
},
{
"pointer": "/sendAfter",
"detail": "'sendAfter' 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": "Knowledge base '4821' not found",
"code": "knowledgeBase.notFound"
}{
"title": "Bad Gateway",
"status": 502,
"detail": "Upstream service returned an unexpected error",
"code": "knowledgeBase.upstreamFailure"
}Create a reengagement card
New. This endpoint shipped recently. If anything about it is unclear or could work better for you, tell us in the developer Slack.
ai-sdr:write scope (or a broader one that includes it).
Create a follow-up for contacts who stop replying. Name, instructions, and sendAfter are required — sendAfter is days of silence.
curl --request POST \
--url https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "30-day silent prospect",
"instructions": "Gentle nudge with new case study; no hard ask.",
"sendAfter": 30,
"toneOfVoice": "empathetic",
"responseLength": "short",
"links": [
"https://example.com/case-study-northstar"
],
"isEnabled": true,
"deliveryMode": "draft"
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards"
payload = {
"name": "30-day silent prospect",
"instructions": "Gentle nudge with new case study; no hard ask.",
"sendAfter": 30,
"toneOfVoice": "empathetic",
"responseLength": "short",
"links": ["https://example.com/case-study-northstar"],
"isEnabled": True,
"deliveryMode": "draft"
}
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({
name: '30-day silent prospect',
instructions: 'Gentle nudge with new case study; no hard ask.',
sendAfter: 30,
toneOfVoice: 'empathetic',
responseLength: 'short',
links: ['https://example.com/case-study-northstar'],
isEnabled: true,
deliveryMode: 'draft'
})
};
fetch('https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards', 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-cards",
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([
'name' => '30-day silent prospect',
'instructions' => 'Gentle nudge with new case study; no hard ask.',
'sendAfter' => 30,
'toneOfVoice' => 'empathetic',
'responseLength' => 'short',
'links' => [
'https://example.com/case-study-northstar'
],
'isEnabled' => true,
'deliveryMode' => 'draft'
]),
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-cards"
payload := strings.NewReader("{\n \"name\": \"30-day silent prospect\",\n \"instructions\": \"Gentle nudge with new case study; no hard ask.\",\n \"sendAfter\": 30,\n \"toneOfVoice\": \"empathetic\",\n \"responseLength\": \"short\",\n \"links\": [\n \"https://example.com/case-study-northstar\"\n ],\n \"isEnabled\": true,\n \"deliveryMode\": \"draft\"\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-cards")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"30-day silent prospect\",\n \"instructions\": \"Gentle nudge with new case study; no hard ask.\",\n \"sendAfter\": 30,\n \"toneOfVoice\": \"empathetic\",\n \"responseLength\": \"short\",\n \"links\": [\n \"https://example.com/case-study-northstar\"\n ],\n \"isEnabled\": true,\n \"deliveryMode\": \"draft\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reengagement-cards")
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 \"name\": \"30-day silent prospect\",\n \"instructions\": \"Gentle nudge with new case study; no hard ask.\",\n \"sendAfter\": 30,\n \"toneOfVoice\": \"empathetic\",\n \"responseLength\": \"short\",\n \"links\": [\n \"https://example.com/case-study-northstar\"\n ],\n \"isEnabled\": true,\n \"deliveryMode\": \"draft\"\n}"
response = http.request(request)
puts response.read_body{
"id": "9c1f8a7e-0b3a-4d11-9b9c-2c4f8a7e0b3a",
"name": "30-day silent prospect",
"instructions": "Gentle nudge with new case study; no hard ask.",
"sampleAnswer": "Hi {{firstName}}, just sharing a quick case study...",
"sendAfter": 30,
"toneOfVoice": "empathetic",
"responseLength": "short",
"links": [
"https://example.com/case-study-northstar"
],
"media": [
{
"id": 12345,
"fileName": "case-study-thumbnail.png",
"size": 248
}
],
"isEnabled": true,
"deliveryMode": "draft",
"createdAt": "2026-05-10T14:32:11Z"
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/name",
"detail": "'name' must not be empty."
},
{
"pointer": "/sendAfter",
"detail": "'sendAfter' 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": "Knowledge base '4821' 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
x >= 1Body
Request body for creating a new reengagement card.
Display name of the card
1 - 256Instructions for what the reengagement message should say
1 - 2048Number of days after the last contact before this card fires
x >= 1Optional sample reengagement message used as a few-shot example
1024Tone applied to generated replies and reengagement messages.
confident, persuasive, witty, straightforward, empathetic Target length of generated replies and reengagement messages.
superShort, short, medium, long Reference URLs (max 10; each non-empty, max 256 chars)
101 - 256Whether the card should be created in the enabled state (defaults to true on create)
How generated reengagement messages for this card are delivered. Defaults to draft when omitted.
draft, auto Response
Reengagement card created successfully
Detailed representation of a reengagement card.
Unique identifier for the reengagement card
Display name of the card
Instructions for what the reengagement message should say
Optional sample reengagement message used as a few-shot example
Number of days after the last contact before this card fires
x >= 1Tone applied to generated replies and reengagement messages.
confident, persuasive, witty, straightforward, empathetic Target length of generated replies and reengagement messages.
superShort, short, medium, long Reference URLs the AI SDR can quote when generating a reengagement message
Media items attached to this card. Managed via the /media sub-resource.
Show child attributes
Show child attributes
Whether the card is currently active
How generated reengagement messages for this card are delivered
draft, auto Timestamp when the card was created