All notable changes to this project will be documented in this file. The format is based on Keep a Changelog.
[1.0.0] - Unreleased
Added
- Initial release.
BankingCircle.Config/BankingCircle.Environment— validated per-client configuration with sandbox/production host resolution and{:system, "VAR"}secret resolution.BankingCircle.Auth.TokenServer— cached, single-flight-refreshed OAuth2/JWT token per client, honoring Banking Circle's documented 5-minute token lifetime and auth-endpoint rate limiting.BankingCircle.HTTP.Client— shared Req-based request pipeline with auth injection, telemetry spans, and error normalization.BankingCircle.HTTP.Middleware.Retry— jittered exponential backoff,Retry-Aftersupport, restricted to GET/HEAD or idempotency-keyed requests to avoid duplicate payment submission.BankingCircle.HTTP.Middleware.Idempotency— UUIDv4 generation and header attachment.BankingCircle.Error— normalizes both documented error body shapes (standardpropertyName/errorCodeand bulkfieldIndex/elementIndex) into one struct, withretryable?/1.BankingCircle.Payments— single payment create/list/status/get/cancel/ reject/mt103/lookup-by-reference; bulk payment create/list/get/cancel.BankingCircle.Schemas.Payment/BankingCircle.Schemas.BulkPayment— Ecto-changeset client-side validation and CSV rendering for bulk submission.BankingCircle.Accounts— list/get/balance/Account Holder Verification.BankingCircle.Webhooks— subscription create/list/get/activate/ deactivate/remove, sandbox simulation.BankingCircle.Webhook.Verifier— AES-256-GCM payload decryption with constant-time checksum verification.BankingCircle.FX— market-order trading, batched RFQ/indicative/ held-rate quote requests, single-pair held rate lookup, trade history (JSON + CSV), single-trade lookup, settlement date calendar, and customer exposure.BankingCircle.Reporting— the async request → poll → download report flow (request_report/3,poll_status/2,download/2), plus a blockingfetch_report/3convenience wrapper for scripts/background workers.BankingCircle.Cases/BankingCircle.Cases.RFI— case listing (cursor pagination), typed RFI/Recall case retrieval, attachment upload, and RFI answer submission (both the "request a return" and "answer every question" paths).BankingCircle.DirectDebit— mandate-based collection initiation against/api/v1/payments/direct-debit-instructions, always attaching an idempotency key (this is the one payment-initiation endpoint Banking Circle documents idempotency support for).BankingCircle.Payments.initiate_recall/3,.initiate_trace/2, and friends — payment recall and trace lifecycle.BankingCircle.Payments.create_fi_to_fi/2— Correspondent/Agency Banking payment initiation via the JSON API, plus embedded-rate/RFQ/held- rate FX support on the same payment.BankingCircle.ISO20022— pain.001/pacs.008 XML submission and camt.053 retrieval (transport layer only — does not build/validate XML; see its moduledoc for scope).BankingCircle.FX.Stream— WebSocket-based streaming FX quotes and Market Order execution, with automatic token-refresh-over-the-wire to keep long-lived sessions alive.BankingCircle.VirtualAccounts— VIBAN listing, customer/UBO details for POBO/COBO accounts (write-once), and the full closure lifecycle (close/2+close_status/2).order/2is included but flagged as endpoint-path-inferred rather than confirmed — see its moduledoc.BankingCircle.Accounts.list_bookings/3— transaction-level ledger (outflows and inflows), matchable to payments viabookingReference/transactionId.BankingCircle.Reporting.reconciliation_report/2— the synchronous Reconciliation Report endpoint (up to 50,000 payments inline), as a direct alternative to the async request/poll/download flow.- Full test suite (Bypass-backed) covering token single-flight behavior, retry policy boundaries, error normalization, webhook crypto round-trip and tamper detection, schema validation, FX trade/quote payload shaping, the full reporting request/poll/download flow, case RFI submission (both variants), direct debit idempotency-key attachment, recall/trace/fi-to-fi payload shaping, and virtual account list/order/close/update payload shaping.
Known gaps (tracked for future releases)
- Correspondent/Agency Banking via Swift is deliberately out of scope — it's a SWIFT FIN network integration, not a Banking Circle Connect HTTP endpoint, so there's nothing here for an HTTP client to wrap. See the README's scope section.
- Aliases (PayID, etc.) is genuinely not implemented — I could not confirm its REST endpoint paths/payloads against available documentation, and chose not to guess at a payment-routing feature where a wrong guess is dangerous. See the README's scope section.
BankingCircle.VirtualAccounts.order/2's endpoint path is inferred, not confirmed — verify before relying on it.BankingCircle.ISO20022doesn't build or validate XML documents for you — bring your own pain.001/pacs.008 XML.BankingCircle.FX.Streamhas had less real-world exercise than the REST modules (different transport,WebSockex-based) — verify reconnect/token-refresh behavior against your own sandbox first.