---
title: "Build the unsigned open-leverage transaction"
method: POST
path: "/v1/partner/leverage/build"
tags: ["Partner"]
---

# Build the unsigned open-leverage transaction

`POST /v1/partner/leverage/build`

## Request

- Base URL: `https://api.spiralstake.xyz`
- URL: `https://api.spiralstake.xyz/v1/partner/leverage/build`
- Auth: HTTP bearer

## Request body

- object
  - `strategyId` string, required: Morpho market id (from /v1/strategies).
  - `payToken` string, required: Token to pay in. Collateral (direct) or any token (zapped). ETH = zero address.
  - `amount` string, required: Amount of payToken in human units, e.g. '10000'.
  - `leverage` number: Target leverage (e.g. 3). Provide this OR desiredLtv.
  - `desiredLtv` string: Target LTV percent (e.g. '66.67'). Provide this OR leverage.
  - `slippage` number: Ratio, default 0.005, capped at 0.01.
  - `chainId` 1 | 4663
  - `userAddress` string, required: Wallet that will sign; approvals + onBehalfOf are built for it.

## Response `200`

Unsigned tx bundle

- object: Unsigned transaction bundle. Non-custodial: sign approvals[] first, then tx, from userAddress.
  - `chainId` integer, required
  - `action` string, required
  - `path` 'leverage' | 'swapAndLeverage' | 'reallocateAndLeverage' | 'reallocateSwapAndLeverage' | 'deleverage' | 'increaseLeverage' | 'supplyCollateral' | 'swapAndSupplyCollateral' | 'repay' | 'swapAndRepay' | 'withdrawCollateral' | 'borrow', required
  - `approvals` object[], required
    - `to` string, required
    - `data` string, required
    - `value` string
  - `tx` object, required
    - `to` string, required
    - `data` string, required
    - `value` string
  - `meta` object, required
    - `positionPreview` object
      - `leverage` string
      - `requestedLtv` string
      - `effectiveLtv` string
      - `amountLeveragedCollateral` string
      - `expectedLeverageApy` string
      - `priceImpactPct` string
      - `swapSource` 'KyberSwap' | 'OpenOcean' | 'Pendle'
    - `amountFlashLoan` string
    - `minTokenOut` string
    - `slippage` number
    - `expiresAt` string, date-time: Swap calldata is time-sensitive (~60s); rebuild if it lapses.
    - `signingUrl` string: One-click link to review + sign in the user's own wallet via the Spiral app.
    - `instructions` string

## Other responses

- `400`: Invalid input
- `401`: Missing/invalid API key
- `429`: Rate limited
- `503`: Transient (stale data / no route / RPC) — retry

---

[API](https://skmtc.dev/spiralstake/apis/spiral-stake-read-api-v1.md) · [All operations](https://skmtc.dev/spiralstake/apis/spiral-stake-read-api-v1/llms.txt) · [OpenAPI document](https://skmtc.dev/spiralstake/apis/spiral-stake-read-api-v1/revisions/e58af20cd747?raw)
