Skip to main content
Loop Market Details View Loop markets (also known as “Multiply”) allow users to create leveraged positions by repeatedly depositing collateral and borrowing against it in an automated way. Our Markets API already contains lots of information that you would manually collect via multiple API calls throughout protocols and providers, such as:
  • basic protocol information,
  • leverage and APY information,
  • token pair information (collateral and debt tokens),
  • risk parameters (LTV and liquidation thresholds),
  • actions (setup, deposit, withdraw), etc.
By enriching the response with all of this information, it makes the API powerful enough to drive full-fledged dashboards and applications as well as smaller widgets, cards or notifications - All in a single API call!

How Loop Markets Work

Loop markets automate a looping strategy, which is as follows:
1

Choose Leverage & Deposit

The user chooses the desired leverage level and deposits collateral (Token A) into the market
2

Borrow

The protocol borrows against the deposited collateral (Token B)
3

Swap & Re-deposit

The borrowed amount gets swapped back to Token A and gets re-deposited
4

Repeat

This cycle repeats automatically until the user’s chosen leverage level is reached
This creates a leveraged position that amplifies exposure to the collateral asset while borrowing the debt asset. The APY reflects the net return after accounting for borrowing costs and the yield from the collateral asset.

Data Structure

Below is an example of a loop market response from the Markets API. Based on customer demand, we may add more fields to the response in the future. For the latest data structure, please have a look at our Markets API Reference page.
Please note that we do our best to design our APIs to be non-breaking. It is recommended to filter the response and only include the fields / types you need to ensure it won’t break your application if new fields are added over time.
Loop Markets Data Structure
{
  "id": "string",                    // Unique market identifier
  "type": "loop",                    // Market type
  "provider": {
    "id": "string",                  // Protocol identifier
    "name": "string",                // Protocol display name
    "icon": "string"                 // Protocol icon URL
  },
  "tokenA": {                        // Collateral token
    "address": "string",             // Token mint address
    "symbol": "string",              // Token symbol
    "decimals": number,              // Token decimals
    "icon": "string"                 // Token icon URL
  },
  "tokenB": {                        // Debt/borrow token
    "address": "string",             // Token mint address
    "symbol": "string",              // Token symbol
    "decimals": number,              // Token decimals
    "icon": "string"                 // Token icon URL
  },
  "websiteUrl": "string",            // Direct link to protocol (optional)
  "depositApy": number,              // Net APY after leverage and borrowing costs
  "maxLeverage": number,             // Maximum leverage multiplier (e.g., 7.69x)
  "maxLtv": number,                  // Maximum loan-to-value ratio (0-1)
  "liquidationLtv": number,          // LTV threshold for liquidation (0-1)
  "additionalData": {},              // Protocol-specific metadata (varies by market)
  "actions": {
    "setup": {
      "blinkUrl": "string"           // Blink URL for LUT creation
    },
    "deposit": {
      "blinkUrl": "string"           // Blink URL for leveraged deposit
    },
    "withdraw": {
      "blinkUrl": "string"           // Blink URL for position withdrawal
    }
  }
}

Practical Example

In order to better understand how the API works, let’s walk through an example response for the Kamino Multiply lanternSOL/SOL strategy below:
API Response for Kamino Multiply lanternSOL/SOL
{
  "id": "kamino.multiply.J5oj3VKWQNKRZx3heWZx7JZC59AEDQ9UQwqqiy63nCuf.d4A2prbA2whesmvHaL88BH6Ewn5N4bTSU2Ze8P6Bc4Q",
  "type": "loop",
  "provider": {
    "id": "kamino",
    "name": "Kamino",
    "icon": "https://imagedelivery.net/C7jfNnfrjpAYWW6YevrFDg/5cddfb2e-c98e-4734-528b-b541fb5e2b00/public"
  },
  "tokenA": {
    "address": "LnTRntk2kTfWEY6cVB8K9649pgJbt6dJLS1Ns1GZCWg",
    "symbol": "lanternSOL",
    "decimals": 9,
    "icon": "https://arweave.net/juI8rxciTff6pljaDiXMEq5klSOngQol_8lvyokGGwY"
  },
  "tokenB": {
    "address": "So11111111111111111111111111111111111111112",
    "symbol": "SOL",
    "decimals": 9,
    "icon": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/So11111111111111111111111111111111111111112/logo.png"
  },
  "websiteUrl": "https://kamino.com/multiply/7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF/J5oj3VKWQNKRZx3heWZx7JZC59AEDQ9UQwqqiy63nCuf/d4A2prbA2whesmvHaL88BH6Ewn5N4bTSU2Ze8P6Bc4Q",
  "depositApy": 0.1902,
  "maxLeverage": 7.692307692307692,
  "maxLtv": 0.87,
  "liquidationLtv": 0.92,
  "additionalData": {
    "marketAddress": "7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF",
    "collateralReserveAddress": "J5oj3VKWQNKRZx3heWZx7JZC59AEDQ9UQwqqiy63nCuf",
    "borrowReserveAddress": "d4A2prbA2whesmvHaL88BH6Ewn5N4bTSU2Ze8P6Bc4Q"
  },
  "actions": {
    "setup": {
      "blinkUrl": "blink:https://kamino.dial.to/api/v0/multiply/7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF/setup?collTokenMint=LnTRntk2kTfWEY6cVB8K9649pgJbt6dJLS1Ns1GZCWg&debtTokenMint=So11111111111111111111111111111111111111112"
    },
    "deposit": {
      "blinkUrl": "blink:https://kamino.dial.to/api/v0/multiply/7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF/deposit?collTokenMint=LnTRntk2kTfWEY6cVB8K9649pgJbt6dJLS1Ns1GZCWg&debtTokenMint=So11111111111111111111111111111111111111112"
    },
    "withdraw": {
      "blinkUrl": "blink:https://kamino.dial.to/api/v0/multiply/7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF/withdraw?collTokenMint=LnTRntk2kTfWEY6cVB8K9649pgJbt6dJLS1Ns1GZCWg&debtTokenMint=So11111111111111111111111111111111111111112"
    }
  }
}

Understanding the Response

What you can see here is the original response from the API. As mentioned in the introduction section, this response is powerful enough to drive full-fledged dashboards and applications. Let’s break it down into its components:
  • Market Identity:
    • id: Unique identifier combining protocol, market type, and reserve addresses
    • type: Market category (always loop for loop markets)
    • provider: Protocol information for branding in your UI
    • tokenA: Collateral token (lanternSOL) - the asset you want leveraged exposure to
    • tokenB: Debt token (SOL) - the asset being borrowed
    • websiteUrl: Direct link to the loop strategy on the protocol’s website
  • APY:
    • depositApy (19.04%) — Net APY after accounting for leverage and borrowing costs
    Note: This represents the leveraged yield. For example, if lanternSOL yields 5% and SOL borrowing costs 3%, with 7x leverage, the net APY reflects: (5% × 7) - (3% × 6) = approximately 17% before fees.
  • Leverage Parameters:
    • maxLeverage (7.69x) — Maximum leverage multiplier available for this strategy
    • maxLtv (0.87 or 87%) — Maximum loan-to-value ratio allowed when establishing the leveraged position
    • liquidationLtv (0.92 or 92%) — LTV threshold at which the position becomes eligible for liquidation
  • Actions: The actions object contains Blink URLs for:
    • setup — Creates a Lookup Table (LUT) required before opening a leveraged position. This is a one-time setup per wallet for each market.
    • deposit — Opens or increases a leveraged position by depositing collateral and executing the looping strategy.
    • withdraw — Reduces or closes a leveraged position by unwinding the loop and returning collateral.
  • Additional Data: The additionalData object contains protocol-specific metadata. In this example, we have the following additional data for Kamino Multiply:
    • marketAddress: The address of the lending market
    • collateralReserveAddress: The reserve address for the collateral token (lanternSOL)
    • borrowReserveAddress: The reserve address for the borrow token (SOL)