Skip to content

Provider matrix

Each provider lives in packages/clients/providers/src/providers/ and implements one or more capability interfaces. Without the relevant env var the provider still registers and degrades — it returns nothing, or falls back to a keyless public tier — rather than refusing the call. No route returns an error to say a key is missing, so How to tell what’s enabled is the check.

ProviderEnv varCapabilitiesNotes
CoinGeckoCOINGECKO_API_KEYprice, token-identityPublic tier (no key) works but is rate-limited.
FinnhubFINNHUB_API_KEYprice, token-identityPublic equities.
DeFiLlamanoneprice, token-identityFree. Coin spec is chain:address or coingecko:slug.
FrankfurternonepriceFiat FX rates from named central banks, through Frankfurter v2. A pair both of whose currencies the European Central Bank publishes is read from the ECB’s table; one with a currency only the Bank of Russia publishes (RUB, KZT, AED, …) from the Bank of Russia’s. Both sides always from one bank. The Google Sheets converter and the base-currency converter read the same client.
BLSnoneinflation indexUS consumer price index (CPI-U) for the returns card’s inflation line. Public API v1, no key, 25 requests a day.
Yahoo FinancenonepriceBackup pricing source for equities.
Google SheetsGOOGLE_SHEETS_ID + GOOGLE_SERVICE_ACCOUNT_KEY (base64 JSON)price (current only)Per-user manual-asset prices read from a sheet. Lives in its own workspace (packages/clients/providers-google-sheets). Historical falls through to Frankfurter.
ProviderEnv varCapabilitiesNotes
Binanceuser-supplied API key/secretbalance, transactionHMAC-signed, like every other exchange here.
Krakenuser-supplied API key/secretbalance, transaction, price, token-identityFull breadth.
Bybituserbalance, transaction
OKXuserbalance, transaction
Coinbaseuserbalance, transaction
KuCoinuserbalance, transaction
Gate.iouserbalance, transaction
HTX (Huobi)userbalance, transaction
Bitstampuserbalance, transaction
Bitgetuserbalance, transaction
Geminiuserbalance, transaction
MEXCuserbalance, transaction

User-supplied credentials are AES-256-GCM-encrypted in user_integration_credentials with ENCRYPTION_KEY. They never leave your api.

ProviderEnv varCapabilitiesNotes
Interactive Brokersuser-supplied Flex Web Service tokenbalance, transactionFlex token + query ID configured per user.
Wiseuser-supplied API tokenbalance, transaction
Airwallexuser-supplied Client ID + API keybalance, transactionClient ID + API key exchanged for a 30-min bearer token per call.
bunquser-supplied personal API keybalance, transactionSelf-hosted Scani only. bunq allows a personal API key only in software you run yourself, so the hosted product lists bunq and refuses to connect it. There, export a statement from bunq as MT940 or CSV and import that instead; bunq offers no CAMT.053. Connecting registers the key with bunq once and stores that registration encrypted beside it. A standard key is tied to the IPv4 address it was first used from, so the API and the worker must reach bunq from the same address, or the key must allow all IP addresses (a setting in the bunq app).
Investecuser-supplied client ID, secret and API keybalance, transactionSelf-hosted Scani only. Investec lets your own credentials serve you or your business; a platform for many clients needs Investec’s own onboarding, so the hosted product lists Investec and refuses to connect it. South Africa Private Bank accounts. Connecting refuses an API key that can transfer or pay, so give it only account, balance and transaction access. With no start date, Investec returns the last 180 days.
Fio bankauser-supplied API tokenbalance, transactionSelf-hosted Scani only. Fio holds you liable for any use of your token by someone else, so the hosted product lists Fio banka and refuses to connect it; it points to a CSV statement instead. One token covers one account, and Fio allows one call per token every 30 seconds. With no start date the read covers 90 days: older movements need an unlock in internetbanking first. Choose the “Sledování účtu” (account monitoring) permission; even a token that may enter payment orders cannot authorise them.
ProviderEnv varCapabilitiesNotes
Etherscan V2ETHERSCAN_API_KEYbalance, transaction, token-identityOne key covers every EVM chain Scani reads (Ethereum, Polygon, Arbitrum, Optimism, Base, BNB, …).
HeliusHELIUS_API_KEYbalance, transaction, token-identitySolana SPL + native.
Bitcoinnonebalance, transactionPublic RPC.
Tronnonebalance, transaction
TONnonebalance, transaction
ENSnoneidentityResolves vitalik.eth → address.
ProviderEnv varCapabilitiesNotes
OpenAIOPENAI_API_KEYAI inferenceModel pinned to gpt-5.6-luna for both text and vision. Not configurable.
AI stubSTUB_AI=1AI inference (stub)Test-only. Returns a fixed holdings payload so e2e tests don’t depend on a real AI provider. Refused in production by the data-provider env schema.
Chain stubSTUB_CHAIN_DATA=1Balances, transactions, address validation (stub)Test-only. Answers every chain from a local fixture so e2e tests don’t depend on a public chain API’s rate limiter. Address-shape checks are the real providers’ own, so a stubbed boot cannot disagree with a live one about what a valid address looks like. Refused in production by the api, worker and data-provider env schemas.

Minimum useful set for a self-hoster with a connected crypto exchange:

  • ETHERSCAN_API_KEY if you have an EVM wallet.
  • HELIUS_API_KEY if you have a Solana wallet.
  • Either COINGECKO_API_KEY (paid tier) or rely on the free CoinGecko fallback if your portfolio is small.
  • OPENAI_API_KEY if you want screenshot import.

Public-equity support adds FINNHUB_API_KEY.

Brokerages and banks don’t need an operator-side env var — they work with per-user credentials only.

ProviderMaturity
Etherscan V2, Helius, CoinGecko, FrankfurterSolid. Used by every Scani deployment.
KrakenSolid. Most-tested exchange adapter.
Binance, Coinbase, Bybit, OKXSolid for balance + recent transactions. Edge cases on multi-account / sub-account setups.
KuCoin, Gate, HTX, Bitstamp, Gemini, MEXC, BitgetFunctional. Less battle-tested.
IBKR (Flex), Wise, AirwallexFunctional. Flex query setup is the main user friction.
bunqNew. Built and tested against bunq’s sandbox; not yet run against a real account.
InvestecNew. Built and tested against Investec’s sandbox; not yet run against a real account.
Fio bankaNew. Built from Fio’s API document; Fio has no sandbox, so it has not run against an account.
Bitcoin, Tron, TON, ENSFunctional. Public RPCs are slow on big wallets.
OpenAI VisionSolid for screenshots; quality degrades on dark-mode or non-English UIs.

See Adding a provider — this is the highest-leverage kind of contribution.