Get the analytics catalog
curl --request GET \
--url https://api.burthq.com/api/v1/analytics/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.burthq.com/api/v1/analytics/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.burthq.com/api/v1/analytics/catalog', 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.burthq.com/api/v1/analytics/catalog",
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.burthq.com/api/v1/analytics/catalog"
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.burthq.com/api/v1/analytics/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.burthq.com/api/v1/analytics/catalog")
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{
"catalogVersion": "2026-08-24.2",
"models": [
{
"name": "agent_runs",
"description": "One row for each agent run. Sub-agent work and the supporting browser, phone, inbound-phone, and platform runs it starts are not counted separately. The date range filters on createdAt.",
"grain": "one agent run; sub-agent and supporting runs are not counted separately",
"eventClock": "createdAt",
"metrics": [
{
"name": "run_count",
"type": "number",
"description": "Agent runs, whatever their status.",
"additive": true,
"deprecated": null
},
{
"name": "completed_run_count",
"type": "number",
"description": "Agent runs that completed successfully (COMPLETED).",
"additive": true,
"deprecated": null
},
{
"name": "failed_run_count",
"type": "number",
"description": "Agent runs that failed (FAILED).",
"additive": true,
"deprecated": null
},
{
"name": "cancelled_run_count",
"type": "number",
"description": "Agent runs that were cancelled (CANCELLED).",
"additive": true,
"deprecated": null
},
{
"name": "active_run_count",
"type": "number",
"description": "Agent runs still working or waiting: PENDING, RUNNING, WAITING_FOR_SLOT, CANCELLING, AWAITING_REPLY, SLEEPING, PAUSING, or PAUSED.",
"additive": true,
"deprecated": null
},
{
"name": "run_success_rate",
"type": "number",
"description": "Completed agent runs divided by the sum of completed and failed runs. Cancelled and active runs are excluded from both sides. The result is null when the denominator is zero.",
"additive": false,
"deprecated": null
},
{
"name": "unique_initiator_count",
"type": "number",
"description": "Distinct identified starters. A starter may be a person or an automated starter. Starters without identifiers are excluded.",
"additive": false,
"deprecated": null
}
],
"dimensions": [
{
"name": "agent_id",
"type": "string",
"description": "Task-agent identifier for the agent run. Filters accept either the agent UUID or its optional slug. Rows for soft-deleted agents are still returned. The agent_name companion comes from the current joined task-agent record, so renames affect historical results. Slug resolution is point-in-time: a slug filter matches whichever agent currently holds that slug, not the agent it identified when the filter was written. Because agent_id always returns the agent UUID, pin the UUID instead of the slug for filters that must stay stable across renames.",
"companions": [
{
"name": "agent_name",
"type": "string",
"description": "Current display name from the joined task-agent record. Soft-deleted agents remain joinable, but renames affect historical results."
}
],
"deprecated": null
},
{
"name": "user_identifier",
"type": "string",
"description": "Identifier for the person or automated starter that started the run, such as a normalized email address or phone number. Rows without an identifier group together and return null.",
"companions": [
{
"name": "user_name",
"type": "string",
"description": "Lexicographically greatest non-null display name in the user-identifier group."
}
],
"deprecated": null
},
{
"name": "user_type",
"type": "string",
"description": "Class of the starter: internal, external, automated, unknown, or null when absent. The automated value marks an automated starter, which is a schedule or integration rather than a person.",
"companions": [],
"deprecated": null
},
{
"name": "day",
"type": "date",
"description": "Creation day in the requested IANA timezone, formatted YYYY-MM-DD. Filters take the same format. Only days with data are returned; the series is not gap-filled.",
"companions": [],
"deprecated": null
}
]
},
{
"name": "agent_user_activity",
"description": "One row each time a person is recorded as starting, being associated with, or interacting with an agent run. The date range filters on occurredAt.",
"grain": "one attribution record for an identified person and an agent run",
"eventClock": "occurredAt",
"metrics": [
{
"name": "attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations with at least one attribution record.",
"additive": false,
"deprecated": null
},
{
"name": "initiated_run_count",
"type": "number",
"description": "Unique person-and-run combinations in which the person started the run.",
"additive": false,
"deprecated": null
},
{
"name": "associated_run_count",
"type": "number",
"description": "associated_run_count = attributed_run_count - initiated_run_count. Both values come from the attribution records selected by the query's date range and filters.",
"additive": false,
"deprecated": null
},
{
"name": "interacted_run_count",
"type": "number",
"description": "Unique person-and-run combinations with at least one recorded interaction.",
"additive": false,
"deprecated": null
},
{
"name": "interaction_count",
"type": "number",
"description": "Recorded interactions. Unlike the run metrics above, every interaction counts.",
"additive": true,
"deprecated": null
},
{
"name": "completed_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run is currently COMPLETED.",
"additive": false,
"deprecated": null
},
{
"name": "failed_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run is currently FAILED.",
"additive": false,
"deprecated": null
},
{
"name": "cancelled_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run is currently CANCELLED.",
"additive": false,
"deprecated": null
},
{
"name": "active_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run currently has a non-terminal status.",
"additive": false,
"deprecated": null
}
],
"dimensions": [
{
"name": "agent_id",
"type": "string",
"description": "Task-agent identifier for the attributed agent run. Filters accept either the agent UUID or its optional slug. The agent_name companion comes from the current joined task-agent record. Slug resolution is point-in-time: a slug filter matches whichever agent currently holds that slug, not the agent it identified when the filter was written. Because agent_id always returns the agent UUID, pin the UUID instead of the slug for filters that must stay stable across renames.",
"companions": [
{
"name": "agent_name",
"type": "string",
"description": "Current display name from the joined task-agent record."
}
],
"deprecated": null
},
{
"name": "user_identifier",
"type": "string",
"description": "Normalized email address or E.164 phone number for the attributed person.",
"companions": [
{
"name": "user_name",
"type": "string",
"description": "Lexicographically greatest non-null captured display name in the user-identifier group."
}
],
"deprecated": null
},
{
"name": "user_domain",
"type": "string",
"description": "Lowercased email domain when the person is identified by an email address. Null when the person is identified by a phone number.",
"companions": [],
"deprecated": null
},
{
"name": "activity_type",
"type": "string",
"description": "Attribution activity: initiated, associated, or interacted.",
"companions": [],
"deprecated": null
},
{
"name": "run_initiation_type",
"type": "string",
"description": "How the agent run started: human, automated when an automated starter began it, or unknown. The value is frozen when the attribution record is written.",
"companions": [],
"deprecated": null
},
{
"name": "source",
"type": "string",
"description": "Channel that produced the attribution record.",
"companions": [],
"deprecated": null
},
{
"name": "day",
"type": "date",
"description": "Day of the attribution record in the requested IANA timezone, formatted YYYY-MM-DD. Filters use the same format.",
"companions": [],
"deprecated": null
}
]
}
]
}API Reference
Get the analytics catalog
Returns the versioned catalog of models, metrics, and dimensions accepted by the query endpoint. Use it to discover valid member names before building a query.
GET
/
api
/
v1
/
analytics
/
catalog
Get the analytics catalog
curl --request GET \
--url https://api.burthq.com/api/v1/analytics/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.burthq.com/api/v1/analytics/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.burthq.com/api/v1/analytics/catalog', 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.burthq.com/api/v1/analytics/catalog",
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.burthq.com/api/v1/analytics/catalog"
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.burthq.com/api/v1/analytics/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.burthq.com/api/v1/analytics/catalog")
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{
"catalogVersion": "2026-08-24.2",
"models": [
{
"name": "agent_runs",
"description": "One row for each agent run. Sub-agent work and the supporting browser, phone, inbound-phone, and platform runs it starts are not counted separately. The date range filters on createdAt.",
"grain": "one agent run; sub-agent and supporting runs are not counted separately",
"eventClock": "createdAt",
"metrics": [
{
"name": "run_count",
"type": "number",
"description": "Agent runs, whatever their status.",
"additive": true,
"deprecated": null
},
{
"name": "completed_run_count",
"type": "number",
"description": "Agent runs that completed successfully (COMPLETED).",
"additive": true,
"deprecated": null
},
{
"name": "failed_run_count",
"type": "number",
"description": "Agent runs that failed (FAILED).",
"additive": true,
"deprecated": null
},
{
"name": "cancelled_run_count",
"type": "number",
"description": "Agent runs that were cancelled (CANCELLED).",
"additive": true,
"deprecated": null
},
{
"name": "active_run_count",
"type": "number",
"description": "Agent runs still working or waiting: PENDING, RUNNING, WAITING_FOR_SLOT, CANCELLING, AWAITING_REPLY, SLEEPING, PAUSING, or PAUSED.",
"additive": true,
"deprecated": null
},
{
"name": "run_success_rate",
"type": "number",
"description": "Completed agent runs divided by the sum of completed and failed runs. Cancelled and active runs are excluded from both sides. The result is null when the denominator is zero.",
"additive": false,
"deprecated": null
},
{
"name": "unique_initiator_count",
"type": "number",
"description": "Distinct identified starters. A starter may be a person or an automated starter. Starters without identifiers are excluded.",
"additive": false,
"deprecated": null
}
],
"dimensions": [
{
"name": "agent_id",
"type": "string",
"description": "Task-agent identifier for the agent run. Filters accept either the agent UUID or its optional slug. Rows for soft-deleted agents are still returned. The agent_name companion comes from the current joined task-agent record, so renames affect historical results. Slug resolution is point-in-time: a slug filter matches whichever agent currently holds that slug, not the agent it identified when the filter was written. Because agent_id always returns the agent UUID, pin the UUID instead of the slug for filters that must stay stable across renames.",
"companions": [
{
"name": "agent_name",
"type": "string",
"description": "Current display name from the joined task-agent record. Soft-deleted agents remain joinable, but renames affect historical results."
}
],
"deprecated": null
},
{
"name": "user_identifier",
"type": "string",
"description": "Identifier for the person or automated starter that started the run, such as a normalized email address or phone number. Rows without an identifier group together and return null.",
"companions": [
{
"name": "user_name",
"type": "string",
"description": "Lexicographically greatest non-null display name in the user-identifier group."
}
],
"deprecated": null
},
{
"name": "user_type",
"type": "string",
"description": "Class of the starter: internal, external, automated, unknown, or null when absent. The automated value marks an automated starter, which is a schedule or integration rather than a person.",
"companions": [],
"deprecated": null
},
{
"name": "day",
"type": "date",
"description": "Creation day in the requested IANA timezone, formatted YYYY-MM-DD. Filters take the same format. Only days with data are returned; the series is not gap-filled.",
"companions": [],
"deprecated": null
}
]
},
{
"name": "agent_user_activity",
"description": "One row each time a person is recorded as starting, being associated with, or interacting with an agent run. The date range filters on occurredAt.",
"grain": "one attribution record for an identified person and an agent run",
"eventClock": "occurredAt",
"metrics": [
{
"name": "attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations with at least one attribution record.",
"additive": false,
"deprecated": null
},
{
"name": "initiated_run_count",
"type": "number",
"description": "Unique person-and-run combinations in which the person started the run.",
"additive": false,
"deprecated": null
},
{
"name": "associated_run_count",
"type": "number",
"description": "associated_run_count = attributed_run_count - initiated_run_count. Both values come from the attribution records selected by the query's date range and filters.",
"additive": false,
"deprecated": null
},
{
"name": "interacted_run_count",
"type": "number",
"description": "Unique person-and-run combinations with at least one recorded interaction.",
"additive": false,
"deprecated": null
},
{
"name": "interaction_count",
"type": "number",
"description": "Recorded interactions. Unlike the run metrics above, every interaction counts.",
"additive": true,
"deprecated": null
},
{
"name": "completed_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run is currently COMPLETED.",
"additive": false,
"deprecated": null
},
{
"name": "failed_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run is currently FAILED.",
"additive": false,
"deprecated": null
},
{
"name": "cancelled_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run is currently CANCELLED.",
"additive": false,
"deprecated": null
},
{
"name": "active_attributed_run_count",
"type": "number",
"description": "Unique person-and-run combinations whose run currently has a non-terminal status.",
"additive": false,
"deprecated": null
}
],
"dimensions": [
{
"name": "agent_id",
"type": "string",
"description": "Task-agent identifier for the attributed agent run. Filters accept either the agent UUID or its optional slug. The agent_name companion comes from the current joined task-agent record. Slug resolution is point-in-time: a slug filter matches whichever agent currently holds that slug, not the agent it identified when the filter was written. Because agent_id always returns the agent UUID, pin the UUID instead of the slug for filters that must stay stable across renames.",
"companions": [
{
"name": "agent_name",
"type": "string",
"description": "Current display name from the joined task-agent record."
}
],
"deprecated": null
},
{
"name": "user_identifier",
"type": "string",
"description": "Normalized email address or E.164 phone number for the attributed person.",
"companions": [
{
"name": "user_name",
"type": "string",
"description": "Lexicographically greatest non-null captured display name in the user-identifier group."
}
],
"deprecated": null
},
{
"name": "user_domain",
"type": "string",
"description": "Lowercased email domain when the person is identified by an email address. Null when the person is identified by a phone number.",
"companions": [],
"deprecated": null
},
{
"name": "activity_type",
"type": "string",
"description": "Attribution activity: initiated, associated, or interacted.",
"companions": [],
"deprecated": null
},
{
"name": "run_initiation_type",
"type": "string",
"description": "How the agent run started: human, automated when an automated starter began it, or unknown. The value is frozen when the attribution record is written.",
"companions": [],
"deprecated": null
},
{
"name": "source",
"type": "string",
"description": "Channel that produced the attribution record.",
"companions": [],
"deprecated": null
},
{
"name": "day",
"type": "date",
"description": "Day of the attribution record in the requested IANA timezone, formatted YYYY-MM-DD. Filters use the same format.",
"companions": [],
"deprecated": null
}
]
}
]
}Authorizations
Organization API key with the analytics:read scope.
Headers
Optional caller-supplied request ID. Values must contain 1–64 ASCII letters, digits, or ._:/=-; invalid values are replaced with a generated UUID.
Required string length:
1 - 64Pattern:
^[A-Za-z0-9._:/=-]+$