curl --request POST \
--url https://api.reply.io/v3/sequences/stats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23:59:59Z",
"userIds": [
123
]
}
}
'import requests
url = "https://api.reply.io/v3/sequences/stats"
payload = { "filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23:59:59Z",
"userIds": [123]
} }
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: {from: '2026-01-01T00:00:00Z', to: '2026-01-31T23:59:59Z', userIds: [123]}
})
};
fetch('https://api.reply.io/v3/sequences/stats', 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/stats",
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' => [
'from' => '2026-01-01T00:00:00Z',
'to' => '2026-01-31T23:59:59Z',
'userIds' => [
123
]
]
]),
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/stats"
payload := strings.NewReader("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\",\n \"userIds\": [\n 123\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/sequences/stats")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\",\n \"userIds\": [\n 123\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/stats")
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 \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\",\n \"userIds\": [\n 123\n ]\n }\n}"
response = http.request(request)
puts response.read_body[
{
"sequenceId": 123,
"name": "<string>",
"status": "new",
"emailOverview": {
"contacted": 123,
"delivered": 123,
"opened": 123,
"replied": 123,
"interested": 123,
"notReached": 123,
"optedOut": 123,
"outOfOffice": 123,
"bounced": 123,
"autoReplied": 123,
"meetingsBooked": 123,
"deliveredPercentage": 123,
"openedPercentage": 123,
"repliedPercentage": 123,
"interestedPercentage": 123,
"notReachedPercentage": 123,
"optedOutPercentage": 123,
"outOfOfficePercentage": 123,
"bouncedPercentage": 123,
"autoRepliedPercentage": 123,
"meetingsBookedPercentage": 123
},
"linkedInOverview": {
"connectionsSent": 123,
"connectionsAccepted": 123,
"connectionsAcceptedPercentage": 123,
"messagesSent": 123,
"replied": 123,
"repliedPercentage": 123,
"inMailsSent": 123,
"inMailsReplied": 123,
"inMailsRepliedPercentage": 123,
"connectionNotesSent": 123,
"connectionNotesReplied": 123,
"connectionNotesRepliedPercentage": 123,
"profileViews": 123,
"likes": 123,
"follows": 123,
"endorses": 123,
"regularMessagesSent": 123,
"regularMessagesReplied": 123,
"regularMessagesRepliedPercentage": 123
}
}
]Get stats for all sequences
sequences:read scope (or a broader one that includes it).
Get email and LinkedIn engagement per sequence. The window is capped at 31 days, as a preset or an explicit from and to.
curl --request POST \
--url https://api.reply.io/v3/sequences/stats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23:59:59Z",
"userIds": [
123
]
}
}
'import requests
url = "https://api.reply.io/v3/sequences/stats"
payload = { "filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23:59:59Z",
"userIds": [123]
} }
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: {from: '2026-01-01T00:00:00Z', to: '2026-01-31T23:59:59Z', userIds: [123]}
})
};
fetch('https://api.reply.io/v3/sequences/stats', 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/stats",
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' => [
'from' => '2026-01-01T00:00:00Z',
'to' => '2026-01-31T23:59:59Z',
'userIds' => [
123
]
]
]),
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/stats"
payload := strings.NewReader("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\",\n \"userIds\": [\n 123\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/sequences/stats")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\",\n \"userIds\": [\n 123\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/stats")
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 \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\",\n \"userIds\": [\n 123\n ]\n }\n}"
response = http.request(request)
puts response.read_body[
{
"sequenceId": 123,
"name": "<string>",
"status": "new",
"emailOverview": {
"contacted": 123,
"delivered": 123,
"opened": 123,
"replied": 123,
"interested": 123,
"notReached": 123,
"optedOut": 123,
"outOfOffice": 123,
"bounced": 123,
"autoReplied": 123,
"meetingsBooked": 123,
"deliveredPercentage": 123,
"openedPercentage": 123,
"repliedPercentage": 123,
"interestedPercentage": 123,
"notReachedPercentage": 123,
"optedOutPercentage": 123,
"outOfOfficePercentage": 123,
"bouncedPercentage": 123,
"autoRepliedPercentage": 123,
"meetingsBookedPercentage": 123
},
"linkedInOverview": {
"connectionsSent": 123,
"connectionsAccepted": 123,
"connectionsAcceptedPercentage": 123,
"messagesSent": 123,
"replied": 123,
"repliedPercentage": 123,
"inMailsSent": 123,
"inMailsReplied": 123,
"inMailsRepliedPercentage": 123,
"connectionNotesSent": 123,
"connectionNotesReplied": 123,
"connectionNotesRepliedPercentage": 123,
"profileViews": 123,
"likes": 123,
"follows": 123,
"endorses": 123,
"regularMessagesSent": 123,
"regularMessagesReplied": 123,
"regularMessagesRepliedPercentage": 123
}
}
]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
Request body for the sequence stats list. All date filtering lives inside filters — from, to and dateRangePreset are only read there, and properties the schema does not define are ignored rather than rejected. Omit filters entirely and the report covers the lastWeek preset.
Date range filters for sequence stats list.
Restrictions: Date range is limited to one month maximum.
dateRangePresetmust belastWeekorlastMonth.lastYearandallTimeare rejected.- When using
from/to, the span must not exceed 31 days. frommust be within the last 31 days from the current date.frommust be earlier than or equal toto.
Show child attributes
Show child attributes
Response
Sequence stats list retrieved successfully
Sequence ID
Sequence name
Current sequence status
new, active, paused, archived Email engagement metrics for a sequence
Show child attributes
Show child attributes
LinkedIn engagement metrics for a sequence
Show child attributes
Show child attributes