Reports
Generated from
DialerDigital/corecommit6e9f026f0a72— specopenapi/dialer-v1.yamlv0.36.0. Do not edit by hand; see How this reference is built. Download the OpenAPI spec.
Packaged compliance artifacts.
Endpoints
| Method | Path | Summary |
|---|---|---|
GET | /v1/reports/attempts | Export attempt history (Reg F) |
GET | /v1/reports/violations-prevented | Violations-Prevented compliance artifact |
Export attempt history (Reg F)
GET /v1/reports/attemptsKeyset-paginated CSV export of the attempt ledger for the CMS round-trip (MT-REP-05 FASE 2). One row per attempt carrying its FINAL disposition: the original dial collapsed with every correction appended to it, the most recently written row wins. call_id is always the ORIGINAL attempt id, so a correction landing between two exports does not re-identify the attempt. source (platform | cms_import) is on every row so the CMS can tell what it declared from what the platform dialled.
Columns: debt_key, attempt_at (UTC RFC 3339), channel (voice), source, outcome, agent_id (empty when none), call_id, export_cursor.
from and to are mandatory and MUST be at most 31 days apart (400 otherwise). Derived from the ledger on every call — nothing is materialised. Rows are ordered by attempt_at descending, then by call_id; resume with ?after=<export_cursor of the last row>. A malformed cursor is 400, never a silent restart from the first page. format=csv (or Accept: text/csv) is required: 400 without it.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
from | query | string (date-time) | yes | RFC 3339 lower bound on attempt_at (inclusive). |
to | query | string (date-time) | yes | RFC 3339 upper bound on attempt_at (inclusive); at most 31 days after from. |
limit | query | integer | no | Page size (rows per response); values above the maximum are capped. |
after | query | string | no | Opaque keyset cursor: the export_cursor of the last row of the previous page. Malformed ⇒ 400. |
format | query | csv | no | csv for the downloadable artifact (equivalent: Accept: text/csv). |
Responses
200
CSV artifact
400 — BadRequest
Malformed request (shape/type errors, invalid filters, bad timestamps).
{
"error": {
"code": "bad_request",
"message": "from must be RFC-3339"
}
}401 — Unauthorized
Missing, unknown or revoked API key (or, on /v1/admin/*, a bad/unset admin token; on webhooks, a bad/missing signature).
{
"error": {
"code": "unauthorized",
"message": "invalid or revoked API key"
}
}Violations-Prevented compliance artifact
GET /v1/reports/violations-preventedPackaged compliance report over the append-only gate_blocks evidence. by_campaign sorted by blocked count (desc); samples are the ≤3 most recent evidence rows PER gate, always masked (last-4 only — the DB CHECK refuses unmasked phones at write time). ?format=csv / Accept: text/csv renders the downloadable CSV (Content-Disposition: attachment) with X-Artifact-SHA256 for chain of custody.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
from | query | string (date-time) | no | RFC 3339 lower bound (endpoint-specific field; default trailing 30 UTC days where noted). |
to | query | string (date-time) | no | RFC 3339 upper bound. |
format | query | csv | no | csv for the downloadable artifact (equivalent: Accept: text/csv). |
Responses
200
The report (JSON) or the CSV artifact.
| Field | Type | Required | Description |
|---|---|---|---|
report | "violations_prevented" | no | |
tenant_id | string (uuid) | no | |
generated_at | string (date-time) | no | |
period | object | no | |
period.from | string (date-time) | no | |
period.to | string (date-time) | no | |
totals | object | no | |
totals.total | integer | no | |
totals.by_gate | object | no | |
by_campaign | array of object | no | Sorted by blocked count (desc). |
by_campaign[].campaign_id | string (uuid) | no | |
by_campaign[].campaign_name | string | no | |
by_campaign[].total | integer | no | |
by_campaign[].by_gate | object | no | |
policy_versions | array of string | no | |
samples | array of object | no | ≤3 most recent evidence rows PER gate, always masked (last-4 only). |
samples[].occurred_at | string (date-time) | no | |
samples[].gate | tcpa_no_consent · quiet_hours · regf_7in7 · regf_post_contact · state_limit · dnc_listed · consent_revoked · cease_and_desist · number_reassigned · tenant_policy | no | The compliance engine's reason-code vocabulary. |
samples[].rule_id | string | no | |
samples[].campaign_id | string (uuid) | null | no | |
samples[].debt_id | string (uuid) | no | |
samples[].contact_phone_masked | string | no | |
samples[].policy_version | string | no |
{
"report": "violations_prevented",
"tenant_id": "0d4f4f9e-1f2a-4b53-9d3c-8a5e2f7b1c10",
"generated_at": "2026-07-05T10:00:00Z",
"period": {
"from": "2026-06-05T00:00:00Z",
"to": "2026-07-05T00:00:00Z"
},
"totals": {
"total": 5,
"by_gate": {
"quiet_hours": 4,
"dnc_listed": 1
}
},
"by_campaign": [
{
"campaign_id": "3f2c1b0a-9d8e-4c7b-a6f5-4e3d2c1b0a99",
"campaign_name": "postman-golden",
"total": 5,
"by_gate": {
"quiet_hours": 4,
"dnc_listed": 1
}
}
],
"policy_versions": [
"usa-cell.v1"
],
"samples": [
{
"occurred_at": "2026-07-01T02:10:00Z",
"gate": "quiet_hours",
"rule_id": "usa-cell.quiet-hours",
"campaign_id": "3f2c1b0a-9d8e-4c7b-a6f5-4e3d2c1b0a99",
"debt_id": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d",
"contact_phone_masked": "***1001",
"policy_version": "usa-cell.v1"
}
]
}400 — BadRequest
Malformed request (shape/type errors, invalid filters, bad timestamps).
{
"error": {
"code": "bad_request",
"message": "from must be RFC-3339"
}
}401 — Unauthorized
Missing, unknown or revoked API key (or, on /v1/admin/*, a bad/unset admin token; on webhooks, a bad/missing signature).
{
"error": {
"code": "unauthorized",
"message": "invalid or revoked API key"
}
}