curl --request GET \
--url https://core-service.prod.brudcast.com/api/v1/user/reports/overview \
--header 'X-API-Key: <api-key>'import requests
url = "https://core-service.prod.brudcast.com/api/v1/user/reports/overview"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://core-service.prod.brudcast.com/api/v1/user/reports/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://core-service.prod.brudcast.com/api/v1/user/reports/overview",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://core-service.prod.brudcast.com/api/v1/user/reports/overview"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://core-service.prod.brudcast.com/api/v1/user/reports/overview")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-service.prod.brudcast.com/api/v1/user/reports/overview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": {
"kpis": {
"totalSent": 123,
"totalDelivered": 123,
"totalOpened": 123,
"totalClicked": 123,
"totalBounced": 123,
"totalUnconfirmed": 123,
"totalUnsubscribed": 123,
"avgDeliveryRate": 98.1,
"avgOpenRate": 41.3,
"avgClickRate": 8.7,
"avgBounceRate": 0.4,
"trends": {
"sent": {
"direction": "up",
"value": 12.5
},
"delivered": {
"direction": "up",
"value": 12.5
},
"opened": {
"direction": "up",
"value": 12.5
},
"clicked": {
"direction": "up",
"value": 12.5
}
},
"totalRevenue": 123,
"totalConversions": 123
},
"emailKpis": {
"totalSent": 123,
"totalDelivered": 123,
"totalOpened": 123,
"totalClicked": 123,
"totalBounced": 123,
"totalUnconfirmed": 123,
"totalUnsubscribed": 123,
"avgDeliveryRate": 98.1,
"avgOpenRate": 41.3,
"avgClickRate": 8.7,
"avgBounceRate": 0.4,
"trends": {
"sent": {
"direction": "up",
"value": 12.5
},
"delivered": {
"direction": "up",
"value": 12.5
},
"opened": {
"direction": "up",
"value": 12.5
},
"clicked": {
"direction": "up",
"value": 12.5
}
}
},
"performanceTrend": [
{
"date": "2026-07-01T00:00:00.000Z",
"sent": 123,
"delivered": 123,
"opened": 123,
"clicked": 123,
"uniqueOpened": 123,
"uniqueClicked": 123
}
],
"channelComparison": [
{
"channel": "email",
"sent": 123,
"delivered": 123,
"opened": 123,
"clicked": 123,
"bounced": 123,
"unconfirmed": 123,
"deliveryRate": 123,
"openRate": 123,
"clickRate": 123,
"bounceRate": 123
}
],
"channelReach": [
{
"channel": "email",
"targeted": 123,
"sent": 123,
"delivered": 123,
"opened": 123,
"clicked": 123,
"failed": 123
}
],
"topCampaigns": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"channels": [
"email",
"sms"
],
"sentAt": "2023-11-07T05:31:56Z",
"sent": 123,
"delivered": 123,
"openRate": 123,
"clickRate": 123,
"revenue": 123
}
],
"recipients": {
"scope": "cross_channel",
"audienceSize": 123,
"audienceIsAggregated": true,
"reached": 123,
"engaged": 123,
"clicked": 123,
"retentionDays": 123,
"coversFullRange": true
},
"journey": {
"firstSuccessfulChannel": [
{
"channel": "email",
"recipients": 123,
"share": 62.5
}
],
"paths": [
{
"steps": [
"email",
"sms"
],
"recipients": 123
}
]
}
}
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "The payload is invalid",
"code": "E_VALIDATION_ERROR",
"errors": [
{
"field": "emailAddress",
"rule": "email",
"message": "The emailAddress field must be a valid email address"
}
]
}{
"success": false,
"message": "Too many requests",
"code": "E_TOO_MANY_REQUESTS",
"retryAfter": 60
}Get the overview report
Returns the cross-channel KPIs with attributed revenue, the same block scoped to email, the daily performance trend, the per-channel comparison and reach matrix, the top campaigns and the recipient funnel. The cross-channel avgOpenRate divides opens by deliveries across every channel, and SMS and push emit no open event, so read the open rate from emailKpis. Omitting from and to leaves every trend flat, since there is no preceding period to compare against. Requires the analytics:read scope.
curl --request GET \
--url https://core-service.prod.brudcast.com/api/v1/user/reports/overview \
--header 'X-API-Key: <api-key>'import requests
url = "https://core-service.prod.brudcast.com/api/v1/user/reports/overview"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://core-service.prod.brudcast.com/api/v1/user/reports/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://core-service.prod.brudcast.com/api/v1/user/reports/overview",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://core-service.prod.brudcast.com/api/v1/user/reports/overview"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://core-service.prod.brudcast.com/api/v1/user/reports/overview")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-service.prod.brudcast.com/api/v1/user/reports/overview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": {
"kpis": {
"totalSent": 123,
"totalDelivered": 123,
"totalOpened": 123,
"totalClicked": 123,
"totalBounced": 123,
"totalUnconfirmed": 123,
"totalUnsubscribed": 123,
"avgDeliveryRate": 98.1,
"avgOpenRate": 41.3,
"avgClickRate": 8.7,
"avgBounceRate": 0.4,
"trends": {
"sent": {
"direction": "up",
"value": 12.5
},
"delivered": {
"direction": "up",
"value": 12.5
},
"opened": {
"direction": "up",
"value": 12.5
},
"clicked": {
"direction": "up",
"value": 12.5
}
},
"totalRevenue": 123,
"totalConversions": 123
},
"emailKpis": {
"totalSent": 123,
"totalDelivered": 123,
"totalOpened": 123,
"totalClicked": 123,
"totalBounced": 123,
"totalUnconfirmed": 123,
"totalUnsubscribed": 123,
"avgDeliveryRate": 98.1,
"avgOpenRate": 41.3,
"avgClickRate": 8.7,
"avgBounceRate": 0.4,
"trends": {
"sent": {
"direction": "up",
"value": 12.5
},
"delivered": {
"direction": "up",
"value": 12.5
},
"opened": {
"direction": "up",
"value": 12.5
},
"clicked": {
"direction": "up",
"value": 12.5
}
}
},
"performanceTrend": [
{
"date": "2026-07-01T00:00:00.000Z",
"sent": 123,
"delivered": 123,
"opened": 123,
"clicked": 123,
"uniqueOpened": 123,
"uniqueClicked": 123
}
],
"channelComparison": [
{
"channel": "email",
"sent": 123,
"delivered": 123,
"opened": 123,
"clicked": 123,
"bounced": 123,
"unconfirmed": 123,
"deliveryRate": 123,
"openRate": 123,
"clickRate": 123,
"bounceRate": 123
}
],
"channelReach": [
{
"channel": "email",
"targeted": 123,
"sent": 123,
"delivered": 123,
"opened": 123,
"clicked": 123,
"failed": 123
}
],
"topCampaigns": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"channels": [
"email",
"sms"
],
"sentAt": "2023-11-07T05:31:56Z",
"sent": 123,
"delivered": 123,
"openRate": 123,
"clickRate": 123,
"revenue": 123
}
],
"recipients": {
"scope": "cross_channel",
"audienceSize": 123,
"audienceIsAggregated": true,
"reached": 123,
"engaged": 123,
"clicked": 123,
"retentionDays": 123,
"coversFullRange": true
},
"journey": {
"firstSuccessfulChannel": [
{
"channel": "email",
"recipients": 123,
"share": 62.5
}
],
"paths": [
{
"steps": [
"email",
"sms"
],
"recipients": 123
}
]
}
}
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "The payload is invalid",
"code": "E_VALIDATION_ERROR",
"errors": [
{
"field": "emailAddress",
"rule": "email",
"message": "The emailAddress field must be a valid email address"
}
]
}{
"success": false,
"message": "Too many requests",
"code": "E_TOO_MANY_REQUESTS",
"retryAfter": 60
}Authorizations
An organization API key, prefixed bk_live_. Takes precedence over Authorization when both are sent. The key is bound to one organization, and the scopes it was issued with are enforced per endpoint.
Headers
Required when authenticating with an access token. Optional with an API key, whose own organization binding is authoritative; a value contradicting it is refused with 403.