Skip to main content

OptimizerPair

Optimizer pair for collateral/debt searches. May include computed maxDebtAmount or minCollateralAmount.

chainIdstring

EVM chain id, as a decimal string. See the ChainId schema.

lenderstring

Protocol identifier. See the LenderId schema.

fixedTerm objectnullable

Fixed-term descriptor for this pair's lender, joined by lender key. Absent on variable-rate lenders. For Term Finance (model: "term"), gate the borrow/loop CTA on fixedTerm.auction.canBorrow: origination only happens inside scheduled sealed-bid auction rounds and most repos sit between rounds, so a pair can carry a maturity, an LTV and a rate and still be impossible to borrow. While a repo has no rate card (between rounds) termsShort is empty, borrowAprShort is null and aprBase/aprTotal still carry the 0%-debt figure — show them as indicative, not obtainable, whenever canBorrow is false. With a card present the borrow leg is priced off it (see borrowAprShort).

modelstring

Underlying fixed-term protocol shape.

Possible values: [lista, midnight, term, exactly, teller, termmax]

Example: term
maturityintegernullable

Single fixed calendar maturity, unix seconds. Absent for rolling-duration menus (Lista) and multi-maturity markets (Exactly — the menu lives on terms[]).

fees object

Market-level fees: continuousFeeApr (%/yr lender-side haircut, Midnight), settlementFee (fraction at the current TTM, Midnight), latePenaltyApr (%/yr on overdue debt, Exactly), originationFeePercent (upfront % of principal, Teller). Empty for lenders without them.

property name*any

Market-level fees: continuousFeeApr (%/yr lender-side haircut, Midnight), settlementFee (fraction at the current TTM, Midnight), latePenaltyApr (%/yr on overdue debt, Exactly), originationFeePercent (upfront % of principal, Teller). Empty for lenders without them.

earlyRepay object

Early-repayment policy: { kind: "none" | "penalty" | "discount" }. none = exit any time at market price; penalty = per-loan penalty (amount is position-level); discount = repaying early costs LESS than face value (Exactly).

property name*any

Early-repayment policy: { kind: "none" | "penalty" | "discount" }. none = exit any time at market price; penalty = per-loan penalty (amount is position-level); discount = repaying early costs LESS than face value (Exactly).

provider object

Who fronts the term: { kind: "broker" | "orderbook" | "auction" | "pool", address? }. auction markets carry the auction window below and can only be borrowed inside a round.

property name*any

Who fronts the term: { kind: "broker" | "orderbook" | "auction" | "pool", address? }. auction markets carry the auction window below and can only be borrowed inside a round.

auction object

Origination window for a fixed-term market whose terms are only obtainable during a bounded round rather than continuously — Term Finance (fixedTerm.provider.kind = "auction"). Served on fixedTerm.auction; ABSENT on lenders whose terms are continuously available, and absent is NOT the same as closed.

This is the difference between "the rate card is empty right now" and "this market cannot be borrowed at all": between rounds a Term repo still has a maturity, collateral params and a last-cleared rate, but nothing can be borrowed. Most repos are between rounds at any given time.

statusstring

upcoming — a round is listed but not yet accepting submissions. open — accepting sealed bids/offers. revealing — bidding shut, sealed prices revealing and the round clearing. closed — no round is listed. Snapshot at fetch time; re-derive from the timestamps against the current clock when reading a cached response.

Possible values: [upcoming, open, revealing, closed]

Example: open
canBorrowboolean

Can a NEW borrow be opened right now? Gate the borrow CTA on this, not on status and not on the presence of a rate — it stays correct if more statuses are added. True only inside an open round: Term borrow origination is a sealed bid, so there is no other entry point.

Example: true
canLendboolean

Can a NEW lend position be opened right now? Deliberately independent of canBorrow — the primary auction is only one of two lend surfaces, and buying repo tokens on the secondary market works between rounds. A closed round therefore leaves the market lend-only, not inert; greying out the whole market would be wrong.

Example: true
secondsUntilCloseintegernullable

Seconds until submissions close (revealTime − now). Absent unless a round is open. A snapshot — for a live countdown derive from revealTime, since responses are cached.

Example: 263000
implicationsstring[]

Ready-to-display consequences of this market's origination model, most important first (same convention as params.market.teller.implications). Auction mechanics are unusual enough that showing only a rate misleads.

idstringnullable

Auction round id. Absent when status: "closed".

startTimeintegernullable

Submissions open, unix seconds. Absent when closed.

revealTimeintegernullable

Submissions CLOSE and sealed prices begin revealing, unix seconds — the deadline to act. Absent when closed.

endTimeintegernullable

Round clears, unix seconds. Equal to revealTime on current deployments. Absent when closed.

minBorrowAmountstringnullable

Minimum bid (borrow) size for this round, loan-token BASE units. A real floor (e.g. "1000000000" = 1000 USDC) — a smaller amount cannot be submitted at all, so validate before building the action rather than surfacing a failed transaction.

Example: 1000000000
minLendAmountstringnullable

Minimum offer (lend) size for this round, loan-token BASE units.

Example: 1000000000
marketLongUidstring

Market UID of the collateral side

marketShortUidstring

Market UID of the debt side

marketNameLongstringnullable

Display name of the collateral market/vault (e.g. the Euler eVault name). Disambiguates rows that share the collateral/debt token symbols and lender.

marketNameShortstringnullable

Display name of the debt market/vault. For Euler this is the controller (debt) eVault — the primary way to tell otherwise-identical WETH→USDC rows apart.

curatorNameLongstringnullable

Curator/brand of the collateral market (Euler: resolved from the vault governor). Null for lenders without a curator, or until the curator registry is seeded. Render as "curatorName + symbol", falling back to marketNameLong.

curatorNameShortstringnullable

Curator/brand of the debt (controller) market. Same semantics as curatorNameLong.

assetLongstring
assetShortstring
assetGroupLongstring
assetGroupShortstring
symbolLongstring

Collateral token symbol

nameLongstring

Collateral token name

symbolShortstring

Debt token symbol

nameShortstring

Debt token name

aprBasenumber

Leverage-weighted net APR % EXCLUDING rewards — the SUSTAINABLE rate (reward incentives are typically transient). Re-priced off the best fixed term on brokered debt markets, like aprTotal.

aprTotalnumber

Leverage-weighted net APR % at max leverage INCLUDING rewards. The reward contribution is aprTotal − aprBase. On a brokered (fixed-term) debt market the borrow leg is the best fixed term (see borrowAprShort), so a fixed-term pair sorts and filters (minApr/maxApr, sortBy=aprTotal) by the rate it actually borrows at — never by the 0% variable leg.

maxLeveragenumber

Highest leverage multiple reachable in this market.

ltvnumber

Loan-to-value ratio, as a fraction between 0 and 1.

depositAprLongnumber

Effective deposit APR (depositRate + intrinsicYield)

borrowAprShortnumbernullable

Effective borrow APR % on the debt side (+ intrinsicYieldShort − rewardAprShort, plus any 1y-amortized origination fee — see originationFeeShort). On a BROKERED (fixed-term only) debt market — variableBorrowDisabledShort=true: Lista broker, Morpho Midnight book, Term Finance repo, TermMax, Teller — the variable rate is 0 and meaningless, so this is the BEST (lowest) fixed term from termsShort (the figure the lender publishes as stableBorrowRate). Null only when the market is brokered AND has no rate card right now (a Term Finance repo between auctions — read fixedTerm.auction). For Liquity-family CDPs the amortized origination fee is the whole borrow cost (variable rate is 0).

intrinsicYieldLongnumbernullable

Standalone intrinsic yield % of the collateral asset (already folded into depositAprLong).

intrinsicYieldShortnumbernullable

Standalone intrinsic yield % of the debt asset (already folded into borrowAprShort). termsShort[].apr / aprAtAmount carry NO intrinsic or reward component — add this and subtract rewardAprShort to put a raw term on the same footing as borrowAprShort.

variableBorrowDisabledShortboolean

True when the debt (short) market is BROKERED — fixed-term only, no variable borrow through the composer (Lista broker, Morpho Midnight book, Term Finance repo, TermMax, Teller). borrowAprShort is then the best fixed term from termsShort (null with no card), aprBase/aprTotal are re-priced off it, and each termsShort entry is its own loop option with its own maturity.

termsShort object[]nullable

Fixed-term rate card on the debt (short) side. Each entry is one loop option; apr is the raw term rate in PERCENT (no intrinsic / reward — see intrinsicYieldShort). When an amount is supplied, order-book terms (Morpho Midnight) also carry aprAtAmount (size-weighted VWAP), fillable and capped. Null/empty on variable-rate pairs. For Term Finance an empty card means "not borrowable right now" — read fixedTerm.auction.

  • Array [
  • termIdinteger

    Term identifier — MEANING IS LENDER-SPECIFIC. Exactly and TermMax: the pool/market unix MATURITY timestamp. Lista: the broker-defined product id. Teller: the duration in seconds (rolling term). Midnight and Term Finance: 0, a placeholder (single maturity per market, so the id carries no information). Pass to /v1/actions/lending/borrow?termId=…. Numeric on-chain; some upstream feeds serialize it as a string — coerce with Number() when comparing.

    Example: 2
    depositAprnumbernullable

    Annualised fixed LEND rate at this maturity, in percent (Exactly only — its fixed pools quote both sides).

    availablenumbernullable

    Borrowable liquidity at this maturity in loan-token human units (Exactly only).

    durationDaysnumber

    How long the position is locked at the fixed rate, in days (e.g. 7, 14, 30).

    Example: 7
    durationSecsnumbernullable

    Term duration in seconds (raw on-chain value).

    Example: 604800
    aprnumber

    Annualised borrow APR for this term, in percent (e.g. 3.85 = 3.85%). Same unit as variableBorrowRate / stableBorrowRate. For order-book markets (Midnight) this is the 0-notional top-of-book (cheapest) rate — see aprAtAmount for the size-weighted rate.

    Example: 3.85
    aprAtAmountnumbernullable

    Size-weighted (VWAP) borrow APR % at the supplied debt notional, for order-book fixed-term markets (Morpho Midnight): the borrow book filled cheapest-first, (Σ filledᵢ·aprᵢ)/amount. Present only when an amount is supplied AND the term carries an order-book ladder; broker rate cards (Lista, single flat rate) omit it and apr already applies at any size.

    fillablenumbernullable

    Total loan-token depth in this term's order book — the maximum borrow openable at this maturity. Present only for order-book terms with an amount supplied.

    cappedbooleannullable

    True when the supplied debt notional exceeds fillable — the book can't fully fund the borrow at this maturity (aprAtAmount is then the drain-the-book VWAP).

    ladder object[]nullable

    Order-book borrow ladder (best-borrow first) for order-book fixed-term markets (Midnight). Only serialized when depth=true (bulky). aprAtAmount is the pre-computed size-weighted rate; use this to re-derive it at any amount.

  • Array [
  • aprnumber

    Annualised borrow rate at this tier (%).

    unitsstring

    Credit/debt units at this tier (raw).

    assetsnumber

    Loan-token size available at this tier.

  • ]
  • ]
  • originationFeeShortnumbernullable

    One-time origination / mint fee on the debt side, PERCENT (Liquity-family CDPs: River, Felix, Nerite, Ebisu, Soneta, USDAf, Liquity). NOT an APR — it is already folded (1y-amortized) into borrowAprShort / aprTotal, and surfaced raw so consumers can re-amortize over a different holding horizon. Null/absent for markets without one.

    totalDepositsUsdLongnumber
    totalDepositsUsdShortnumber
    totalDebtUsdLongnumber
    totalDebtUsdShortnumber
    totalLiquidityUsdLongnumber
    totalLiquidityUsdShortnumber
    borrowLiquidityShortnumber
    utilizationLongnumber
    utilizationShortnumber
    maxDebtAmountnumber

    Max borrowable amount given collateral (only when collateralAmount/collateralAmountUsd param provided)

    maxDebtAmountUsdnumber

    USD value of maxDebtAmount

    minCollateralAmountnumber

    Min collateral needed for debt amount (only when debtAmount/debtAmountUsd param provided)

    minCollateralAmountUsdnumber

    USD value of minCollateralAmount

    borrowAprAtAmountnumbernullable

    Effective borrow APR % at the computed debt notional. Variable markets: the headline borrowAprShort with only its organic (IRM) component re-priced at the post-borrow utilization (intrinsic + rewards are size-invariant). Brokered (fixed-term) markets: the cheapest term's order-book VWAP at the notional (termsShort[].aprAtAmount — Morpho Midnight) or, for a flat broker rate card with no ladder (Lista, TermMax, Teller), the headline itself. Present when an amount is supplied; null for a non-curve variable lender without a depth grid and for a brokered market with no rate card.

    depositAprAtAmountnumbernullable

    Effective supply APR % at the collateral notional: the headline depositAprLong with only its organic (IRM) component re-priced at the post-deposit utilization. Present when an amount is supplied; null for non-curve lenders.

    netAprAtAmountnumbernullable

    Leverage-weighted net position APR % on equity at the supplied amount, using the effective legs (INCLUDING rewards). Same components as aprTotal (directly comparable), but at the position's actual size/leverage. Set for brokered (fixed-term) pairs too, off the fixed-term borrowAprAtAmount. Null when equity is non-positive or a leg is unavailable.

    netAprAtAmountBasenumbernullable

    Net APR % at the supplied amount EXCLUDING rewards — the sustainable at-size rate (netAprAtAmount with per-leg rewards stripped). The at-size reward contribution is netAprAtAmount − netAprAtAmountBase. Null when netAprAtAmount is.

    borrowDepthShort objectnullable

    Debt-market rate-vs-amount borrow grid. Only when depth=true.

    property name*anynullable

    Debt-market rate-vs-amount borrow grid. Only when depth=true.

    supplyDepthLong objectnullable

    Collateral-market rate-vs-amount supply grid. Only when depth=true.

    property name*anynullable

    Collateral-market rate-vs-amount supply grid. Only when depth=true.

    risk object

    Per-dimension risk for the pair. No composite headline score — take the worst (highest) breakdown entry if you need one.

    maxTokenScoreintegernullable

    Worse of the two sides' token risk scores.

    breakdown object[]

    One entry per dimension: config (market/e-mode configuration), chain, lender (protocol), tokenLong (collateral asset), tokenShort (debt asset), and curation — the last present ONLY for lenders that have curators (Morpho Blue, Euler, Kamino — whose curator is the market owner). Scores are 1-5, higher = riskier, plus 6 = compromised: the object is currently drained, insolvent or abandoned (exit scam, unremediated exploit, an asset whose backing is gone) — distinct from a high-risk but functioning venue, which stays at 5. A config that accepts a compromised collateral asset is 6, and so is every market borrowable in that config. 0/null means unassessed and is labelled "unknown". Ceilings are <=, so the default maxConfigRiskScore of 4 never admits a 6; pass 6 explicitly to see them.

  • Array [
  • categorystring
    Example: lender
    scoreintegernullable

    Normalized risk score — lower is safer.

    labelstring

    Possible values: [low, medium, high, compromised, unknown]

    curatorIdsstring[]nullable

    curation only: curator slugs of the pair's two markets, unioned. The pair's curation score is the WORSE of its two legs — an Euler position spanning a curated collateral vault and an uncurated controller is only as curated as the controller.

  • ]
  • collateralDesk objectnullable

    The CREDIT DESK of the collateral (long) asset — whose solvency the position is exposed to. This is the strategy's exposure and what to group strategies by. A PT-sUSDe collateral is { id: 'ethena', via: 'pendle', hops: 1 }. null when the asset names no issuer (WETH, BNB — nobody's liability) or is uncurated.

    idstringrequired
    Example: ethena
    namestringrequired

    Human-readable display name.

    Example: Ethena
    kindstring

    protocol, institution, cex, … when the token list publishes it.

    viastring

    The INSTRUMENT issuer, when the desk was reached through a wrapper — pendle on a PT, spectra, dolomite on a receipt token. Absent when the desk is the token's own issuer.

    Example: pendle
    hopsintegerrequired

    0 = the token's own issuer; ≥ 1 = reached through that many wrapper hops.

    debtDesk objectnullable

    The credit desk of the debt (short) asset — published for completeness, but it is only whose money you OWE. A debt is not an exposure: a USDC-funded sUSDe loop is Ethena credit, not Circle credit, and must never be grouped under circle.

    idstringrequired
    Example: ethena
    namestringrequired

    Human-readable display name.

    Example: Ethena
    kindstring

    protocol, institution, cex, … when the token list publishes it.

    viastring

    The INSTRUMENT issuer, when the desk was reached through a wrapper — pendle on a PT, spectra, dolomite on a receipt token. Absent when the desk is the token's own issuer.

    Example: pendle
    hopsintegerrequired

    0 = the token's own issuer; ≥ 1 = reached through that many wrapper hops.

    collateralAssetClassstringnullable

    WHAT KIND of real-world asset the collateral (long) asset is, from token-lists props.rwa; null = not a tokenized real-world asset. What collateralAssetClasses= matches.

    Possible values: [stock, etf, pre-ipo, fund, credit, commodity, null]

    debtAssetClassstringnullable

    The same for the debt (short) asset. What debtAssetClasses= matches.

    Possible values: [stock, etf, pre-ipo, fund, credit, commodity, null]

    collateralUnderlyingTickerstringnullable

    The real-world ticker the collateral tracks (TSLA); equity classes only. What collateralUnderlyingTickers= matches.

    debtUnderlyingTickerstringnullable

    The real-world ticker the debt asset tracks; equity classes only. What debtUnderlyingTickers= matches.

    OptimizerPair
    {
    "chainId": "string",
    "lender": "string",
    "fixedTerm": {
    "model": "term",
    "maturity": 0,
    "fees": {},
    "earlyRepay": {},
    "provider": {},
    "auction": {
    "status": "open",
    "canBorrow": true,
    "canLend": true,
    "secondsUntilClose": 263000,
    "implications": [
    "string"
    ],
    "id": "string",
    "startTime": 0,
    "revealTime": 0,
    "endTime": 0,
    "minBorrowAmount": "1000000000",
    "minLendAmount": "1000000000"
    }
    },
    "marketLongUid": "string",
    "marketShortUid": "string",
    "marketNameLong": "string",
    "marketNameShort": "string",
    "curatorNameLong": "string",
    "curatorNameShort": "string",
    "assetLong": "string",
    "assetShort": "string",
    "assetGroupLong": "string",
    "assetGroupShort": "string",
    "symbolLong": "string",
    "nameLong": "string",
    "symbolShort": "string",
    "nameShort": "string",
    "aprBase": 0,
    "aprTotal": 0,
    "maxLeverage": 0,
    "ltv": 0,
    "depositAprLong": 0,
    "borrowAprShort": 0,
    "intrinsicYieldLong": 0,
    "intrinsicYieldShort": 0,
    "variableBorrowDisabledShort": true,
    "termsShort": [
    {
    "termId": 2,
    "depositApr": 0,
    "available": 0,
    "durationDays": 7,
    "durationSecs": 604800,
    "apr": 3.85,
    "aprAtAmount": 0,
    "fillable": 0,
    "capped": true,
    "ladder": [
    {
    "apr": 0,
    "units": "string",
    "assets": 0
    }
    ]
    }
    ],
    "originationFeeShort": 0,
    "totalDepositsUsdLong": 0,
    "totalDepositsUsdShort": 0,
    "totalDebtUsdLong": 0,
    "totalDebtUsdShort": 0,
    "totalLiquidityUsdLong": 0,
    "totalLiquidityUsdShort": 0,
    "borrowLiquidityShort": 0,
    "utilizationLong": 0,
    "utilizationShort": 0,
    "maxDebtAmount": 0,
    "maxDebtAmountUsd": 0,
    "minCollateralAmount": 0,
    "minCollateralAmountUsd": 0,
    "borrowAprAtAmount": 0,
    "depositAprAtAmount": 0,
    "netAprAtAmount": 0,
    "netAprAtAmountBase": 0,
    "borrowDepthShort": {},
    "supplyDepthLong": {},
    "risk": {
    "maxTokenScore": 0,
    "breakdown": [
    {
    "category": "lender",
    "score": 0,
    "label": "low",
    "curatorIds": [
    "string"
    ]
    }
    ]
    },
    "collateralDesk": {
    "id": "ethena",
    "name": "Ethena",
    "kind": "string",
    "via": "pendle",
    "hops": 0
    },
    "debtDesk": {
    "id": "ethena",
    "name": "Ethena",
    "kind": "string",
    "via": "pendle",
    "hops": 0
    },
    "collateralAssetClass": "stock",
    "debtAssetClass": "stock",
    "collateralUnderlyingTicker": "string",
    "debtUnderlyingTicker": "string"
    }