curl --request GET \
--url https://api.casexchange.com/api/public/v1/analytics/received \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.casexchange.com/api/public/v1/analytics/received"
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://api.casexchange.com/api/public/v1/analytics/received', 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.casexchange.com/api/public/v1/analytics/received",
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://api.casexchange.com/api/public/v1/analytics/received"
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://api.casexchange.com/api/public/v1/analytics/received")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.casexchange.com/api/public/v1/analytics/received")
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{
"data": {
"warmTransfer": {
"kpis": {
"attempted": 123,
"successful": 123,
"successRate": 123
},
"reasonBreakdown": [
{
"reasonType": "FIRM_UNABLE_TO_ANSWER",
"count": 123
}
],
"byPartnerFirm": [
{
"firmId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"firmName": "<string>",
"attempted": 123,
"successful": 123,
"successRate": 123
}
],
"trend": [
{
"month": "2026-08",
"attempted": 123,
"successful": 123,
"successRate": 123
}
]
}
},
"meta": {
"requestId": "req_f2dbe1d3f6ad4a7bb5b4c9f2",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"meta": {
"requestId": "req_f2dbe1d3f6ad4a7bb5b4c9f2",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"meta": {
"requestId": "req_f2dbe1d3f6ad4a7bb5b4c9f2",
"timestamp": "2023-11-07T05:31:56Z"
}
}Get received-referral analytics
Extended analytics for referrals the caller’s firm has RECEIVED: KPIs, stage breakdown, pipeline, trends, outcome distributions, top sending firms, and warm-transfer metrics (partner firms in warmTransfer.byPartnerFirm are sending firms). Supports the shared extended-analytics query filters (date ranges, case type, jurisdiction, tz).
curl --request GET \
--url https://api.casexchange.com/api/public/v1/analytics/received \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.casexchange.com/api/public/v1/analytics/received"
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://api.casexchange.com/api/public/v1/analytics/received', 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.casexchange.com/api/public/v1/analytics/received",
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://api.casexchange.com/api/public/v1/analytics/received"
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://api.casexchange.com/api/public/v1/analytics/received")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.casexchange.com/api/public/v1/analytics/received")
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{
"data": {
"warmTransfer": {
"kpis": {
"attempted": 123,
"successful": 123,
"successRate": 123
},
"reasonBreakdown": [
{
"reasonType": "FIRM_UNABLE_TO_ANSWER",
"count": 123
}
],
"byPartnerFirm": [
{
"firmId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"firmName": "<string>",
"attempted": 123,
"successful": 123,
"successRate": 123
}
],
"trend": [
{
"month": "2026-08",
"attempted": 123,
"successful": 123,
"successRate": 123
}
]
}
},
"meta": {
"requestId": "req_f2dbe1d3f6ad4a7bb5b4c9f2",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"meta": {
"requestId": "req_f2dbe1d3f6ad4a7bb5b4c9f2",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"meta": {
"requestId": "req_f2dbe1d3f6ad4a7bb5b4c9f2",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Public API key: cxp_<hex> (firm-scoped) or cxpp_<hex> (provider-scoped). Required on every request.
Response
Received-referral analytics
Received-referral analytics object. Documented here (partially): warmTransfer; other sections (kpis, currentStageBreakdown, currentStageStats, activePipeline, activePipelineFlow, timeToAcknowledgeTrend, timeToAcknowledgeStats, timeToSignTrend, timeToSignStats, outcomesOfReceived, outcomesReceivedStats, outcomesOfClosed, outcomesClosedStats, topSendingFirms, topCaseTypeJurisdictions) are returned as-is. timeToAcknowledgeStats carries case-level mean/median/p90 (acknowledgements above outlierThresholdHours are excluded from every average and counted separately), a dense day/week/month-bucketed trend over [rangeStart, rangeEnd] where avgHours is null for buckets with no acknowledgements, and a previous-window comparison when a referral date range is active. timeToSignStats carries the same shape for sent-to-signed durations in days (threshold 365), bucketed on the signed date. activePipelineFlow carries the five active stages in flow order with, per stage, the current count, its share of the active total, the number of referrals that ever reached it, and the percentage of those that ever reached the next stage (measured on status history, so it never exceeds 100%), plus trailing-30-day throughput figures each with the preceding window beside it. currentStageStats carries every stage with a case in it now or 30 days ago, busiest first, each with its current count, its occupancy 30 days ago (replayed from status history, not from a stored snapshot) and its share of the total. outcomesReceivedStats and outcomesClosedStats each carry the outcome mix in a fixed order (so a slice keeps its colour as counts move), every row with a display label, its count and its share, plus the total and the immediately preceding window's total.
Show child attributes
Show child attributes
Show child attributes
Show child attributes

