defmodule Column do @moduledoc """ Production-grade Elixir client for the [Column Bank API](https://docs.column.com). Column is a bank-as-a-service platform providing FDIC-insured accounts, KYC/KYB compliance, and every major US payment rail: ACH, Fedwire, SWIFT international wires, RTP/FedNow realtime payments, and checks. ## Installation Add `column` to your dependencies in `mix.exs`: def deps do [ {:column, "~> 0.1"} ] end ## Configuration Set your Column API key in `config/config.exs`: config :column, api_key: System.get_env("COLUMN_API_KEY") For runtime configuration (e.g. `config/runtime.exs`): config :column, api_key: System.get_env("COLUMN_API_KEY"), base_url: "https://api.column.com", # default timeout: 30_000, max_retries: 3 Per-request config override (useful for multi-tenant setups): config = %Column.Config{api_key: "live_abc123"} Column.BankAccounts.list(config: config) ## Environments - **Sandbox:** Use `test_...` prefixed API keys. Call `Column.Simulation.*` to trigger synthetic network events. - **Production:** Use `live_...` prefixed API keys. ## Module map | Domain | Module | |---|---| | KYC / KYB | `Column.Entities` | | Bank accounts | `Column.BankAccounts` | | Virtual account numbers | `Column.AccountNumbers` | | Counterparties | `Column.Counterparties` | | ACH transfers + positive pay | `Column.ACH` | | Book transfers | `Column.BookTransfers` | | Domestic wires | `Column.Wires` | | International wires + FX | `Column.InternationalWires` | | Realtime (RTP / FedNow) | `Column.RealtimeTransfers` | | Checks | `Column.Checks` | | All transfers unified | `Column.Transfers` | | Loans & programs | `Column.Loans` | | Loan disbursements | `Column.Disbursements` | | Loan payments | `Column.LoanPayments` | | Events | `Column.Events` | | Webhooks | `Column.Webhooks` | | Reporting | `Column.Reporting` | | Documents | `Column.Documents` | | Sandbox simulation | `Column.Simulation` | | Pagination helpers | `Column.Pagination` | | HTTP client | `Column.Client` | | Config | `Column.Config` | | Error type | `Column.Error` | ## Error handling All functions return `{:ok, map()}` or `{:error, %Column.Error{}}`: case Column.BankAccounts.get("bacc_missing") do {:ok, account} -> account {:error, %Column.Error{type: :api_error, status: 404}} -> {:error, :not_found} {:error, %Column.Error{type: :network_error} = err} -> Logger.error("Column network error: \#{err.message}") {:error, :unavailable} end ## Pagination All list functions support cursor pagination. Use `Column.Pagination.stream/2` to consume pages lazily as a `Stream`: Column.Pagination.stream(&Column.Transfers.list/1, limit: 100) |> Stream.filter(fn transfer -> transfer["status"] == "SETTLED" end) |> Enum.to_list() ## Idempotency All POST requests automatically generate and attach an `Idempotency-Key` header. Supply your own to control retry behaviour: Column.ACH.create(%{...}, idempotency_key: "my-unique-key") ## Webhook signature verification Column.Webhooks.verify_signature(raw_body, signature_header, webhook_secret) # => :ok | :error """ @doc """ Returns the current library version. ## Module map | Domain | Module | |---|---| | KYC / KYB | `Column.Entities` | | Bank accounts | `Column.BankAccounts` | | Virtual account numbers | `Column.AccountNumbers` | | Counterparties | `Column.Counterparties` | | ACH transfers + positive pay | `Column.ACH` | | Book transfers | `Column.BookTransfers` | | Domestic wires | `Column.Wires` | | International wires + FX | `Column.InternationalWires` | | Realtime (RTP / FedNow) | `Column.RealtimeTransfers` | | Checks | `Column.Checks` | | All transfers unified | `Column.Transfers` | | Loans & programs | `Column.Loans` | | Loan disbursements | `Column.Disbursements` | | Loan payments | `Column.LoanPayments` | | Events | `Column.Events` | | Webhooks | `Column.Webhooks` | | Webhook handler behaviour | `Column.WebhookHandler` | | Reporting | `Column.Reporting` | | Documents | `Column.Documents` | | Sandbox simulation | `Column.Simulation` | | Pagination helpers | `Column.Pagination` | | Money / currency helpers | `Column.Money` | | Param builder / validation | `Column.Params` | | Idempotency key helpers | `Column.Idempotency` | | Rate limit parsing | `Column.RateLimit` | | Telemetry events | `Column.Telemetry` | | HTTP client | `Column.Client` | | Config | `Column.Config` | | Error type | `Column.Error` | """ @spec version() :: String.t() def version, do: to_string(Application.spec(:column, :vsn)) end