curl --request POST \
--url https://api.reply.io/v3/inbox/threads/filter \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channels": [
"email"
],
"onlyWithMeetingIntent": true,
"from": "2026-04-01T00:00:00Z",
"to": "2026-04-30T23:59:59Z"
}
'import requests
url = "https://api.reply.io/v3/inbox/threads/filter"
payload = {
"channels": ["email"],
"onlyWithMeetingIntent": True,
"from": "2026-04-01T00:00:00Z",
"to": "2026-04-30T23:59:59Z"
}
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({
channels: ['email'],
onlyWithMeetingIntent: true,
from: '2026-04-01T00:00:00Z',
to: '2026-04-30T23:59:59Z'
})
};
fetch('https://api.reply.io/v3/inbox/threads/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/inbox/threads/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([
'channels' => [
'email'
],
'onlyWithMeetingIntent' => true,
'from' => '2026-04-01T00:00:00Z',
'to' => '2026-04-30T23:59:59Z'
]),
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/inbox/threads/filter"
payload := strings.NewReader("{\n \"channels\": [\n \"email\"\n ],\n \"onlyWithMeetingIntent\": true,\n \"from\": \"2026-04-01T00:00:00Z\",\n \"to\": \"2026-04-30T23:59:59Z\"\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/inbox/threads/filter")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channels\": [\n \"email\"\n ],\n \"onlyWithMeetingIntent\": true,\n \"from\": \"2026-04-01T00:00:00Z\",\n \"to\": \"2026-04-30T23:59:59Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/inbox/threads/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 \"channels\": [\n \"email\"\n ],\n \"onlyWithMeetingIntent\": true,\n \"from\": \"2026-04-01T00:00:00Z\",\n \"to\": \"2026-04-30T23:59:59Z\"\n}"
response = http.request(request)
puts response.read_bodyFilter inbox threads
inbox:read scope (or a broader one that includes it).
Use this endpoint when you need the inbox threads matching specific criteria — a search term, channel, owner, sequence, email or LinkedIn account, contact, category, date range, source, or only those flagged with meeting intent. Every filter field is optional, and an empty body matches the same set as the plain thread listing. Results are paged with the top and skip query parameters.
curl --request POST \
--url https://api.reply.io/v3/inbox/threads/filter \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channels": [
"email"
],
"onlyWithMeetingIntent": true,
"from": "2026-04-01T00:00:00Z",
"to": "2026-04-30T23:59:59Z"
}
'import requests
url = "https://api.reply.io/v3/inbox/threads/filter"
payload = {
"channels": ["email"],
"onlyWithMeetingIntent": True,
"from": "2026-04-01T00:00:00Z",
"to": "2026-04-30T23:59:59Z"
}
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({
channels: ['email'],
onlyWithMeetingIntent: true,
from: '2026-04-01T00:00:00Z',
to: '2026-04-30T23:59:59Z'
})
};
fetch('https://api.reply.io/v3/inbox/threads/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/inbox/threads/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([
'channels' => [
'email'
],
'onlyWithMeetingIntent' => true,
'from' => '2026-04-01T00:00:00Z',
'to' => '2026-04-30T23:59:59Z'
]),
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/inbox/threads/filter"
payload := strings.NewReader("{\n \"channels\": [\n \"email\"\n ],\n \"onlyWithMeetingIntent\": true,\n \"from\": \"2026-04-01T00:00:00Z\",\n \"to\": \"2026-04-30T23:59:59Z\"\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/inbox/threads/filter")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"channels\": [\n \"email\"\n ],\n \"onlyWithMeetingIntent\": true,\n \"from\": \"2026-04-01T00:00:00Z\",\n \"to\": \"2026-04-30T23:59:59Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/inbox/threads/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 \"channels\": [\n \"email\"\n ],\n \"onlyWithMeetingIntent\": true,\n \"from\": \"2026-04-01T00:00:00Z\",\n \"to\": \"2026-04-30T23:59:59Z\"\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
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
Filter criteria for POST /v3/inbox/threads/filter. All fields are optional — omit a field to skip that filter.
Free-text search across subject, body preview, and contact identifiers.
Restrict to threads owned by the given user. The target must be a member of the caller's team; otherwise the request fails with 400 inboxThread.invalidInput.
x >= 1x >= 1x >= 1x >= 1x >= 1Restrict to threads on the given channels. unknown is rejected by validation.
email, linkedIn x >= 1Predefined source bucket:
inbox— all threads with at least one inbound message.sent— threads where the latest activity is outbound.unread— only unread threads.aiDraft— threads with a pending AI-drafted reply.
inbox, sent, unread, aiDraft Upper bound on lastActivityDate. Must be strictly after from when both are supplied.