Skip to main content
POST
/
v3
/
ai-sdr
/
knowledge-bases
/
{knowledge_base_id}
/
reengagement-cards
Create a reengagement card
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

Authorization
string
header
required

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

knowledge_base_id
integer<int64>
required
Required range: x >= 1

Body

application/json

Request body for creating a new reengagement card.

name
string
required

Display name of the card

Required string length: 1 - 256
instructions
string
required

Instructions for what the reengagement message should say

Required string length: 1 - 2048
sendAfter
integer
required

Number of days after the last contact before this card fires

Required range: x >= 1
sampleAnswer
string

Optional sample reengagement message used as a few-shot example

Maximum string length: 1024
toneOfVoice
enum<string>

Tone applied to generated replies and reengagement messages.

Available options:
confident,
persuasive,
witty,
straightforward,
empathetic
responseLength
enum<string>

Target length of generated replies and reengagement messages.

Available options:
superShort,
short,
medium,
long

Reference URLs (max 10; each non-empty, max 256 chars)

Maximum array length: 10
Required string length: 1 - 256
isEnabled
boolean

Whether the card should be created in the enabled state (defaults to true on create)

deliveryMode
enum<string>

How generated reengagement messages for this card are delivered. Defaults to draft when omitted.

Available options:
draft,
auto

Response

Reengagement card created successfully

Detailed representation of a reengagement card.

id
string<uuid>
read-only

Unique identifier for the reengagement card

name
string

Display name of the card

instructions
string

Instructions for what the reengagement message should say

sampleAnswer
string

Optional sample reengagement message used as a few-shot example

sendAfter
integer

Number of days after the last contact before this card fires

Required range: x >= 1
toneOfVoice
enum<string>

Tone applied to generated replies and reengagement messages.

Available options:
confident,
persuasive,
witty,
straightforward,
empathetic
responseLength
enum<string>

Target length of generated replies and reengagement messages.

Available options:
superShort,
short,
medium,
long

Reference URLs the AI SDR can quote when generating a reengagement message

media
KnowledgeBaseMedia · object[]
read-only

Media items attached to this card. Managed via the /media sub-resource.

isEnabled
boolean

Whether the card is currently active

deliveryMode
enum<string>

How generated reengagement messages for this card are delivered

Available options:
draft,
auto
createdAt
string<date-time>
read-only

Timestamp when the card was created