Skip to content

Reports

Generated from DialerDigital/core commit 6e9f026f0a72 — spec openapi/dialer-v1.yaml v0.36.0. Do not edit by hand; see How this reference is built. Download the OpenAPI spec.

Packaged compliance artifacts.

Endpoints

MethodPathSummary
GET/v1/reports/attemptsExport attempt history (Reg F)
GET/v1/reports/violations-preventedViolations-Prevented compliance artifact

Export attempt history (Reg F)

http
GET /v1/reports/attempts

Keyset-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

NameInTypeRequiredDescription
fromquerystring (date-time)yesRFC 3339 lower bound on attempt_at (inclusive).
toquerystring (date-time)yesRFC 3339 upper bound on attempt_at (inclusive); at most 31 days after from.
limitqueryintegernoPage size (rows per response); values above the maximum are capped.
afterquerystringnoOpaque keyset cursor: the export_cursor of the last row of the previous page. Malformed ⇒ 400.
formatquerycsvnocsv for the downloadable artifact (equivalent: Accept: text/csv).

Responses

200

CSV artifact

400 — BadRequest

Malformed request (shape/type errors, invalid filters, bad timestamps).

json
{
  "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).

json
{
  "error": {
    "code": "unauthorized",
    "message": "invalid or revoked API key"
  }
}

Violations-Prevented compliance artifact

http
GET /v1/reports/violations-prevented

Packaged 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

NameInTypeRequiredDescription
fromquerystring (date-time)noRFC 3339 lower bound (endpoint-specific field; default trailing 30 UTC days where noted).
toquerystring (date-time)noRFC 3339 upper bound.
formatquerycsvnocsv for the downloadable artifact (equivalent: Accept: text/csv).

Responses

200

The report (JSON) or the CSV artifact.

FieldTypeRequiredDescription
report"violations_prevented"no
tenant_idstring (uuid)no
generated_atstring (date-time)no
periodobjectno
period.fromstring (date-time)no
period.tostring (date-time)no
totalsobjectno
totals.totalintegerno
totals.by_gateobjectno
by_campaignarray of objectnoSorted by blocked count (desc).
by_campaign[].campaign_idstring (uuid)no
by_campaign[].campaign_namestringno
by_campaign[].totalintegerno
by_campaign[].by_gateobjectno
policy_versionsarray of stringno
samplesarray of objectno≤3 most recent evidence rows PER gate, always masked (last-4 only).
samples[].occurred_atstring (date-time)no
samples[].gatetcpa_no_consent · quiet_hours · regf_7in7 · regf_post_contact · state_limit · dnc_listed · consent_revoked · cease_and_desist · number_reassigned · tenant_policynoThe compliance engine's reason-code vocabulary.
samples[].rule_idstringno
samples[].campaign_idstring (uuid) | nullno
samples[].debt_idstring (uuid)no
samples[].contact_phone_maskedstringno
samples[].policy_versionstringno
json
{
  "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).

json
{
  "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).

json
{
  "error": {
    "code": "unauthorized",
    "message": "invalid or revoked API key"
  }
}

Nothing in these docs is legal advice — always confirm compliance posture with your own counsel.