curl --request POST \
--url https://api.reply.io/v3/ai-sdr/approvals/send-bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"sequenceId": 2,
"contactId": 2
}
]
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/approvals/send-bulk"
payload = { "items": [
{
"sequenceId": 2,
"contactId": 2
}
] }
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({items: [{sequenceId: 2, contactId: 2}]})
};
fetch('https://api.reply.io/v3/ai-sdr/approvals/send-bulk', 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/approvals/send-bulk",
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([
'items' => [
[
'sequenceId' => 2,
'contactId' => 2
]
]
]),
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/approvals/send-bulk"
payload := strings.NewReader("{\n \"items\": [\n {\n \"sequenceId\": 2,\n \"contactId\": 2\n }\n ]\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/approvals/send-bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"sequenceId\": 2,\n \"contactId\": 2\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/approvals/send-bulk")
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 \"items\": [\n {\n \"sequenceId\": 2,\n \"contactId\": 2\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/items",
"detail": "Items must contain at most 20 items."
}
]
}{
"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": "salesAgentApproval.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "No pending approval found for: (sequence 100, contact 200)",
"code": "salesAgentApproval.notFound"
}Send a batch of pending approvals
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 approve and send several queued drafts in one call. Pass items as a list of at most 20 sequenceId and contactId pairs, each identifying one pending approval. The batch is all or nothing: every pair is matched to a pending approval before anything is sent, and if any of them has none, nothing is sent and the response names the pairs that could not be matched. Drafts go out exactly as generated — to change a body or subject first, use the per-contact send endpoint. A successful call returns no content. The AI SDR feature must be enabled for your team.
curl --request POST \
--url https://api.reply.io/v3/ai-sdr/approvals/send-bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"sequenceId": 2,
"contactId": 2
}
]
}
'import requests
url = "https://api.reply.io/v3/ai-sdr/approvals/send-bulk"
payload = { "items": [
{
"sequenceId": 2,
"contactId": 2
}
] }
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({items: [{sequenceId: 2, contactId: 2}]})
};
fetch('https://api.reply.io/v3/ai-sdr/approvals/send-bulk', 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/approvals/send-bulk",
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([
'items' => [
[
'sequenceId' => 2,
'contactId' => 2
]
]
]),
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/approvals/send-bulk"
payload := strings.NewReader("{\n \"items\": [\n {\n \"sequenceId\": 2,\n \"contactId\": 2\n }\n ]\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/approvals/send-bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"sequenceId\": 2,\n \"contactId\": 2\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/approvals/send-bulk")
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 \"items\": [\n {\n \"sequenceId\": 2,\n \"contactId\": 2\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/items",
"detail": "Items must contain at most 20 items."
}
]
}{
"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": "salesAgentApproval.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "No pending approval found for: (sequence 100, contact 200)",
"code": "salesAgentApproval.notFound"
}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.
Body
1 - 20 elementsShow child attributes
Show child attributes
Response
Bulk send accepted