AlgoTerminal
Standardized financial KPIs for 3 Algorand DeFi protocols — TVL, fees, revenue, take rate, capital efficiency — computed under one accounting policy so a DEX and a lending market are directly comparable, and sold per query in USDC over x402. No API key, no signup: the payment is the authentication.
Price
| Endpoint | Price | When |
|---|---|---|
GET /metric/{protocol}/{kpi} |
$0.005 | Cache-backed lookup |
| $0.02 | ?fresh=true — forces an upstream round-trip; we sell recency honestly | |
| $0.03 | kpi=active_users_24h — indexer aggregation is materially more expensive | |
GET /compare |
$0.05 | Flat, 2-5 protocols |
| $0.08 | ?fresh=true — forces an upstream round-trip on EVERY leg | |
POST /ask not yet live |
$0.15 | Standard synthesis |
| $0.2 | ?depth=deep — wider KPI sweep + longer synthesis budget |
Paid in USDC (ASA 31566704, 6 decimals) on Algorand MainNet, scheme
exact, x402 v2, settled through
https://facilitator.goplausible.xyz. The network fee is sponsored by the facilitator, so you need USDC only — no ALGO.
Two guarantees worth reading before you integrate.
We settle only after a successful response — the payment is captured after the
handler returns 2xx, so any 4xx or 5xx costs you nothing, and that includes a
?fresh=true that could not produce a fresh number and a comparison that could not
resolve two legs. And a stale number is never sold as a fresh one: every response
carries its own cache and stale state, a confidence penalty when it is
stale, and a note saying how old it is. When confidence falls to the 0.40 floor we decline
rather than sell it, because at that point we can no longer bound the error.
Free — evaluate without paying
| Endpoint | Price | Why it is free |
|---|---|---|
GET /health |
free | Liveness; must never require payment |
GET /catalog |
free | Capability discovery; an agent must be able to learn what we sell before buying |
GET /openapi.json |
free | Machine-readable spec |
GET /llms.txt |
free | Agent discovery (llmstxt.org) |
GET /methodology |
free | Published accounting policy (DATA_SCHEMA.md) |
GET /schema/kpi-fact.json |
free | The KpiFact envelope as JSON Schema — generate types, validate a response |
Evaluate for free first: https://api-testnet-production-a3ec.up.railway.app
is the same API on Algorand TestNet, settling in TestNet USDC from the free dispenser.
Every route behaves identically, 402s and settlement included, so you can prove the
integration and judge the data before spending a real cent. We would rather you did.
Call it
# 1. What we sell, and for how much — free, no payment
curl -s https://api-production-36692.up.railway.app/catalog | jq '.protocols[].id, .routes'
# 2. Ask without paying: the 402 carries the full payment requirements
curl -si https://api-production-36692.up.railway.app/metric/tinyman/tvl
# 3. Pay and read, with any x402 client
npm i @x402/fetch @x402/avm algosdk
import algosdk from 'algosdk';
import { wrapFetchWithPayment } from '@x402/fetch';
import { x402Client } from '@x402/core/client';
import { ExactAvmScheme } from '@x402/avm/exact/client';
import { toClientAvmSigner } from '@x402/avm';
const account = algosdk.mnemonicToSecretKey(process.env.PAYER_MNEMONIC);
const signer = toClientAvmSigner(Buffer.from(account.sk).toString('base64'));
const client = new x402Client().register(
'algorand:*',
new ExactAvmScheme(signer, { algodUrl: 'https://mainnet-api.4160.nodely.dev' }),
);
const pay = wrapFetchWithPayment(fetch, client);
const fact = await (await pay('https://api-production-36692.up.railway.app/metric/tinyman/tvl')).json();
console.log(fact.value, fact.unit, fact.confidence);
A complete runnable example, funded with free TestNet USDC, is in
examples/.
What you get back
Every /metric response is one KpiFact. timestamp is when we
computed it; as_of is the moment the data describes. They are never the same field.
{
"metric": "tvl",
"protocol": "tinyman",
"value": 5344337.0,
"unit": "USD",
"timestamp": "2026-09-09T14:32:11Z",
"as_of": "2026-09-09T14:30:00Z",
"source": [{ "name": "tinyman-analytics", "url": "...", "kind": "rest",
"retrieved_at": "2026-09-09T14:30:02Z" }],
"confidence": 0.70,
"is_estimated": false,
"estimation_method": null,
"methodology_version": "1.2.0",
"cache": "hit",
"stale": false,
"coverage": { "entities": 412, "excluded": 7, "basis": "all_pools_usd_priced" },
"notes": []
}
confidence is 0-1 and every input that degrades it is named in
notes. At or above 0.9 the number is safe to act on; below 0.7 it is caveated
explicitly. Estimates are always labelled, and a number we cannot compute is
null with a reason or an error — never a zero that looks like an answer.
Coverage
| Protocol | Publishes | Declines, with the reason at /catalog |
|---|---|---|
folksFolks Finance · lending |
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 |
— |
pactPact · dex |
tvl volume_24h gross_fees_24h capital_efficiency volume_to_tvl pool_count |
protocol_revenue_24h supply_side_revenue_24h take_rate fee_apr active_users_24h |
tinymanTinyman · dex |
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 |
— |
A declined KPI is a fact about the source, not a gap in our coverage, and we return it as
one: GET /metric/pact/take_rate answers 404 with a paragraph explaining that Pact's
pact_fee_bps is null on all 3,961 of its pools, so the only honest bound on its
protocol revenue is "at least $0". Publishing $0.00 would rank Pact last for a reason that is
about disclosure rather than economics. That call is free, like every error.
Methodology
Every KPI has one published definition, and a formula never changes silently — a change is a
methodology_version bump, currently 1.2.0, carried
in every response so you can pin to an accounting policy.
Read it at /methodology
(markdown), the machine-readable spec at
/openapi.json, and the agent-facing summary at
/llms.txt.
What we do not do
No forecasts, no price targets, no trading advice, no custody, no execution. Descriptive standardized data only. A question asking us to predict something is refused, and not charged.