curl --request GET \
--url https://api.legal.usecroma.com/v1/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.legal.usecroma.com/v1/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.legal.usecroma.com/v1/analytics', 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.legal.usecroma.com/v1/analytics",
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.legal.usecroma.com/v1/analytics"
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.legal.usecroma.com/v1/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.legal.usecroma.com/v1/analytics")
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{
"data": {
"kpis": {
"total_processes": 1280,
"tracking": 1174,
"not_tracking": 106,
"total_actions": 41230
},
"processes": {
"by_status": [
{
"status": "TRACKING",
"count": 1174
},
{
"status": "NOT_TRACKING",
"count": 106
}
],
"by_priority": [
{
"priority": "NONE",
"count": 1280
}
],
"by_office": [
{
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"count": 96
}
],
"by_city": [
{
"city": "Bogotá",
"count": 512
},
{
"city": "Medellín",
"count": 203
}
],
"concentration": [
{
"city": "Bogotá",
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"count": 96
}
]
},
"actions": {
"by_period": [
{
"date": "2026-08-17",
"count": 38
},
{
"date": "2026-08-18",
"count": 51
}
],
"by_day_of_week": [
{
"day_of_week": 1,
"count": 6120
},
{
"day_of_week": 2,
"count": 7045
}
],
"by_office": [
{
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"count": 3120
}
],
"by_city": [
{
"city": "Bogotá",
"count": 16400
}
],
"by_message": [
{
"message": "AUTO QUE DECRETA MEDIDAS CAUTELARES",
"count": 910
}
],
"most_active_cases": [
{
"registration_number": "11001400300120240012300",
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"action_count": 74
}
]
}
}
}{
"error": {
"type": "invalid_request_error",
"code": "invalid_param",
"message": "Unrecognized city.",
"param": "city",
"details": {
"issues": [
{
"path": "city",
"message": "Unrecognized city."
}
]
}
}
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or missing API key."
}
}{
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"message": "Rate limit exceeded. Try again in 42 seconds."
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Internal error. Contact support with the X-Request-Id if it persists."
}
}Portfolio analytics
Aggregated KPIs and distributions over your cases and actuaciones: by status, priority, office, city, period, day of week, and the most active cases. Use it for any volume or trend question instead of paging through rows.
curl --request GET \
--url https://api.legal.usecroma.com/v1/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.legal.usecroma.com/v1/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.legal.usecroma.com/v1/analytics', 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.legal.usecroma.com/v1/analytics",
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.legal.usecroma.com/v1/analytics"
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.legal.usecroma.com/v1/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.legal.usecroma.com/v1/analytics")
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{
"data": {
"kpis": {
"total_processes": 1280,
"tracking": 1174,
"not_tracking": 106,
"total_actions": 41230
},
"processes": {
"by_status": [
{
"status": "TRACKING",
"count": 1174
},
{
"status": "NOT_TRACKING",
"count": 106
}
],
"by_priority": [
{
"priority": "NONE",
"count": 1280
}
],
"by_office": [
{
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"count": 96
}
],
"by_city": [
{
"city": "Bogotá",
"count": 512
},
{
"city": "Medellín",
"count": 203
}
],
"concentration": [
{
"city": "Bogotá",
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"count": 96
}
]
},
"actions": {
"by_period": [
{
"date": "2026-08-17",
"count": 38
},
{
"date": "2026-08-18",
"count": 51
}
],
"by_day_of_week": [
{
"day_of_week": 1,
"count": 6120
},
{
"day_of_week": 2,
"count": 7045
}
],
"by_office": [
{
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"count": 3120
}
],
"by_city": [
{
"city": "Bogotá",
"count": 16400
}
],
"by_message": [
{
"message": "AUTO QUE DECRETA MEDIDAS CAUTELARES",
"count": 910
}
],
"most_active_cases": [
{
"registration_number": "11001400300120240012300",
"office": "JUZGADO 001 CIVIL MUNICIPAL DE BOGOTÁ",
"action_count": 74
}
]
}
}
}{
"error": {
"type": "invalid_request_error",
"code": "invalid_param",
"message": "Unrecognized city.",
"param": "city",
"details": {
"issues": [
{
"path": "city",
"message": "Unrecognized city."
}
]
}
}
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or missing API key."
}
}{
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"message": "Rate limit exceeded. Try again in 42 seconds."
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Internal error. Contact support with the X-Request-Id if it persists."
}
}Authorizations
Use Authorization: Bearer YOUR_API_KEY
Query Parameters
Partial match on the judicial office (despacho).
Monitoring status of the case in your portfolio. TRACKING: actively monitored for new actuaciones. NOT_TRACKING: monitoring paused.
TRACKING, NOT_TRACKING Filter by priority. Priority is a personal flag each dashboard user sets on their own cases, so it has no organization-level value: NONE matches every case, while HIGH and MEDIUM are accepted but match no rows for API callers.
HIGH, MEDIUM, NONE City name, accent and case insensitive (e.g. Bogotá, Medellin). An unrecognized city returns 400.
ISO 8601 date. Only cases filed on or after this date.
ISO 8601 date. Only cases filed on or before this date.
Window, in days back from today, for the actions.by_period timeline (default 90, max 3650).
1 <= x <= 3650Bucket size for actions.by_period.
day, month, year Response
Successful response
Show child attributes
Show child attributes