{"service":"AlgoTerminal","methodology_version":"1.2.0","document_version":"1.2.0","document_url":"https://api-production-36692.up.railway.app/methodology?format=markdown","document_available":true,"units":["USD","RATIO","COUNT","ASSET_UNITS"],"protocol_classes":["dex","lending","l1"],"kpis":[{"id":"tvl","unit":"USD","classes":["dex","lending"],"definition":"DEX: sum of pool liquidity. Lending: sum of total deposits (§3.5) — total value supplied, not deposits minus borrows.","ttl_seconds":300,"cross_class_basis":"both are the capital the protocol has attracted and is holding — liquidity sitting in pools for a DEX, total deposits for a lending market (§3.5). The two are not identically constructed, though: a lending market's deposits include capital currently lent out, so check each leg's coverage.basis before reading a difference as a difference in size"},{"id":"volume_24h","unit":"USD","classes":["dex"],"definition":"Sum of USD notional swapped, trailing 24h.","ttl_seconds":600},{"id":"gross_fees_24h","unit":"USD","classes":["dex","lending"],"definition":"Total paid by users to use the protocol, trailing 24h (§3.1).","ttl_seconds":600,"cross_class_basis":"§3.1 defines gross_fees identically for both — swap fees paid by traders and interest paid by borrowers are both what users pay to use the protocol"},{"id":"supply_side_revenue_24h","unit":"USD","classes":["dex","lending"],"definition":"Portion of gross fees flowing to LPs / depositors (§3.1).","ttl_seconds":600,"cross_class_basis":"§3.1 splits what users paid the same way for both — the share reaching the parties who supplied the capital, whether they are LPs earning a cut of swap fees or depositors earning borrower interest. Deposit interest is this quantity seen from the receiving end, never a second fee (§3.2)"},{"id":"protocol_revenue_24h","unit":"USD","classes":["dex","lending"],"definition":"Portion of gross fees the protocol keeps (§3.1). The comparable \"revenue\".","ttl_seconds":600,"cross_class_basis":"§3.1 defines protocol_revenue identically for both — the share of what users paid that the protocol itself keeps, whether that is a DEX's cut of the swap fee or a lending market's retention of borrower interest. This is the figure comparable to a company's revenue, and it excludes token emissions, governance rewards and incentives on every class"},{"id":"take_rate","unit":"RATIO","classes":["dex","lending"],"definition":"protocol_revenue_24h / gross_fees_24h.","ttl_seconds":600,"null_when":{"rule":"gross_fees_24h < 1 USD","threshold":1},"cross_class_basis":"take_rate is protocol_revenue_24h / gross_fees_24h, and §3.1 defines both terms identically across classes, so the ratio is the protocol's cut of what its users paid either way. It is dimensionless, so no unit or price conversion enters the comparison — which is why §3.1 calls it the clearest single demonstration that the standardization works"},{"id":"capital_efficiency","unit":"RATIO","classes":["dex","lending"],"definition":"(gross_fees_24h * 365) / tvl — annualized fees generated per dollar of capital. The flagship cross-type ratio.","ttl_seconds":600,"cross_class_basis":"§3.1 defines gross_fees identically for both — swap fees paid by traders and interest paid by borrowers are both what users pay to use the protocol"},{"id":"fee_apr","unit":"RATIO","classes":["dex"],"definition":"(supply_side_revenue_24h * 365) / tvl — LP yield from fees only, incentives excluded (§3.1).","ttl_seconds":600},{"id":"volume_to_tvl","unit":"RATIO","classes":["dex"],"definition":"volume_24h / tvl — turnover. DEX-only by construction.","ttl_seconds":600},{"id":"supply_apr","unit":"RATIO","classes":["lending"],"definition":"Deposit-weighted mean depositInterestRate.","ttl_seconds":120},{"id":"borrow_apr","unit":"RATIO","classes":["lending"],"definition":"Borrow-weighted mean variableBorrowInterestRate.","ttl_seconds":120},{"id":"utilization","unit":"RATIO","classes":["lending"],"definition":"total_borrows_usd / total_deposits_usd, protocol-wide (§3.5).","ttl_seconds":120},{"id":"total_borrows","unit":"USD","classes":["lending"],"definition":"Sum of outstanding debt, USD.","ttl_seconds":300},{"id":"active_users_24h","unit":"COUNT","classes":["dex","lending"],"definition":"Distinct Algorand addresses with at least one core protocol interaction in the trailing 24h (§4.1). Counts addresses, not humans.","ttl_seconds":900,"max_confidence":0.8,"cross_class_basis":"§4.1 counts the same event on both — a distinct address performing a core interaction, meaning a swap or a liquidity change on a DEX and a deposit, withdraw, borrow or repay on a lending market. The count is of addresses rather than people on every class, so the comparison inherits that limitation uniformly"},{"id":"pool_count","unit":"COUNT","classes":["dex","lending"],"definition":"Entities (pools / markets) passing the §3.6 inclusion filters.","ttl_seconds":900,"cross_class_basis":"both count the venues that passed our inclusion filters. This is the weakest cross-class comparison we publish, and deliberately so: a DEX pool is permissionlessly created and filtered down from tens of thousands, while a lending market is listed by the protocol itself and takes no dust floor at all (§3.5). Comparable as a count of venues, not as a measure of size or activity"}],"confidence":{"formula":"base x multiplicative penalties, then the additive penalty, then per-KPI caps, floored and rounded to 2dp","bases":[{"derivation":"reported","base":0.95},{"derivation":"onchain","base":0.95},{"derivation":"arithmetic","base":0.9},{"derivation":"usd_conversion","base":0.9,"note":"multiplied by the §3.7 price confidence for the assets involved"},{"derivation":"documented_estimation","base":0.85},{"derivation":"fallback_constant","base":0.7},{"derivation":"indexer_address_aggregation","base":0.8}],"penalties":[{"condition":"stale_l1","mode":"multiply","amount":0.9},{"condition":"l2_snapshot","mode":"multiply","amount":0.7},{"condition":"high_exclusion","mode":"multiply","amount":0.9},{"condition":"defillama_divergence","mode":"multiply","amount":0.9},{"condition":"folks_retention_divergence","mode":"subtract","amount":0.1},{"condition":"validation_skip","mode":"multiply","amount":0.85}],"floor":0.1,"l2_snapshot_floor":0.4,"composite_rule":"A composite spanning two facts takes the MINIMUM of its inputs, never the mean. A sum built from many prices takes the TVL-weighted mean of their price confidences — a different object, graded on the dollars it is made of.","ladder":[{"tier":"safe_to_act","min":0.9,"meaning":"Safe to act on."},{"tier":"directional","min":0.7,"below":0.9,"meaning":"Directionally sound; check notes[]."},{"tier":"informational","below":0.7,"meaning":"Informational only. /ask explicitly caveats any fact strictly below this line in prose."}],"min_billable":0.4,"min_billable_note":"At or below this confidence we return 502 and do not charge, rather than sell a number whose error we can no longer bound."},"inclusion_filters":{"min_entity_tvl_usd":1000,"min_price_liquidity_usd":50000,"min_price_confidence":0.1,"max_exclusion_ratio":0.1,"defillama_divergence_threshold":0.1,"folks_retention_divergence_threshold":0.05},"protocols":[{"id":"folks","name":"Folks Finance","class":"lending","kpis":["tvl","total_borrows","utilization","supply_apr","borrow_apr","gross_fees_24h","supply_side_revenue_24h","protocol_revenue_24h","take_rate","capital_efficiency","active_users_24h","pool_count"],"declined":[],"supports_basis":["all_pools_usd_priced"],"sources":["algod:mainnet-api.4160.nodely.dev","mainnet-idx.4160.nodely.dev"],"app_ids":[971368268,971370097,2611131944,3073474613,971372237,971372700,1060585819,1247053569,3514794123,3514795114,971373361,971373611,1067289273,1067289481,1166977433,1166980669,1216434571,1258515734,1258524099,1044267181,1166982094,3184317016,3184324594,3184325123,3343137163,971388781,971388977,971389489,1202382736,1202382829,3184333108,971353536]},{"id":"pact","name":"Pact","class":"dex","kpis":["tvl","volume_24h","gross_fees_24h","capital_efficiency","volume_to_tvl","pool_count"],"declined":[{"kpi":"protocol_revenue_24h","reason":"Pact does not publish the protocol's share of the swap fee. `pact_fee_bps` is null on every pool in the catalogue (3,961 of 3,961, measured 2026-09-09), so the only honest bound is \"at least $0\", which constrains nothing. Publishing $0.00 would read as \"Pact captures no revenue\" when the fact is that Pact does not disclose its cut (DATA_SCHEMA.md §1.5, §3.4). gross_fees_24h — what swappers actually paid — is published and is exact."},{"kpi":"supply_side_revenue_24h","reason":"Derived from a fee split Pact does not publish (`pact_fee_bps` is null on all 3,961 pools). With the protocol share unknown, this figure would equal gross_fees_24h exactly, which asserts that LPs receive 100% of swap fees — a claim about Pact we cannot support (DATA_SCHEMA.md §3.4). Use gross_fees_24h, which is measured."},{"kpi":"take_rate","reason":"take_rate is protocol_revenue_24h / gross_fees_24h, and Pact does not publish the numerator: `pact_fee_bps` is null on all 3,961 pools. A take_rate of 0.000000 would rank Pact below every protocol that discloses its cut, for a reason that is about disclosure rather than economics (DATA_SCHEMA.md §1.5, §3.4)."},{"kpi":"fee_apr","reason":"fee_apr is supply_side_revenue_24h * 365 / tvl, and the supply-side split is unpublished (`pact_fee_bps` is null on all 3,961 pools). Computing it would silently assume LPs keep 100% of fees and would return a number identical to capital_efficiency. Use capital_efficiency, which is built on measured gross fees and makes no split assumption."},{"kpi":"active_users_24h","reason":"DATA_SCHEMA.md §4.1 counts distinct addresses transacting against a protocol's application ids, and Pact has no single validator application to filter on: every pool is its own application (3,961 distinct app ids), so the count would require 3,961 paged indexer walks per refresh, and any smaller sample would answer a narrower question than the KPI names. Declined rather than approximated (DATA_SCHEMA.md §1.5)."}],"supports_basis":["all_pools_usd_priced","verified_only"],"sources":["api.pact.fi"]},{"id":"tinyman","name":"Tinyman","class":"dex","kpis":["tvl","volume_24h","gross_fees_24h","supply_side_revenue_24h","protocol_revenue_24h","take_rate","capital_efficiency","fee_apr","volume_to_tvl","active_users_24h","pool_count"],"declined":[],"supports_basis":["all_pools_usd_priced","verified_only"],"sources":["mainnet.analytics.tinyman.org","algod:mainnet-api.4160.nodely.dev","indexer:mainnet-idx.4160.nodely.dev"],"app_ids":[552635992,1002541853]}],"versioning":{"scope":"methodology_version is semver over the ACCOUNTING POLICY (DATA_SCHEMA.md §3 and §4), not over the code and not over the HTTP surface. A new route, a rewritten connector or a latency fix is not a bump.","levels":[{"level":"patch","may_change":"An arithmetic or scaling defect fixed so a KPI matches what §3 already says it should be. Prose, examples, notes[] wording.","may_not_change":"Any §3 or §4 formula, any field meaning, the confidence ladder, KPI coverage.","notice_days":0},{"level":"minor","may_change":"A new protocol, KPI, notes[] entry or optional envelope field. A confidence going UP because a number is now measured where it was estimated.","may_not_change":"The definition or units of an existing KPI, any removal, the §5 thresholds.","notice_days":0},{"level":"major","may_change":"A §3 or §4 formula, and therefore a published value. A unit or coverage.basis. A §5 derivation or threshold. Withdrawing a KPI or protocol. A required envelope field.","may_not_change":null,"notice_days":30}],"announced_in":["https://api-production-36692.up.railway.app/methodology (this block, and the changelog in the markdown rendering)","a notes[] entry on every affected fact, for the whole notice period","https://api-production-36692.up.railway.app/schema/kpi-fact.json (x-methodology-version)"],"correction_exception":"A published KPI we find to be materially misstated is corrected as soon as the correction is verified, without the notice period. We would rather serve a corrected number late than a wrong number on schedule. Every such correction is recorded in the changelog with what was wrong, for how long, and by how much.","previous_version_served":false,"previous_version_note":"There is one live methodology at a time. §3 formulas are code, not configuration, so serving a retired version would mean maintaining a second implementation of every KPI against upstreams that keep changing. Instead: the current version is served unchanged for the full 30-day notice period, every response is stamped with methodology_version so a bot can halt on the change, and the changelog carries the old and new value of every affected KPI.","out_of_scope":"Route paths, status codes and error shapes are API_SPEC.md's contract; a breaking change there ships under /v2. Coverage lost because a SOURCE went away is not a bump — the policy did not change, our ability to apply it did — and shows up as available: false on /catalog with the reason.","policy_url":"https://api-production-36692.up.railway.app/methodology?format=markdown#7-version-policy","schema_url":"https://api-production-36692.up.railway.app/schema/kpi-fact.json"},"spec_url":"https://api-production-36692.up.railway.app/openapi.json"}