Kerb Terms are published on chain and over a public read API, so another lender, curator or venue operator can act on them without rebuilding equity market risk logic. Everything below is live. Nothing needs a key.
The authoritative source. No API in the path, no trust in Kerb’s servers, just the contract.
import { createPublicClient, http, keccak256, encodeAbiParameters } from "viem";
import { KERB_TERMS_ABI } from "@kerb/sdk";
const client = createPublicClient({ transport: http("https://rpc.xlayer.tech") });
const assetId = keccak256(
encodeAbiParameters([{ type: "uint256" }, { type: "address" }], [196n, tokenAddress]),
);
// usable === false means "no new risk may be taken". It never means "liquidate everything".
const [carryLTV, sessionMaxLTV, creditMark, regime, usable] = await client.readContract({
address: KERB_TERMS,
abi: KERB_TERMS_ABI,
functionName: "effectiveTerms",
args: [assetId],
});usable is the field that matters: false means no new risk may be taken against this asset right now, because the report is stale or the regime is STALE or HALTED. It never means liquidate. Repayment and cures keep working in every state.
import { Kerb, toDecimalString } from "@kerb/sdk";
const kerb = new Kerb(); // defaults to X Layer mainnet
const terms = await kerb.terms("KOx");
if (!terms.usable) return; // no new risk may be taken
// Decimal strings all the way. Never parse a term into a float: that is how a risk
// number quietly becomes wrong.
toDecimalString(terms.carryLTV); // "0.55"
toDecimalString(terms.creditMark); // "86.916770468522919603"
toDecimalString(terms.debtCeiling); // in loan-asset units, not WADEvery value is a decimal string with the provenance label it was published under. Ratios are WAD; depth and ceilings are in loan-asset units, and the response says which.
Base URL https://api.usekerb.xyz. CORS is open for reads. No key, no rate limit beyond what is reasonable, no secrets in any error payload.
Scroll the table sideways for what each endpoint returns.
| Method | Path | Returns |
|---|---|---|
| GET | /health | Observation freshness and post counts per chain. |
| GET | /v1/board | Every tracked asset with its regime, mark, depth and capacities, each with provenance. |
| GET | /v1/terms/:chain/:asset | The latest posted Terms, the pinned bundle behind them, and the last 50 posts. |
| GET | /v1/clock/:chain/:asset | Session now, next transition, next weakening, the Last Call window, and the week's session geometry. |
| GET | /v1/report/:chain/:asset | The full Market-Time Report recomputed from current observations, including the impact curve venue by venue. |
| GET | /v1/credit/:chain | The credit market: pool state, listed collateral, the fixed liquidation thresholds. |
| GET | /v1/credit/:chain/position/:user/:assetId | A position's health, covenant target and exact cure amount. Public, because cure is permissionless. |
| GET | /v1/params | The KTS parameter set the engine is running on. |
| GET | /v1/proof | Build period, deployments, observation counts, the latest pinned bundle and the degradation rungs. |
| GET | /v1/market-time | Published Market-Time Reports. |
| GET | /v1/bundle/:hash | The canonical input bundle behind a report, by its inputs hash. |
Try one now: https://api.usekerb.xyz/v1/board currently returns 10 assets
ABIs are the Foundry artefacts in contracts/out/ of the repository, and the source is verified on Sourcify for everything on mainnet.
| Contract | Chain | Address | Source |
|---|---|---|---|
| KerbClock | mainnet 196 | 0xf765d374…2161b8 | Sourcify exact match |
| KerbTerms | mainnet 196 | 0x6d6eaf24…0102d5 | Sourcify exact match |
| KerbClock | testnet 1952 | 0x6c1de992…18bc5c | Sourcify exact match |
| KerbTerms | testnet 1952 | 0x5a4942f5…b75f7e | Sourcify exact match |
| MockUSDG | testnet 1952 | 0x91fcf992…dba679 | Sourcify exact match |
| KerbClockDemo | testnet 1952 | 0xd2483b2d…6bcb0f | Sourcify exact match |
| KerbMirror:KOx |
KerbCredit at 0xa1314645cd6c07e651359aba540e2600090b98a8 on X Layer testnet, loan asset mUSDG. Collateral is mirror collateral with no claim on any security, and the clock is a compressed demo clock. Both are flagged in the API response itself (loanAsset.isMock and contracts.clockIsDemo), so an integrator cannot mistake this for a production market even if they never read this page.
Every report pins its input bundle and posts the hash on chain. pnpm --filter @kerb/engine kerb verify <inputsHash> fetches those bytes, checks they hash to the CID they were pinned under, recomputes every number and compares the result with what is on chain. The methodology page walks the whole calculation →
| testnet 1952 |
| 0x11827f0f…af4a16 |
| Sourcify exact match |
| KerbMirror:HKEXCx | testnet 1952 | 0x80da4036…9360f2 | Sourcify exact match |
| KerbCredit | testnet 1952 | 0xa1314645…0b98a8 | Sourcify exact match |
HKEXCx · the asset currently carrying the most capacity. See it →