curl --request POST \
--url https://api.reply.io/v3/reporting/emails/overview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-03-01T00:00:00Z",
"dateRangePreset": "lastWeek",
"teamIds": [
123
],
"userIds": [
123
],
"contactListIds": [
123
],
"emailValidationStatuses": [],
"companies": [
"<string>"
],
"companySizes": [],
"industries": [
"<string>"
],
"cities": [
"<string>"
],
"states": [
"<string>"
],
"countries": [
"<string>"
],
"titles": [
"<string>"
],
"sequenceIds": [
123
],
"includeOutOfSequence": false,
"emailProviders": [],
"emailAccountIds": [
123
],
"emailSendingSources": [],
"bounceTypes": [],
"sentiments": []
},
"compareTo": {
"from": "2025-12-01T00:00:00Z",
"to": "2025-12-31T00:00:00Z"
}
}
'import requests
url = "https://api.reply.io/v3/reporting/emails/overview"
payload = {
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-03-01T00:00:00Z",
"dateRangePreset": "lastWeek",
"teamIds": [123],
"userIds": [123],
"contactListIds": [123],
"emailValidationStatuses": [],
"companies": ["<string>"],
"companySizes": [],
"industries": ["<string>"],
"cities": ["<string>"],
"states": ["<string>"],
"countries": ["<string>"],
"titles": ["<string>"],
"sequenceIds": [123],
"includeOutOfSequence": False,
"emailProviders": [],
"emailAccountIds": [123],
"emailSendingSources": [],
"bounceTypes": [],
"sentiments": []
},
"compareTo": {
"from": "2025-12-01T00:00:00Z",
"to": "2025-12-31T00:00:00Z"
}
}
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-03-01T00:00:00Z',
dateRangePreset: 'lastWeek',
teamIds: [123],
userIds: [123],
contactListIds: [123],
emailValidationStatuses: [],
companies: ['<string>'],
companySizes: [],
industries: ['<string>'],
cities: ['<string>'],
states: ['<string>'],
countries: ['<string>'],
titles: ['<string>'],
sequenceIds: [123],
includeOutOfSequence: false,
emailProviders: [],
emailAccountIds: [123],
emailSendingSources: [],
bounceTypes: [],
sentiments: []
},
compareTo: {from: '2025-12-01T00:00:00Z', to: '2025-12-31T00:00:00Z'}
})
};
fetch('https://api.reply.io/v3/reporting/emails/overview', 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/reporting/emails/overview",
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-03-01T00:00:00Z',
'dateRangePreset' => 'lastWeek',
'teamIds' => [
123
],
'userIds' => [
123
],
'contactListIds' => [
123
],
'emailValidationStatuses' => [
],
'companies' => [
'<string>'
],
'companySizes' => [
],
'industries' => [
'<string>'
],
'cities' => [
'<string>'
],
'states' => [
'<string>'
],
'countries' => [
'<string>'
],
'titles' => [
'<string>'
],
'sequenceIds' => [
123
],
'includeOutOfSequence' => false,
'emailProviders' => [
],
'emailAccountIds' => [
123
],
'emailSendingSources' => [
],
'bounceTypes' => [
],
'sentiments' => [
]
],
'compareTo' => [
'from' => '2025-12-01T00:00:00Z',
'to' => '2025-12-31T00:00:00Z'
]
]),
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/reporting/emails/overview"
payload := strings.NewReader("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-03-01T00:00:00Z\",\n \"dateRangePreset\": \"lastWeek\",\n \"teamIds\": [\n 123\n ],\n \"userIds\": [\n 123\n ],\n \"contactListIds\": [\n 123\n ],\n \"emailValidationStatuses\": [],\n \"companies\": [\n \"<string>\"\n ],\n \"companySizes\": [],\n \"industries\": [\n \"<string>\"\n ],\n \"cities\": [\n \"<string>\"\n ],\n \"states\": [\n \"<string>\"\n ],\n \"countries\": [\n \"<string>\"\n ],\n \"titles\": [\n \"<string>\"\n ],\n \"sequenceIds\": [\n 123\n ],\n \"includeOutOfSequence\": false,\n \"emailProviders\": [],\n \"emailAccountIds\": [\n 123\n ],\n \"emailSendingSources\": [],\n \"bounceTypes\": [],\n \"sentiments\": []\n },\n \"compareTo\": {\n \"from\": \"2025-12-01T00:00:00Z\",\n \"to\": \"2025-12-31T00:00:00Z\"\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/reporting/emails/overview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-03-01T00:00:00Z\",\n \"dateRangePreset\": \"lastWeek\",\n \"teamIds\": [\n 123\n ],\n \"userIds\": [\n 123\n ],\n \"contactListIds\": [\n 123\n ],\n \"emailValidationStatuses\": [],\n \"companies\": [\n \"<string>\"\n ],\n \"companySizes\": [],\n \"industries\": [\n \"<string>\"\n ],\n \"cities\": [\n \"<string>\"\n ],\n \"states\": [\n \"<string>\"\n ],\n \"countries\": [\n \"<string>\"\n ],\n \"titles\": [\n \"<string>\"\n ],\n \"sequenceIds\": [\n 123\n ],\n \"includeOutOfSequence\": false,\n \"emailProviders\": [],\n \"emailAccountIds\": [\n 123\n ],\n \"emailSendingSources\": [],\n \"bounceTypes\": [],\n \"sentiments\": []\n },\n \"compareTo\": {\n \"from\": \"2025-12-01T00:00:00Z\",\n \"to\": \"2025-12-31T00:00:00Z\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/reporting/emails/overview")
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-03-01T00:00:00Z\",\n \"dateRangePreset\": \"lastWeek\",\n \"teamIds\": [\n 123\n ],\n \"userIds\": [\n 123\n ],\n \"contactListIds\": [\n 123\n ],\n \"emailValidationStatuses\": [],\n \"companies\": [\n \"<string>\"\n ],\n \"companySizes\": [],\n \"industries\": [\n \"<string>\"\n ],\n \"cities\": [\n \"<string>\"\n ],\n \"states\": [\n \"<string>\"\n ],\n \"countries\": [\n \"<string>\"\n ],\n \"titles\": [\n \"<string>\"\n ],\n \"sequenceIds\": [\n 123\n ],\n \"includeOutOfSequence\": false,\n \"emailProviders\": [],\n \"emailAccountIds\": [\n 123\n ],\n \"emailSendingSources\": [],\n \"bounceTypes\": [],\n \"sentiments\": []\n },\n \"compareTo\": {\n \"from\": \"2025-12-01T00:00:00Z\",\n \"to\": \"2025-12-31T00:00:00Z\"\n }\n}"
response = http.request(request)
puts response.read_body{
"contacted": 123,
"delivered": 123,
"opened": 123,
"replied": 123,
"interested": 123,
"notReached": 123,
"optedOut": 123,
"outOfOffice": 123,
"bounced": 123,
"autoReplied": 123,
"meetingsBooked": 123,
"accounts": 123,
"deliveredPercentage": 123,
"openedPercentage": 123,
"repliedPercentage": 123,
"interestedPercentage": 123,
"notReachedPercentage": 123,
"optedOutPercentage": 123,
"outOfOfficePercentage": 123,
"bouncedPercentage": 123,
"autoRepliedPercentage": 123,
"meetingsBookedPercentage": 123
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/filters/from",
"detail": "'from' must be a valid ISO 8601 date."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ViewReports] are denied for userId 123.",
"code": "reports.forbidden"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "API calls quota exceeded! maximum admitted 100 per 1m."
}Get email reporting overview
reporting:read scope (or a broader one that includes it).
Use this endpoint when you need the headline email numbers for a period as one team-wide total with no per-member or per-sequence split — how many contacts were reached, and how many of them were delivered to, opened, replied, showed interest, bounced, auto-replied, were out of office, opted out or booked a meeting, each counted in distinct contacts and paired with its rate. Use the emails endpoint instead when you need the individual sent emails behind these totals. The request body must carry a filters object; set the window inside it with either from and to or a dateRangePreset — the two cannot be combined, sending neither gives you the last seven days, and both are read in the time zone configured on your Reply account; set includeOutOfSequence to true to also count one-off emails sent outside any sequence. Figures cover your whole team unless you narrow them with userIds or teamIds, and if your role only exposes your own activity you get your own numbers whatever you pass. Reporting must be enabled for your team, and your role must allow viewing the email report.
curl --request POST \
--url https://api.reply.io/v3/reporting/emails/overview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-03-01T00:00:00Z",
"dateRangePreset": "lastWeek",
"teamIds": [
123
],
"userIds": [
123
],
"contactListIds": [
123
],
"emailValidationStatuses": [],
"companies": [
"<string>"
],
"companySizes": [],
"industries": [
"<string>"
],
"cities": [
"<string>"
],
"states": [
"<string>"
],
"countries": [
"<string>"
],
"titles": [
"<string>"
],
"sequenceIds": [
123
],
"includeOutOfSequence": false,
"emailProviders": [],
"emailAccountIds": [
123
],
"emailSendingSources": [],
"bounceTypes": [],
"sentiments": []
},
"compareTo": {
"from": "2025-12-01T00:00:00Z",
"to": "2025-12-31T00:00:00Z"
}
}
'import requests
url = "https://api.reply.io/v3/reporting/emails/overview"
payload = {
"filters": {
"from": "2026-01-01T00:00:00Z",
"to": "2026-03-01T00:00:00Z",
"dateRangePreset": "lastWeek",
"teamIds": [123],
"userIds": [123],
"contactListIds": [123],
"emailValidationStatuses": [],
"companies": ["<string>"],
"companySizes": [],
"industries": ["<string>"],
"cities": ["<string>"],
"states": ["<string>"],
"countries": ["<string>"],
"titles": ["<string>"],
"sequenceIds": [123],
"includeOutOfSequence": False,
"emailProviders": [],
"emailAccountIds": [123],
"emailSendingSources": [],
"bounceTypes": [],
"sentiments": []
},
"compareTo": {
"from": "2025-12-01T00:00:00Z",
"to": "2025-12-31T00:00:00Z"
}
}
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-03-01T00:00:00Z',
dateRangePreset: 'lastWeek',
teamIds: [123],
userIds: [123],
contactListIds: [123],
emailValidationStatuses: [],
companies: ['<string>'],
companySizes: [],
industries: ['<string>'],
cities: ['<string>'],
states: ['<string>'],
countries: ['<string>'],
titles: ['<string>'],
sequenceIds: [123],
includeOutOfSequence: false,
emailProviders: [],
emailAccountIds: [123],
emailSendingSources: [],
bounceTypes: [],
sentiments: []
},
compareTo: {from: '2025-12-01T00:00:00Z', to: '2025-12-31T00:00:00Z'}
})
};
fetch('https://api.reply.io/v3/reporting/emails/overview', 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/reporting/emails/overview",
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-03-01T00:00:00Z',
'dateRangePreset' => 'lastWeek',
'teamIds' => [
123
],
'userIds' => [
123
],
'contactListIds' => [
123
],
'emailValidationStatuses' => [
],
'companies' => [
'<string>'
],
'companySizes' => [
],
'industries' => [
'<string>'
],
'cities' => [
'<string>'
],
'states' => [
'<string>'
],
'countries' => [
'<string>'
],
'titles' => [
'<string>'
],
'sequenceIds' => [
123
],
'includeOutOfSequence' => false,
'emailProviders' => [
],
'emailAccountIds' => [
123
],
'emailSendingSources' => [
],
'bounceTypes' => [
],
'sentiments' => [
]
],
'compareTo' => [
'from' => '2025-12-01T00:00:00Z',
'to' => '2025-12-31T00:00:00Z'
]
]),
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/reporting/emails/overview"
payload := strings.NewReader("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-03-01T00:00:00Z\",\n \"dateRangePreset\": \"lastWeek\",\n \"teamIds\": [\n 123\n ],\n \"userIds\": [\n 123\n ],\n \"contactListIds\": [\n 123\n ],\n \"emailValidationStatuses\": [],\n \"companies\": [\n \"<string>\"\n ],\n \"companySizes\": [],\n \"industries\": [\n \"<string>\"\n ],\n \"cities\": [\n \"<string>\"\n ],\n \"states\": [\n \"<string>\"\n ],\n \"countries\": [\n \"<string>\"\n ],\n \"titles\": [\n \"<string>\"\n ],\n \"sequenceIds\": [\n 123\n ],\n \"includeOutOfSequence\": false,\n \"emailProviders\": [],\n \"emailAccountIds\": [\n 123\n ],\n \"emailSendingSources\": [],\n \"bounceTypes\": [],\n \"sentiments\": []\n },\n \"compareTo\": {\n \"from\": \"2025-12-01T00:00:00Z\",\n \"to\": \"2025-12-31T00:00:00Z\"\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/reporting/emails/overview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"from\": \"2026-01-01T00:00:00Z\",\n \"to\": \"2026-03-01T00:00:00Z\",\n \"dateRangePreset\": \"lastWeek\",\n \"teamIds\": [\n 123\n ],\n \"userIds\": [\n 123\n ],\n \"contactListIds\": [\n 123\n ],\n \"emailValidationStatuses\": [],\n \"companies\": [\n \"<string>\"\n ],\n \"companySizes\": [],\n \"industries\": [\n \"<string>\"\n ],\n \"cities\": [\n \"<string>\"\n ],\n \"states\": [\n \"<string>\"\n ],\n \"countries\": [\n \"<string>\"\n ],\n \"titles\": [\n \"<string>\"\n ],\n \"sequenceIds\": [\n 123\n ],\n \"includeOutOfSequence\": false,\n \"emailProviders\": [],\n \"emailAccountIds\": [\n 123\n ],\n \"emailSendingSources\": [],\n \"bounceTypes\": [],\n \"sentiments\": []\n },\n \"compareTo\": {\n \"from\": \"2025-12-01T00:00:00Z\",\n \"to\": \"2025-12-31T00:00:00Z\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/reporting/emails/overview")
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-03-01T00:00:00Z\",\n \"dateRangePreset\": \"lastWeek\",\n \"teamIds\": [\n 123\n ],\n \"userIds\": [\n 123\n ],\n \"contactListIds\": [\n 123\n ],\n \"emailValidationStatuses\": [],\n \"companies\": [\n \"<string>\"\n ],\n \"companySizes\": [],\n \"industries\": [\n \"<string>\"\n ],\n \"cities\": [\n \"<string>\"\n ],\n \"states\": [\n \"<string>\"\n ],\n \"countries\": [\n \"<string>\"\n ],\n \"titles\": [\n \"<string>\"\n ],\n \"sequenceIds\": [\n 123\n ],\n \"includeOutOfSequence\": false,\n \"emailProviders\": [],\n \"emailAccountIds\": [\n 123\n ],\n \"emailSendingSources\": [],\n \"bounceTypes\": [],\n \"sentiments\": []\n },\n \"compareTo\": {\n \"from\": \"2025-12-01T00:00:00Z\",\n \"to\": \"2025-12-31T00:00:00Z\"\n }\n}"
response = http.request(request)
puts response.read_body{
"contacted": 123,
"delivered": 123,
"opened": 123,
"replied": 123,
"interested": 123,
"notReached": 123,
"optedOut": 123,
"outOfOffice": 123,
"bounced": 123,
"autoReplied": 123,
"meetingsBooked": 123,
"accounts": 123,
"deliveredPercentage": 123,
"openedPercentage": 123,
"repliedPercentage": 123,
"interestedPercentage": 123,
"notReachedPercentage": 123,
"optedOutPercentage": 123,
"outOfOfficePercentage": 123,
"bouncedPercentage": 123,
"autoRepliedPercentage": 123,
"meetingsBookedPercentage": 123
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/filters/from",
"detail": "'from' must be a valid ISO 8601 date."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ViewReports] are denied for userId 123.",
"code": "reports.forbidden"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "API calls quota exceeded! maximum admitted 100 per 1m."
}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
Response
Email overview with trends retrieved successfully
Email delivery and engagement metrics
Number of people contacted
Number of emails delivered
Number of emails opened
Number of emails replied to
Number of replies marked as interested
Number of contacts not reached
Number of opt-outs
Number of out-of-office replies
Number of bounced emails
Number of auto-replies received
Number of meetings booked from emails
Total number of email accounts used
Delivery rate as a percentage (0–100)
Open rate as a percentage (0–100)
Reply rate as a percentage (0–100)
Interested rate as a percentage (0–100)
Not-reached rate as a percentage (0–100)
Opt-out rate as a percentage (0–100)
Out-of-office rate as a percentage (0–100)
Bounce rate as a percentage (0–100)
Auto-reply rate as a percentage (0–100)
Meetings booked rate as a percentage (0–100)