curl --request POST \
--url https://api.reply.io/v3/contacts/filter \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rules": [
{
"property": "<string>",
"condition": "<string>",
"value": "<string>"
}
],
"listId": 123,
"sequenceId": 123,
"sequenceStepId": 123,
"searchTerm": "<string>",
"sortBy": "<string>",
"sortDirection": "<string>"
}
'import requests
url = "https://api.reply.io/v3/contacts/filter"
payload = {
"rules": [
{
"property": "<string>",
"condition": "<string>",
"value": "<string>"
}
],
"listId": 123,
"sequenceId": 123,
"sequenceStepId": 123,
"searchTerm": "<string>",
"sortBy": "<string>",
"sortDirection": "<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({
rules: [{property: '<string>', condition: '<string>', value: '<string>'}],
listId: 123,
sequenceId: 123,
sequenceStepId: 123,
searchTerm: '<string>',
sortBy: '<string>',
sortDirection: '<string>'
})
};
fetch('https://api.reply.io/v3/contacts/filter', 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/contacts/filter",
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([
'rules' => [
[
'property' => '<string>',
'condition' => '<string>',
'value' => '<string>'
]
],
'listId' => 123,
'sequenceId' => 123,
'sequenceStepId' => 123,
'searchTerm' => '<string>',
'sortBy' => '<string>',
'sortDirection' => '<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/contacts/filter"
payload := strings.NewReader("{\n \"rules\": [\n {\n \"property\": \"<string>\",\n \"condition\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"listId\": 123,\n \"sequenceId\": 123,\n \"sequenceStepId\": 123,\n \"searchTerm\": \"<string>\",\n \"sortBy\": \"<string>\",\n \"sortDirection\": \"<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/contacts/filter")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rules\": [\n {\n \"property\": \"<string>\",\n \"condition\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"listId\": 123,\n \"sequenceId\": 123,\n \"sequenceStepId\": 123,\n \"searchTerm\": \"<string>\",\n \"sortBy\": \"<string>\",\n \"sortDirection\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contacts/filter")
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 \"rules\": [\n {\n \"property\": \"<string>\",\n \"condition\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"listId\": 123,\n \"sequenceId\": 123,\n \"sequenceStepId\": 123,\n \"searchTerm\": \"<string>\",\n \"sortBy\": \"<string>\",\n \"sortDirection\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"items": [
{
"id": 12345,
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"domain": "company.com",
"companySize": "oneThousand",
"city": "San Francisco",
"state": "CA",
"country": "United States",
"timeZoneId": "America/Los_Angeles",
"phone": "+1-415-555-0123",
"phoneStatus": "valid",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"linkedInSalesNavigatorUrl": "https://www.linkedin.com/sales/profile/123456",
"linkedInRecruiterUrl": "https://www.linkedin.com/recruiter/profile/789012",
"industry": "Software & Technology",
"notes": "Met at SaaS Conference 2024",
"ownerUserId": 42,
"accountId": 100,
"isOptedOut": false,
"callStatus": "toCall",
"meetingStatus": "none",
"addingDate": "2024-03-08T10:00:00+00:00",
"createdAt": "2024-03-08T10:00:00",
"lastModifiedAt": "2024-03-10T15:30:00",
"customFields": [
{
"key": "leadSource",
"value": "Conference"
},
{
"key": "budget",
"value": "100k-250k"
}
]
}
],
"hasMore": true
}Filter contacts
contacts:read scope (or a broader one that includes it).
Use this endpoint when you need a filtered, sorted page of contacts that a plain email or LinkedIn lookup cannot express. Combine field rules (property, condition, value) with optional scoping by list, sequence, or sequence step, a free-text search term, and a sort order. Results are paged with the top and skip query parameters. To get only the total for the same criteria, use filter/count.
curl --request POST \
--url https://api.reply.io/v3/contacts/filter \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rules": [
{
"property": "<string>",
"condition": "<string>",
"value": "<string>"
}
],
"listId": 123,
"sequenceId": 123,
"sequenceStepId": 123,
"searchTerm": "<string>",
"sortBy": "<string>",
"sortDirection": "<string>"
}
'import requests
url = "https://api.reply.io/v3/contacts/filter"
payload = {
"rules": [
{
"property": "<string>",
"condition": "<string>",
"value": "<string>"
}
],
"listId": 123,
"sequenceId": 123,
"sequenceStepId": 123,
"searchTerm": "<string>",
"sortBy": "<string>",
"sortDirection": "<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({
rules: [{property: '<string>', condition: '<string>', value: '<string>'}],
listId: 123,
sequenceId: 123,
sequenceStepId: 123,
searchTerm: '<string>',
sortBy: '<string>',
sortDirection: '<string>'
})
};
fetch('https://api.reply.io/v3/contacts/filter', 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/contacts/filter",
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([
'rules' => [
[
'property' => '<string>',
'condition' => '<string>',
'value' => '<string>'
]
],
'listId' => 123,
'sequenceId' => 123,
'sequenceStepId' => 123,
'searchTerm' => '<string>',
'sortBy' => '<string>',
'sortDirection' => '<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/contacts/filter"
payload := strings.NewReader("{\n \"rules\": [\n {\n \"property\": \"<string>\",\n \"condition\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"listId\": 123,\n \"sequenceId\": 123,\n \"sequenceStepId\": 123,\n \"searchTerm\": \"<string>\",\n \"sortBy\": \"<string>\",\n \"sortDirection\": \"<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/contacts/filter")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rules\": [\n {\n \"property\": \"<string>\",\n \"condition\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"listId\": 123,\n \"sequenceId\": 123,\n \"sequenceStepId\": 123,\n \"searchTerm\": \"<string>\",\n \"sortBy\": \"<string>\",\n \"sortDirection\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contacts/filter")
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 \"rules\": [\n {\n \"property\": \"<string>\",\n \"condition\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"listId\": 123,\n \"sequenceId\": 123,\n \"sequenceStepId\": 123,\n \"searchTerm\": \"<string>\",\n \"sortBy\": \"<string>\",\n \"sortDirection\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"items": [
{
"id": 12345,
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"title": "Senior Product Manager",
"company": "Tech Solutions Inc",
"domain": "company.com",
"companySize": "oneThousand",
"city": "San Francisco",
"state": "CA",
"country": "United States",
"timeZoneId": "America/Los_Angeles",
"phone": "+1-415-555-0123",
"phoneStatus": "valid",
"linkedInUrl": "https://www.linkedin.com/in/johndoe",
"linkedInSalesNavigatorUrl": "https://www.linkedin.com/sales/profile/123456",
"linkedInRecruiterUrl": "https://www.linkedin.com/recruiter/profile/789012",
"industry": "Software & Technology",
"notes": "Met at SaaS Conference 2024",
"ownerUserId": 42,
"accountId": 100,
"isOptedOut": false,
"callStatus": "toCall",
"meetingStatus": "none",
"addingDate": "2024-03-08T10:00:00+00:00",
"createdAt": "2024-03-08T10:00:00",
"lastModifiedAt": "2024-03-10T15:30:00",
"customFields": [
{
"key": "leadSource",
"value": "Conference"
},
{
"key": "budget",
"value": "100k-250k"
}
]
}
],
"hasMore": true
}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 contacts to return (default 25, max 1000)
Number of contacts to skip
Body
Show child attributes
Show child attributes
Filter by contact list ID
Filter by sequence ID
Filter by sequence step ID
Free-text search term
Field to sort by
Sort direction (asc or desc)