Crypto and wealth

The crypto half stops being a separate product.

Brokerage positions, custodial exchange balances and self-custody wallets return the same holdings shape — security metadata, quantity, cost basis, value — and net worth is computed across all of it. One integration instead of a bank vendor, an exchange vendor and a chain indexer.

who this is for

Three vendors, one number.

Portfolio and wealth products that have to include the crypto half

Wealth products fragment along infrastructure lines. Banks come from an aggregator, brokerages sometimes from the same one and sometimes not, exchanges each have their own API, and self-custody wallets need a chain indexer. Four integrations, four data models, and a net worth figure assembled by hand in your own code.

The user does not experience it that way. They have money in several places and they want one number, one allocation chart, and a history that does not stop at the bank boundary.

Here every venue routes through one Link flow and returns one set of shapes. Adding a venue is a connection, not a project — and the wallet path needs nobody's permission because reading a public address is not a regulated activity.

what you'd call

The endpoints this actually uses.

Holdings and balances are the core; the search endpoint matters more here than elsewhere, because a crypto onboarding should not surface regional banks.

Endpoints used by crypto and wealth integrations
POST/v1/investments/holdings/getPositions with security metadata and cost basis
POST/v1/investments/transactions/getBuys, sells, dividends and fees over a range
POST/v1/assets/getTotal assets, liabilities and net worth in one response
POST/v1/accounts/getCash balances alongside positions
POST/v1/accounts/balance/getRefreshed balances for a live portfolio view
POST/v1/institutions/searchTyped search: exchanges, wallets, brokerages
POST/v1/link/token/createOne flow for banks, brokerages, exchanges and wallets
POST/v1/items/refreshPull fresh valuations on demand

in code

What the integration looks like.

Aggregating across venues first, then the totals and history a portfolio view needs.

tsportfolio.ts
import { FeelConnect } from "@feelconnect/node"; const fc = new FeelConnect({  apiKey: process.env.FEELCONNECT_SECRET_KEY!,  baseUrl: "https://connect.feels.money/v1",}); // A brokerage, an exchange and a hardware wallet are three very// different upstreams and one response shape. Holdings carry security// metadata, quantity, cost basis and value regardless of source.export async function portfolio(accessTokens: string[]) {  const pages = await Promise.all(    accessTokens.map((access_token) => fc.investments.holdings({ access_token }))  );   const holdings = pages.flatMap((page) => page.holdings);   const byAssetClass = new Map<string, number>();  for (const holding of holdings) {    const key = holding.security.type; // equity | etf | crypto | cash | bond    byAssetClass.set(key, (byAssetClass.get(key) ?? 0) + holding.value);  }   return { holdings, byAssetClass };}
tsnet-worth.ts
// Net worth across everything the user connected, computed for you.const { total_assets, total_liabilities, net_worth } = await fc.assets.get({  access_token: accessToken,}); // Trades, dividends and fees when you need performance rather than a// point-in-time snapshot.const { investment_transactions } = await fc.investments.transactions({  access_token: accessToken,  start_date: "2026-01-01",  end_date: "2026-07-01",}); // Let the user find the right venue: search is typed, so a crypto// onboarding never makes someone scroll past a regional credit union.const { institutions } = await fc.institutions.search({  query: "",  types: ["crypto_exchange", "crypto_wallet", "investment"],}); console.log(net_worth, total_assets, total_liabilities);console.log(investment_transactions.length, institutions.length);

what you get

Mechanisms, in the order you would meet them.

  1. One holdings shape across every venue

    Security id, ticker, name, type, close price, quantity, cost basis and value — identical whether the source was a brokerage, an exchange or a wallet address.
  2. Self-custody without custody

    Wallets are tracked by public address through a configurable RPC endpoint. No private key exists anywhere in the system, and there is no signing path to abuse.
  3. Both exchange auth patterns

    OAuth where the venue supports it, and user-supplied read-only API keys where it does not — collected inside the same Link flow, with identical code on your side.
  4. Net worth computed, not assembled

    /v1/assets/get returns totals and net worth across connected accounts, so your portfolio view does not carry its own accounting layer.
  5. Typed institution search

    Filter by type and country so a crypto onboarding shows exchanges and wallets, and a retirement onboarding shows brokerages.
  6. Holdings webhooks

    holdings.updated tells you when a portfolio moved, signed and retried like every other event.

questions

Straight answers.

Show the whole picture, including the awkward half.

Connect a sandbox brokerage, an exchange and a wallet address and watch three very different upstreams return the same holdings array. No agreement required to try it.

The sandbox needs no approval and no card. You can have the shapes in front of you in a few minutes and decide from there.