Nolus Docs
Infrastructure

ETL data API

Query indexed Nolus protocol data at etl.nolus.network, from positions, pools and lenders to revenue, prices and account history, and the limits that apply.

The Nolus ETL indexes every Nolus block and contract event into a database and serves the result as a public, read-only JSON API. It answers the questions that a node answers slowly or not at all, such as time series, protocol-wide totals, liquidation and lending history, and the full position history of an account. For authoritative current state, or to submit transactions, use the chain endpoints instead.

The API is published at the following locations:

ResourceLocation
Base URLhttps://etl.nolus.network, routes under /api
Spec (source of truth)https://etl.nolus.network/openapi.json (OpenAPI 3.1)
Overview for LLM agentshttps://etl.nolus.network/llms.txt
Browsable indexhttps://etl.nolus.network/
AccessPublic, no API key, CORS open to any origin, best effort

Every response carries a Link header that points to the spec and to llms.txt. Since the spec holds the full parameter list and response schema of each endpoint, the sections below concentrate on the parts that most integrations need.

What it covers

The spec groups its endpoints by tag, and each tag covers one area of protocol data:

TagData
Protocol, CurrencyRegistered protocols with their contract addresses; currencies with their per-protocol decimals and denoms
MetricsTVL, supplied funds, open interest, borrowed volume, supplied versus borrowed over time, monthly active accounts
TreasuryProtocol revenue, NLS buybacks, staking rewards distributed, incentives pool
LiquidityEarn pools (utilization, borrow APR), current and historical lenders
Position, LeaseOpen positions with PnL and liquidation prices, markets, openings, repayments, liquidations, interest
MarketPrice history per protocol and ticker, price feed health
PnL, WalletRealized and unrealized PnL; per-account transactions, positions, earnings and staking activity
Meta, HealthVersion, ingested block count, liveness and readiness probes

Useful endpoints

Most integrations start with the endpoints in this section. All of them use GET and were verified on 2026-10-19, and wherever an endpoint needs a protocol, you can pass SOLANA-METIS-USDC or any name that /api/protocols/active returns.

Protocols and pools

These endpoints describe the active protocols, their currencies and the state of each lending pool:

EndpointReturns
/api/protocols/activeActive protocols with network, DEX, position type and contract addresses
/api/protocols/SOLANA-METIS-USDCOne protocol
/api/currencies/activeCurrencies with per-protocol decimals and bank denoms
/api/poolsEvery pool in one call: utilization, supplied, borrowed, borrow APR
/api/supplied-borrowed-history?protocol=SOLANA-METIS-USDCHourly supplied and borrowed series for one pool

Protocol-wide figures

These endpoints return figures for the protocol as a whole:

EndpointReturns
/api/total-value-lockedTVL in USD (pool deposits plus open positions)
/api/open-interestOutstanding debt of all open positions in USD
/api/lease-marketsPer market: open positions, value, mean leverage, 24-hour openings and price change
/api/revenue, /api/buyback-totalProtocol revenue in USD; total NLS bought back, in NLS

Positions and history

Position data covers the positions that are open now as well as past openings, liquidations and prices:

EndpointReturns
/api/positionsAll open positions with PnL, current and liquidation prices
/api/historically-opened?period=3mPosition openings in the window
/api/liquidations?period=3m&format=csvLiquidation events, as CSV
/api/prices?interval=7&protocol=SOLANA-METIS-USDC&key=<ticker>Price points [[timestampMs, price]] for the last 7 days

In the price query, replace <ticker> with the ticker of the asset whose price history you want.

One account

The account endpoints take a nolus1... account as the address parameter, in place of <account> below:

EndpointReturns
/api/position-opens?address=<account>Every position the account opened, newest first
/api/leases-search?address=<account>The account's position contract addresses
/api/txs?address=<account>&limit=10The account's transactions, paginated
/api/earnings?address=<account>Lending earnings in USD
/api/realized-pnl?address=<account>Realized PnL in USD

Health

The health endpoints report on the state of the API itself:

EndpointReturns
/api/blocksNumber of blocks ingested (a liveness signal, not the chain height)
/api/versionThe running API version
/health, /readyLiveness and readiness probes

Example requests

The first request below prints the first pool from /api/pools, and the second saves three months of liquidation events to a CSV file:

curl -s https://etl.nolus.network/api/pools | jq '.protocols[0]'
curl -s 'https://etl.nolus.network/api/liquidations?period=3m&format=csv' -o liquidations.csv

Conventions and limits

Query parameters and responses follow the same conventions across the API:

TopicRule
Time windowperiod=3m|6m|12m|all on history endpoints, default 3m
Incremental syncfrom=<ISO-8601>, exclusive lower bound
CSVformat=csv. export=true streams the full dataset and ignores period and from, and exports stop at 100,000 rows
Paginationskip and limit, default 10, maximum 100, or 10 on /api/ls-loan-closing
Price historyinterval in days, at most 100
PnL over timeinterval in days, at most 30
Accountsaddress must be a lowercase nolus1... bech32 account, and anything else returns 400
NumbersAmounts are JSON strings to parse as decimals. Token amounts use the decimals of the protocol they belong to (/api/currencies)
FreshnessMost aggregates are cached for 5 minutes or 1 hour, as each endpoint's description says. Hourly snapshot figures such as TVL and pools update on the hour, and per-account reads are not cached
ErrorsJSON {"error": "...", "message": "...", "status": <code>}. An unknown protocol, currency or record returns 404
Rate limitsNo per-endpoint limits. On 429, back off as Retry-After says

A few legacy fields are JSON numbers rather than strings, for example in /api/realized-pnl, so check each endpoint's schema in the spec before you parse its amounts.

The API is free for reasonable use. For bulk history, fetch one export=true CSV instead of many paginated pages, and read every pool through /api/pools instead of calling once per pool.

On this page