curl --request POST \
--url https://api.reply.io/v3/reporting/team-performance/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
]
}
}
'import requests
url = "https://api.reply.io/v3/reporting/team-performance/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]
} }
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]
}
})
};
fetch('https://api.reply.io/v3/reporting/team-performance/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/team-performance/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
]
]
]),
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/team-performance/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 }\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/team-performance/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 }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/reporting/team-performance/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 }\n}"
response = http.request(request)
puts response.read_body{
"meetings": 123,
"contacted": 123,
"meetingConversionPercentage": 123,
"touchesPerContact": 123,
"autoTouchesPerContact": 123,
"manualTouchesPerContact": 123,
"averageResponseTimePerContact": 123,
"memberStatistics": [
{
"userId": 123,
"meetings": 123,
"contacted": 123,
"conversionPercentage": 123,
"touches": 123,
"autoTouches": 123,
"manualTouches": 123,
"responseTime": 123,
"responseRate": "slow"
}
]
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/filters",
"detail": "'filters' must not be empty."
}
]
}{
"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": "Rate limit exceeded. Retry after 60 seconds."
}Get team performance overview
reporting:read scope (or a broader one that includes it).
Use this endpoint when you need to compare the people on your team over a period — meetings booked, contacts in sequences, meeting conversion rate, average touches per contact split into automated and manual, and average response time, returned both as a team total and per member under memberStatistics, keyed by userId. Members with a recorded response time also carry a responseRate of fast, average or slow, which ranks them against the other members in the same response rather than against a fixed threshold. 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. 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 team performance report.
curl --request POST \
--url https://api.reply.io/v3/reporting/team-performance/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
]
}
}
'import requests
url = "https://api.reply.io/v3/reporting/team-performance/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]
} }
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]
}
})
};
fetch('https://api.reply.io/v3/reporting/team-performance/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/team-performance/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
]
]
]),
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/team-performance/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 }\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/team-performance/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 }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/reporting/team-performance/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 }\n}"
response = http.request(request)
puts response.read_body{
"meetings": 123,
"contacted": 123,
"meetingConversionPercentage": 123,
"touchesPerContact": 123,
"autoTouchesPerContact": 123,
"manualTouchesPerContact": 123,
"averageResponseTimePerContact": 123,
"memberStatistics": [
{
"userId": 123,
"meetings": 123,
"contacted": 123,
"conversionPercentage": 123,
"touches": 123,
"autoTouches": 123,
"manualTouches": 123,
"responseTime": 123,
"responseRate": "slow"
}
]
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/filters",
"detail": "'filters' must not be empty."
}
]
}{
"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": "Rate limit exceeded. Retry after 60 seconds."
}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
Filters specific to team performance reporting endpoints
Show child attributes
Show child attributes
Response
Team performance overview retrieved successfully
Team performance metrics including meetings, contacts, and engagement rates
Total number of meetings booked
Total number of contacts engaged
Meeting conversion rate as a percentage (0–100)
Average total touches per contact
Average automated touches per contact
Average manual touches per contact
Average response time per contact in seconds
Per-member performance breakdown
Show child attributes
Show child attributes