Returns the calls with the worst audio in a window, worst first. This is the proactive-outreach worklist: it answers “which calls went badly, and whose phone was it”.
Scope, verdicts, finding codes and thresholds are described on Call audio quality.
| URL | https://api.telecomx.dk/pbx/quality/calls | ||
|---|---|---|---|
| Method | GET | ||
| Access level | ADMIN, or RESELLER_ADMIN with the TELE employee feature. TX staff only - see Call audio quality. | ||
| Query | from | Date | Start of the window. Optional, defaults to 24 hours ago. |
| to | Date | End of the window. Optional, defaults to now. | |
| customer | Id | Customer to report on. Optional - omit it to span every customer. | |
| extension | Id | Only calls involving this extension. Optional. | |
| employee | Id | Only calls involving this employees extensions. Optional. | |
| pbx | String | Only calls handled by this PBX server, e.g. pbx12. Optional. |
|
| minVerdict | String | Lowest verdict to include: OK, DEGRADED, BAD or NO_AUDIO. Optional, default DEGRADED. |
|
| minDurationSeconds | Number | Ignore calls shorter than this. Optional, default 5. | |
| offset | Number | Index of the first call to return. Optional, default 0. | |
| limit | Number | Maximum number of calls to return (1-200). Optional, default 50. | |
Pass minVerdict=OK to list every call that could be measured, not only the bad ones. A period
with no problems then reads as “here are your calls, all fine” instead of as an empty page.
NOT_MEASURED calls are never listed - they carry no information.
minDurationSeconds is a call-level floor and is deliberately low. Legs are separately held to a
10 second measurable floor by the analyser, which is what actually keeps the rates honest; a
call-level floor high enough to hide a low-volume customers only call is worse than a little noise.
The window may not exceed 31 days for a single customer, or 7 days when spanning customers. The cross-customer form unwinds every leg of every answered call in the window, so it is a report rather than a page render.
https://api.telecomx.dk/pbx/quality/calls https://api.telecomx.dk/pbx/quality/calls?customer=1234567890ABCDEF12345678&from=2026-08-17T00:00:00.000Z&to=2026-08-24T00:00:00.000Z https://api.telecomx.dk/pbx/quality/calls?minVerdict=NO_AUDIO&pbx=pbx12&limit=100
| JSON object | ||
|---|---|---|
| offset | Number | Index of the first returned call. |
| limit | Number | Maximum number of returned calls. |
| total | Number | Total number of calls matching the filters. |
| from | Date | Start of the window that was actually used. |
| to | Date | End of the window that was actually used. |
| calls | Array | Matching calls, worst first (see below). |
| calls[] object | ||
|---|---|---|
| _id | Id | Id of the CDR. |
| customer | Id | Id of the customer the call belongs to. |
| pbx | String | Hostname of the PBX server that handled the call. |
| started | Date | When the call started. |
| ended | Date | When the call ended. |
| durationSeconds | Number | Length of the call in whole seconds. |
| caller | Object | Caller details, as in CDR. Subject to the same privacy rules. |
| callee | Object | Callee details, as in CDR. |
| quality | Object | The full analysis of the call - identical to Call quality. |
Caller and callee details go through exactly the same privacy rules as CDR: suppressed numbers stay suppressed, sensitive numbers are hidden below ADMIN, and caller names that look like a CPR number are dropped.
{ "offset": 0, "limit": 50, "total": 12, "from": "2026-08-23T00:00:00.000Z", "to": "2026-08-24T00:00:00.000Z", "calls": [ { "_id": "5d035c832d357b369b6f7aff", "customer": "52f4fd7734697b28ccaf77ec", "pbx": "pbx12.telecomx.dk", "started": "2026-08-23T08:36:08.791Z", "ended": "2026-08-23T08:39:11.523Z", "durationSeconds": 183, "caller": { "number": "+4570112233", "name": "Reception", "type": "SIPPHONE" }, "callee": { "number": "1234", "name": "Sales" }, "quality": { "cdrId": "5d035c832d357b369b6f7aff", "verdict": "DEGRADED", "measured": true, "severity": 2, "worst": { "code": "INBOUND_DELIVERY_LOW", "role": "caller", "party": { "kind": "SIP_PHONE", "model": "Mitel-6867i", "raw": "SIPPHONE/Mitel-6867i" }, "direction": "INBOUND", "percentMissing": 16 }, "legs": [ ... ], "findings": [ ... ] } } ] }
| Error code | Message | Description |
|---|---|---|
| 401 | unauthorized | Missing or invalid token |
| 403 | access_denied | Not TX staff: below RESELLER_ADMIN, or RESELLER_ADMIN without the TELE employee feature |
| 404 | extension | Extension not found |
| 422 | from | Invalid date range, or window wider than the limit for this scope |
| 500 | internal_error | <Unspecified> |
The aggregation is a coarse filter: it unwinds every leg, grades it, and returns the ids of the calls that qualify. That page of CDRs is then read back and analysed again in Node, so the verdict shown on a worklist row and the verdict on the call it links to always come from one implementation.