---
title: "Recover stuck assets from a failed EVM multiswap"
method: POST
path: "/exchanges/multi/recovery"
tags: ["Exchanges"]
---

# Recover stuck assets from a failed EVM multiswap

`POST /exchanges/multi/recovery`

Find failed EVM multiswap batches for a wallet and return pre-built withdrawal UserOps.
Builds and stores a recovery record, hence POST.
Returns null (204) if no stuck assets are found.

## Request body

- FailedMultiswapRecoveryRequest — Request body for POST /exchanges/multi/recovery
  - `multiId` string, required — The multi exchange group ID

## Response `200`

Recovery data

- FailedMultiswapRecoveryResult
  - `saAddress` string, required
  - `assets` RecoveryAssetInfoResult[], required
    - `tokenAddress` string, required
    - `tokenSymbol` string, required
    - `decimals` number, double, required
    - `balance` string, required
    - `sourceHoudiniIds` string[], required
  - `transactions` TxBatch[], required
    - `houdiniIds` string[], required — HoudiniIds of the orders included in this batch
    - `txData` union, required — Network-specific transaction data ready to broadcast
      - EvmBatchTxSlimData — Slim response returned to the frontend — backend stores the full userOp in DB
        - `userOpHash` string, required
        - `to` string, required
        - `data` string, required
        - `value` string, required
        - `chainId` number, double, required
        - `tokenAmount` string, required
      - union — Union — add new network types here as they are supported
        - SolanaBatchTxData
          - `data` string, required — Serialized transaction bytes (base64)
        - EvmBatchTxData
          - `userOp` EvmUserOp, required — EntryPoint v0.7 unpacked UserOp. User pays gas from Smart Account balance — no paymaster.
            - `sender` string, required
            - `nonce` string, required
            - `factory` string
            - `factoryData` string
            - `callData` string, required
            - `callGasLimit` string, required
            - `verificationGasLimit` string, required
            - `preVerificationGas` string, required
            - `maxFeePerGas` string, required
            - `maxPriorityFeePerGas` string, required
            - `signature` string, required
            - `paymaster` string
            - `paymasterData` string
            - `paymasterVerificationGasLimit` string
            - `paymasterPostOpGasLimit` string
          - `userOpHash` string, required
          - `chainId` number, double, required
          - `entryPoint` string, required
          - `to` string, required
          - `smartAccountAddress` string, required
          - `gasEstimate` EvmGasEstimate, required
            - `gasCostWei` string, required
            - `gasCostNative` string, required
            - `nativeSymbol` string, required
            - `totalTransferAmountWei` string, required
            - `requiredSmartAccountBalanceWei` string, required
            - `gasCostToken` string
            - `gasCostTokenDecimals` number, double
          - `data` string, required
          - `value` string, required
          - `tokenAmount` string, required

## Other responses

- `400` — Bad request
- `404` — No stuck assets found
- `422` — Validation Failed
- `500` — Internal Server Error

---

[API](https://skmtc.net/houdiniswap/apis/houdiniswap-backend.md) · [All operations](https://skmtc.net/houdiniswap/apis/houdiniswap-backend/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/houdiniswap/houdiniswap-backend/versions/2063dbc88d59/schema)
