defmodule TreasuryPrime do
@moduledoc """
An unofficial, complete Elixir client for the [Treasury Prime](https://www.treasuryprime.com)
banking API (the Ledger product) — bank accounts, ACH, wires, book
transfers, FedNow, cards, account opening / KYC, check deposit (RDC),
check issuing, webhooks, sandbox simulations, and more.
This module just re-exports `TreasuryPrime.Client.new/1` for convenience.
Everything else lives in resource-specific modules named after the
Treasury Prime object they wrap: `TreasuryPrime.Account`,
`TreasuryPrime.Ach`, `TreasuryPrime.Wire`, `TreasuryPrime.Card`, and so on
— see the docs sidebar for the full list, grouped by area.
## Quick start
client =
TreasuryPrime.new(
api_key_id: System.fetch_env!("TREASURY_PRIME_KEY_ID"),
api_key_value: System.fetch_env!("TREASURY_PRIME_KEY_VALUE"),
environment: :sandbox
)
{:ok, page} = TreasuryPrime.Account.list(client)
Enum.each(page.data, &IO.inspect/1)
{:ok, ach} =
TreasuryPrime.Ach.create(
client,
%{
account_id: "acct_123456",
counterparty_id: "cp_098765",
amount: "100.00",
direction: "credit",
sec_code: "ccd"
},
idempotency_key: TreasuryPrime.Idempotency.generate_key()
)
## Design notes
* **Every function comes in a non-raising and a raising flavor.**
`TreasuryPrime.Account.get/2` returns `{:ok, account} | {:error, error}`;
`TreasuryPrime.Account.get!/2` returns the account or raises a
`TreasuryPrime.Error`.
* **Zero required HTTP dependency.** The default transport is built on
Erlang's own `:httpc`/`:ssl` (see `TreasuryPrime.HTTPClient.Httpc`).
Plug in Req, Finch, or anything else by implementing the one-callback
`TreasuryPrime.HTTPClient` behaviour and passing
`http_client: YourAdapter` to `new/1`.
* **Pagination is lazy.** `list/2` functions return a `TreasuryPrime.Page`;
call `TreasuryPrime.Page.stream/1` to get a lazy `Stream` over every
result across every page.
* **Nested/embedded objects** (addresses, card controls, IMAD/OMAD wire
tracing info, etc.) are kept as plain string-keyed maps rather than
further nested structs, to keep the library's surface area
manageable — only top-level resource fields are typed struct fields.
* **Unknown response fields are ignored, not errors.** Treasury Prime
can add fields to responses over time; this library won't break when
that happens.
"""
alias TreasuryPrime.Client
@doc "Alias for `TreasuryPrime.Client.new/1`."
@spec new(keyword()) :: Client.t()
def new(opts), do: Client.new(opts)
end