> ## Documentation Index
> Fetch the complete documentation index at: https://docs.houdiniswap.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Recover stuck assets from a failed EVM multiswap

> 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.



## OpenAPI

````yaml https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi/recovery
openapi: 3.0.0
info:
  title: houdiniswap-backend
  version: 2.1.2
  description: Houdiniswap Backend
  license:
    name: ISC
  contact: {}
servers:
  - url: https://api-partner.houdiniswap.com/v2
security: []
paths:
  /exchanges/multi/recovery:
    post:
      tags:
        - Exchanges
      summary: Recover stuck assets from a failed EVM multiswap
      description: >-
        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.
      operationId: GetFailedMultiswapRecovery
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FailedMultiswapRecoveryRequest'
      responses:
        '200':
          description: Recovery data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FailedMultiswapRecoveryResult'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: No stuck assets found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: Validation Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKey: []
components:
  schemas:
    FailedMultiswapRecoveryRequest:
      description: Request body for POST /exchanges/multi/recovery
      properties:
        multiId:
          type: string
          description: The multi exchange group ID
          maxLength: 64
      required:
        - multiId
      type: object
      additionalProperties: false
    FailedMultiswapRecoveryResult:
      properties:
        saAddress:
          type: string
        assets:
          items:
            $ref: '#/components/schemas/RecoveryAssetInfoResult'
          type: array
        transactions:
          items:
            $ref: '#/components/schemas/TxBatch'
          type: array
      required:
        - saAddress
        - assets
        - transactions
      type: object
      additionalProperties: false
    ErrorResponse:
      properties:
        message:
          type: string
        code:
          type: string
        requestId:
          type: string
      required:
        - message
        - code
      type: object
      additionalProperties: false
    ValidationError:
      properties:
        message:
          type: string
        code:
          type: string
        requestId:
          type: string
        fields:
          $ref: '#/components/schemas/FieldErrors'
      required:
        - message
        - code
        - fields
      type: object
      additionalProperties: false
    RecoveryAssetInfoResult:
      properties:
        tokenAddress:
          type: string
        tokenSymbol:
          type: string
        decimals:
          type: number
          format: double
        balance:
          type: string
        sourceHoudiniIds:
          items:
            type: string
          type: array
      required:
        - tokenAddress
        - tokenSymbol
        - decimals
        - balance
        - sourceHoudiniIds
      type: object
      additionalProperties: false
    TxBatch:
      properties:
        houdiniIds:
          items:
            type: string
          type: array
          description: HoudiniIds of the orders included in this batch
        txData:
          anyOf:
            - $ref: '#/components/schemas/EvmBatchTxSlimData'
            - $ref: '#/components/schemas/BatchTxData'
          description: Network-specific transaction data ready to broadcast
      required:
        - houdiniIds
        - txData
      type: object
      additionalProperties: false
    FieldErrors:
      properties: {}
      type: object
      additionalProperties:
        properties:
          value: {}
          message:
            type: string
        required:
          - message
        type: object
    EvmBatchTxSlimData:
      description: >-
        Slim response returned to the frontend — backend stores the full userOp
        in DB
      properties:
        userOpHash:
          type: string
        to:
          type: string
        data:
          type: string
        value:
          type: string
        chainId:
          type: number
          format: double
        tokenAmount:
          type: string
      required:
        - userOpHash
        - to
        - data
        - value
        - chainId
        - tokenAmount
      type: object
      additionalProperties: false
    BatchTxData:
      anyOf:
        - $ref: '#/components/schemas/SolanaBatchTxData'
        - $ref: '#/components/schemas/EvmBatchTxData'
      description: Union — add new network types here as they are supported
    SolanaBatchTxData:
      properties:
        data:
          type: string
          description: Serialized transaction bytes (base64)
      required:
        - data
      type: object
      additionalProperties: false
    EvmBatchTxData:
      properties:
        userOp:
          $ref: '#/components/schemas/EvmUserOp'
        userOpHash:
          type: string
        chainId:
          type: number
          format: double
        entryPoint:
          type: string
        to:
          type: string
        smartAccountAddress:
          type: string
        gasEstimate:
          $ref: '#/components/schemas/EvmGasEstimate'
        data:
          type: string
        value:
          type: string
        tokenAmount:
          type: string
      required:
        - userOp
        - userOpHash
        - chainId
        - entryPoint
        - to
        - smartAccountAddress
        - gasEstimate
        - data
        - value
        - tokenAmount
      type: object
      additionalProperties: false
    EvmUserOp:
      description: >-
        EntryPoint v0.7 unpacked UserOp. User pays gas from Smart Account
        balance — no paymaster.
      properties:
        sender:
          type: string
        nonce:
          type: string
        factory:
          type: string
        factoryData:
          type: string
        callData:
          type: string
        callGasLimit:
          type: string
        verificationGasLimit:
          type: string
        preVerificationGas:
          type: string
        maxFeePerGas:
          type: string
        maxPriorityFeePerGas:
          type: string
        signature:
          type: string
        paymaster:
          type: string
        paymasterData:
          type: string
        paymasterVerificationGasLimit:
          type: string
        paymasterPostOpGasLimit:
          type: string
      required:
        - sender
        - nonce
        - callData
        - callGasLimit
        - verificationGasLimit
        - preVerificationGas
        - maxFeePerGas
        - maxPriorityFeePerGas
        - signature
      type: object
      additionalProperties: false
    EvmGasEstimate:
      properties:
        gasCostWei:
          type: string
        gasCostNative:
          type: string
        nativeSymbol:
          type: string
        totalTransferAmountWei:
          type: string
        requiredSmartAccountBalanceWei:
          type: string
      required:
        - gasCostWei
        - gasCostNative
        - nativeSymbol
        - totalTransferAmountWei
        - requiredSmartAccountBalanceWei
      type: object
      additionalProperties: false
  securitySchemes:
    apiKey:
      type: apiKey
      name: Authorization
      in: header

````