Skip to main content
POST
Python (SDK)

Authorizations

x-api-key
string
header
required

Your Compass API Key. Get your key here.

Body

application/json

Open a leveraged loop: repeatedly supply collateral, borrow, and swap the borrow back to collateral — all in ONE atomic transaction from the Credit Account.

owner
string
default:0x5e5b00ed886A6879C2B934612D2312975427fcAf
required

The address that owns the Credit Account.

Example:

"0x5e5b00ed886A6879C2B934612D2312975427fcAf"

chain
enum<string>
default:ethereum
required

Blockchain network.

Available options:
arbitrum,
base,
bsc,
ethereum,
hyperevm,
tempo
Example:

"ethereum"

collateral_token
string
default:WETH
required

Token supplied as collateral each iteration. Must already be in the Credit Account for the initial amount. For MORPHO it must be the market's collateral token.

Examples:

"wstETH"

"WETH"

borrow_token
string
default:USDC
required

Token borrowed each iteration and swapped back to the collateral token. For MORPHO it must be the market's loan token.

Examples:

"WETH"

"USDC"

initial_collateral_amount
default:1
required

Collateral (in token units) already held in the Credit Account to seed the loop.

Required range: x > 0
Example:

1.5

multiplier
default:2
required

Target leverage: total collateral exposure = multiplier × initial_collateral_amount. Must be achievable at the requested loan_to_value (max ≈ 0.9 / (1 − LTV)).

Required range: x > 1
Example:

2

loan_to_value
default:70
required

Per-iteration borrow LTV in percent. Must not exceed the protocol's maximum for the market (Aave reserve/e-mode LTV; Morpho LLTV with a safety margin); borrows are sized slightly inside the requested value so no leg sits on the protocol's revert boundary.

Required range: 0 < x <= 100
Example:

70

protocol
enum<string>
default:AAVE

Lending protocol to loop into: AAVE, MORPHO, or EULER.

Available options:
AAVE,
EULER,
MORPHO
Example:

"AAVE"

market_id
string | null

Morpho only: the bytes32 market id (from /v2/credit/morpho_markets). Required when protocol=MORPHO.

collateral_vault
string | null

Euler only: the EVK vault address collateral is supplied to (from /v2/credit/euler_markets). Required when protocol=EULER.

borrow_vault
string | null

Euler only: the EVK vault address borrowed from (the sub-account's controller). Required when protocol=EULER.

sub_account_id
integer
default:0

Euler only: the EVC sub-account (0-255) holding this isolated looped position. 0 is the Credit Account itself.

Required range: 0 <= x <= 255
max_slippage_percent
default:0.5

Per-swap slippage tolerance in percent. Loop dust is bounded by this per iteration, so tighter slippage means less dust.

Required range: 0 < x <= 10
Example:

0.3

emode_category
integer | null

Aave only: e-mode category to enable before looping (higher LTV for correlated pairs, e.g. ETH-correlated).

Required range: x >= 0
gas_sponsorship
boolean
default:false

If true, returns EIP-712 typed data for gas-sponsored execution instead of an unsigned transaction.

Example:

false

preview
boolean
default:false

If true, build a display ESTIMATE: swap legs always route through the default aggregator and no firm RFQ quotes are requested (quote_expires_at stays null). Set it on every call made while a user is exploring parameters, and leave it false only for the build they actually intend to sign — firm quotes are single-use maker commitments, and requesting them for displays that are never executed degrades the pricing this API is offered.

Response

Successful Response

The atomic loop transaction plus its guaranteed-floor preview.

preview
CreditLoopPreview · object
required

Projected end state, computed on guaranteed swap floors.

transaction
UnsignedTransaction · object | null

Unsigned transaction for direct execution by the owner. Present when gas_sponsorship=false — except firm-priced previews (preview=true with swap_provider='bebop'), which carry numbers only: the firm quotes are fetched at execution time, so there is no payload to sign yet.

Example:
eip_712
BatchedSafeOperationsResponse · object | null

EIP-712 typed data for gas-sponsored execution. Present when gas_sponsorship=true.

Example:
swap_provider
enum<string>
default:one_inch

Which venue priced the swap leg(s): 'one_inch' (iterative loop, slippage-bounded floors) or 'bebop' (firm zero-slippage quotes, one per swap leg, each partially filled at the leg's size — exact fills, zero dust). On preview=true responses, 'bebop' means the numbers are INDICATIVE, computed from the firm venue's live maker price levels without spending any quote; execution fetches the firm quotes at signing time. Always present, including on fallbacks.

Available options:
one_inch,
bebop
quote_expires_at
string<date-time> | null

Deadline of the firm swap quotes (the earliest across the loop's swap legs) — sign and broadcast before it or the transaction reverts on-chain; refresh by re-calling this endpoint (discard the previous payload). Present only on executable swap_provider='bebop' builds; null on previews (no quote is spent for a preview).

max_firm_multiplier
string | null

Multiplier bound firm zero-slippage quotes can fill for the requested position size, LTV and target (estimated without spending any quote). The requested multiplier is firm-servable iff it is <= this value; above it the loop executes at market rate with slippage-bounded floors instead. Present only on preview=true responses when a firm-quote venue covers the pair; null otherwise. Recompute per parameter change - minimum-size floors make reachability target-dependent.