Data dictionary, data quality, and best practices for the allium_identity.geo schema
A consolidated reference for the categorical fields across the allium_identity.geo tables,
plus data-quality caveats and query best practices. For full column lists see the
Table Reference.
Both addresses_geography.confidence and addresses_timezones.conviction_level use the same five-tier scale. This is the field to filter on — not a numeric score.
Value
Rough selectivity
Recommended use
Very High Conviction
~top 1%
Compliance / KYC
High Conviction
~top 5%
Compliance, high-trust analysis
Moderate Conviction
~top 20%
Regional analysis
Low Conviction
~top 40%
Exploration only
Very Low Conviction
remainder
Exploration only; weak signal
addresses_geography.score is a raw attribution strength (observed range ~0–47, mostly < 1) — it is not a 0–1 probability and thresholds like score >= 0.7 are meaningless. Always filter on the conviction tier.
addresses_geography.reasoning is not an enum — it is a human-readable explanation of the
signals behind each attribution, e.g. “Propagated from 20 related wallet(s) via shared funders
within a 24-72h window.” or “Countries disagree. … Selected deposit country based on higher
score (685 vs 270).” Use it for auditing individual rows; don’t GROUP BY it expecting a small
set of values.
exchange_country_attribution.status: active, defunct.exchange_country_attribution.volume_tier: major_global, major_local, regional, unknown.
Global exchanges (top_global) are excluded from exchange_country_attribution entirely — their
per-country distribution lives in exchange_gravity_weekly.
Counterparty → exchange (where deposits come from)
outbound_withdrawal
Exchange → counterparty (where withdrawals go)
gravity_share sums to 1.0 across countries per (exchange, direction, week). coverage_pct =
attributed ÷ (attributed + unattributed_addressable) — not_measurable and other_exchange
(CEX-to-CEX settlement) volume is excluded from the denominator.
from_entity_category / to_entity_category: cex, dex, protocol, bridge,
wallet_classifier (typed by behavioral segment, no hard label), unlabeled.from_wallet_type / to_wallet_type: hosted, unhosted, unknown.classification is the stablecoin-pipeline activity bucket carried through from
enriched_transfers (e.g. cex_flow, defi, payments, gambling, store_of_value); dust,
mint_burn, and infra_automation are excluded from this table.token: USDC or USDT (bridged/wrapped variants folded to the base asset).
from_country_source / to_country_source — how each leg’s country was resolved:
Value
Meaning
hosted_country
Local/regional exchange operating country (exact)
unhosted_geo
Unhosted wallet country from addresses_geography (exact)
global_cex
Global-exchange leg — no single country; distributed in country_corridors_distributed_weekly
unattributed
No country available
is_cross_border = TRUE only when both legs are exact (hosted_country/unhosted_geo) and
the countries differ. In country_corridors_distributed_weekly, global_cex legs are fanned out
by exchange_gravity_weekly shares and distributed_volume_usd replaces volume_usd
(transfer counts are not distributed).
Attribution coverage ≈ 25%. ~20M of ~80M classified addresses have a country in
addresses_geography. The rest are potentially_measurable but lack a confident signal
(mostly unlabeled self-custody wallets), not hard-excluded not_measurable infra.
Country propagation is partial. Flow-based relatedness propagation runs on ethereum,
polygon, base, solana, and tron (EVM chains surface as evm). Other EVM chains rely on labels
and timezone signals only, so their coverage is lower.
Global-exchange geography is a distribution. Binance/Coinbase-style global exchanges get
no single country; use exchange_gravity_weekly (and the distributed corridors view) for their
per-country flow shares, and check coverage_pct before trusting a given week.
Flow tables are USDC/USDT only.entity_flows_weekly and the corridor tables cover the
canonical USDC/USDT deployment set on adjusted volume; they are not all-token or all-stablecoin.
Timezone ≠ country.addresses_timezones infers a region profile from activity timing;
treat it as a supporting signal, not a country.
A country on a local exchange wallet is an operating jurisdiction; a country on an
unhosted wallet is an inferred user location. Filter master_list.wallet_type to the one
you mean rather than mixing them.
not_measurable in master_list flags contracts/tokens/infra/genesis (~0.06% of rows). The much
larger set of addresses without a country are potentially_measurable and simply absent from
addresses_geography.
Address case varies by chain — preserve case when joining on address for Solana/Tron.
Chain
Case sensitive?
Solana, Tron
✅ Yes (preserve case)
EVM
❌ No
-- GOOD (Solana): preserve caseJOIN allium_identity.geo.addresses_geography g ON g.chain = 'solana' AND g.address = t.address-- BAD: lowercasing breaks Solana joinsJOIN allium_identity.geo.addresses_geography g ON g.chain = 'solana' AND LOWER(g.address) = LOWER(t.address)