curl --request POST \
--url https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"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"
],
"deliveryMode": "draft"
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers"
payload = {
"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"],
"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({
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'],
deliveryMode: 'draft'
})
};
fetch('https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers', 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",
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([
'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'
],
'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}/reply-handlers"
payload := strings.NewReader("{\n \"typeOfQuestion\": \"Pricing inquiry\",\n \"instructions\": \"Quote our published tiered pricing; offer a discovery call for enterprise.\",\n \"sampleAnswer\": \"Thanks for asking! Our tiered pricing starts at $X...\",\n \"toneOfVoice\": \"confident\",\n \"responseLength\": \"medium\",\n \"links\": [\n \"https://example.com/pricing\"\n ],\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}/reply-handlers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"typeOfQuestion\": \"Pricing inquiry\",\n \"instructions\": \"Quote our published tiered pricing; offer a discovery call for enterprise.\",\n \"sampleAnswer\": \"Thanks for asking! Our tiered pricing starts at $X...\",\n \"toneOfVoice\": \"confident\",\n \"responseLength\": \"medium\",\n \"links\": [\n \"https://example.com/pricing\"\n ],\n \"deliveryMode\": \"draft\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers")
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 \"typeOfQuestion\": \"Pricing inquiry\",\n \"instructions\": \"Quote our published tiered pricing; offer a discovery call for enterprise.\",\n \"sampleAnswer\": \"Thanks for asking! Our tiered pricing starts at $X...\",\n \"toneOfVoice\": \"confident\",\n \"responseLength\": \"medium\",\n \"links\": [\n \"https://example.com/pricing\"\n ],\n \"deliveryMode\": \"draft\"\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"
}Create a reply handler
ai-sdr:write scope (or a broader one that includes it).
Tell the AI SDR how to handle one recurring kind of reply. The question type and instructions are required; a sample answer helps.
curl --request POST \
--url https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"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"
],
"deliveryMode": "draft"
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers"
payload = {
"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"],
"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({
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'],
deliveryMode: 'draft'
})
};
fetch('https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers', 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",
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([
'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'
],
'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}/reply-handlers"
payload := strings.NewReader("{\n \"typeOfQuestion\": \"Pricing inquiry\",\n \"instructions\": \"Quote our published tiered pricing; offer a discovery call for enterprise.\",\n \"sampleAnswer\": \"Thanks for asking! Our tiered pricing starts at $X...\",\n \"toneOfVoice\": \"confident\",\n \"responseLength\": \"medium\",\n \"links\": [\n \"https://example.com/pricing\"\n ],\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}/reply-handlers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"typeOfQuestion\": \"Pricing inquiry\",\n \"instructions\": \"Quote our published tiered pricing; offer a discovery call for enterprise.\",\n \"sampleAnswer\": \"Thanks for asking! Our tiered pricing starts at $X...\",\n \"toneOfVoice\": \"confident\",\n \"responseLength\": \"medium\",\n \"links\": [\n \"https://example.com/pricing\"\n ],\n \"deliveryMode\": \"draft\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/knowledge-bases/{knowledge_base_id}/reply-handlers")
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 \"typeOfQuestion\": \"Pricing inquiry\",\n \"instructions\": \"Quote our published tiered pricing; offer a discovery call for enterprise.\",\n \"sampleAnswer\": \"Thanks for asking! Our tiered pricing starts at $X...\",\n \"toneOfVoice\": \"confident\",\n \"responseLength\": \"medium\",\n \"links\": [\n \"https://example.com/pricing\"\n ],\n \"deliveryMode\": \"draft\"\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
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 reply handler.
Short label describing the type of incoming reply this handler covers
1 - 256Instructions for how to handle replies of this type
1 - 2048Optional sample answer 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 - 256How generated replies for this handler are delivered. Defaults to draft when omitted.
draft, auto, stopAndNotify Extra recipient notified when a reply is handled with stopAndNotify. Ignored for other delivery modes.
128Response
Reply handler created 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