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_bodyUpdate a reply handler
Beta. This endpoint is in beta. Behavior, parameters, and response shapes may change without notice.
ai-sdr:write scope (or a broader one that includes it).
Use this endpoint when you need to adjust how the AI SDR agent answers a kind of reply. Send only the fields you want to change; at least one of typeOfQuestion, instructions, sampleAnswer, toneOfVoice, responseLength, links, deliveryMode and additionalNotificationEmail must be present, and the same limits apply as on create. Switching deliveryMode to stopAndNotify requires that mode to be enabled for your team, and moving the handler off stopAndNotify clears additionalNotificationEmail. Media is not changed here — use the handler’s media sub-resource. The updated handler is returned. The AI SDR feature must be enabled for your team.
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_bodyAuthorizations
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
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.
1 - 2561 - 20481024Tone applied to generated replies and reengagement messages.
confident, persuasive, witty, straightforward, empathetic Target length of generated replies and reengagement messages.
superShort, short, medium, long 101 - 256How generated replies for this handler are delivered
draft, auto, stopAndNotify Extra recipient notified when a reply is handled with stopAndNotify. Ignored for other delivery modes.
128Response
Reply handler updated successfully
Detailed representation of a reply handler.
Unique identifier for the reply handler
Short label describing the type of incoming reply this handler covers
Instructions for how to handle replies of this type
Optional sample answer used as a few-shot example
Tone applied to generated replies
confident, persuasive, witty, straightforward, empathetic Target length for generated replies
superShort, short, medium, long Reference URLs the AI SDR can quote when generating a reply
Media items attached to this reply handler. Managed via the /media sub-resource.
Show child attributes
Show child attributes
How generated replies for this handler are delivered
draft, auto, stopAndNotify Extra recipient notified when a reply is handled with stopAndNotify. Ignored for other delivery modes.
Timestamp when the reply handler was created