Wallet that will sign and fund the transaction(s). On EVM it also owns the smart account the batch runs through, so the same wallet must sign at Submit signed transaction.
Native coin the smart account holds right now, in wei. The account is owned by the sender wallet, so this balance stays under the user's control.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Houdini documentation","colors":{"primary":"#A955F7","light":"#A955F7","dark":"#6D19BB"},"logo":{"light":"https://mintcdn.com/houdini/1qxWMAnpbp51-Yh3/logo/wordmark-black.svg?fit=max\u0026auto=format\u0026n=1qxWMAnpbp51-Yh3\u0026q=85\u0026s=835e11b4170923b979bdf1ba4cb302b8","dark":"https://mintcdn.com/houdini/1qxWMAnpbp51-Yh3/logo/wordmark-white.svg?fit=max\u0026auto=format\u0026n=1qxWMAnpbp51-Yh3\u0026q=85\u0026s=93f5cefb108d85fa5bf5397fa325f004"},"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"},"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.houdiniswap.com"],"gitSource":{"type":"github","owner":"houdiniswap","repo":"docs-v2","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adc5d15137af4d6beae7c4c","collectionId":"a4f08450-0fc2-4651-80ab-b78e3a3297ef","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adc5d15137af4d6beae7c4c"},"entitlements":{},"buildId":"6adf551c362b83303f22ca3e","clientVersion":"0.0.3966","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":"Multi-Exchange","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":"Guides","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","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":"editor-v7-file-tree","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":"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":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"editor-nav-generations","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/bundler-evm/build-batch-transaction","slug":"/api-reference/bundler-evm/build-batch-transaction","pageMetadata":{"title":"Build batch transaction","description":"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.","openapi":"POST /exchanges/multi/{multiId}/tx/build","href":"/api-reference/bundler-evm/build-batch-transaction"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components};return _jsxs(_Fragment,{children:[_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`every order must send the `,_jsx(_components.strong,{children:`same token`}),` — all the chain’s native coin, or all the same ERC-20. Mixing them is rejected`]}),`\n`,_jsx(_components.li,{children:`supported on Ethereum, Base and BNB Smart Chain; other EVM chains are rejected`}),`\n`,_jsx(_components.li,{children:`up to 20 legs per batch`}),`\n`,_jsxs(_components.li,{children:[`send `,_jsx(_components.code,{children:`value`}),` and `,_jsx(_components.code,{children:`tokenAmount`}),` to `,_jsx(_components.code,{children:`to`}),`, sign `,_jsx(_components.code,{children:`userOpHash`}),`, then call `,_jsx(_components.a,{href:`/api-reference/bundler-evm/submit-signed-transaction`,children:`Submit signed transaction`})]}),`\n`,_jsxs(_components.li,{children:[`large groups come back as several batches, so handle every entry in `,_jsx(_components.code,{children:`transactions`})]}),`\n`,_jsxs(_components.li,{children:[`if a bundle fails: `,_jsx(_components.a,{href:`/api-reference/bundler-evm/retry-failed-orders`,children:`retry`}),` within 30 minutes, or `,_jsx(_components.a,{href:`/api-reference/bundler-evm/recover-stuck-assets`,children:`recover stuck assets`})]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Find batchable tokens with `,_jsx(_components.a,{href:`/api-reference/multi-exchange/get-tokens`,children:`Get tokens`}),` and `,_jsx(_components.code,{children:`hasBundler=true`}),`. See the `,_jsx(_components.a,{href:`https://docs.houdiniswap.com/developer-hub/swap-flows/multi-swap`,children:`multi-swap flow`}),` for the full sequence.`]})]})}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":"Build batch transaction","description":"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.","openapi":"POST /exchanges/multi/{multiId}/tx/build","href":"/api-reference/bundler-evm/build-batch-transaction"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"BuildMultiExchangeTx","responses":{"200":"174fa89e-40ee-4223-b8ae-10cb63be0e82","401":"2cfc4737-694a-4855-817b-5e20b9304a79","402":"43ced11d-c00a-4a59-b365-91a502f41034","403":"f03cdbb9-48fd-48d2-928f-b71c64878327","404":"50ce193b-f15c-4433-b0b0-807d86b75f90","409":"289efdab-e873-4d6f-95a8-3677134a6938","422":"fb357dfb-5741-4863-8d6d-dccfcb6cc077","429":"cd63a9c1-1d67-4d39-a5e5-7cc34f2503c3","500":"699a5434-cf3e-4589-8e11-18b7fedc795c"},"description":"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.","summary":"Build batch transaction","tags":["Bundler EVM"],"security":["4b99804a-d663-411a-b45c-4d136ce76a72"],"parameters":["e81701e7-ab1d-4036-97e4-66cf3cb12212"],"requestBody":"9b7aee51-d027-44a4-b26f-6b85e14012bd","method":"post","type":"path","servers":["8ebb4976-baf3-411c-8a1c-cd4d2c55015e"],"path":"/exchanges/multi/{multiId}/tx/build","baseUrlOptions":["http://localhost:3003/v2"],"title":"Build batch transaction","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"e81701e7-ab1d-4036-97e4-66cf3cb12212":{"description":"The multi exchange group ID","in":"path","name":"multiId","required":true,"schema":{"type":"string","maxLength":64,"isRequired":true,"description":"The multi exchange group ID","uniqueKey":"","typeLabel":"string"},"example":"mx8Qa1"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for POST /exchanges/multi/{multiId}/tx/build","properties":{"sender":{"type":"string","description":"Wallet that will sign and fund the transaction(s). On EVM it also owns the smart account the batch runs through, so the same wallet must sign at [Submit signed transaction](/api-reference/bundler-evm/submit-signed-transaction).","minLength":1,"isRequired":true,"uniqueKey":"sender","typeLabel":"string"},"houdiniIds":{"items":{"type":"string","uniqueKey":"houdiniIds.items.[INDEX]","typeLabel":"string"},"type":"array","description":"Optional subset of orders to build for; defaults to all orders in the group","maxItems":50,"uniqueKey":"houdiniIds","typeLabel":"string[]"}},"required":["sender"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"sender":"\u003cstring>","houdiniIds":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"174fa89e-40ee-4223-b8ae-10cb63be0e82":{"description":"Success","content":{"application/json":{"schema":{"properties":{"multiId":{"type":"string","description":"The group these transactions fund.","isRequired":true,"uniqueKey":"multiId","typeLabel":"string"},"chain":{"type":"string","description":"Chain kind of the from token (e.g. \"solana\", \"evm\")","isRequired":true,"uniqueKey":"chain","typeLabel":"string"},"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":"One entry per batch. A group larger than the per-chain batch limit is split across several.","isRequired":true,"uniqueKey":"transactions","typeLabel":"object[]"},"txVersion":{"enum":["legacy","v0","v1"],"type":"string","description":"Solana only. Format of every transaction in `transactions`. Matches the `txVersion` you requested, or `legacy` if you did not set one.","uniqueKey":"txVersion","typeLabel":"enum\u003cstring>"},"depositNeeded":{"type":"string","description":"Native coin the smart account still needs before you can submit, in wei. `\"0\"` means it is already funded.","uniqueKey":"depositNeeded","typeLabel":"string"},"saCurrentBalance":{"type":"string","description":"Native coin the smart account holds right now, in wei. The account is owned by the `sender` wallet, so this balance stays under the user's control.","uniqueKey":"saCurrentBalance","typeLabel":"string"}},"required":["multiId","chain","transactions"],"type":"object","additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example 1":{"title":"Example 1","value":{"multiId":"mx8Qa1","chain":"evm","depositNeeded":"500012687","saCurrentBalance":"0","transactions":[{"houdiniIds":["hxK7mQp2","hxK7mQp3"],"txData":{"userOpHash":"0xa52e838c3667a152f26a3e039abe5bd0274261ef64dfa32d45c3a4604537852b","to":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","data":"0xa9059cbb000000000000000000000000067423f2da169b79497f1ae57863a1d1ee7af772000000000000000000000000000000000000000000000000000000001dcdb5a6","value":"0","chainId":8453,"tokenAmount":"500012687"}}]}}},"exampleType":"examples"}},"exampleType":"examples"},"2cfc4737-694a-4855-817b-5e20b9304a79":{"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"},"43ced11d-c00a-4a59-b365-91a502f41034":{"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"},"f03cdbb9-48fd-48d2-928f-b71c64878327":{"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"},"50ce193b-f15c-4433-b0b0-807d86b75f90":{"description":"Not 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"},"289efdab-e873-4d6f-95a8-3677134a6938":{"description":"Bundle already submitted","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"},"fb357dfb-5741-4863-8d6d-dccfcb6cc077":{"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"},"cd63a9c1-1d67-4d39-a5e5-7cc34f2503c3":{"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"},"699a5434-cf3e-4589-8e11-18b7fedc795c":{"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":{"4b99804a-d663-411a-b45c-4d136ce76a72":{"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":{"8ebb4976-baf3-411c-8a1c-cd4d2c55015e":{"url":"http://localhost:3003/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":"Build batch transaction - Houdini documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-07T01:27:46.513Z","originalFileLocation":"api-reference/bundler-evm/build-batch-transaction.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=\"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.\">\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=\"Build batch transaction - Houdini documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Houdini documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://houdini.mintlify.app/_mintlify/api/og/v2?division=Bundler+EVM\u0026amp;title=Build+batch+transaction\u0026amp;description=Funds+every+order+in+a+multi-exchange+with+one+ERC-4337+UserOperation+instead+of+paying+each+deposit+address.\u0026amp;theme=9ee3d943f07b0e7ca37035be\u0026amp;signature=a549dbf20eae65bb668ead6b0194f962828d296bc17e6f7f80c5aa6c0d7b60c4\">\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=\"Build batch transaction - Houdini documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://houdini.mintlify.app/_mintlify/api/og/v2?division=Bundler+EVM\u0026amp;title=Build+batch+transaction\u0026amp;description=Funds+every+order+in+a+multi-exchange+with+one+ERC-4337+UserOperation+instead+of+paying+each+deposit+address.\u0026amp;theme=9ee3d943f07b0e7ca37035be\u0026amp;signature=a549dbf20eae65bb668ead6b0194f962828d296bc17e6f7f80c5aa6c0d7b60c4\">\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=\"#A955F7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction\">\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/build-batch-transaction.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.houdiniswap.com/#organization\",\"name\":\"Houdini documentation\",\"url\":\"https://docs.houdiniswap.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/houdini/1qxWMAnpbp51-Yh3/logo/wordmark-black.svg?fit=max\u0026auto=format\u0026n=1qxWMAnpbp51-Yh3\u0026q=85\u0026s=835e11b4170923b979bdf1ba4cb302b8\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.houdiniswap.com#website\",\"name\":\"Houdini documentation\",\"url\":\"https://docs.houdiniswap.com\",\"publisher\":{\"@id\":\"https://docs.houdiniswap.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction#webpage\",\"url\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction\",\"name\":\"Build batch transaction\",\"description\":\"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.\",\"dateModified\":\"2026-10-07T01:27:46.513Z\",\"isPartOf\":{\"@id\":\"https://docs.houdiniswap.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Multi-Exchange\",\"item\":\"https://docs.houdiniswap.com/api-reference/multi-exchange/get-tokens\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build batch transaction\",\"item\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction#apireference\",\"headline\":\"Build batch transaction\",\"name\":\"Build batch transaction\",\"description\":\"Funds every order in a multi-exchange with one ERC-4337 UserOperation instead of paying each deposit address.\",\"url\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction\",\"mainEntityOfPage\":{\"@id\":\"https://docs.houdiniswap.com/api-reference/bundler-evm/build-batch-transaction#webpage\"},\"dateModified\":\"2026-10-07T01:27:46.513Z\",\"publisher\":{\"@id\":\"https://docs.houdiniswap.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.houdiniswap.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Houdini documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Houdini documentation","nav":{"global":null,"tabs":[{"tab":"Overview","pages":[{"title":"Overview","href":"/overview/getting-started/what-is-houdini"}]},{"tab":"Guides","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":"Multi-Exchange","pages":[{"title":"Get tokens","openapi":"GET /tokens","href":"/api-reference/multi-exchange/get-tokens"},{"title":"Get multi quotes","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /quotes/multi","href":"/api-reference/multi-exchange/get-multi-quotes"},{"title":"Create multi exchange","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json post /exchanges/multi","href":"/api-reference/multi-exchange/create-multi-exchange"},{"title":"Get batch status","deprecated":null,"version":null,"openapi":"https://api-partner.houdiniswap.com/v2/openapi.json get /exchanges/multi/{multiId}","href":"/api-reference/multi-exchange/get-batch-status"},{"group":"Bundler SOL","pages":[{"title":"Get batch transaction","description":"Returns one Solana transaction that pays every deposit address in the group.","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","description":"Sends the batch on-chain, using the signatures from the user's wallet.\n\n- sign the `userOpHash` of each batch from [Build batch transaction](/api-reference/bundler-evm/build-batch-transaction), and send them in the same order\n- most groups fit in one batch, so usually one signature\n- fund the smart account first, using `txData` from the build response. For an ERC-20 source `txData.to` is the token contract, not the smart account\n- 404 means nothing is awaiting submission — either never built, or already submitted. Check [Get batch status](/api-reference/multi-exchange/get-batch-status).","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","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","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"}]}]},"title":"Build batch transaction - Houdini documentation","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","Page-7TwLLapg.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js","Markdown-DKsLa3wy.js","clsx-CefdjKz2.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BaREnp3o.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-sgx_0XzF.js"]}