Skip to main content
PATCH
/
v3
/
ai-sdr
/
knowledge-bases
/
{knowledge_base_id}
/
reply-handlers
/
{reply_handler_id}
Update a reply handler
curl --request PATCH \
  --url https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id} \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "instructions": "Updated playbook — also link the v2 pricing page.",
  "links": [
    "https://example.com/pricing-v2"
  ]
}
'
import requests

url = "https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}"

payload = {
"instructions": "Updated playbook — also link the v2 pricing page.",
"links": ["https://example.com/pricing-v2"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
instructions: 'Updated playbook — also link the v2 pricing page.',
links: ['https://example.com/pricing-v2']
})
};

fetch('https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_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/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'instructions' => 'Updated playbook — also link the v2 pricing page.',
'links' => [
'https://example.com/pricing-v2'
]
]),
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}/reply-handlers/{reply_handler_id}"

payload := strings.NewReader("{\n \"instructions\": \"Updated playbook — also link the v2 pricing page.\",\n \"links\": [\n \"https://example.com/pricing-v2\"\n ]\n}")

req, _ := http.NewRequest("PATCH", 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.patch("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"instructions\": \"Updated playbook — also link the v2 pricing page.\",\n \"links\": [\n \"https://example.com/pricing-v2\"\n ]\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers/{reply_handler_id}")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"instructions\": \"Updated playbook — also link the v2 pricing page.\",\n \"links\": [\n \"https://example.com/pricing-v2\"\n ]\n}"

response = http.request(request)
puts response.read_body
{
  "id": "9c1f8a7e-0b3a-4d11-9b9c-2c4f8a7e0b3a",
  "typeOfQuestion": "Pricing inquiry",
  "instructions": "Quote our published tiered pricing; offer a discovery call for enterprise.",
  "sampleAnswer": "Thanks for asking! Our tiered pricing starts at $X...",
  "toneOfVoice": "confident",
  "responseLength": "medium",
  "links": [
    "https://example.com/pricing"
  ],
  "media": [
    {
      "id": 12345,
      "fileName": "pricing-tiers.png",
      "size": 248
    }
  ],
  "deliveryMode": "draft",
  "additionalNotificationEmail": null,
  "createdAt": "2026-05-10T14:32:11Z"
}

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
reply_handler_id
string<uuid>
required

Body

application/json

Partial update for a reply handler. Send only the fields you want to change; absent fields retain their current value. At least one field must be present. Media is not patched here — manage it via the /media sub-resource.

typeOfQuestion
string
Required string length: 1 - 256
instructions
string
Required string length: 1 - 2048
sampleAnswer
string
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
Maximum array length: 10
Required string length: 1 - 256
deliveryMode
enum<string>

How generated replies for this handler are delivered

Available options:
draft,
auto,
stopAndNotify
additionalNotificationEmail
string<email> | null

Extra recipient notified when a reply is handled with stopAndNotify. Ignored for other delivery modes.

Maximum string length: 128

Response

Reply handler updated successfully

Detailed representation of a reply handler.

id
string<uuid>
read-only

Unique identifier for the reply handler

typeOfQuestion
string

Short label describing the type of incoming reply this handler covers

instructions
string

Instructions for how to handle replies of this type

sampleAnswer
string

Optional sample answer used as a few-shot example

toneOfVoice
enum<string>

Tone applied to generated replies

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

Target length for generated replies

Available options:
superShort,
short,
medium,
long

Reference URLs the AI SDR can quote when generating a reply

media
KnowledgeBaseMedia · object[]
read-only

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

deliveryMode
enum<string>

How generated replies for this handler are delivered

Available options:
draft,
auto,
stopAndNotify
additionalNotificationEmail
string | null

Extra recipient notified when a reply is handled with stopAndNotify. Ignored for other delivery modes.

createdAt
string<date-time>
read-only

Timestamp when the reply handler was created