curl --request POST \
--url https://api.reply.io/v3/sequences/{id}/stats/emails \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"dateRangePreset": "lastMonth"
}
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/stats/emails"
payload = { "filters": { "dateRangePreset": "lastMonth" } }
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: {dateRangePreset: 'lastMonth'}})
};
fetch('https://api.reply.io/v3/sequences/{id}/stats/emails', 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/emails",
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' => [
'dateRangePreset' => 'lastMonth'
]
]),
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/emails"
payload := strings.NewReader("{\n \"filters\": {\n \"dateRangePreset\": \"lastMonth\"\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/emails")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"dateRangePreset\": \"lastMonth\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/stats/emails")
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 \"dateRangePreset\": \"lastMonth\"\n }\n}"
response = http.request(request)
puts response.read_body{
"overview": {
"contacted": 120,
"delivered": 118,
"opened": 64,
"replied": 11,
"interested": 4,
"notReached": 2,
"optedOut": 1,
"outOfOffice": 3,
"bounced": 2,
"autoReplied": 1,
"meetingsBooked": 2,
"deliveredPercentage": 98.33,
"openedPercentage": 54.24,
"repliedPercentage": 9.32,
"interestedPercentage": 3.33,
"notReachedPercentage": 1.67,
"optedOutPercentage": 0.85,
"outOfOfficePercentage": 2.54,
"bouncedPercentage": 1.67,
"autoRepliedPercentage": 0.85,
"meetingsBookedPercentage": 1.67
},
"steps": [
{
"stepId": 3101,
"stepNumber": 1,
"displayName": "Intro email",
"isArchived": false,
"delivered": 118,
"deliveredPercentage": 98.33,
"opened": 60,
"openedPercentage": 50.85,
"replied": 8,
"repliedPercentage": 6.78,
"interested": 3,
"interestedPercentage": 2.5,
"notReached": 2,
"notReachedPercentage": 1.67,
"optedOut": 1,
"optedOutPercentage": 0.85,
"linksClicked": 9,
"clickThroughRate": 7.63,
"meetingsBooked": 2,
"meetingsBookedPercentage": 1.67,
"variants": [
{
"id": 5001,
"isEnabled": true,
"generatedByAi": false,
"delivered": 59,
"deliveredPercentage": 98.33,
"opened": 34,
"openedPercentage": 57.63,
"replied": 6,
"repliedPercentage": 10.17,
"interested": 2,
"interestedPercentage": 3.33,
"notReached": 1,
"notReachedPercentage": 1.67,
"optedOut": 0,
"optedOutPercentage": 0,
"linksClicked": 5,
"clickThroughRate": 8.47,
"meetingsBooked": 2,
"meetingsBookedPercentage": 3.33
},
{
"id": 5002,
"isEnabled": true,
"generatedByAi": false,
"delivered": 59,
"deliveredPercentage": 98.33,
"opened": 26,
"openedPercentage": 44.07,
"replied": 2,
"repliedPercentage": 3.39,
"interested": 1,
"interestedPercentage": 1.67,
"notReached": 1,
"notReachedPercentage": 1.67,
"optedOut": 1,
"optedOutPercentage": 1.69,
"linksClicked": 4,
"clickThroughRate": 6.78,
"meetingsBooked": 0,
"meetingsBookedPercentage": 0
}
]
}
]
}Get sequence email stats
Coming soon. This endpoint will be available by early October 2026.
sequences:read scope (or a broader one that includes it).
Compare A/B variants: get one sequence’s email stats per step and per variant, as on its Stats → Email tab. Set the window with a preset or from and to, not both; if omitted give you the last week.
curl --request POST \
--url https://api.reply.io/v3/sequences/{id}/stats/emails \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"dateRangePreset": "lastMonth"
}
}
'import requests
url = "https://api.reply.io/v3/sequences/{id}/stats/emails"
payload = { "filters": { "dateRangePreset": "lastMonth" } }
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: {dateRangePreset: 'lastMonth'}})
};
fetch('https://api.reply.io/v3/sequences/{id}/stats/emails', 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/emails",
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' => [
'dateRangePreset' => 'lastMonth'
]
]),
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/emails"
payload := strings.NewReader("{\n \"filters\": {\n \"dateRangePreset\": \"lastMonth\"\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/emails")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"dateRangePreset\": \"lastMonth\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/sequences/{id}/stats/emails")
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 \"dateRangePreset\": \"lastMonth\"\n }\n}"
response = http.request(request)
puts response.read_body{
"overview": {
"contacted": 120,
"delivered": 118,
"opened": 64,
"replied": 11,
"interested": 4,
"notReached": 2,
"optedOut": 1,
"outOfOffice": 3,
"bounced": 2,
"autoReplied": 1,
"meetingsBooked": 2,
"deliveredPercentage": 98.33,
"openedPercentage": 54.24,
"repliedPercentage": 9.32,
"interestedPercentage": 3.33,
"notReachedPercentage": 1.67,
"optedOutPercentage": 0.85,
"outOfOfficePercentage": 2.54,
"bouncedPercentage": 1.67,
"autoRepliedPercentage": 0.85,
"meetingsBookedPercentage": 1.67
},
"steps": [
{
"stepId": 3101,
"stepNumber": 1,
"displayName": "Intro email",
"isArchived": false,
"delivered": 118,
"deliveredPercentage": 98.33,
"opened": 60,
"openedPercentage": 50.85,
"replied": 8,
"repliedPercentage": 6.78,
"interested": 3,
"interestedPercentage": 2.5,
"notReached": 2,
"notReachedPercentage": 1.67,
"optedOut": 1,
"optedOutPercentage": 0.85,
"linksClicked": 9,
"clickThroughRate": 7.63,
"meetingsBooked": 2,
"meetingsBookedPercentage": 1.67,
"variants": [
{
"id": 5001,
"isEnabled": true,
"generatedByAi": false,
"delivered": 59,
"deliveredPercentage": 98.33,
"opened": 34,
"openedPercentage": 57.63,
"replied": 6,
"repliedPercentage": 10.17,
"interested": 2,
"interestedPercentage": 3.33,
"notReached": 1,
"notReachedPercentage": 1.67,
"optedOut": 0,
"optedOutPercentage": 0,
"linksClicked": 5,
"clickThroughRate": 8.47,
"meetingsBooked": 2,
"meetingsBookedPercentage": 3.33
},
{
"id": 5002,
"isEnabled": true,
"generatedByAi": false,
"delivered": 59,
"deliveredPercentage": 98.33,
"opened": 26,
"openedPercentage": 44.07,
"replied": 2,
"repliedPercentage": 3.39,
"interested": 1,
"interestedPercentage": 1.67,
"notReached": 1,
"notReachedPercentage": 1.67,
"optedOut": 1,
"optedOutPercentage": 1.69,
"linksClicked": 4,
"clickThroughRate": 6.78,
"meetingsBooked": 0,
"meetingsBookedPercentage": 0
}
]
}
]
}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
Date range filters for sequence stats
Show child attributes
Show child attributes
Response
Sequence email stats retrieved successfully
Email stats for one sequence, broken down per step and per A/B variant — the figures on the sequence's Stats → Email tab.
Sequence-wide email figures, counted per contact across the whole sequence — the same figures as emailOverview in POST /v3/sequences/{id}/stats.
Show child attributes
Show child attributes
One row per email step that sent at least one email in the date range, sorted by stepNumber. LinkedIn steps are not included.
Show child attributes
Show child attributes