---
title: "Build the unsigned manage/close transaction for a position"
method: POST
path: "/v1/partner/manage/build"
tags: ["Partner"]
---

# Build the unsigned manage/close transaction for a position

`POST /v1/partner/manage/build`

## Request

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

## Request body

- object
  - `userAddress` string, required
  - `id` integer, required: On-chain position index (from /positions).
  - `action` 'close' | 'increase_leverage' | 'add_collateral' | 'remove_collateral' | 'repay' | 'borrow', required
  - `amount` string
  - `payToken` string
  - `full` boolean: repay only: clear the entire remaining debt.
  - `desiredLtv` string
  - `leverage` number
  - `slippage` number
  - `chainId` 1 | 4663

## 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)
