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, in 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 (400) or PDF (422). The date window spans at most 365 days, and a longer window returns 400. Job creation returns 503 when asynchronous exports are not enabled for your environment.

Poll job status

Read the top-level job route (the statusUrl from creation).
contextId names the context the job exports. error carries the job’s last failure reason, when it has one. downloadUrl is the download route below, and it 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, 7 days after the job was created. After that, 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. A new dispute is OPEN. Closing it sets WON or LOST, and both outcomes are terminal.

Open a dispute

POST to the exception’s disputes collection. Responds 201 Created.
category is one of BANK_FEE_ERROR, UNRECOGNIZED_CHARGE, DUPLICATE_TRANSACTION, AMOUNT_MISMATCH, or OTHER. The response omits evidence until the dispute has some. The openedBy field records the opening principal. Matcher refuses to open a dispute with 409 (MTCH-0511) when the exception is RESOLVED or PENDING_RESOLUTION. It answers 409 (MTCH-0510) while a settlement is in progress on the exception. Retry that request after the settlement completes.

Submit evidence by URL

Attach a reference to an already-hosted evidence file plus a describing comment. fileUrl must be an https URL.

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. For an uploaded file, fileUrl holds the object-storage key, not a download URL:
The upload endpoint returns 503 when evidence storage is unavailable. 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: true sets the state to WON and won: false sets it to LOST. A resolution note is required.
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