Packages

A complete, production-grade Elixir client for the Tipalti API surface: the modern OAuth2 REST API, the legacy HMAC-signed SOAP Payee/Payer API, and the Procurement REST API, with pagination, retries, telemetry, and IPN webhook support.

Current section

Files

Jump to
tipalti_client CHANGELOG.md
Raw

CHANGELOG.md

# Changelog
## 1.0.0
Initial release.
### Added
- **Modern REST API**: `Tipalti.Payees`, `Tipalti.Invoices`, `Tipalti.Payments`
— full CRUD/list/stream coverage, OAuth2 client-credentials auth with
automatic token caching and refresh (`Tipalti.Auth.TokenServer`).
- **Legacy SOAP API**: `Tipalti.SOAP.Payee` (21 operations) and
`Tipalti.SOAP.Payer` (24 operations), covering the full Payee/Payer
Functions surface, with automatic HMAC-SHA256 request signing
(`Tipalti.SOAP.Signature`) and XML fault parsing.
- **Procurement REST API**: `Tipalti.Procurement.PurchaseOrders` (list/update)
and `Tipalti.Procurement.Employees` (full 3-step CSV upload/import flow).
- `Tipalti.Config` for credential/environment management across all three
API families.
- `Tipalti.Error` and 6 typed exception subclasses
(`AuthenticationError`, `ValidationError`, `APIError`, `RateLimitError`,
`NetworkError`, `SOAPFaultError`).
- `Tipalti.HTTP`: transport built on OTP's `:httpc`/`:ssl` (no external HTTP
client dependency), with exponential backoff + full jitter retries and
TLS verification via `:public_key.cacerts_get/0`.
- `Tipalti.Pagination`: generic `Stream`-based auto-pagination, used by
every REST resource's `stream/2`.
- `Tipalti.RateLimiter`: optional token-bucket rate limiter for
high-throughput Procurement API usage.
- `Tipalti.Webhook`: IPN notification parsing.
- `Tipalti.Telemetry`: `:telemetry` span instrumentation on every request.
- Every read/write function has a raising `!` counterpart.
- `mix credo --strict`: 0 issues (312 functions analyzed). `mix dialyzer`: 0 errors.
Both `credo` and `dialyxir` (plus their small transitive deps) are pinned to
git tags rather than hex.pm, for environments where the hex.pm registry
isn't reachable — see the comment in `mix.exs`.