Sales Analytics
Revenue by client category
Powers the Revenue by category doughnut on the Overview screen and the horizontal bar chart on the Sales analytics screen.
Categories are driven by LeadCategory records (Direct, Agency, Digital, Government). Each row includes total contract value, deal count, and avg deal value for leads committed in the period.
GET
/
api
/
v1
/
analytics
/
sales
/
revenue-by-category
Revenue by client category
curl --request GET \
--url https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category', 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.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
[
{
"category": "Direct",
"total_contracted_revenue": "8140000.00",
"deal_count": 18,
"avg_deal_value": "452222.22"
},
{
"category": "Agency",
"total_contracted_revenue": "5985600.00",
"deal_count": 12,
"avg_deal_value": "498800.00"
},
{
"category": "Digital",
"total_contracted_revenue": "4700000.00",
"deal_count": 9,
"avg_deal_value": "522222.22"
},
{
"category": "Government",
"total_contracted_revenue": "2574400.00",
"deal_count": 8,
"avg_deal_value": "321800.00"
}
]
]Authorizations
Enter your JWT token in the format: Bearer
Query Parameters
Period string. Accepted formats:
2026-05— calendar monthQ2-2026— quarter (Q1–Q4)YTD-2026— year to date
⌘I
Revenue by client category
curl --request GET \
--url https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category', 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.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.capedigital.co.ke/commercial/api/v1/analytics/sales/revenue-by-category")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
[
{
"category": "Direct",
"total_contracted_revenue": "8140000.00",
"deal_count": 18,
"avg_deal_value": "452222.22"
},
{
"category": "Agency",
"total_contracted_revenue": "5985600.00",
"deal_count": 12,
"avg_deal_value": "498800.00"
},
{
"category": "Digital",
"total_contracted_revenue": "4700000.00",
"deal_count": 9,
"avg_deal_value": "522222.22"
},
{
"category": "Government",
"total_contracted_revenue": "2574400.00",
"deal_count": 8,
"avg_deal_value": "321800.00"
}
]
]