All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
1.0.0 - 2026-08-08
Added
Core infrastructure
PlaidEx.Config— NimbleOptions-validated configuration with runtime injection supportPlaidEx.HTTP.Client— Req + Finch HTTP client with full jitter backoff, idempotency, and OpenTelemetry spansPlaidEx.HTTP.RateLimiter— ETS token bucket rate limiter with per-tenant isolationPlaidEx.Error— Typed error struct with retry classification, reauthentication detection, and telemetry-safe serialization
API coverage
PlaidEx.API.Link— Link token create/get/listPlaidEx.API.Items— Token exchange, item get/remove/webhook update, processor token creationPlaidEx.API.Accounts— Account get, balance getPlaidEx.API.Transactions— Sync (cursor-based), get (legacy), recurring, enrich, refreshPlaidEx.API.Auth— Auth getPlaidEx.API.Identity— Identity get, matchPlaidEx.API.Investments— Holdings get, transactions get, refreshPlaidEx.API.Liabilities— Liabilities getPlaidEx.API.Transfer— Authorize, create, get, cancel, list, event list, event syncPlaidEx.API.Signal— Evaluate, decision report, return report, preparePlaidEx.API.Institutions— Get by ID, list, searchPlaidEx.API.Assets— Create, get, get PDF, remove, filter, create audit copyPlaidEx.API.Income— Create verification, get summary, get payrollPlaidEx.API.Statements— List, download, refreshPlaidEx.API.Beacon— Create/get/review user, create/list reportsPlaidEx.API.Monitor— Individual and entity watchlist screeningPlaidEx.API.Processor— Auth, identity, balance, Stripe bank account tokenPlaidEx.API.Sandbox— Public token, fire webhook, reset login, simulate transfers
Reliability
PlaidEx.Reliability.CircuitBreaker— Per-environment GenServer circuit breaker with :closed/:open/:half_open statesPlaidEx.Reliability.CircuitBreakerSupervisor— DynamicSupervisor managing circuit breakersPlaidEx.Reliability.Bulkhead— Bounded process pool isolation per product area
Transaction sync
PlaidEx.Sync.TransactionSync— Durable cursor-based sync worker with OTP supervisionPlaidEx.Sync.SyncSupervisor— DynamicSupervisor for per-item sync workersPlaidEx.Sync.CursorStore— ETS cursor store with pluggable backend behaviourPlaidEx.Sync.BroadwayPipeline— Broadway integration for high-throughput multi-item sync
Webhooks
PlaidEx.Webhooks.Plug— Phoenix Plug with signature verification, deduplication, async dispatchPlaidEx.Webhooks.Verifier— HMAC-SHA256 and JWT webhook verificationPlaidEx.Webhooks.Dispatcher— Typed event routing to handler callbacksPlaidEx.Webhooks.Deduplicator— ETS sliding window deduplicationPlaidEx.Webhooks.Handler— Behaviour +usemacro with default no-op implementationsPlaidEx.Webhooks.ObanWorker— Oban-backed durable webhook processingPlaidEx.Webhooks.Schemas— Typed structs for all 20+ webhook event types
Multi-tenant
PlaidEx.Config.TenantRegistry— ETS-backed runtime credential store with secret rotationPlaidEx.MultiTenant.TenantSupervisor— DynamicSupervisor for per-tenant process subtreesPlaidEx.MultiTenant.Tenant— Per-tenant GenServer with isolated rate limiting
OAuth
PlaidEx.OAuth.PKCE— PKCE code_verifier/challenge generation (S256 method)PlaidEx.OAuth.StateStore— ETS OAuth state store with TTL and single-use consumptionPlaidEx.OAuth.Flow— High-level OAuth flow orchestration
Schemas
- Typed structs for: Account, Transaction, TransactionSyncPage, Item, Institution, Transfer, LinkToken, AccessToken, InvestmentHolding, Security, IdentityData
Observability
PlaidEx.Telemetry.Handler— Structured logging for all 14 telemetry eventsPlaidEx.Telemetry.Metrics— Telemetry.Metrics definitions (histograms, counters, sums)PlaidEx.Telemetry.OpenTelemetry— OpenTelemetry span wrappers
Testing
PlaidEx.Test.BypassHelpers— Bypass stubs for all major endpoints with realistic fixturesPlaidEx.Test.MockPlaidServer— Full mock Plaid server for integration testingPlaidEx.Test.MockPlaidServer.build_webhook/3— Typed webhook payload buildersPlaidEx.Test.MockPlaidServer.build_signed_webhook/2— HMAC-signed webhook builder
CI/CD
- GitHub Actions workflow with matrix testing (Elixir 1.17/1.18, OTP 27/28)
- Automatic Hex.pm publishing on git tag
- Dialyzer PLT caching
- ExCoveralls integration
Changed
- N/A (initial release)
Deprecated
- N/A (initial release)
Removed
- N/A (initial release)
Fixed
- N/A (initial release)
Security
- Webhook secrets are never logged (scrubbed in telemetry metadata)
- Access tokens are masked in log output (only first 20 chars shown)
- Config.scrub/1 redacts secrets for safe logging
Upgrade Guide
From plaid (the other Elixir Plaid library)
# Before (plaid library):
{:ok, %{"accounts" => accounts}} = Plaid.Accounts.get("access-...")
# After (plaid_ex):
{:ok, %{accounts: accounts}} = PlaidEx.API.Accounts.get(config, "access-...")
# accounts is now [%PlaidEx.Schemas.Account{}] — typed structsKey differences:
- Typed structs — responses are typed structs, not raw maps
- Explicit config — pass a
PlaidEx.Configstruct (enables multi-tenant) - Error structs — errors are
PlaidEx.Errorstructs with retry metadata - Automatic sync — use
PlaidEx.start_transaction_sync/2instead of manual polling