List pending approvals
curl --request GET \
--url https://api.reply.io/v3/ai-sdr/approvals \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/ai-sdr/approvals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reply.io/v3/ai-sdr/approvals', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.reply.io/v3/ai-sdr/approvals"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.reply.io/v3/ai-sdr/approvals")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/approvals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"sequenceId": 123,
"contactId": 123,
"contactFullName": "<string>",
"contactTitle": "<string>",
"contactCompany": "<string>",
"sequenceName": "<string>",
"channel": "email",
"stepDisplayName": "<string>",
"messageSubject": "<string>",
"messageContent": "<string>",
"isRegenerating": true,
"createdAt": "2023-11-07T05:31:56Z"
}
],
"hasMore": true
}{
"title": "Bad Request",
"status": 400,
"detail": "Parameter 'top' must be between 1 and 1000",
"code": "salesAgentApproval.invalidPagination"
}{
"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"
}Pending Approvals
List pending approvals
New. This endpoint shipped recently. If anything about it is unclear or could work better for you, tell us in the developer Slack.
ai-sdr:read scope (or a broader one that includes it).
Work through the AI messages your team’s sequences have queued for approval. Paged with top and skip, filterable by sequence.
GET
/
v3
/
ai-sdr
/
approvals
List pending approvals
curl --request GET \
--url https://api.reply.io/v3/ai-sdr/approvals \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/ai-sdr/approvals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reply.io/v3/ai-sdr/approvals', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.reply.io/v3/ai-sdr/approvals"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.reply.io/v3/ai-sdr/approvals")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/ai-sdr/approvals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"sequenceId": 123,
"contactId": 123,
"contactFullName": "<string>",
"contactTitle": "<string>",
"contactCompany": "<string>",
"sequenceName": "<string>",
"channel": "email",
"stepDisplayName": "<string>",
"messageSubject": "<string>",
"messageContent": "<string>",
"isRegenerating": true,
"createdAt": "2023-11-07T05:31:56Z"
}
],
"hasMore": true
}{
"title": "Bad Request",
"status": 400,
"detail": "Parameter 'top' must be between 1 and 1000",
"code": "salesAgentApproval.invalidPagination"
}{
"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"
}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.
Query Parameters
Maximum number of items to return (default 100, max 1000)
Number of items to skip
Filter by sequence id
Filter by approval owner (user id)
Filter by message channel
Available options:
email, linkedIn Order of returned items (default newestFirst)
Available options:
newestFirst, oldestFirst