API reference
The portal speaks to dispute-api over HTTP. Every route lives under the /v1 prefix. All authenticated routes require a Heimdall-issued bearer token in the Authorization header. CORS is enabled for the portal and marketing-site origins.
Auth
/v1/auth/signupCreate an account. Returns access and refresh tokens. Triggers a fire-and-forget email-verification dispatch via Envoi.
/v1/auth/signinSign in with identifier (username or primary email) and password. Returns tokens already switched into the caller's tenant.
/v1/auth/refreshExchange a refresh token for a fresh access token.
/v1/auth/bootstrapIdempotent — provisions a tenant for an authenticated user who doesn't have one yet. Returns post-switch tokens.
/v1/auth/verify-email/resendRe-dispatches the 6-digit verification code via Envoi.
/v1/auth/verify-email/confirmSubmit the 6-digit code. Public consume — flips the contact to verified.
/v1/auth/meIdentity, permissions, tenant, workspace, and emailVerified flag.
Transactions
/v1/transactionsList with pagination, filters, and search.
/v1/transactions/export.csvStream the full transaction table as CSV.
/v1/transactions/:idSingle transaction with payment-event timeline.
Disputes
/v1/disputesList with status / category / search / date-range filters.
/v1/disputes/:idSingle dispute with linked transaction and evidence list.
/v1/disputes/:id/eventsAudit-style event history for the dispute.
/v1/disputes/:id/acceptMove the dispute to accepted.
/v1/disputes/:id/challengeSubmit a challenge after evidence is attached. Moves to under_review.
/v1/disputes/:id/rfi-responseSubmit a text response to an RFI. Moves to rfi_responded.
/v1/disputes/:id/arbitrateEscalate a lost dispute to arbitration. Adds the scheme-specific arbitration fee to the record.
/v1/disputes/:id/notesAppend a free-form note to the dispute's event history.
/v1/disputes/:id/decline-listBlock future transactions from the same card / fingerprint.
/v1/disputes/:id/support-caseOpen a support case linked to the dispute.
/v1/disputes/bulkApply a decision (accept / challenge / etc.) to a batch of disputes in one request.
/v1/disputes/apply-playbook/:playbookIdRun a stored playbook over the open-disputes queue.
Evidence
Uploads use a two-step presigned-URL flow — files never traverse the API.
/v1/disputes/:id/evidence/upload-urlBody { filename, contentType }. Returns a short-lived PUT URL for the file plus the storageKey to send back when finalising.
/v1/disputes/:id/evidenceBody { storageKey, filename, contentType, kind, note? }. Finalises the evidence record after the client has PUT the file to storage. kind is one of receipt, shipping_proof, communication, refund_policy, service_documentation, other.
/v1/disputes/:id/evidence/:evidenceId/download-urlShort-lived presigned GET URL for the evidence file.
Reports
/v1/reportsList queued / running / completed reports.
/v1/reportsQueue a transactions or disputes CSV report.
/v1/reports/:idStatus + metadata for a single report.
/v1/reports/:id/download-urlShort-lived presigned URL for the generated CSV.
Playbooks
/v1/playbooksList the tenant's playbooks.
/v1/playbooksCreate a playbook.
/v1/playbooks/:idSingle playbook with its rules.
/v1/playbooks/:idUpdate name, rules, or default flag.
/v1/playbooks/:idDelete the playbook.
/v1/playbooks/:id/dry-runRun the playbook against the current open-disputes queue without applying changes.
Webhooks
/v1/webhooksList configured webhook endpoints.
/v1/webhooksRegister a new endpoint. The HMAC secret is returned exactly once.
/v1/webhooks/:idEdit the URL, event filter, or active flag.
/v1/webhooks/:idRemove the webhook.
/v1/webhooks/:id/testFire a synthetic event to the endpoint and return the upstream response.
Team
/v1/team/synthetic-accountsList synthetic accounts in the tenant.
/v1/team/synthetic-accountsProvision a synthetic account. Returns the generated email + password once.
/v1/team/synthetic-accounts/:displayIdUpdate label, role, or notes.
/v1/team/synthetic-accounts/:displayIdArchive the synthetic account.
/v1/team/synthetic-accounts/:displayId/rotate-passwordIssue a new password and return it once.
Metrics, payments, public stats
/v1/metrics/overviewDashboard KPIs: chargeback ratio, win rate, totals.
/v1/payments/:idSingle payment lookup by display id.
/v1/public/stats/synthetic-paymentsUnauthenticated counter feeding the marketing-page total. Rate-limited and cached server-side.
/v1/healthLiveness + database probe.
Dev
/v1/dev/generateGenerate a synthetic batch. See the Dev panel page for the field list.
/v1/dev/advance-lifecycleRun the hourly background job on demand. Returns counts of moved rows.
/v1/dev/resetWipe the tenant's synthetic data.
A machine-readable schema (OpenAPI / Swagger) is on the roadmap but not yet shipped — endpoints are documented here in the meantime.