curl --request POST \
--url https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"accountListIds": [
{
"value": 2
}
],
"industries": [
{
"value": "<string>"
}
],
"companyLocations": [
{
"value": "<string>"
}
],
"companySizes": [],
"headcountGrowth": {
"min": 1,
"max": 1
},
"departmentHeadcountGrowth": {
"department": "<string>",
"min": 1,
"max": 1
},
"accountKeywords": {
"values": [
{
"value": "<string>"
}
]
},
"isHiringOnLinkedIn": true,
"contactLocations": [
{
"value": "<string>"
}
],
"jobTitles": [
{
"value": "<string>"
}
],
"departments": [
{
"value": "<string>"
}
],
"seniorities": [
"<string>"
],
"yearsInCompany": [],
"contactKeywords": {
"values": [
{
"value": "<string>"
}
]
},
"changedJobIn90Days": true
},
"maxPeoplePerCompany": 2,
"maxPeopleToAddPerDay": 2,
"referenceUrl": "<string>"
}
'import requests
url = "https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview"
payload = {
"filters": {
"accountListIds": [{ "value": 2 }],
"industries": [{ "value": "<string>" }],
"companyLocations": [{ "value": "<string>" }],
"companySizes": [],
"headcountGrowth": {
"min": 1,
"max": 1
},
"departmentHeadcountGrowth": {
"department": "<string>",
"min": 1,
"max": 1
},
"accountKeywords": { "values": [{ "value": "<string>" }] },
"isHiringOnLinkedIn": True,
"contactLocations": [{ "value": "<string>" }],
"jobTitles": [{ "value": "<string>" }],
"departments": [{ "value": "<string>" }],
"seniorities": ["<string>"],
"yearsInCompany": [],
"contactKeywords": { "values": [{ "value": "<string>" }] },
"changedJobIn90Days": True
},
"maxPeoplePerCompany": 2,
"maxPeopleToAddPerDay": 2,
"referenceUrl": "<string>"
}
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({
filters: {
accountListIds: [{value: 2}],
industries: [{value: '<string>'}],
companyLocations: [{value: '<string>'}],
companySizes: [],
headcountGrowth: {min: 1, max: 1},
departmentHeadcountGrowth: {department: '<string>', min: 1, max: 1},
accountKeywords: {values: [{value: '<string>'}]},
isHiringOnLinkedIn: true,
contactLocations: [{value: '<string>'}],
jobTitles: [{value: '<string>'}],
departments: [{value: '<string>'}],
seniorities: ['<string>'],
yearsInCompany: [],
contactKeywords: {values: [{value: '<string>'}]},
changedJobIn90Days: true
},
maxPeoplePerCompany: 2,
maxPeopleToAddPerDay: 2,
referenceUrl: '<string>'
})
};
fetch('https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview', 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/sequences/ai-sdr/{sequence_id}/autopilot/preview",
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([
'filters' => [
'accountListIds' => [
[
'value' => 2
]
],
'industries' => [
[
'value' => '<string>'
]
],
'companyLocations' => [
[
'value' => '<string>'
]
],
'companySizes' => [
],
'headcountGrowth' => [
'min' => 1,
'max' => 1
],
'departmentHeadcountGrowth' => [
'department' => '<string>',
'min' => 1,
'max' => 1
],
'accountKeywords' => [
'values' => [
[
'value' => '<string>'
]
]
],
'isHiringOnLinkedIn' => true,
'contactLocations' => [
[
'value' => '<string>'
]
],
'jobTitles' => [
[
'value' => '<string>'
]
],
'departments' => [
[
'value' => '<string>'
]
],
'seniorities' => [
'<string>'
],
'yearsInCompany' => [
],
'contactKeywords' => [
'values' => [
[
'value' => '<string>'
]
]
],
'changedJobIn90Days' => true
],
'maxPeoplePerCompany' => 2,
'maxPeopleToAddPerDay' => 2,
'referenceUrl' => '<string>'
]),
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/sequences/ai-sdr/{sequence_id}/autopilot/preview"
payload := strings.NewReader("{\n \"filters\": {\n \"accountListIds\": [\n {\n \"value\": 2\n }\n ],\n \"industries\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companyLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companySizes\": [],\n \"headcountGrowth\": {\n \"min\": 1,\n \"max\": 1\n },\n \"departmentHeadcountGrowth\": {\n \"department\": \"<string>\",\n \"min\": 1,\n \"max\": 1\n },\n \"accountKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"isHiringOnLinkedIn\": true,\n \"contactLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"jobTitles\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"departments\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"seniorities\": [\n \"<string>\"\n ],\n \"yearsInCompany\": [],\n \"contactKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"changedJobIn90Days\": true\n },\n \"maxPeoplePerCompany\": 2,\n \"maxPeopleToAddPerDay\": 2,\n \"referenceUrl\": \"<string>\"\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/sequences/ai-sdr/{sequence_id}/autopilot/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"accountListIds\": [\n {\n \"value\": 2\n }\n ],\n \"industries\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companyLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companySizes\": [],\n \"headcountGrowth\": {\n \"min\": 1,\n \"max\": 1\n },\n \"departmentHeadcountGrowth\": {\n \"department\": \"<string>\",\n \"min\": 1,\n \"max\": 1\n },\n \"accountKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"isHiringOnLinkedIn\": true,\n \"contactLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"jobTitles\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"departments\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"seniorities\": [\n \"<string>\"\n ],\n \"yearsInCompany\": [],\n \"contactKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"changedJobIn90Days\": true\n },\n \"maxPeoplePerCompany\": 2,\n \"maxPeopleToAddPerDay\": 2,\n \"referenceUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview")
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 \"filters\": {\n \"accountListIds\": [\n {\n \"value\": 2\n }\n ],\n \"industries\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companyLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companySizes\": [],\n \"headcountGrowth\": {\n \"min\": 1,\n \"max\": 1\n },\n \"departmentHeadcountGrowth\": {\n \"department\": \"<string>\",\n \"min\": 1,\n \"max\": 1\n },\n \"accountKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"isHiringOnLinkedIn\": true,\n \"contactLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"jobTitles\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"departments\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"seniorities\": [\n \"<string>\"\n ],\n \"yearsInCompany\": [],\n \"contactKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"changedJobIn90Days\": true\n },\n \"maxPeoplePerCompany\": 2,\n \"maxPeopleToAddPerDay\": 2,\n \"referenceUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "You do not have permission to access this resource.",
"code": "sequence.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"code": "sequence.notFound"
}Preview autopilot results
Beta. This endpoint is in beta. Behavior, parameters, and response shapes may change without notice.
ai-sdr:operate scope (or a broader one that includes it).
Previews the expected autopilot results for the sequence. Clients pass the autopilot filter config in the body — they are NOT required to save it to the sequence first (supports try-before-save in the filter UI).
Returns a background job to poll via GET /v3/background-jobs/{id}; on completion its jsonDataResult carries { contactsCount, companiesCount, sampleContacts }, where sampleContacts is a capped sample of matching contacts.
Requires the AI SDR feature on the caller’s team.
curl --request POST \
--url https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"accountListIds": [
{
"value": 2
}
],
"industries": [
{
"value": "<string>"
}
],
"companyLocations": [
{
"value": "<string>"
}
],
"companySizes": [],
"headcountGrowth": {
"min": 1,
"max": 1
},
"departmentHeadcountGrowth": {
"department": "<string>",
"min": 1,
"max": 1
},
"accountKeywords": {
"values": [
{
"value": "<string>"
}
]
},
"isHiringOnLinkedIn": true,
"contactLocations": [
{
"value": "<string>"
}
],
"jobTitles": [
{
"value": "<string>"
}
],
"departments": [
{
"value": "<string>"
}
],
"seniorities": [
"<string>"
],
"yearsInCompany": [],
"contactKeywords": {
"values": [
{
"value": "<string>"
}
]
},
"changedJobIn90Days": true
},
"maxPeoplePerCompany": 2,
"maxPeopleToAddPerDay": 2,
"referenceUrl": "<string>"
}
'import requests
url = "https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview"
payload = {
"filters": {
"accountListIds": [{ "value": 2 }],
"industries": [{ "value": "<string>" }],
"companyLocations": [{ "value": "<string>" }],
"companySizes": [],
"headcountGrowth": {
"min": 1,
"max": 1
},
"departmentHeadcountGrowth": {
"department": "<string>",
"min": 1,
"max": 1
},
"accountKeywords": { "values": [{ "value": "<string>" }] },
"isHiringOnLinkedIn": True,
"contactLocations": [{ "value": "<string>" }],
"jobTitles": [{ "value": "<string>" }],
"departments": [{ "value": "<string>" }],
"seniorities": ["<string>"],
"yearsInCompany": [],
"contactKeywords": { "values": [{ "value": "<string>" }] },
"changedJobIn90Days": True
},
"maxPeoplePerCompany": 2,
"maxPeopleToAddPerDay": 2,
"referenceUrl": "<string>"
}
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({
filters: {
accountListIds: [{value: 2}],
industries: [{value: '<string>'}],
companyLocations: [{value: '<string>'}],
companySizes: [],
headcountGrowth: {min: 1, max: 1},
departmentHeadcountGrowth: {department: '<string>', min: 1, max: 1},
accountKeywords: {values: [{value: '<string>'}]},
isHiringOnLinkedIn: true,
contactLocations: [{value: '<string>'}],
jobTitles: [{value: '<string>'}],
departments: [{value: '<string>'}],
seniorities: ['<string>'],
yearsInCompany: [],
contactKeywords: {values: [{value: '<string>'}]},
changedJobIn90Days: true
},
maxPeoplePerCompany: 2,
maxPeopleToAddPerDay: 2,
referenceUrl: '<string>'
})
};
fetch('https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview', 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/sequences/ai-sdr/{sequence_id}/autopilot/preview",
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([
'filters' => [
'accountListIds' => [
[
'value' => 2
]
],
'industries' => [
[
'value' => '<string>'
]
],
'companyLocations' => [
[
'value' => '<string>'
]
],
'companySizes' => [
],
'headcountGrowth' => [
'min' => 1,
'max' => 1
],
'departmentHeadcountGrowth' => [
'department' => '<string>',
'min' => 1,
'max' => 1
],
'accountKeywords' => [
'values' => [
[
'value' => '<string>'
]
]
],
'isHiringOnLinkedIn' => true,
'contactLocations' => [
[
'value' => '<string>'
]
],
'jobTitles' => [
[
'value' => '<string>'
]
],
'departments' => [
[
'value' => '<string>'
]
],
'seniorities' => [
'<string>'
],
'yearsInCompany' => [
],
'contactKeywords' => [
'values' => [
[
'value' => '<string>'
]
]
],
'changedJobIn90Days' => true
],
'maxPeoplePerCompany' => 2,
'maxPeopleToAddPerDay' => 2,
'referenceUrl' => '<string>'
]),
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/sequences/ai-sdr/{sequence_id}/autopilot/preview"
payload := strings.NewReader("{\n \"filters\": {\n \"accountListIds\": [\n {\n \"value\": 2\n }\n ],\n \"industries\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companyLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companySizes\": [],\n \"headcountGrowth\": {\n \"min\": 1,\n \"max\": 1\n },\n \"departmentHeadcountGrowth\": {\n \"department\": \"<string>\",\n \"min\": 1,\n \"max\": 1\n },\n \"accountKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"isHiringOnLinkedIn\": true,\n \"contactLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"jobTitles\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"departments\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"seniorities\": [\n \"<string>\"\n ],\n \"yearsInCompany\": [],\n \"contactKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"changedJobIn90Days\": true\n },\n \"maxPeoplePerCompany\": 2,\n \"maxPeopleToAddPerDay\": 2,\n \"referenceUrl\": \"<string>\"\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/sequences/ai-sdr/{sequence_id}/autopilot/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"accountListIds\": [\n {\n \"value\": 2\n }\n ],\n \"industries\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companyLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companySizes\": [],\n \"headcountGrowth\": {\n \"min\": 1,\n \"max\": 1\n },\n \"departmentHeadcountGrowth\": {\n \"department\": \"<string>\",\n \"min\": 1,\n \"max\": 1\n },\n \"accountKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"isHiringOnLinkedIn\": true,\n \"contactLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"jobTitles\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"departments\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"seniorities\": [\n \"<string>\"\n ],\n \"yearsInCompany\": [],\n \"contactKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"changedJobIn90Days\": true\n },\n \"maxPeoplePerCompany\": 2,\n \"maxPeopleToAddPerDay\": 2,\n \"referenceUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/ai-sdr/{sequence_id}/autopilot/preview")
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 \"filters\": {\n \"accountListIds\": [\n {\n \"value\": 2\n }\n ],\n \"industries\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companyLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"companySizes\": [],\n \"headcountGrowth\": {\n \"min\": 1,\n \"max\": 1\n },\n \"departmentHeadcountGrowth\": {\n \"department\": \"<string>\",\n \"min\": 1,\n \"max\": 1\n },\n \"accountKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"isHiringOnLinkedIn\": true,\n \"contactLocations\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"jobTitles\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"departments\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"seniorities\": [\n \"<string>\"\n ],\n \"yearsInCompany\": [],\n \"contactKeywords\": {\n \"values\": [\n {\n \"value\": \"<string>\"\n }\n ]\n },\n \"changedJobIn90Days\": true\n },\n \"maxPeoplePerCompany\": 2,\n \"maxPeopleToAddPerDay\": 2,\n \"referenceUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "You do not have permission to access this resource.",
"code": "sequence.forbidden"
}{
"title": "Not Found",
"status": 404,
"detail": "The requested resource was not found.",
"code": "sequence.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.
Path Parameters
Sequence id
x >= 1Body
Autopilot filter configuration to preview. Does not need to be saved to the sequence first — supports try-before-save in the filter UI.
Account- and contact-level filter configuration used by autopilot when searching for new contacts to add to the sequence.
Most collections are capped at 25 items. accountKeywords and contactKeywords are always present and non-null in responses even when empty ({ "values": [], "type": "or" }).
Show child attributes
Show child attributes
Maximum contacts to consider per company
x >= 1Maximum contacts to add per day
x >= 1Optional reference URL used to seed the search
Response
Preview accepted; poll the returned job for progress and results
Background job id; poll GET /v3/background-jobs/{id}.