MoneyHub (MoneyHub v1.0.0)

Copy Markdown View Source

A client for the Moneyhub Open Finance API.

Moneyhub provides three core capabilities, each with a corresponding group of modules in this library:

All of the above sit on top of MoneyHub.Auth, which implements Moneyhub's OpenID Connect flows (Pushed Authorisation Requests, private_key_jwt client authentication, authorisation code exchange, and client_credentials tokens for ongoing access).

Configuration

Build a MoneyHub.Config once (typically at application boot, or per-tenant if you serve multiple Moneyhub clients) and pass it to every call:

config = MoneyHub.Config.new!(
  environment: :sandbox,
  client_id: System.fetch_env!("MONEYHUB_CLIENT_ID"),
  jwk: MoneyHub.Auth.PrivateKeyJWT.load_jwk!(System.fetch_env!("MONEYHUB_PRIVATE_KEY_PATH")),
  jwk_kid: System.fetch_env!("MONEYHUB_KEY_ID"),
  redirect_uri: "https://myapp.example.com/moneyhub/callback"
)

This library starts its own supervised Finch connection pool (MoneyHub.Finch) under MoneyHub.Application - no extra setup is required beyond adding :money_hub to your application's dependencies. Configure pool sizing via:

config :money_hub, :finch_pools, %{default: [size: 25, count: 1]}

End-to-end example: connect a bank account, then read transactions

alias MoneyHub.{Auth, Claims, Scopes, Accounts, Transactions}
alias MoneyHub.Auth.IdToken

# 1. Build an authorisation URL for a new user
claims = Claims.new() |> Claims.put_sub()

{:ok, %{url: url}} =
  Auth.pushed_authorisation_request(config, scope: Scopes.ais_offline(), claims: claims)

# 2. Redirect the user's browser to `url`. They authenticate at
#    their bank and are redirected back to your `redirect_uri` with
#    `?code=...&state=...`.

# 3. Exchange the code for tokens and verify the id_token
{:ok, tokens} = Auth.exchange_code(config, code)
{:ok, id_claims} = IdToken.verify(tokens.id_token, config)
user_id = id_claims["sub"]

# 4. From now on, fetch fresh data tokens for this user as needed
{:ok, data_token} = Auth.token_for_user(config, user_id)
{:ok, accounts} = Accounts.list(config, data_token.access_token)
{:ok, transactions} = Transactions.list(config, data_token.access_token, account_id: hd(accounts)["id"])

See the MoneyHub.Auth, MoneyHub.Claims, and MoneyHub.Scopes module docs for the full range of supported flows, including single-use (no persistent user) connections, payments, VRP, and standing orders.