curl --request POST \
--url https://api.reply.io/v3/reporting/emails \
--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": []
}
}
'import requests
url = "https://api.reply.io/v3/reporting/emails"
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": []
} }
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: []
}
})
};
fetch('https://api.reply.io/v3/reporting/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/reporting/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' => [
'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' => [
]
]
]),
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"
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}")
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")
.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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/reporting/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 \"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}"
response = http.request(request)
puts response.read_body{
"items": [
{
"contactId": 123,
"firstName": "<string>",
"lastName": "<string>",
"email": "jsmith@example.com",
"company": "<string>",
"emailAccountId": 123,
"emailAccountEmail": "jsmith@example.com",
"sequenceId": 123,
"sequenceName": "<string>",
"sequenceStepNumber": 123,
"sequenceStepDisplayName": "<string>",
"deliveryDate": "2023-11-07T05:31:56Z",
"isDelivered": true,
"isOpened": true,
"isReplied": true,
"isInterested": true,
"isBounced": true,
"isClicked": true,
"isOptedOut": true
}
],
"hasMore": true
}List email activity
reporting:read scope (or a broader one that includes it).
Use this endpoint when you need the individual emails behind the email report rather than its totals — one row per email sent, carrying the contact, the email account it was sent from, the sequence and step it belongs to, its delivery date, and whether it was delivered, opened, clicked, replied to, marked interested, bounced or opted out. Results are returned as a page controlled by the top and skip query parameters; omit both to get the first page. 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 return one-off emails sent outside any sequence. Rows cover your whole team unless you narrow them with userIds or teamIds, and if your role only exposes your own activity you see only your own 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 \
--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": []
}
}
'import requests
url = "https://api.reply.io/v3/reporting/emails"
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": []
} }
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: []
}
})
};
fetch('https://api.reply.io/v3/reporting/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/reporting/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' => [
'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' => [
]
]
]),
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"
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}")
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")
.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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/reporting/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 \"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}"
response = http.request(request)
puts response.read_body{
"items": [
{
"contactId": 123,
"firstName": "<string>",
"lastName": "<string>",
"email": "jsmith@example.com",
"company": "<string>",
"emailAccountId": 123,
"emailAccountEmail": "jsmith@example.com",
"sequenceId": 123,
"sequenceName": "<string>",
"sequenceStepNumber": 123,
"sequenceStepDisplayName": "<string>",
"deliveryDate": "2023-11-07T05:31:56Z",
"isDelivered": true,
"isOpened": true,
"isReplied": true,
"isInterested": true,
"isBounced": true,
"isClicked": true,
"isOptedOut": true
}
],
"hasMore": true
}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.
Query Parameters
Number of records to return (page size)
x >= 1Number of records to skip
x >= 0Body
Filters specific to email reporting endpoints
Show child attributes
Show child attributes