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.
Browse by topic
Section titled “Browse by topic”- Asset & instrument
- Custody & venue
- Position & ledger
- Transactions
- Pricing & FX
- Yield
- Blockchain
- Scani-specific
Asset & instrument
Section titled “Asset & instrument”Asset class
Section titled “Asset class”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.
Cryptocurrency
Section titled “Cryptocurrency”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.
Derivative
Section titled “Derivative”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.
Equity
Section titled “Equity”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.
Market segment
Section titled “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.
Private company
Section titled “Private company”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.
Stablecoin
Section titled “Stablecoin”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.
Ticker symbol
Section titled “Ticker symbol”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.
Custody & venue
Section titled “Custody & venue”A financial institution that holds fiat deposits. In Scani:
institution.type='bank'. Connect via statement import or manual
entries.
Brokerage
Section titled “Brokerage”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'.
Cold wallet
Section titled “Cold wallet”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.
Custodial
Section titled “Custodial”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.
Exchange
Section titled “Exchange”Hardware wallet
Section titled “Hardware wallet”A dedicated device that holds private keys offline (Ledger, Trezor). In Scani: no distinction — addresses you control are non-custodial wallets.
Hot wallet
Section titled “Hot wallet”A wallet whose keys are stored on an internet-connected device. In Scani: no distinction.
Investment fund
Section titled “Investment fund”A pooled vehicle managed by a fund manager. In Scani:
institution.type='investment_fund'; typically tracked manually.
Multisig
Section titled “Multisig”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.
Non-custodial
Section titled “Non-custodial”A wallet whose private keys are held by the user. In Scani:
institution.type='crypto_wallet'.
Omnibus account
Section titled “Omnibus account”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.
Self-custody
Section titled “Self-custody”Holding your own keys. Same as non-custodial.
Wallet
Section titled “Wallet”A blockchain address (or addresses) that holds tokens. In
Scani: institution.type='crypto_wallet'; the address lives in
accounts.metadata.
Position & ledger
Section titled “Position & ledger”Average cost
Section titled “Average cost”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.
Cost basis
Section titled “Cost basis”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.
Double-entry
Section titled “Double-entry”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.
Holding
Section titled “Holding”Scani term of art. One (account, token) position with a balance. The atomic unit of portfolio tracking. See Holdings.
Journal
Section titled “Journal”A chronological record of transactions. In Scani: the
holding_transactions table.
Ledger
Section titled “Ledger”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).
Mark-to-market
Section titled “Mark-to-market”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.
Observation
Section titled “Observation”Scani term of art. A point-in-time snapshot of a holding’s balance from a specific source. Append-only. See Observations & coverage.
Opening balance
Section titled “Opening balance”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.
Position
Section titled “Position”A held quantity of an asset at a venue. In Scani: same as holding.
Realised PnL
Section titled “Realised PnL”Gain or loss from positions that have been closed. In Scani:
the realizedPnl column on portfolio_value_daily.
Reconciliation
Section titled “Reconciliation”Comparing two records and resolving discrepancies. In Scani:
opening-balance reconciliation
synthesises a transaction to make sum(transactions) equal
holdings.balance.
Unrealised PnL
Section titled “Unrealised PnL”Gain or loss on open positions, computed as
mark-to-market value − cost basis. In Scani: the
unrealizedPnl column on portfolio_value_daily.
Transactions
Section titled “Transactions”Airdrop
Section titled “Airdrop”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.
Deposit
Section titled “Deposit”An inflow from outside the tracked system (or from an unpaired
source). In Scani: kind='deposit'.
Dividend
Section titled “Dividend”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.
Interest
Section titled “Interest”Yield paid on a holding. In Scani: kind='interest', produced
by APY payouts or by ingesting upstream
interest events.
Rebase
Section titled “Rebase”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.
Reward
Section titled “Reward”A payout for participating (staking, mining, liquidity provision).
In Scani: kind='reward'.
Disposing of an asset in exchange for another. In Scani:
kind='sell'.
Settlement date
Section titled “Settlement date”The date a trade actually settles (cash + asset change hands).
Often later than trade date. In Scani: not
modelled — transactions use a single occurredAt.
Stock split
Section titled “Stock split”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.
Trade date
Section titled “Trade date”The date a trade is executed (price agreed). In Scani: the
occurredAt on the transaction.
Transaction
Section titled “Transaction”Any economic event. In Scani: a row in
holding_transactions. See Transactions.
Transfer
Section titled “Transfer”A move of assets between two accounts. In Scani: two rows
(kind='transfer_out' + kind='transfer_in', or 'withdraw' +
'deposit') linked by transferGroupId.
Withdrawal
Section titled “Withdrawal”An outflow to outside the tracked system. In Scani:
kind='withdraw'.
Pricing & FX
Section titled “Pricing & FX”Base currency
Section titled “Base currency”The denominator in a price (BTC/USD → USD is the base).
In Scani: tokenPrices.baseTokenId. No USD-canonical
assumption.
Bid / Ask
Section titled “Bid / Ask”Best buy and best sell prices on an order book. In Scani: not modelled at the lot level; price data is mid or close.
Candle
Section titled “Candle”An OHLC (open / high / low / close) bar at a fixed time interval. In Scani: not modelled — prices are point quotes at a timestamp.
Cross rate
Section titled “Cross rate”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.
Granularity
Section titled “Granularity”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.
Price graph
Section titled “Price graph”Scani term of art. The implicit directed graph defined by
token_prices rows. See
Pricing & the price graph.
Quote currency
Section titled “Quote currency”Same as base currency (the denominator).
Spot price
Section titled “Spot price”The current market price for immediate delivery. In Scani: intraday prices are spot-equivalents.
Stale price
Section titled “Stale price”A price older than the granularity-appropriate staleness cap.
In Scani: the stale flag on PriceGraphConversion; folded
into coverage quality.
Accrual
Section titled “Accrual”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.
Compounding
Section titled “Compounding”Reinvesting yield so it earns yield itself. In Scani: approximated by daily payouts; longer payout frequencies undercount compounded yield slightly.
Liquidity provision
Section titled “Liquidity provision”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'.
Lending
Section titled “Lending”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.
Staking
Section titled “Staking”Locking a token to support network operations in exchange for rewards. In Scani: same as lending — APY config or upstream event ingestion.
Yield farming
Section titled “Yield farming”Moving assets between protocols to chase the highest yield. In Scani: each leg appears as a regular transaction; no first-class “strategy” model.
Blockchain
Section titled “Blockchain”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.
Contract address
Section titled “Contract address”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.
Off-chain
Section titled “Off-chain”Not recorded on a blockchain. In Scani: every CEX trade is off-chain by definition (from the chain’s perspective).
On-chain
Section titled “On-chain”Recorded on a blockchain. In Scani: every wallet transaction is on-chain; the source is the blockchain RPC.
Transaction hash
Section titled “Transaction hash”The unique identifier of a blockchain transaction. In Scani:
used as externalId for on-chain transactions.
Scani-specific
Section titled “Scani-specific”Account
Section titled “Account”A per-user container for holdings at one institution. See Accounts & institutions.
Advisory lock
Section titled “Advisory lock”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.
BullMQ
Section titled “BullMQ”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.
Coverage
Section titled “Coverage”Scani term of art. Per-holding metadata about transaction and observation completeness. See Observations & coverage.
Coverage quality
Section titled “Coverage quality”Scani term of art. A bucket on each rollup
row: full, partial, estimated, or unknown. Drives chart
rendering (solid / dashed / gap).
Data-provider
Section titled “Data-provider”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.
Holding-inclusion rule
Section titled “Holding-inclusion rule”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.
Institution
Section titled “Institution”Scani term of art. A financial entity (exchange, bank, brokerage, blockchain) under which a user has one or more accounts. See Accounts & institutions.
Manual institution
Section titled “Manual institution”Scani term of art. A synthetic per-user institution row used to anchor manual holdings. See Why manual data is a synthetic institution.
Inclusion rule
Section titled “Inclusion rule”Rollup
Section titled “Rollup”Scani term of art. The daily portfolio-value cache,
portfolio_value_daily. See
Portfolio value rollup.
Swap group
Section titled “Swap group”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.
Token identity
Section titled “Token identity”Scani term of art. The merged per-provider metadata that materialises a token row from a partial provider-supplied identifier. See Token identity & enrichment.
Transfer group
Section titled “Transfer group”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.