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

EndpointPriceWhen
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

EndpointPriceWhy 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

ProtocolPublishesDeclines, with the reason at /catalog
folks
Folks 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
pact
Pact · 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
tinyman
Tinyman · 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.