Skip to main content
This guide covers two operator workflows that both end in a downloadable or resolved artifact. With export jobs you queue a report, poll until it succeeds, and download the file. With disputes you open a dispute against an exception, attach evidence, then close it won or lost. Both are tenant-scoped from the JWT.

Export jobs


Exports are asynchronous. You create a job scoped to a context, poll its status by ID, and download the file once it reaches SUCCEEDED. Statuses are QUEUED, RUNNING, SUCCEEDED, FAILED, EXPIRED, and CANCELED.

Create an export job

POST to the context’s export-jobs collection. Responds 202 Accepted with the job ID and a poll URL.
  • reportType: one of MATCHED, UNMATCHED, VARIANCE, EXCEPTIONS (the aliases MATCHES and UNMATCHED_TRANSACTIONS normalize to these values).
  • format: CSV, JSON, or XML (normalized to uppercase).
  • dateFrom / dateTo: optional YYYY-MM-DD. dateFrom defaults to 30 days before dateTo, and dateTo defaults to tomorrow (UTC).
  • sourceId: optional source filter.
Async export jobs do not support SUMMARY and PDF. A request for either returns 400. The date window also has a maximum span. An over-range request returns an error rather than a silently clamped window.

Poll job status

Read the top-level job route (the statusUrl from creation).
error is present only when status is FAILED. downloadUrl appears only once the job has SUCCEEDED and the file is still available. You can list a context’s jobs with GET /v1/contexts/{contextId}/export-jobs, list all jobs with GET /v1/export-jobs, and cancel a queued/running job with POST /v1/export-jobs/{jobId}/cancel.

Download the file

Returns a presigned URL, the original file name, a SHA-256 checksum, and the URL’s remaining lifetime in seconds.
Export files are purged after expiresAt (default 7 days). Once a job is EXPIRED the file is no longer downloadable. Re-run the export to regenerate it.

Disputes


You open a dispute against a specific exception when you need to contest a reconciliation discrepancy. Its lifecycle starts at DRAFTOPEN. From OPEN a dispute can move to PENDING_EVIDENCE (and back to OPEN) or close directly as WON / LOST. Only WON is terminal. You can reopen a LOST dispute to OPEN.

Open a dispute

POST to the exception’s disputes collection.
category is one of BANK_FEE_ERROR, UNRECOGNIZED_CHARGE, DUPLICATE_TRANSACTION, or OTHER. The openedBy field records the opening principal.

Submit evidence by URL

Attach a reference to an already-hosted evidence file plus a describing comment.

Upload an evidence file

Stream the raw file bytes directly to tenant-scoped object storage. The comment travels as a query parameter and the file as the request body. Responds 201 Created with the updated dispute. Allowed content types are application/pdf, image/png, image/jpeg, and text/csv. The body has a 10 MiB limit.
The dispute’s evidence array lists each stored evidence item:
The upload endpoint fails closed with 503 when you do not configure object storage. It rejects oversize bodies with 413 and content types outside the allowlist with 415. The tenant always comes from the JWT and the dispute from the path, never from the body.

Close a dispute

Record the outcome. won sets the state to WON (terminal) or LOST (reopenable), with a required resolution note.
You can list disputes with GET /v1/disputes and fetch one with GET /v1/disputes/{disputeId}. The list endpoint filters by state, category, and date range, and it supports sorting and cursor pagination.

Response codes