every order must send the same token — all the chain’s native coin, or all the same ERC-20. Mixing them is rejected
supported on Ethereum, Base and BNB Smart Chain; other EVM chains are rejected
if depositNeeded is not "0", fund the smart account first. Native coin: send value to to. ERC-20: to is the token contract — send a transfer of tokenAmount to the smart account, which is the recipient inside data. Never send tokens to to itself
after funding confirms, build again and use the new userOpHash. For an ERC-20 source, the hash from before funding cannot be submitted
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","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/build-batch-transaction","slug":"/api-reference/bundler-evm/build-batch-transaction","pageMetadata":{"title":"Build batch transaction","description":"Funds every order in a Split 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 Split 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`,_jsxs(_components.li,{children:[`if `,_jsx(_components.code,{children:`depositNeeded`}),` is not `,_jsx(_components.code,{children:`\"0\"`}),`, fund the smart account first. Native coin: send `,_jsx(_components.code,{children:`value`}),` to `,_jsx(_components.code,{children:`to`}),`. ERC-20: `,_jsx(_components.code,{children:`to`}),` is the token contract — send a `,_jsx(_components.code,{children:`transfer`}),` of `,_jsx(_components.code,{children:`tokenAmount`}),` to the smart account, which is the recipient inside `,_jsx(_components.code,{children:`data`}),`. Never send tokens to `,_jsx(_components.code,{children:`to`}),` itself`]}),`\n`,_jsxs(_components.li,{children:[`after funding confirms, build again and use the new `,_jsx(_components.code,{children:`userOpHash`}),`. For an ERC-20 source, the hash from before funding cannot be submitted`]}),`\n`,_jsxs(_components.li,{children:[`sign `,_jsx(_components.code,{children:`userOpHash`}),` with the `,_jsx(_components.code,{children:`sender`}),` wallet, then call `,_jsx(_components.a,{href:`/api-reference/bundler-evm/submit-signed-transaction`,children:`Submit signed transaction`}),` within 10 minutes`]}),`\n`,_jsxs(_components.li,{children:[`up to 50 orders, funded in one transaction; a larger group is rejected — still handle every entry in `,_jsx(_components.code,{children:`transactions`})]}),`\n`,_jsx(_components.li,{children:`rejected while any order is still initializing, with those orders listed — wait until every order has a deposit address, then build again`}),`\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/split/get-tokens`,children:`Get tokens`}),` and `,_jsx(_components.code,{children:`hasBundler=true`}),`. See the `,_jsx(_components.a,{href:`/developer-hub/swap-flows/split`,children:`Split 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 Split 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":"34c4c3cd-9dc4-4f0e-9be7-16d3c0d794ad","401":"0d1f0c07-c8fe-4846-8cb7-60adb99dff9c","402":"1bf81bc9-3480-4983-9aef-ee9d7b6faf8c","403":"8d44a7fe-b21f-4447-aedd-156cdcada368","404":"abbd5f2f-3540-4a0e-b55f-fb71140f5c5b","409":"a73a60f9-fdd8-4ba5-b413-de4d1bcb7b8b","422":"6787818d-d7e7-4361-869f-15275a678b6a","429":"84d16777-1823-48bf-bf15-8934ccd2e940","500":"47296985-2091-4234-a0f6-2ef73506e888"},"description":"Funds every order in a Split with one ERC-4337 UserOperation instead of paying each deposit address.","summary":"Build batch transaction","tags":["Bundler EVM"],"security":["da212a91-70d3-41f5-a706-f741209b1dee"],"parameters":["76c625a7-6e66-40c4-ab59-7961c57636fc"],"requestBody":"ddc4edf7-3c93-4c35-93c0-eb3bbee922fd","method":"post","type":"path","servers":["8dcc9605-3ae8-4724-b409-35be2c99d96f"],"path":"/exchanges/multi/{multiId}/tx/build","baseUrlOptions":["https://api-partner.houdiniswap.com/v2"],"title":"Build batch transaction","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"76c625a7-6e66-40c4-ab59-7961c57636fc":{"description":"The Split group ID","in":"path","name":"multiId","required":true,"schema":{"type":"string","maxLength":64,"isRequired":true,"description":"The Split 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":{"34c4c3cd-9dc4-4f0e-9be7-16d3c0d794ad":{"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 divided 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"},"0d1f0c07-c8fe-4846-8cb7-60adb99dff9c":{"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"},"1bf81bc9-3480-4983-9aef-ee9d7b6faf8c":{"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"},"8d44a7fe-b21f-4447-aedd-156cdcada368":{"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"},"abbd5f2f-3540-4a0e-b55f-fb71140f5c5b":{"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"},"a73a60f9-fdd8-4ba5-b413-de4d1bcb7b8b":{"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"},"6787818d-d7e7-4361-869f-15275a678b6a":{"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"},"84d16777-1823-48bf-bf15-8934ccd2e940":{"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"},"47296985-2091-4234-a0f6-2ef73506e888":{"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":{"da212a91-70d3-41f5-a706-f741209b1dee":{"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":"Build batch transaction - Houdini documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-11T04:50:34.922Z","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 Split 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 Split 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.houdini.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.site/_mintlify/api/og/v2?division=Bundler+EVM\u0026amp;title=Build+batch+transaction\u0026amp;description=Funds+every+order+in+a+Split+with+one+ERC-4337+UserOperation+instead+of+paying+each+deposit+address.\u0026amp;theme=86a65e009c286e14b5c98004\u0026amp;signature=7b0b7d3051d7bd5c3670319cda35cce8ee38bb96897943e290cc1aff621d0625\">\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 Split with one ERC-4337 UserOperation instead of paying each deposit address.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://houdini.mintlify.site/_mintlify/api/og/v2?division=Bundler+EVM\u0026amp;title=Build+batch+transaction\u0026amp;description=Funds+every+order+in+a+Split+with+one+ERC-4337+UserOperation+instead+of+paying+each+deposit+address.\u0026amp;theme=86a65e009c286e14b5c98004\u0026amp;signature=7b0b7d3051d7bd5c3670319cda35cce8ee38bb96897943e290cc1aff621d0625\">\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/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.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/build-batch-transaction#webpage\",\"url\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction\",\"name\":\"Build batch transaction\",\"description\":\"Funds every order in a Split with one ERC-4337 UserOperation instead of paying each deposit address.\",\"dateModified\":\"2026-11-11T04:50:34.922Z\",\"isPartOf\":{\"@id\":\"https://docs.houdini.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Split\",\"item\":\"https://docs.houdini.com/api-reference/split/get-tokens\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build batch transaction\",\"item\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction#apireference\",\"headline\":\"Build batch transaction\",\"name\":\"Build batch transaction\",\"description\":\"Funds every order in a Split with one ERC-4337 UserOperation instead of paying each deposit address.\",\"url\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction\",\"mainEntityOfPage\":{\"@id\":\"https://docs.houdini.com/api-reference/bundler-evm/build-batch-transaction#webpage\"},\"dateModified\":\"2026-11-11T04:50:34.922Z\",\"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/build-batch-transaction.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","description":"Returns the Solana transactions that pay 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/split/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"}]}]},"basePath":"","title":"Build batch transaction - 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"]}