Withdrawal transactions to sign and submit, one per batch.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Houdini documentation","description":"Learn how Houdini works: private, non-custodial cross-chain swaps across 120+ chains. Guides for Swap, Send, Split and Request, and docs for the Partner API.","colors":{"primary":"#864DE2","light":"#864DE2","dark":"#6D19BB"},"logo":{"light":"https://mintcdn.com/houdini/XK0rhkSzA66TLGwZ/images/newhoudinilogo.svg?fit=max\u0026auto=format\u0026n=XK0rhkSzA66TLGwZ\u0026q=85\u0026s=e7ce62c2ee9963c727689d1c1e30e048","dark":"https://mintcdn.com/houdini/XK0rhkSzA66TLGwZ/images/Group496.svg?fit=max\u0026auto=format\u0026n=XK0rhkSzA66TLGwZ\u0026q=85\u0026s=03e691bcd3c6b2b64e3db0526279e52d"},"favicon":"https://mintcdn.com/houdini/J_K5qV0WwrgjImSc/favicon.svg?fit=max\u0026auto=format\u0026n=J_K5qV0WwrgjImSc\u0026q=85\u0026s=590f308a0168b015c97bd34e59347cc6","appearance":{"default":"dark"},"background":{"decoration":"gradient","color":{"light":"#EBEBEB","dark":"#191919"}},"footer":{"socials":{"x":"https://x.com/HoudiniSwap","github":"https://github.com/HoudiniSwap"}},"fonts":{"family":"Inter"},"integrations":{"posthog":{"apiKey":"phc_w4HfQH4UqlUBDknwuvTDJMJLJ9CpshxIwzH3eZFa32c","apiHost":"https://api4.houdiniswap.com"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"houdini","hasAudioNarration":false,"actualSubdomain":"houdini","customDomains":["docs.houdini.com"],"gitSource":{"type":"github","owner":"houdiniswap","repo":"docs-v2","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6af461adbf7f51e9bf6bc4f7","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"API V2 Reference ","count":41},{"language":"default","tag":"Developer Hub","count":23},{"language":"default","tag":"Overview","count":16},{"language":"default","tag":"Split","count":9},{"language":"default","tag":"On-chain DEX or Bridge","count":9},{"language":"default","tag":"Partner Account","count":9},{"language":"default","tag":"Swap Flow Guides","count":8},{"language":"default","tag":"Private and Standard Swaps","count":5},{"language":"default","tag":"Core Concepts","count":5},{"language":"default","tag":"Bundler EVM","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/bundler-evm/recover-stuck-assets","slug":"/api-reference/bundler-evm/recover-stuck-assets","pageMetadata":{"title":"Recover stuck assets","description":"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible.\n\n- 404 means nothing to withdraw — no failed swap for this `multiId`, or the smart account no longer holds those tokens","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi/recovery","href":"/api-reference/bundler-evm/recover-stuck-assets","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible.\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"404 means nothing to withdraw — no failed swap for this \", _jsx(_components.code, {\n children: \"multiId\"\n }), \", or the smart account no longer holds those tokens\"]\n }), \"\\n\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Recover stuck assets","description":"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible.\n\n- 404 means nothing to withdraw — no failed swap for this `multiId`, or the smart account no longer holds those tokens","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi/recovery","href":"/api-reference/bundler-evm/recover-stuck-assets","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"BuildFailedMultiswapRecovery","responses":{"200":"1b59bae3-384d-4189-8f52-a39b29e250fb","400":"94bb90ca-593f-4c03-a616-12f73061a9b3","401":"6650970d-8348-4639-95d3-915e0e59fea9","402":"5426e5dc-fe48-410d-9e98-5148b4e8ca7d","403":"6d0785d8-bca9-4333-aef8-b2d6e3128d1f","404":"f16adba8-3bb6-4ae5-8e2a-e7cecf5171ff","422":"1166def0-40a8-410d-9e78-1682e43f8b20","429":"76b6656c-aa07-4c00-88a1-e26f4da60c2f","500":"f35ce643-a9fc-4008-9abb-ba1385fee2f4"},"description":"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible.\n\n- 404 means nothing to withdraw — no failed swap for this `multiId`, or the smart account no longer holds those tokens","summary":"Recover stuck assets","tags":["Bundler EVM"],"security":["3e726df3-1013-44a4-bf9b-f6e73aacd1ea"],"parameters":[],"requestBody":"b71a641c-8b98-4819-87fa-18b67b63c70e","method":"post","type":"path","servers":["8dcc9605-3ae8-4724-b409-35be2c99d96f"],"path":"/exchanges/multi/recovery","baseUrlOptions":["https://api-partner.houdiniswap.com/v2"],"title":"Recover stuck assets","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for POST /exchanges/multi/recovery","properties":{"multiId":{"type":"string","description":"The Split group ID","maxLength":64,"isRequired":true,"uniqueKey":"multiId","typeLabel":"string"}},"required":["multiId"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"multiId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"1b59bae3-384d-4189-8f52-a39b29e250fb":{"description":"Recovery data","content":{"application/json":{"schema":{"properties":{"saAddress":{"type":"string","description":"Smart account holding the stuck funds. It is owned by the wallet that built the batch, so the funds stay recoverable by that wallet alone.","isRequired":true,"uniqueKey":"saAddress","typeLabel":"string"},"assets":{"items":{"properties":{"tokenAddress":{"type":"string","description":"Contract address of the stuck token.","isRequired":true,"uniqueKey":"assets.items.[INDEX].tokenAddress","typeLabel":"string"},"tokenSymbol":{"type":"string","description":"Symbol of the stuck token, e.g. `USDT`.","isRequired":true,"uniqueKey":"assets.items.[INDEX].tokenSymbol","typeLabel":"string"},"decimals":{"type":"number","format":"double","description":"Decimals of the stuck token, for turning `balance` into a display amount.","isRequired":true,"uniqueKey":"assets.items.[INDEX].decimals","typeLabel":"number\u003cdouble>"},"balance":{"type":"string","description":"Amount held, in the token's smallest unit.","isRequired":true,"uniqueKey":"assets.items.[INDEX].balance","typeLabel":"string"},"sourceHoudiniIds":{"items":{"type":"string","uniqueKey":"assets.items.[INDEX].sourceHoudiniIds.items.[INDEX]","typeLabel":"string"},"type":"array","description":"The orders whose funds ended up here.","isRequired":true,"uniqueKey":"assets.items.[INDEX].sourceHoudiniIds","typeLabel":"string[]"}},"required":["tokenAddress","tokenSymbol","decimals","balance","sourceHoudiniIds"],"type":"object","additionalProperties":false,"uniqueKey":"assets.items.[INDEX]","typeLabel":"object"},"type":"array","description":"Every stuck token, with its balance.","isRequired":true,"uniqueKey":"assets","typeLabel":"object[]"},"transactions":{"items":{"properties":{"houdiniIds":{"items":{"type":"string","uniqueKey":"transactions.items.[INDEX].houdiniIds.items.[INDEX]","typeLabel":"string"},"type":"array","description":"HoudiniIds of the orders included in this batch","isRequired":true,"uniqueKey":"transactions.items.[INDEX].houdiniIds","typeLabel":"string[]"},"txData":{"oneOf":[{"type":"object","description":"Network-specific transaction data ready to broadcast","required":["userOpHash","to","data","value","chainId","tokenAmount"],"properties":{"userOpHash":{"type":"string","description":"The digest the user's wallet must sign, as 32 bytes of hex. Sign it as a message — `signMessage({ message: { raw: userOpHash } })` in viem, `signMessage(getBytes(userOpHash))` in ethers — then post the signature to [Submit signed transaction](/api-reference/bundler-evm/submit-signed-transaction).","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.0.userOpHash","typeLabel":"string"},"to":{"type":"string","description":"Where to send the funding transaction. It is **not** always the smart account:\n\n- ERC-20 source token — the token contract. The smart account is the recipient encoded inside `data`.\n- native source coin — the smart account itself.","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.0.to","typeLabel":"string"},"data":{"type":"string","description":"Calldata for the funding transaction. An ERC-20 `transfer` moving the tokens to the smart account, or `0x` when the source token is the chain's native coin.\n\nThe amount encoded here is the full balance the batch needs.","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.0.data","typeLabel":"string"},"value":{"type":"string","description":"Native coin to send with the transaction, in wei. Covers gas plus the swap amount when the source token is the native coin, and is `\"0\"` for ERC-20 sources.","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.0.value","typeLabel":"string"},"chainId":{"type":"number","format":"double","description":"EVM chain the batch runs on, e.g. `1` for Ethereum, `8453` for Base.","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.0.chainId","typeLabel":"number\u003cdouble>"},"tokenAmount":{"type":"string","description":"How much of the source token still has to reach the smart account, in the token's smallest unit. Already funded balance is deducted. `\"0\"` when the source token is the chain's native coin.","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.0.tokenAmount","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.0","typeLabel":"object"},{"type":"object","description":"Network-specific transaction data ready to broadcast","required":["data"],"properties":{"data":{"type":"string","description":"Serialized transaction bytes (base64)","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.1.data","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.1","typeLabel":"object"},{"type":"object","description":"Network-specific transaction data ready to broadcast","required":["userOp","userOpHash","chainId","entryPoint","to","smartAccountAddress","gasEstimate","data","value","tokenAmount"],"properties":{"userOp":{"description":"EntryPoint v0.7 unpacked UserOp. User pays gas from Smart Account balance — no paymaster.","properties":{"sender":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.sender","typeLabel":"string"},"nonce":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.nonce","typeLabel":"string"},"callData":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.callData","typeLabel":"string"},"callGasLimit":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.callGasLimit","typeLabel":"string"},"verificationGasLimit":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.verificationGasLimit","typeLabel":"string"},"preVerificationGas":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.preVerificationGas","typeLabel":"string"},"maxFeePerGas":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.maxFeePerGas","typeLabel":"string"},"maxPriorityFeePerGas":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.maxPriorityFeePerGas","typeLabel":"string"},"signature":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.signature","typeLabel":"string"},"factory":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.factory","typeLabel":"string"},"factoryData":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.factoryData","typeLabel":"string"},"paymaster":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.paymaster","typeLabel":"string"},"paymasterData":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.paymasterData","typeLabel":"string"},"paymasterVerificationGasLimit":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.paymasterVerificationGasLimit","typeLabel":"string"},"paymasterPostOpGasLimit":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp.paymasterPostOpGasLimit","typeLabel":"string"}},"required":["sender","nonce","callData","callGasLimit","verificationGasLimit","preVerificationGas","maxFeePerGas","maxPriorityFeePerGas","signature"],"type":"object","additionalProperties":false,"isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOp","typeLabel":"object"},"userOpHash":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.userOpHash","typeLabel":"string"},"chainId":{"type":"number","format":"double","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.chainId","typeLabel":"number\u003cdouble>"},"entryPoint":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.entryPoint","typeLabel":"string"},"to":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.to","typeLabel":"string"},"smartAccountAddress":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.smartAccountAddress","typeLabel":"string"},"gasEstimate":{"properties":{"gasCostWei":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.gasCostWei","typeLabel":"string"},"gasCostNative":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.gasCostNative","typeLabel":"string"},"nativeSymbol":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.nativeSymbol","typeLabel":"string"},"totalTransferAmountWei":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.totalTransferAmountWei","typeLabel":"string"},"requiredSmartAccountBalanceWei":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.requiredSmartAccountBalanceWei","typeLabel":"string"},"gasCostToken":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.gasCostToken","typeLabel":"string"},"gasCostTokenDecimals":{"type":"number","format":"double","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.gasCostTokenDecimals","typeLabel":"number\u003cdouble>"},"exchangeRate":{"type":"string","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.exchangeRate","typeLabel":"string"},"paymasterStub":{"type":"boolean","uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate.paymasterStub","typeLabel":"boolean"}},"required":["gasCostWei","gasCostNative","nativeSymbol","totalTransferAmountWei","requiredSmartAccountBalanceWei"],"type":"object","additionalProperties":false,"isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.gasEstimate","typeLabel":"object"},"data":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.data","typeLabel":"string"},"value":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.value","typeLabel":"string"},"tokenAmount":{"type":"string","isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2.tokenAmount","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData.oneOf.2","typeLabel":"object"}],"isRequired":true,"uniqueKey":"transactions.items.[INDEX].txData","typeLabel":"object"}},"required":["houdiniIds","txData"],"type":"object","additionalProperties":false,"uniqueKey":"transactions.items.[INDEX]","typeLabel":"object"},"type":"array","description":"Withdrawal transactions to sign and submit, one per batch.","isRequired":true,"uniqueKey":"transactions","typeLabel":"object[]"}},"required":["saAddress","assets","transactions"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example 1":{"title":"Example 1","value":{"saAddress":"0x3aF1c90b5E2d7B4a8c6E9f0a1B2c3D4e5F607182","assets":[{"tokenAddress":"0xdac17f958d2ee523a2206206994597c13d831ec7","tokenSymbol":"USDT","decimals":6,"balance":"1000000000","sourceHoudiniIds":["hxK7mQp2"]}],"transactions":[{"houdiniIds":["hxK7mQp2"],"txData":{"userOpHash":"0x7b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90a","to":"0xdac17f958d2ee523a2206206994597c13d831ec7","data":"0xa9059cbb000000000000000000000000b7de6b6eebf7401afea5a49d6405c9048fef2d40","value":"0","chainId":1,"tokenAmount":"1000000000"}}]}}},"exampleType":"examples"}},"exampleType":"examples"},"94bb90ca-593f-4c03-a616-12f73061a9b3":{"description":"Bad request","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs.","uniqueKey":"requestId","typeLabel":"string"}},"required":["message","code"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","requestId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"6650970d-8348-4639-95d3-915e0e59fea9":{"description":"Credentials missing, malformed, or rejected — all return `INVALID_API_CREDENTIALS`. Sending only `partner-id` returns `PARTNER_ID_NOT_SUPPORTED`.","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs.","uniqueKey":"requestId","typeLabel":"string"}},"required":["message","code"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","requestId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"5426e5dc-fe48-410d-9e98-5148b4e8ca7d":{"description":"Payment required — x402 protocol. The body is empty; what to pay is in the `payment-required` header. Not returned when you send an `Authorization` header.","content":{"application/json":{"schema":{"description":"Body of a `402 Payment required`. Empty — `{}` — for API clients; a request that looks like a browser gets an HTML paywall page instead.\n\nThis is the x402 payment protocol, not the normal error format, so there is no `code` or `message` to branch on. What to pay is always in the `payment-required` response header, in both cases: base64-encoded JSON whose `accepts[]` entries each carry the `network`, the `asset` to pay in, the `amount`, and the `payTo` address, alongside `maxTimeoutSeconds` and the x402 `scheme`.\n\nSending `Authorization` skips the payment flow, so a 402 only reaches callers paying per request. An `apiKey` query param also skips it but is not a credential — those requests fail with `401 INVALID_API_CREDENTIALS`.","properties":{},"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{}}},"exampleType":"generated"}},"headers":{"payment-required":{"schema":{"type":"string"},"required":true}},"exampleType":"generated"},"6d0785d8-bca9-4333-aef8-b2d6e3128d1f":{"description":"Access Denied","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs.","uniqueKey":"requestId","typeLabel":"string"}},"required":["message","code"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","requestId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"f16adba8-3bb6-4ae5-8e2a-e7cecf5171ff":{"description":"No stuck assets found","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs.","uniqueKey":"requestId","typeLabel":"string"}},"required":["message","code"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","requestId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"1166def0-40a8-410d-9e78-1682e43f8b20":{"description":"Validation Failed","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"fields":{"properties":{},"type":"object","additionalProperties":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"fields.additionalProperties.message","typeLabel":"string"},"value":{"oneOf":[{}],"uniqueKey":"fields.additionalProperties.value","typeLabel":"any"}},"required":["message"],"type":"object","uniqueKey":"fields.additionalProperties","typeLabel":"object"},"description":"The inputs that failed, keyed by field name — or by path for a nested field, e.g. `filters.rotatePayoutWallets`. Each entry has a `message` and, when you sent one, the `value`.\n\nNot every `422` names its input, so `fields` can be `{}`: branch on `code`, and use `fields` to highlight the input when one is named.","isRequired":true,"uniqueKey":"fields","typeLabel":"object"},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs.","uniqueKey":"requestId","typeLabel":"string"}},"required":["message","code","fields"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","fields":{},"requestId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"76b6656c-aa07-4c00-88a1-e26f4da60c2f":{"description":"Rate limit exceeded — back off and retry","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs.","uniqueKey":"requestId","typeLabel":"string"}},"required":["message","code"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","requestId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"f35ce643-a9fc-4008-9abb-ba1385fee2f4":{"description":"Internal Server Error","content":{"application/json":{"schema":{"properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Machine-readable reason for the failure. Branch on this, not on `message` — messages are free to change.\n\nThe value depends on the HTTP status. The common ones:\n\n- `400` — `BAD_REQUEST`\n- `401` — `INVALID_API_CREDENTIALS`, `PARTNER_ID_NOT_SUPPORTED`\n- `403` — `ACCESS_DENIED`, `FIXED_RATE_NOT_ALLOWED`\n- `404` — `NOT_FOUND`, `TOKEN_NOT_FOUND`, `TOKEN_DISABLED`\n- `409` — `ALREADY_SUBMITTED`, `STATIC_DEPOSIT_IN_USE`\n- `422` — `VALIDATION_ERROR`, `AMOUNT_TOO_LOW`, `INVALID_SWAP`, `FIXED_RATE_QUOTE_EXPIRED`, and most other request problems\n- `429` — `RATE_LIMIT_EXCEEDED`\n- `5xx` — `INTERNAL_SERVER_ERROR`, `PROVIDER_EXCHANGE_FAILED`, `SERVICE_UNAVAILABLE`\n\nNew codes are added over time, so treat this as an open set: match the ones you handle and fall back to the HTTP status for the rest.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"requestId":{"type":"string","description":"Unique id for this request. Quote it when contacting support — it is how we find the failure in our logs.","uniqueKey":"requestId","typeLabel":"string"}},"required":["message","code"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","requestId":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"3e726df3-1013-44a4-bf9b-f6e73aacd1ea":{"apiKey":{"type":"apiKey","name":"Authorization","in":"header","description":"Send `Authorization: \u003cApiKey>:\u003cApiSecret>` — joined by a colon, raw. No `Bearer` prefix, no base64.\n\n[Get your credentials](https://docs.houdini.com/developer-hub/getting-started/authentication)","scopes":[],"schemeName":"apiKey"}}},"servers":{"8dcc9605-3ae8-4724-b409-35be2c99d96f":{"url":"https://api-partner.houdiniswap.com/v2"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","name":"Authorization","in":"header","description":"Send `Authorization: \u003cApiKey>:\u003cApiSecret>` — joined by a colon, raw. No `Bearer` prefix, no base64.\n\n[Get your credentials](https://docs.houdini.com/developer-hub/getting-started/authentication)","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Authorization","type":"string","description":"Send `Authorization: \u003cApiKey>:\u003cApiSecret>` — joined by a colon, raw. No `Bearer` prefix, no base64.\n\n[Get your credentials](https://docs.houdini.com/developer-hub/getting-started/authentication)","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"https://api-partner.houdiniswap.com/v2/openapi.json"},"subdomain":"houdini","siteName":"Houdini documentation","title":"Recover stuck assets - Houdini documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-10T13:16:16.609Z","originalFileLocation":"api-reference/bundler-evm/recover-stuck-assets.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible. - 404 means nothing to withdraw — no failed swap for this multiId, or the smart account no longer holds those tokens\">\u003cmeta data-mint-head name=\"application-name\" content=\"Houdini documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Recover stuck assets - Houdini documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible. - 404 means nothing to withdraw — no failed swap for this multiId, or the smart account no longer holds those tokens\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Houdini documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://houdini.mintlify.site/_mintlify/api/og/v2?division=Bundler+EVM\u0026amp;title=Recover+stuck+assets\u0026amp;description=Finds+failed+EVM+batches+for+a+wallet+and+returns+pre-built+withdrawal+UserOps.+Use+this+once+retry+is+no+longer+possible.%0A%0A-+404+means+nothing+to+withdraw+%E2%80%94+no\u0026amp;theme=86a65e009c286e14b5c98004\u0026amp;signature=efc5cf50d30b2a92741dc4081a0ccab892fb8d10229de685d074328d12405e2b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Recover stuck assets - Houdini documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible. - 404 means nothing to withdraw — no failed swap for this multiId, or the smart account no longer holds those tokens\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://houdini.mintlify.site/_mintlify/api/og/v2?division=Bundler+EVM\u0026amp;title=Recover+stuck+assets\u0026amp;description=Finds+failed+EVM+batches+for+a+wallet+and+returns+pre-built+withdrawal+UserOps.+Use+this+once+retry+is+no+longer+possible.%0A%0A-+404+means+nothing+to+withdraw+%E2%80%94+no\u0026amp;theme=86a65e009c286e14b5c98004\u0026amp;signature=efc5cf50d30b2a92741dc4081a0ccab892fb8d10229de685d074328d12405e2b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/houdini/yzTfSRPGdvC9032C/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Houdini documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#864DE2\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/bundler-evm/recover-stuck-assets.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.houdini.com/#organization\",\"name\":\"Houdini documentation\",\"url\":\"https://docs.houdini.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/houdini/XK0rhkSzA66TLGwZ/images/newhoudinilogo.svg?fit=max\u0026auto=format\u0026n=XK0rhkSzA66TLGwZ\u0026q=85\u0026s=e7ce62c2ee9963c727689d1c1e30e048\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.houdini.com#website\",\"name\":\"Houdini documentation\",\"url\":\"https://docs.houdini.com\",\"publisher\":{\"@id\":\"https://docs.houdini.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets#webpage\",\"url\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets\",\"name\":\"Recover stuck assets\",\"description\":\"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible. - 404 means nothing to withdraw — no failed swap for this multiId, or the smart account no longer holds those tokens\",\"dateModified\":\"2026-11-10T13:16:16.609Z\",\"isPartOf\":{\"@id\":\"https://docs.houdini.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Split\",\"item\":\"https://docs.houdini.com/api-reference/split/get-tokens\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bundler EVM\",\"item\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Recover stuck assets\",\"item\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets#apireference\",\"headline\":\"Recover stuck assets\",\"name\":\"Recover stuck assets\",\"description\":\"Finds failed EVM batches for a wallet and returns pre-built withdrawal UserOps. Use this once retry is no longer possible. - 404 means nothing to withdraw — no failed swap for this multiId, or the smart account no longer holds those tokens\",\"url\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets\",\"mainEntityOfPage\":{\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/recover-stuck-assets#webpage\"},\"dateModified\":\"2026-11-10T13:16:16.609Z\",\"publisher\":{\"@id\":\"https://docs.houdini.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.houdini.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Houdini documentation\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Houdini documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/bundler-evm/recover-stuck-assets.md","siteName":"Houdini documentation","nav":{"global":null,"tabs":[{"tab":"Overview","pages":[{"title":"Overview","href":"/overview/getting-started/what-is-houdini"}]},{"tab":"Guides","hidden":true,"pages":[{"title":"Guides","href":"/guides/how-to/private-swap"}]},{"tab":"Developer Hub","pages":[{"title":"Developer Hub","href":"/developer-hub/overview/what-you-can-build"}]},{"tab":"API V2 Reference ","icon":"folder-gear","groups":[{"group":"Private and Standard Swaps","pages":[{"title":"Get tokens","openapi":"GET /tokens","href":"/api-reference/private-and-standard-swaps/get-tokens"},{"title":"Get quotes","openapi":"GET /quotes","href":"/api-reference/private-and-standard-swaps/get-quotes"},{"title":"Get quotes by token address","openapi":"GET /quotes/byChainAddress","href":"/api-reference/private-and-standard-swaps/get-quotes-by-token-address"},{"title":"Create exchange","openapi":"POST /exchanges","href":"/api-reference/private-and-standard-swaps/create-exchange"},{"title":"Get order details","openapi":"GET /orders/{houdiniId}","href":"/api-reference/private-and-standard-swaps/get-order-details"}]},{"group":"Private Send","pages":[{"title":"Get tokens","openapi":"GET /tokens","href":"/api-reference/private-send/get-tokens"},{"title":"Get private send quote","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /quotes/private-send","href":"/api-reference/private-send/get-private-send-quote"},{"title":"Create private send order","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/private-send","href":"/api-reference/private-send/create-private-send-order"},{"title":"Get order details","openapi":"GET /orders/{houdiniId}","href":"/api-reference/private-send/get-order-details"}]},{"group":"Split","pages":[{"title":"Get tokens","openapi":"GET /tokens","href":"/api-reference/split/get-tokens"},{"title":"Get split quotes","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /quotes/multi","href":"/api-reference/split/get-split-quotes"},{"title":"Create split","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi","href":"/api-reference/split/create-split"},{"title":"Get batch status","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /exchanges/multi/{multiId}","href":"/api-reference/split/get-batch-status"},{"group":"Bundler SOL","pages":[{"title":"Get batch transaction","openapi":"GET /exchanges/multi/{multiId}/tx","href":"/api-reference/bundler-sol/get-batch-transaction"}]},{"group":"Bundler EVM","pages":[{"title":"Build batch transaction","openapi":"POST /exchanges/multi/{multiId}/tx/build","href":"/api-reference/bundler-evm/build-batch-transaction"},{"title":"Submit signed transaction","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi/{multiId}/tx","href":"/api-reference/bundler-evm/submit-signed-transaction"},{"title":"Retry failed orders","description":"Retries a failed bundle, returning fresh `txData` to re-sign and submit.\n\n- only within 30 minutes of order creation, while deposit addresses are valid\n- returns 400 after that, and for refunded orders — use [Recover stuck assets](/api-reference/bundler-evm/recover-stuck-assets) to withdraw the funds instead","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi/{multiId}/retry","href":"/api-reference/bundler-evm/retry-failed-orders"},{"title":"Recover stuck assets","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi/recovery","href":"/api-reference/bundler-evm/recover-stuck-assets"}]}]},{"group":"On-chain DEX or Bridge","pages":[{"title":"Get tokens","description":"Returns the tokens available for on-chain DEX and bridge swaps. Use the returned id as the from / to of a quote.","openapi":"GET /tokens","href":"/api-reference/on-chain-dex-or-bridge/get-tokens"},{"title":"Get quotes","openapi":"GET /quotes","href":"/api-reference/on-chain-dex-or-bridge/get-quotes"},{"title":"Get quotes by token address","openapi":"GET /quotes/byChainAddress","href":"/api-reference/on-chain-dex-or-bridge/get-quotes-by-token-address"},{"title":"Create exchange","openapi":"POST /exchanges","href":"/api-reference/on-chain-dex-or-bridge/create-exchange"},{"title":"Get token approval data","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /dex/approve","href":"/api-reference/on-chain-dex-or-bridge/get-token-approval-data"},{"title":"Check token allowance","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /dex/allowance","href":"/api-reference/on-chain-dex-or-bridge/check-token-allowance"},{"title":"Get next chain signature","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /dex/chainSignatures","href":"/api-reference/on-chain-dex-or-bridge/get-next-chain-signature"},{"title":"Confirm DEX transaction","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /dex/confirmTx","href":"/api-reference/on-chain-dex-or-bridge/confirm-dex-transaction"},{"title":"Get order details","openapi":"GET /orders/{houdiniId}","href":"/api-reference/on-chain-dex-or-bridge/get-order-details"}]},{"group":"Reference Data","pages":[{"title":"Get token by ID","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /tokens/{id}","href":"/api-reference/reference-data/get-token-by-id"},{"title":"Get chains","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /chains","href":"/api-reference/reference-data/get-chains"},{"title":"Get swap providers","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /swaps","href":"/api-reference/reference-data/get-swap-providers"},{"title":"Get min and max amounts","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /minMax","href":"/api-reference/reference-data/get-min-and-max-amounts"}]},{"group":"Partner Account","pages":[{"title":"Get orders","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /orders","href":"/api-reference/partner-account/get-orders"},{"title":"Get partner profile","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /me","href":"/api-reference/partner-account/get-partner-profile"},{"title":"Get rate limits","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /rateLimits","href":"/api-reference/partner-account/get-rate-limits"},{"title":"Get commissions","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /commissions","href":"/api-reference/partner-account/get-commissions"},{"title":"Get commission summary","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /commissions/summary","href":"/api-reference/partner-account/get-commission-summary"},{"title":"Get withdrawals","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /withdrawals","href":"/api-reference/partner-account/get-withdrawals"},{"title":"Get volume stats","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /stats/volume","href":"/api-reference/partner-account/get-volume-stats"},{"title":"Get weekly volume","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /stats/weeklyVolume","href":"/api-reference/partner-account/get-weekly-volume"},{"title":"Get chart stats","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /stats/chart","href":"/api-reference/partner-account/get-chart-stats"}]},{"group":"System","pages":[{"title":"Get system health","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /status","href":"/api-reference/system/get-system-health"}]}]},{"tab":"API v1","hidden":true,"pages":[{"title":"API v1","href":"/migration/v1-to-v2"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/release-notes"}]},{"tab":"Support \u0026 FAQs","pages":[{"title":"Support \u0026 FAQs","href":"/support-and-faqs/faqs"}]}]},"basePath":"","title":"Recover stuck assets - Houdini documentation","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C9Wu0MeN.js","utils-jWgu-6Qf.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DBD8f9qn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BGuX1ui5.js","snippetPresets-Evy63nQB.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BQHO1lnV.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-B6C8m-t_.js","shallow-BG4cT0fH.js","getApiPlaygroundDisplay-CgEPrE-D.js","CodeSnippet-CU8JyZ9N.js","CodeSnippets-BnxHU32T.js","Page-D6S0Yh6q.js","getPastedJson-CwiYOonh.js","icon-DYDpWmDf.js","MethodPill-C-J-l7_c.js","DuplicateIcon-B6ARwg9w.js","createIcon-Dsv4MtDq.js","DynamicMarkdown-CtasenyM.js","SectionHeading-YNcgYwjB.js","axios-vUo_bRtp.js","Markdown-CwLx6PAg.js","clsx-C3kuh_dz.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CmKHfscc.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-U3mI6Ljh.js"]}