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
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.
| POST | /v1/investments/holdings/get | Positions with security metadata and cost basis |
| POST | /v1/investments/transactions/get | Buys, sells, dividends and fees over a range |
| POST | /v1/assets/get | Total assets, liabilities and net worth in one response |
| POST | /v1/accounts/get | Cash balances alongside positions |
| POST | /v1/accounts/balance/get | Refreshed balances for a live portfolio view |
| POST | /v1/institutions/search | Typed search: exchanges, wallets, brokerages |
| POST | /v1/link/token/create | One flow for banks, brokerages, exchanges and wallets |
| POST | /v1/items/refresh | Pull fresh valuations on demand |
in code
What the integration looks like.
Aggregating across venues first, then the totals and history a portfolio view needs.
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 };}// 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.
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.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.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.Net worth computed, not assembled
/v1/assets/getreturns totals and net worth across connected accounts, so your portfolio view does not carry its own accounting layer.Typed institution search
Filter by type and country so a crypto onboarding shows exchanges and wallets, and a retirement onboarding shows brokerages.Holdings webhooks
holdings.updatedtells you when a portfolio moved, signed and retried like every other event.
questions
Straight answers.
Other use cases
- AI agents and assistantsAn MCP server with 15 tools, an OpenAPI 3.1 document and an llms.txt — so an agent can discover the platform, connect an account and read real balances without you writing a tool wrapper.
- Budgeting and personal finance appsCursor-based transaction sync, categorization and subscription detection included — the exact stack feels.money runs on.
- Lending and underwritingIdentity, income streams, assets and liabilities from the source, with cash-flow forecasting and anomaly signals on top.
- Accounting and bookkeepingA reconciliation-shaped sync loop with added, modified and removed sets, plus merchant cleanup and categorization on the same key.
- Platform pricingPublished tiers with the real quotas: Free for the sandbox, Startup at $99 for live access, Growth at $499, Enterprise quoted.
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.