Get sequence stats
curl --request POST \
--url https://api.reply.io/v3/sequences/{id}/stats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23:59:59Z"
}
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/stats"
payload = { "filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23: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({filters: {from: '2026-01-01T00:00:00Z', to: '2026-01-31T23:59:59Z'}})
};
fetch('https://api.reply.io/v3/sequences/{id}/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/{id}/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'
]
]),
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/{id}/stats"
payload := strings.NewReader("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\"\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/{id}/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 }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/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 }\n}"
response = http.request(request)
puts response.read_body{
"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
}
}Sequences
Get sequence stats
Requires the
sequences:read scope (or a broader one that includes it).
Get engagement figures for one sequence. Set the window with a date range preset or an explicit from and to, not both.
POST
/
v3
/
sequences
/
{id}
/
stats
Get sequence stats
curl --request POST \
--url https://api.reply.io/v3/sequences/{id}/stats \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23:59:59Z"
}
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/stats"
payload = { "filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-01-31T23: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({filters: {from: '2026-01-01T00:00:00Z', to: '2026-01-31T23:59:59Z'}})
};
fetch('https://api.reply.io/v3/sequences/{id}/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/{id}/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'
]
]),
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/{id}/stats"
payload := strings.NewReader("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-01-31T23:59:59Z\"\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/{id}/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 }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/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 }\n}"
response = http.request(request)
puts response.read_body{
"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.
Path Parameters
Sequence ID
Required range:
x >= 1Body
application/json
Request body for sequence stats. 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
Show child attributes
Show child attributes
Response
Sequence stats retrieved successfully