curl --request GET \
--url https://agents.labs.bandwidth.com/api/v1/organizations/usage/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://agents.labs.bandwidth.com/api/v1/organizations/usage/runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://agents.labs.bandwidth.com/api/v1/organizations/usage/runs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"limit": 123,
"page": 123,
"runs": [
{
"call_duration_seconds": 123,
"created_at": "<string>",
"id": 123,
"name": "<string>",
"voai_token_usage": 123,
"workflow_id": 123,
"workflow_name": "<string>",
"call_type": "<string>",
"called_number": "<string>",
"caller_number": "<string>",
"charge_usd": 123,
"disposition": "<string>",
"gathered_context": {},
"initial_context": {},
"mode": "<string>",
"phone_number": "<string>",
"recording_url": "<string>",
"transcript_url": "<string>"
}
],
"total_count": 123,
"total_duration_seconds": 123,
"total_pages": 123,
"total_voai_tokens": 123
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}List usage runs
Retrieve paginated run usage and charges.
curl --request GET \
--url https://agents.labs.bandwidth.com/api/v1/organizations/usage/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://agents.labs.bandwidth.com/api/v1/organizations/usage/runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://agents.labs.bandwidth.com/api/v1/organizations/usage/runs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"limit": 123,
"page": 123,
"runs": [
{
"call_duration_seconds": 123,
"created_at": "<string>",
"id": 123,
"name": "<string>",
"voai_token_usage": 123,
"workflow_id": 123,
"workflow_name": "<string>",
"call_type": "<string>",
"called_number": "<string>",
"caller_number": "<string>",
"charge_usd": 123,
"disposition": "<string>",
"gathered_context": {},
"initial_context": {},
"mode": "<string>",
"phone_number": "<string>",
"recording_url": "<string>",
"transcript_url": "<string>"
}
],
"total_count": 123,
"total_duration_seconds": 123,
"total_pages": 123,
"total_voai_tokens": 123
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}limit defaults to 50 and is capped at 100. start_date and end_date are inclusive ISO 8601 creation-time bounds. filters is a JSON-encoded array; supported shapes appear in the parameter reference. Unknown attributes and unsupported filter types are ignored. Use callerNumber and calledNumber as filter attribute names. In response objects, the corresponding fields are caller_number and called_number; the response field phone_number is deprecated.Authorizations
Bandwidth Labs OAuth access token. Uses the user's selected workspace; the workspace header is not required. Do not also send an API key. Bearer-only operations may additionally require the Labs super_user role.
Headers
Required with X-BW-LABS-AGENTS-API-KEY: the positive local workspace ID to access. The key owner must be a current member. Missing or invalid IDs return 400; non-member workspaces return 403. Not required for bearer authentication, which uses the user's selected workspace.
Query Parameters
ISO 8601 date-time string (UTC). Lower bound (inclusive) on created_at.
"2026-04-01T00:00:00Z"
ISO 8601 date-time string (UTC). Upper bound (inclusive) on created_at.
"2026-05-01T00:00:00Z"
x >= 11 <= x <= 100JSON-encoded array of filter objects. Each object has the shape:
{ "attribute": "<name>", "type": "<type>", "value": <value> }
Supported attribute / type / value combinations:
| attribute | type | value shape | matches |
|---|---|---|---|
runId | number | { "value": 12345 } | exact run id |
workflowId | number | { "value": 42 } | exact agent (workflow) id |
campaignId | number | { "value": 7 } | exact campaign id |
callerNumber | text | { "value": "415555" } | substring match on initial_context.caller_number |
calledNumber | text | { "value": "9911848" } | substring match on initial_context.called_number |
dispositionCode | multiSelect | { "codes": ["XFER", "DNC"] } | any of the codes in gathered_context.mapped_call_disposition |
duration | numberRange | { "min": 60, "max": 300 } | call duration (seconds), inclusive bounds |
Unknown attributes and unsupported type values are silently ignored.
Date filtering on this endpoint is done via the dedicated start_date / end_date query params, not via a dateRange filter object.
"[{\"attribute\":\"callerNumber\",\"type\":\"text\",\"value\":{\"value\":\"415555\"}}]"