Pluggy AI - Demo Notebook

Copy Markdown View Source
Mix.install([
  {:pluggy_ai, path: Path.join(__DIR__, "..")},
  {:kino, "~> 0.14"},
])

Configuration

Enter your Pluggy API credentials below.

client_id_input = Kino.Input.text("Client ID")
client_secret_input = Kino.Input.text("Client Secret", type: :password)

Kino.Layout.grid([client_id_input, client_secret_input], columns: 2)

Create Client

This authenticates with the Pluggy API eagerly — if your credentials are wrong, you'll get an error here.

client_id = Kino.Input.read(client_id_input)
client_secret = Kino.Input.read(client_secret_input)

{:ok, client} = Pluggy.Client.new(client_id, client_secret)

List Connectors

Fetch available connectors and display a simplified view.

{:ok, %{results: connectors}} = Pluggy.Connectors.list(client)

connectors_simplified =
  for %{name: name, id: id, products: products} <- connectors do
    %{name: name, id: id, products: products}
  end
  |> Enum.sort_by(& &1.name)

Kino.DataTable.new(connectors_simplified)

Pluggy Connect Widget

Render the Pluggy Connect widget inline. Select a bank and complete the connection flow.

You can pass a :client directly — the widget generates the token for you:

widget = Pluggy.Connect.Kino.new(client, include_sandbox: true)

Connected Item

After completing the connection above, run this cell to retrieve the item data.

item = Pluggy.Connect.Kino.await_item(widget)

Accounts

Fetch the accounts for the connected item.

accounts = Pluggy.Accounts.list(client, item) |> Pluggy.Unwrap.results()
Kino.DataTable.new(accounts)

Transactions

Pass an account map directly — no need to extract the ID manually.

transactions_map =
  for account <- accounts, into: %{} do
    transactions = Pluggy.Transactions.list(client, account) |> Pluggy.Unwrap.results()
    {account.type, transactions}
  end

for {type, transactions} <- transactions_map do
  %{name: String.capitalize(type), transaction_count: length(transactions)}
end
|> Kino.DataTable.new()
transaction_select =
  transactions_map
  |> Enum.map(fn {key, _v} = option -> {option, String.capitalize(key)} end)

type_select = Kino.Input.select("Transaction type:", transaction_select)
{account_type, transactions} =
  type_select
  |> Kino.Input.read()

Kino.DataTable.new(
  transactions,
  name: "\'#{String.capitalize(account_type)}\' transactions"
)

Investments

Fetch investments for the item, then pass an investment map to get its transactions.

investments = Pluggy.Investments.list(client, item) |> Pluggy.Unwrap.results()
Kino.DataTable.new(investments)
investment = hd(investments)
inv_transactions = Pluggy.Investments.transactions(client, investment) |> Pluggy.Unwrap.results()
Kino.DataTable.new(inv_transactions)