Skip to content

Glossary

This is the single-page authoritative glossary. Both general finance terms (so the rest of the docs can use them without re-defining) and Scani-specific concepts. For each entry, an in Scani line points at the relevant concept or schema where one exists.


A category of financial instrument with shared characteristics. Common classes: equities, fixed income, cash & cash-equivalents, commodities, real estate, alternatives, cryptocurrencies. Scani tracks at the instrument level, not the asset-class level — asset-class summaries are derived from the type of each token.

A debt instrument: the holder lends money in exchange for periodic interest payments and return of principal at maturity. In Scani: tracked as a token of type='other' (no native bond integration yet); priced manually or via Google Sheets.

A token whose ledger is maintained on a public blockchain. Examples: BTC, ETH, SOL, USDC. In Scani: token.type='crypto'. Identity may include CoinGecko, DeFiLlama, Etherscan (for ERC-20s), or Solana (for SPL tokens) metadata.

A nine-character alphanumeric identifier for North American securities. In Scani: not modelled directly. The (symbol, type, marketSegment) tuple identifies a security.

A financial contract whose value derives from an underlying asset: options, futures, swaps. In Scani: not modelled directly.

Exchange-Traded Fund. A basket of assets that trades as a single listed security. In Scani: tracked as a regular type='public-stock' token; the basket composition is out of scope.

A share of ownership in a company. Public equity trades on a listed exchange; private equity does not. In Scani: token.type='public-stock' or 'private-company'.

A government-issued currency that is not backed by a physical commodity. USD, EUR, GBP, JPY, … In Scani: token.type='fiat'. FX rates supplied by Frankfurter (free, no key).

International Securities Identification Number. Twelve-character global identifier for a security. In Scani: not stored; disambiguation uses market segment.

The structural market the security trades on — NYSE/NASDAQ (US), London Stock Exchange (L), Toronto (TO), etc. AAPL on NYSE is not the same security as AAPL.L on LSE — different dividends, tax treatment, and liquidity. In Scani: the marketSegment column on tokens, part of the unique key alongside (symbol, typeId). Migration 0055.

Non-Fungible Token. A token where each unit is distinct. In Scani: not first-class. Holdings are quantitative; an NFT can be modelled as a type='other' token with a balance of 1.

A company whose shares are not publicly listed. In Scani: token.type='private-company'; prices entered manually with an audit trail in token_price_edit_history.

A cryptocurrency designed to maintain a fixed value (typically 1 USD or 1 EUR). USDC, USDT, DAI, EURC. In Scani: token.type='crypto'; treated like any other crypto asset, but commonly used as a hub in the price graph.

The short alphanumeric code used to identify a tradeable asset on a venue. BTC, AAPL, EUR. In Scani: tokens.symbol. Not globally unique on its own — paired with type and marketSegment.

Scani term of art. Any tradeable asset — fiat, crypto, equity, private company, or other. See Tokens & market segments.


A financial institution that holds fiat deposits. In Scani: institution.type='bank'. Connect via statement import or manual entries.

A firm that executes trades in equities and other securities on behalf of clients. In Scani: institution.type='broker'. Native integrations: Interactive Brokers (via Flex Web Service), Wise.

Centralised Exchange. A custodial crypto exchange (Binance, Kraken, Coinbase, …). The exchange holds the user’s keys. In Scani: institution.type='crypto_exchange'.

A wallet whose private keys are stored offline (paper, hardware, air-gapped device). High security, low convenience. In Scani: no distinction in the schema — it’s just a wallet.

A venue where someone else holds your keys (an exchange, a brokerage, a bank). In Scani: implicit in the institution type.

Decentralised Exchange. A non-custodial trading venue executed by smart contracts (Uniswap, dYdX). In Scani: trades on a DEX appear via the on-chain transaction history of the wallet that made them.

See CEX and DEX.

A dedicated device that holds private keys offline (Ledger, Trezor). In Scani: no distinction — addresses you control are non-custodial wallets.

A wallet whose keys are stored on an internet-connected device. In Scani: no distinction.

A pooled vehicle managed by a fund manager. In Scani: institution.type='investment_fund'; typically tracked manually.

A wallet whose transactions require multiple signatures. In Scani: no first-class support; tracked as a regular wallet whose balance is read from the multisig address.

A wallet whose private keys are held by the user. In Scani: institution.type='crypto_wallet'.

A single account at a venue that holds the assets of many underlying owners. Common in fund management. In Scani: not modelled — Scani’s tenancy is per-user.

Holding your own keys. Same as non-custodial.

A blockchain address (or addresses) that holds tokens. In Scani: institution.type='crypto_wallet'; the address lives in accounts.metadata.


A cost-basis method: every lot has cost equal to the running average of all acquisitions. In Scani: the rollup supports FIFO by default; average-cost configurability is on the wishlist.

The amount paid for an asset, used to compute realised gain or loss when it’s sold. Cost basis is per lot, so the order of sales matters (see FIFO / LIFO / HIFO). In Scani: tracked by the rollup per holding; the costBasis column on portfolio_value_daily carries the running total.

An accounting convention where every transaction has two equal sides (a debit and a credit). In Scani: the ledger uses signed quantities rather than explicit double-entry — every transaction has one row with a positive or negative quantity. The “other side” of a trade is captured via counterTokenId + counterQuantity on the same row.

First-In, First-Out. When closing a position, consume the oldest open lot first. In Scani: the rollup’s default lot-selection method.

Before fees and expenses. In Scani: transactions carry separate feeQuantity so gross and net can be derived.

Highest-In, First-Out. Consume the highest-cost open lot first — minimises realised gain. In Scani: not yet supported; on the wishlist.

Scani term of art. One (account, token) position with a balance. The atomic unit of portfolio tracking. See Holdings.

A chronological record of transactions. In Scani: the holding_transactions table.

The authoritative record of every event. In Scani, append-only. See Transactions (the ledger) and Why an append-only ledger.

Last-In, First-Out. Consume the newest open lot first. In Scani: not yet supported.

A discrete acquisition of an asset at a known cost. A holding may have many open lots; closing a position consumes lots per the chosen method (FIFO / LIFO / HIFO).

Valuing a position at its current market price rather than its cost basis. In Scani: the dashboard headline and chart are mark-to-market.

After fees and expenses.

Scani term of art. A point-in-time snapshot of a holding’s balance from a specific source. Append-only. See Observations & coverage.

The starting balance of a holding when its transaction history is incomplete. In Scani: synthesised by reconciliation as a kind='opening_balance' transaction, so the ledger reconciles with the current balance.

A held quantity of an asset at a venue. In Scani: same as holding.

Gain or loss from positions that have been closed. In Scani: the realizedPnl column on portfolio_value_daily.

Comparing two records and resolving discrepancies. In Scani: opening-balance reconciliation synthesises a transaction to make sum(transactions) equal holdings.balance.

Gain or loss on open positions, computed as mark-to-market value − cost basis. In Scani: the unrealizedPnl column on portfolio_value_daily.


A free token distribution. In Scani: kind='airdrop'. Cost basis typically zero.

Acquiring an asset in exchange for another. In Scani: kind='buy', with counterToken and counterQuantity describing what was paid.

An inflow from outside the tracked system (or from an unpaired source). In Scani: kind='deposit'.

A cash distribution from a company to shareholders. In Scani: tracked as kind='reward' or kind='interest' depending on context; future iteration may add kind='dividend'.

A charge by a venue for executing a transaction. In Scani: kind='fee' (a standalone fee row) or feeQuantity / feeTokenId on a trade row.

Yield paid on a holding. In Scani: kind='interest', produced by APY payouts or by ingesting upstream interest events.

A protocol-driven change in token quantity (e.g. some elastic-supply tokens). In Scani: not in the live kind set yet; ingesters can introduce it without a migration because kind is intentionally loose.

A payout for participating (staking, mining, liquidity provision). In Scani: kind='reward'.

Disposing of an asset in exchange for another. In Scani: kind='sell'.

The date a trade actually settles (cash + asset change hands). Often later than trade date. In Scani: not modelled — transactions use a single occurredAt.

A re-denomination of shares (2-for-1, 3-for-1, …). In Scani: not yet first-class.

A single trade that produces both an outflow and an inflow. In Scani: two transactions (kind='swap_in' + kind='swap_out') sharing a swapGroupId.

The date a trade is executed (price agreed). In Scani: the occurredAt on the transaction.

Any economic event. In Scani: a row in holding_transactions. See Transactions.

A move of assets between two accounts. In Scani: two rows (kind='transfer_out' + kind='transfer_in', or 'withdraw' + 'deposit') linked by transferGroupId.

An outflow to outside the tracked system. In Scani: kind='withdraw'.


The denominator in a price (BTC/USD → USD is the base). In Scani: tokenPrices.baseTokenId. No USD-canonical assumption.

Best buy and best sell prices on an order book. In Scani: not modelled at the lot level; price data is mid or close.

An OHLC (open / high / low / close) bar at a fixed time interval. In Scani: not modelled — prices are point quotes at a timestamp.

A price between two non-USD currencies computed via a common hub. In Scani: the price graph’s one-hop and two-hop routing.

Foreign Exchange. Conversion between fiat currencies. In Scani: supplied by Frankfurter with no key required.

The intended timescale of a price: daily (closes), intraday (live), or tx-exact (price at a transaction’s timestamp). In Scani: the granularity column on token_prices.

The midpoint between bid and ask. In Scani: typically what upstream APIs return for a “current price”.

Open / High / Low / Close. Standard market-data bar shape. In Scani: not stored; only point quotes.

Scani term of art. The implicit directed graph defined by token_prices rows. See Pricing & the price graph.

Same as base currency (the denominator).

The current market price for immediate delivery. In Scani: intraday prices are spot-equivalents.

A price older than the granularity-appropriate staleness cap. In Scani: the stale flag on PriceGraphConversion; folded into coverage quality.


The gradual accumulation of interest over time. In Scani: the APY payout job applies accrued interest on the configured schedule.

Annual Percentage Rate. Simple-interest annual rate. In Scani: not stored directly; APY is the configured rate.

Annual Percentage Yield. Effective annual rate accounting for compounding within the year. In Scani: holdingApyConfigs.annualRatePct.

Reinvesting yield so it earns yield itself. In Scani: approximated by daily payouts; longer payout frequencies undercount compounded yield slightly.

Supplying assets to a market-making pool in exchange for yield (and impermanent-loss risk). In Scani: rewards from LP positions land as kind='reward'.

Loaning out an asset for yield. In Scani: tracked by manually configuring an APY config on the relevant holding, or by ingesting the upstream protocol’s interest events.

Locking a token to support network operations in exchange for rewards. In Scani: same as lending — APY config or upstream event ingestion.

Moving assets between protocols to chase the highest yield. In Scani: each leg appears as a regular transaction; no first-class “strategy” model.


A batch of transactions appended to a blockchain. In Scani: not modelled directly; transactions reference the block via the chain tx hash.

A blockchain. Ethereum, Polygon, Bitcoin, Solana, Tron, TON, etc. In Scani: the chain catalogue lives in institution_blockchain_mappings.

The address of a smart contract on an EVM chain. In Scani: tokens.providerMetadata.etherscan.contractAddress.

Ethereum Name Service. Human-readable names for Ethereum addresses (vitalik.eth). In Scani: resolved by the wallet- discovery flow.

Ethereum Virtual Machine. The execution environment shared by Ethereum and many compatible chains (Polygon, Arbitrum, Optimism, Base, …). In Scani: Etherscan V2 covers every EVM chain with one API key.

The fee paid to execute a transaction on a blockchain. In Scani: tracked in feeQuantity / feeTokenId on transactions.

Not recorded on a blockchain. In Scani: every CEX trade is off-chain by definition (from the chain’s perspective).

Recorded on a blockchain. In Scani: every wallet transaction is on-chain; the source is the blockchain RPC.

The unique identifier of a blockchain transaction. In Scani: used as externalId for on-chain transactions.


A per-user container for holdings at one institution. See Accounts & institutions.

A Postgres-level lock that callers cooperatively acquire. In Scani: used by the cron-lock wrapper to make scheduled jobs idempotent. See Why BullMQ + Postgres advisory locks.

The Redis-backed job-queue library Scani uses. In Scani: every async job runs through it. The api is the producer; the worker is the consumer.

Scani term of art. Per-holding metadata about transaction and observation completeness. See Observations & coverage.

Scani term of art. A bucket on each rollup row: full, partial, estimated, or unknown. Drives chart rendering (solid / dashed / gap).

Scani term of art. The Bun service that centralises every outbound third-party call. The seam between Tier 1 and Tier 2/3.

Scani term of art. A user-defined tag for organising holdings and accounts. Many-to-many on both. See Groups.

Scani term of art. The canonical predicate for whether a holding contributes to a portfolio total (!isHidden && isActive && token.isScamProbability < THRESHOLD). Implemented in TS and SQL. See Why the holding-inclusion rule lives twice.

Scani term of art. A financial entity (exchange, bank, brokerage, blockchain) under which a user has one or more accounts. See Accounts & institutions.

Scani term of art. A synthetic per-user institution row used to anchor manual holdings. See Why manual data is a synthetic institution.

See holding-inclusion rule.

Scani term of art. The daily portfolio-value cache, portfolio_value_daily. See Portfolio value rollup.

Scani term of art. The shared swapGroupId linking both legs of a swap. See Transfers & swaps.

Scani term of art. One of three deployment shapes: Tier 1 (fully self-hosted), Tier 2 (semi-managed via hosted data-provider), Tier 3 (fully managed). See Tier model.

Scani term of art. The merged per-provider metadata that materialises a token row from a partial provider-supplied identifier. See Token identity & enrichment.

Scani term of art. The shared transferGroupId linking a CEX withdrawal to a wallet deposit (and vice versa). See Transfers & swaps.

Scani term of art. A user-defined savings goal with a target amount and currency, accumulating from percentage splits of holdings. See Vaults.