Process multiple transfers in a single request. Transfers are executed sequentially — use this instead of sending many parallel single-transfer requests.
Each transfer in the array supports the same parameters as the single transfer endpoint.
Best-effort (default): omit atomic or set atomic: false. Results are returned per-transfer; a failure in one item does not stop the others.
Atomic: set atomic: true when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with failureCount: 0 and atomic: true.
Retry an aborted atomic batch with new per-item idempotencyKey values (and a new batch idempotencyKey if you sent one). Replaying the same keys returns the stored abort and does not pay again.
Why batch? Sending 50+ parallel requests to /accounts/transfer causes Firestore transaction contention on the source wallet, resulting in INTERNAL_ERROR failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call.
Limits: Maximum 200 transfers per batch.
Idempotency and evidence: Every transfer requires its own idempotencyKey. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SideShift","description":"API documentation for SideShift — campaign operations, embedded payments, and social data.","colors":{"primary":"#2E6FE0","light":"#3C83F9","dark":"#2E6FE0"},"logo":{"light":"https://mintcdn.com/sideshift/oTyWBbQpawmh0yna/logo/light.svg?fit=max\u0026auto=format\u0026n=oTyWBbQpawmh0yna\u0026q=85\u0026s=067b5f4d28c1d362dd1035d42fd4cf61","dark":"https://mintcdn.com/sideshift/oTyWBbQpawmh0yna/logo/light.svg?fit=max\u0026auto=format\u0026n=oTyWBbQpawmh0yna\u0026q=85\u0026s=067b5f4d28c1d362dd1035d42fd4cf61","href":"https://sideshift.app"},"favicon":"https://mintcdn.com/sideshift/oTyWBbQpawmh0yna/favicon.svg?fit=max\u0026auto=format\u0026n=oTyWBbQpawmh0yna\u0026q=85\u0026s=9a8515441d19975691d5531716a644ba","appearance":{"default":"light","strict":true},"background":{"color":{"light":"#FFFFFF"}},"navbar":{"links":[{"href":"https://app.sideshift.app","label":"Dashboard"}],"primary":{"type":"button","label":"Choose OAuth flow","href":"/authentication"}},"fonts":{"family":"Geist"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","codeblocks":"system","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"sideshift","hasAudioNarration":false,"actualSubdomain":"sideshift","customDomains":["docs.sideshift.app"],"gitSource":{"type":"github","owner":"sideshiftapp","repo":"sideshift-monorepo","deployBranch":"main","contentDirectory":"docs-site","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aefd72dd5518ba96e474103","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Platform API","count":395},{"language":"default","tag":"OAuth 2.1 \u0026 MCP","count":351},{"language":"default","tag":"Content \u0026 Analytics","count":112},{"language":"default","tag":"Reference","count":109},{"language":"default","tag":"Scraper","count":77},{"language":"default","tag":"Payments \u0026 Finance","count":68},{"language":"default","tag":"Ads","count":58},{"language":"default","tag":"Company \u0026 Team","count":56},{"language":"default","tag":"Creators \u0026 Recruiting","count":52},{"language":"default","tag":"Connect","count":50}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"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":"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},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--ds-blue: #3c83f9;--ds-blue-light: #ebf2fe;--ds-blue-mid: #7eb4ff;--ds-text-primary: #202020;--ds-text-secondary: #707070;--ds-text-tertiary: #979a9b;--ds-surface: #ffffff;--ds-surface-secondary: #fafafa;--ds-surface-page: #f6f6f6;--ds-surface-muted: #7b818c0d;--ds-surface-inverse: #202020;--ds-border: #20202014;--ds-border-strong: #20202029;--ds-radius-sm: 8px;--ds-radius-md: 12px;--ds-radius-lg: 16px;--ds-shadow-xs: 0px 1px 2px 0px #6865650f;--ds-shadow-sm: 0px 2px 4px -1px #01416314;--ds-shadow-md: 0px 4px 8px -2px #0141631a, 0px 2px 4px -1px #0141630f;--ds-shadow-lg: 0px 12px 24px -4px #0141631a, 0px 4px 8px -2px #0141630a;--ds-shadow-card: 0px 2px 4px -1px #01416314, 0px 0px 0px 1px #20202014;--ds-tracking-tight: -0.02em;--ds-heading-weight: 550;--ds-body-weight: 350;--ds-button-weight: 600}#navbar>div:first-child{background-color:var(--ds-surface)!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;transition:none!important;border-bottom-color:var(--ds-border)!important}.sidebar-group-header{border-top:1px solid var(--ds-border);padding-top:1rem;margin-right:0.9rem}ul.sidebar-group:first-child{border-top:1px solid var(--ds-border);padding-top:1rem;margin-right:0.9rem}ul.sidebar-group:has(>li>ul>li>button)>li>button{font-weight:600;color:var(--ds-text-primary)}ul.sidebar-group>li:has(>ul>li>button)+li:has(>ul>li>button){margin-top:1.1rem;padding-top:1.1rem;border-top:1px solid var(--ds-border);margin-right:0.9rem}ul.sidebar-group>li:has(>ul>li>button)>ul{position:relative}ul.sidebar-group>li:has(>ul>li>button)>ul::before{content:\"\";position:absolute;left:8px;top:0.15rem;bottom:0.15rem;width:1px;border-radius:1px;background:var(--ds-border-strong);transition:background-color 0.18s ease}ul.sidebar-group>li:has(>ul>li>button)>ul:has([data-active-nav-item=\"true\"])::before{background:var(--ds-blue)}ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)){position:relative}ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button))::before{content:\"\";position:absolute;left:0;top:0.15rem;bottom:0.15rem;width:1px;border-radius:1px;background:var(--ds-border-strong);transition:background-color 0.18s ease}ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)):has([data-active-nav-item=\"true\"])::before{background:var(--ds-blue)}.sidebar-group-header+ul.sidebar-group:not(:has(button)){position:relative}.sidebar-group-header+ul.sidebar-group:not(:has(button))::before{content:\"\";position:absolute;left:0;top:0.15rem;bottom:0.15rem;width:1px;border-radius:1px;background:var(--ds-border-strong);transition:background-color 0.18s ease}.sidebar-group-header+ul.sidebar-group:not(:has(button)):has([data-active-nav-item=\"true\"])::before{background:var(--ds-blue)}#navigation-items>ul.sidebar-group:not(:has(li+li)){position:relative;padding-top:0;margin-top:16px}#navigation-items>ul.sidebar-group:not(:has(li+li))::before{content:\"\";position:absolute;left:0;top:0.15rem;bottom:0.15rem;width:1px;border-radius:1px;background:var(--ds-border-strong);transition:background-color 0.18s ease}#navigation-items>ul.sidebar-group:not(:has(li+li)):has([data-active-nav-item=\"true\"])::before{background:var(--ds-blue)}#navigation-items>ul.sidebar-group:not(:has(li+li)) li:has(>a:hover)::after{content:\"\";position:absolute;top:1px;bottom:1px;left:-1px;width:3px;border-radius:3px;background:var(--ds-blue);pointer-events:none}ul.sidebar-group li{position:relative}ul.sidebar-group>li:has(>ul>li>button)>ul li:has(>button:hover)::after,ul.sidebar-group>li:has(>ul>li>button)>ul li:has(>a:hover)::after,ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)) li:has(>button:hover)::after,ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)) li:has(>a:hover)::after,.sidebar-group-header+ul.sidebar-group:not(:has(button)) li:has(>a:hover)::after{content:\"\";position:absolute;top:1px;bottom:1px;width:3px;border-radius:3px;background:var(--ds-blue);pointer-events:none}ul.sidebar-group>li:has(>ul>li>button)>ul li:has(>button:hover)::after,ul.sidebar-group>li:has(>ul>li>button)>ul li:has(>a:hover)::after{left:7px}ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)) li:has(>button:hover)::after,ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)) li:has(>a:hover)::after,.sidebar-group-header+ul.sidebar-group:not(:has(button)) li:has(>a:hover)::after{left:-1px}ul.sidebar-group>li:has(>ul>li>button):has(>button:hover)>ul::before{background:var(--ds-blue);width:3px;left:6.5px}ul.sidebar-group li:has(>a[aria-current=\"page\"])>a{background-color:transparent!important;position:relative}ul.sidebar-group li:has(>a[aria-current=\"page\"])::before{content:\"\";position:absolute;top:0;bottom:0;left:0;right:0;border-radius:12px;background:rgb(60 131 249 / 0.1);pointer-events:none}ul.sidebar-group>li:has(>ul>li>button)>ul li:has(>a[aria-current=\"page\"])::before{left:12px}ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)) li:has(>a[aria-current=\"page\"])::before{left:4px}ul.sidebar-group>li:has(>ul>li>button)>button:hover,ul.sidebar-group>li:has(>ul>li>button)>ul li>button:hover,ul.sidebar-group>li:has(>ul>li>button)>ul li>a:not([aria-current=\"page\"]):hover,ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)) li>button:hover,ul.sidebar-group:has(>li>button):not(:has(>li>ul>li>button)) li>a:not([aria-current=\"page\"]):hover{background-color:transparent!important}li[id$=\"/depositpending\"] .method-nav-pill>span[class*=\"bg-blue-400\"],li[id$=\"/depositconfirmed\"] .method-nav-pill>span[class*=\"bg-blue-400\"],li[id$=\"/depositfailed\"] .method-nav-pill>span[class*=\"bg-blue-400\"],li[id$=\"/transfercompleted\"] .method-nav-pill>span[class*=\"bg-blue-400\"],li[id$=\"/withdrawalcreated\"] .method-nav-pill>span[class*=\"bg-blue-400\"],li[id$=\"/withdrawalupdated\"] .method-nav-pill>span[class*=\"bg-blue-400\"],li[id$=\"/withdrawalcompleted\"] .method-nav-pill>span[class*=\"bg-blue-400\"],li[id$=\"/accountrisk_flagged\"] .method-nav-pill>span[class*=\"bg-blue-400\"]{background-color:rgb(167 139 250 / 0.22)!important;color:#6d28d9!important}li[id$=\"/depositpending\"] .method-nav-pill>span[class*=\"3064E3\"],li[id$=\"/depositconfirmed\"] .method-nav-pill>span[class*=\"3064E3\"],li[id$=\"/depositfailed\"] .method-nav-pill>span[class*=\"3064E3\"],li[id$=\"/transfercompleted\"] .method-nav-pill>span[class*=\"3064E3\"],li[id$=\"/withdrawalcreated\"] .method-nav-pill>span[class*=\"3064E3\"],li[id$=\"/withdrawalupdated\"] .method-nav-pill>span[class*=\"3064E3\"],li[id$=\"/withdrawalcompleted\"] .method-nav-pill>span[class*=\"3064E3\"],li[id$=\"/accountrisk_flagged\"] .method-nav-pill>span[class*=\"3064E3\"]{background-color:#6d28d9!important;color:#ffffff!important}html:has(li[id$=\"/depositpending\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"],html:has(li[id$=\"/depositconfirmed\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"],html:has(li[id$=\"/depositfailed\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"],html:has(li[id$=\"/transfercompleted\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"],html:has(li[id$=\"/withdrawalcreated\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"],html:has(li[id$=\"/withdrawalupdated\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"],html:has(li[id$=\"/withdrawalcompleted\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"],html:has(li[id$=\"/accountrisk_flagged\"][data-active-nav-item=\"true\"]) .method-pill[class*=\"bg-blue-400\"]{background-color:rgb(167 139 250 / 0.22)!important;color:#6d28d9!important}.prose table,main table{display:block;width:100%;overflow-x:auto}.ss-page{max-width:72rem;margin:0 auto;padding:4.5rem 2rem 6rem}@media (max-width: 640px){.ss-page{padding:2.5rem 1.15rem 3.5rem}}.ss-hero{padding:0 0 3.5rem}.ss-hero__eyebrow{display:inline-flex;align-items:center;gap:0.45rem;font-size:12px;font-weight:var(--ds-button-weight);letter-spacing:0.055em;text-transform:uppercase;color:var(--ds-blue);background:var(--ds-blue-light);border-radius:9999px;padding:0.32rem 0.75rem;margin-bottom:1.35rem}.ss-hero__eyebrow::before{content:\"\";width:6px;height:6px;border-radius:50%;background:var(--ds-blue)}.ss-hero h1{font-size:clamp(2.5rem, 5vw, 3.6rem);line-height:1.05;letter-spacing:-0.03em;font-weight:700;margin:0 0 1.1rem;color:var(--ds-text-primary)}.ss-hero h1 .ss-accent{color:var(--ds-blue)}.ss-hero p{font-size:1.1875rem;font-weight:var(--ds-body-weight);line-height:1.6;color:var(--ds-text-secondary);max-width:44rem;margin:0}.ss-hero p+.ss-hero__sub{font-size:1.0625rem;margin-top:1rem;color:var(--ds-text-tertiary)}.ss-rows{display:grid;grid-template-columns:repeat(3, minmax(0, 1fr));gap:1rem;margin:0 0 4rem;align-items:stretch}@media (max-width: 1080px){.ss-rows{grid-template-columns:repeat(2, minmax(0, 1fr))}}@media (max-width: 700px){.ss-rows{grid-template-columns:minmax(0, 1fr)}}.ss-row{display:flex;flex-direction:column;padding:1.6rem;border-radius:var(--ds-radius-lg);background:var(--ds-surface);box-shadow:var(--ds-shadow-card);text-decoration:none!important;transition:transform 0.16s ease, box-shadow 0.16s ease}.ss-row:hover{transform:translateY(-2px);box-shadow:var(--ds-shadow-lg), 0px 0px 0px 1px var(--ds-border-strong)}.ss-row__icon{display:block;width:4rem;height:4rem;flex:none;margin:0 0 1rem}.ss-row__title{font-size:1.25rem;font-weight:var(--ds-heading-weight);letter-spacing:var(--ds-tracking-tight);color:var(--ds-text-primary);margin:0 0 0.45rem}.ss-row__desc{font-size:0.9375rem;font-weight:var(--ds-body-weight);line-height:1.55;color:var(--ds-text-secondary);margin:0 0 1.1rem}.ss-row__aside{margin-top:auto;border-top:1px solid var(--ds-border);padding-top:0.95rem;display:flex;flex-direction:column;gap:0.85rem}.ss-row__pick{font-size:13px;line-height:1.5;font-weight:var(--ds-body-weight);color:var(--ds-text-secondary);margin:0}.ss-row__pick strong{color:var(--ds-text-primary);font-weight:600}.ss-tile__icon{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:var(--ds-radius-md);background:var(--ds-blue-light);color:var(--ds-blue)}.ss-tile__badge{display:inline-block;font-size:12px;font-weight:var(--ds-button-weight);letter-spacing:0.04em;text-transform:uppercase;padding:0.25rem 0.6rem;border-radius:9999px;white-space:nowrap;color:var(--ds-blue);background:var(--ds-blue-light)}.ss-tile__badge--muted{color:var(--ds-text-secondary);background:var(--ds-surface-muted);box-shadow:inset 0 0 0 1px var(--ds-border)}.ss-tile__title{font-size:1.28rem;font-weight:var(--ds-heading-weight);letter-spacing:var(--ds-tracking-tight);color:var(--ds-text-primary);margin:0 0 0.5rem}.ss-tile__desc{font-size:0.9375rem;font-weight:var(--ds-body-weight);line-height:1.58;color:var(--ds-text-secondary);margin:0 0 1.15rem}.ss-tile__list{list-style:none!important;padding:0!important;margin:0 0 1.35rem!important;display:flex;flex-wrap:wrap;gap:0.375rem}.ss-tile__list li{list-style:none!important;font-size:13px;font-weight:500;color:var(--ds-text-secondary);background:var(--ds-surface-muted);box-shadow:inset 0 0 0 1px var(--ds-border);border-radius:var(--ds-radius-sm);padding:0.2rem 0.5rem!important;margin:0!important}.ss-tile__list li::marker,.ss-tile__list li::before{content:none!important;display:none!important}.ss-tile__foot{display:flex;align-items:center;gap:0.4rem;font-size:14px;font-weight:var(--ds-button-weight);color:var(--ds-blue);white-space:nowrap}.ss-tile__foot svg{transition:transform 0.16s ease}.ss-row:hover .ss-tile__foot svg{transform:translateX(3px)}.ss-jump{display:grid;grid-template-columns:repeat(3, minmax(0, 1fr));gap:0.875rem}@media (max-width: 860px){.ss-jump{grid-template-columns:minmax(0, 1fr)}}.ss-jump__card{display:flex;align-items:center;gap:0.85rem;padding:1rem 1.1rem;border-radius:var(--ds-radius-md);background:var(--ds-surface);box-shadow:var(--ds-shadow-card);text-decoration:none!important;transition:background-color 0.16s ease, box-shadow 0.16s ease}.ss-jump__card:hover{background:var(--ds-surface-secondary);box-shadow:var(--ds-shadow-card), inset 0px 0px 0px 1px var(--ds-border-strong)}.ss-jump__icon{width:2.5rem;height:2.5rem;flex:none;margin:0}.ss-jump__text{display:flex;flex-direction:column;gap:0.15rem;min-width:0}.ss-jump__title{font-size:0.9375rem;font-weight:600;letter-spacing:var(--ds-tracking-tight);color:var(--ds-text-primary)}.ss-jump__desc{font-size:13px;font-weight:var(--ds-body-weight);line-height:1.45;color:var(--ds-text-secondary)}.ss-section-label{font-size:12px;font-weight:var(--ds-button-weight);letter-spacing:0.075em;text-transform:uppercase;color:var(--ds-text-tertiary);margin:0 0 1rem}.ss-fork{display:grid;grid-template-columns:repeat(2, minmax(0, 1fr));gap:0.875rem;margin:0 0 2rem}@media (max-width: 720px){.ss-fork{grid-template-columns:minmax(0, 1fr)}}.ss-fork__card{display:flex;flex-direction:column;padding:1.25rem;border-radius:var(--ds-radius-md);background:var(--ds-surface);box-shadow:var(--ds-shadow-card);text-decoration:none!important;transition:transform 0.16s ease, box-shadow 0.16s ease}.ss-fork__card:hover{transform:translateY(-2px);box-shadow:var(--ds-shadow-md), 0px 0px 0px 1px var(--ds-border-strong)}.ss-fork__card--recommended{background:var(--ds-blue-light);box-shadow:0px 0px 0px 1px #3c83f92e}.ss-fork__card--recommended:hover{box-shadow:var(--ds-shadow-md), 0px 0px 0px 1px #3c83f94d}.ss-fork__card--recommended .ss-tile__badge{background:var(--ds-surface);color:var(--ds-blue);box-shadow:inset 0 0 0 1px #3c83f92e}.ss-fork__head{display:flex;align-items:center;gap:0.6rem;flex-wrap:wrap;margin-bottom:0.55rem}.ss-fork__name{font-size:1.05rem;font-weight:var(--ds-heading-weight);letter-spacing:var(--ds-tracking-tight);color:var(--ds-text-primary);margin:0}.ss-fork__desc{font-size:0.9rem;font-weight:var(--ds-body-weight);line-height:1.55;color:var(--ds-text-secondary);margin:0 0 0.9rem}.ss-fork__meta{margin-top:auto;font-size:12px;color:var(--ds-text-tertiary);font-family:ui-monospace, SFMono-Regular, Menlo, monospace;border-top:1px solid var(--ds-border);padding-top:0.7rem}:not(pre)>code{padding-left:4px;padding-right:4px;margin-left:-2px;margin-right:-2px}.shiki,.shiki span{white-space:pre}.ss-credit{display:flex;width:fit-content;align-items:center;gap:0.45rem;margin-top:4px;padding:0.45rem 0.8rem;border:1px solid var(--ds-blue-mid);border-radius:var(--ds-radius-sm);background:var(--ds-blue-light);font-size:14px;font-weight:var(--ds-body-weight);line-height:1;color:var(--ds-blue);white-space:nowrap}.ss-credit+*{margin-top:12px!important}.ss-credit::before{content:\"\";flex:none;width:15px;height:15px;background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%233c83f9' stroke-width='1.4' stroke-linecap='round'%3E%3Ccircle cx='8' cy='8' r='6.1'/%3E%3Cpath d='M8 4.7v6.6M6.3 6.5h3.4M6.3 9.5h3.4'/%3E%3C/svg%3E\") center / contain no-repeat}.ss-credit strong{color:var(--ds-text-primary);font-weight:var(--ds-button-weight)}#sidebar{width:var(--ss-sidebar-w, 18rem)!important}#sidebar{border-right:1px solid var(--ds-border)}#sidebar>div{right:10px!important}#sidebar [class*=\"scroll-area-fade-size\"]{padding-right:22px}.ss-sidebar-handle{position:relative;flex:none;align-self:stretch;width:9px;margin-left:-4px;margin-right:-5px;z-index:30;cursor:col-resize;background:transparent;touch-action:none}.ss-sidebar-handle::after{content:\"\";position:absolute;top:0;bottom:0;left:4px;width:1px;background:transparent;transition:background-color 0.12s ease, width 0.12s ease, left 0.12s ease}.ss-sidebar-handle:hover::after{left:3px;width:3px;background:var(--ds-blue-mid)}.ss-sidebar-handle:focus-visible{outline:none}.ss-sidebar-handle:focus-visible::after,html.ss-resizing .ss-sidebar-handle::after{left:3px;width:3px;background:var(--ds-blue)}html.ss-resizing,html.ss-resizing *{cursor:col-resize!important;user-select:none!important}html[data-ss-sidebar-collapsed=\"true\"] #sidebar{overflow:hidden}html[data-ss-sidebar-collapsed=\"true\"] #sidebar>*{visibility:hidden}@media (max-width: 1023px){.ss-sidebar-handle{display:none}#sidebar{width:auto!important;border-right:0}}#sidebar ul.sidebar-group :is(a,button)>div>div{flex-wrap:nowrap}#sidebar ul.sidebar-group :is(a,button) span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:normal;hyphens:none}#sidebar ul.sidebar-group :is(a,button){align-items:center}.ss-launch{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin:1.5rem 0;padding:1.1rem 1.25rem;border-radius:var(--ds-radius-md);background:var(--ds-surface);box-shadow:var(--ds-shadow-card);text-decoration:none!important;transition:background-color 0.16s ease, box-shadow 0.16s ease}.ss-launch:hover{background:var(--ds-surface-secondary);box-shadow:var(--ds-shadow-card), inset 0px 0px 0px 1px var(--ds-border-strong)}.ss-launch__body{display:flex;flex-direction:column;gap:0.15rem;min-width:0}.ss-launch__title{font-size:0.95rem;font-weight:var(--ds-button-weight);letter-spacing:var(--ds-tracking-tight);color:var(--ds-text-primary)}.ss-launch__sub{font-size:0.825rem;color:var(--ds-text-secondary)}.ss-launch__arrow{flex:none;font-size:1.05rem;line-height:1;color:var(--ds-blue);transition:transform 0.16s ease}.ss-launch:hover .ss-launch__arrow{transform:translate(2px, -2px)}.ss-modal{position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;padding:clamp(0.75rem, 3vw, 2.5rem);background:#20202066;animation:ss-modal-in 0.16s ease}.ss-modal[hidden]{display:none}.ss-modal[data-instant=\"true\"]{animation:none}@keyframes ss-modal-in{from{opacity:0}to{opacity:1}}.ss-modal__panel{display:flex;flex-direction:column;width:min(1240px, 100%);height:min(920px, 100%);overflow:hidden;border-radius:var(--ds-radius-lg);background:var(--ds-surface);box-shadow:var(--ds-shadow-lg), 0px 0px 0px 1px var(--ds-border-strong)}.ss-modal__bar{display:flex;flex:none;align-items:center;justify-content:space-between;gap:1rem;padding:0.7rem 0.9rem 0.7rem 1.1rem;border-bottom:1px solid var(--ds-border);background:var(--ds-surface)}.ss-modal__title{font-size:0.9rem;font-weight:var(--ds-button-weight);letter-spacing:var(--ds-tracking-tight);color:var(--ds-text-primary)}.ss-modal__actions{display:flex;align-items:center;gap:0.6rem}.ss-modal__link{font-size:0.8rem;color:var(--ds-text-secondary);text-decoration:none!important}.ss-modal__link:hover{color:var(--ds-text-primary)}.ss-modal__close{display:flex;align-items:center;justify-content:center;width:1.9rem;height:1.9rem;border:0;border-radius:var(--ds-radius-sm);background:transparent;font-size:1.3rem;line-height:1;color:var(--ds-text-secondary);cursor:pointer;transition:background-color 0.14s ease, color 0.14s ease}.ss-modal__close:hover{background:var(--ds-surface-secondary);color:var(--ds-text-primary)}.ss-modal__frame{flex:1 1 auto;width:100%;min-height:0;border:0;display:block}html.ss-modal-open,html.ss-modal-open body{overflow:hidden}html.ss-modal-open body{padding-right:var(--ss-modal-gap, 0px)}@media (prefers-reduced-motion: reduce){.ss-modal{animation:none}}.ss-modal__fallback{display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;gap:0.9rem;padding:2rem;text-align:center}.ss-modal__fallback[hidden]{display:none}.ss-modal__fallback__text{margin:0;max-width:34ch;font-size:0.9rem;color:var(--ds-text-secondary)}.ss-modal__fallback__cta{padding:0.55rem 1.1rem;border-radius:var(--ds-radius-sm);background:var(--ds-blue);color:#fff!important;font-size:0.875rem;font-weight:var(--ds-button-weight);text-decoration:none!important}"}],"page":{"pagePath":"connect/reference/transfers/batch-transfer","slug":"/connect/reference/transfers/batch-transfer","pageMetadata":{"title":"Batch transfer","description":"Process multiple transfers in a single request. Transfers are executed **sequentially** — use this instead of sending many parallel single-transfer requests.\n\nEach transfer in the array supports the same parameters as the single transfer endpoint.\n\n**Best-effort (default):** omit `atomic` or set `atomic: false`. Results are returned per-transfer; a failure in one item does not stop the others.\n\n**Atomic:** set `atomic: true` when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with `failureCount: 0` and `atomic: true`.\n\nRetry an aborted atomic batch with **new** per-item `idempotencyKey` values (and a new batch `idempotencyKey` if you sent one). Replaying the same keys returns the stored abort and does not pay again.\n\n**Why batch?** Sending 50+ parallel requests to `/accounts/transfer` causes Firestore transaction contention on the source wallet, resulting in `INTERNAL_ERROR` failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call.\n\n**Limits:** Maximum 200 transfers per batch.\n\n**Idempotency and evidence:** Every transfer requires its own `idempotencyKey`. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\n","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/transfer/batch","href":"/connect/reference/transfers/batch-transfer","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Process multiple transfers in a single request. Transfers are executed \", _jsx(_components.strong, {\n children: \"sequentially\"\n }), \" — use this instead of sending many parallel single-transfer requests.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Each transfer in the array supports the same parameters as the single transfer endpoint.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Best-effort (default):\"\n }), \" omit \", _jsx(_components.code, {\n children: \"atomic\"\n }), \" or set \", _jsx(_components.code, {\n children: \"atomic: false\"\n }), \". Results are returned per-transfer; a failure in one item does not stop the others.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Atomic:\"\n }), \" set \", _jsx(_components.code, {\n children: \"atomic: true\"\n }), \" when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with \", _jsx(_components.code, {\n children: \"failureCount: 0\"\n }), \" and \", _jsx(_components.code, {\n children: \"atomic: true\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Retry an aborted atomic batch with \", _jsx(_components.strong, {\n children: \"new\"\n }), \" per-item \", _jsx(_components.code, {\n children: \"idempotencyKey\"\n }), \" values (and a new batch \", _jsx(_components.code, {\n children: \"idempotencyKey\"\n }), \" if you sent one). Replaying the same keys returns the stored abort and does not pay again.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Why batch?\"\n }), \" Sending 50+ parallel requests to \", _jsx(_components.code, {\n children: \"/accounts/transfer\"\n }), \" causes Firestore transaction contention on the source wallet, resulting in \", _jsx(_components.code, {\n children: \"INTERNAL_ERROR\"\n }), \" failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Limits:\"\n }), \" Maximum 200 transfers per batch.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Idempotency and evidence:\"\n }), \" Every transfer requires its own \", _jsx(_components.code, {\n children: \"idempotencyKey\"\n }), \". Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Batch transfer","description":"Process multiple transfers in a single request. Transfers are executed **sequentially** — use this instead of sending many parallel single-transfer requests.\n\nEach transfer in the array supports the same parameters as the single transfer endpoint.\n\n**Best-effort (default):** omit `atomic` or set `atomic: false`. Results are returned per-transfer; a failure in one item does not stop the others.\n\n**Atomic:** set `atomic: true` when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with `failureCount: 0` and `atomic: true`.\n\nRetry an aborted atomic batch with **new** per-item `idempotencyKey` values (and a new batch `idempotencyKey` if you sent one). Replaying the same keys returns the stored abort and does not pay again.\n\n**Why batch?** Sending 50+ parallel requests to `/accounts/transfer` causes Firestore transaction contention on the source wallet, resulting in `INTERNAL_ERROR` failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call.\n\n**Limits:** Maximum 200 transfers per batch.\n\n**Idempotency and evidence:** Every transfer requires its own `idempotencyKey`. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\n","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/transfer/batch","href":"/connect/reference/transfers/batch-transfer","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/sideshift/87b877b70d161d1e/sidebar-state.js","/_mintlify/custom/sideshift/2e2d77d11acb5577/sidebar-resize.js","/_mintlify/custom/sideshift/ab0e397cf2c387df/playground-modal.js"],"openApiReferenceData":{"operation":{"tags":["Transfers"],"summary":"Batch transfer","operationId":"createBatchTransfer","description":"Process multiple transfers in a single request. Transfers are executed **sequentially** — use this instead of sending many parallel single-transfer requests.\n\nEach transfer in the array supports the same parameters as the single transfer endpoint.\n\n**Best-effort (default):** omit `atomic` or set `atomic: false`. Results are returned per-transfer; a failure in one item does not stop the others.\n\n**Atomic:** set `atomic: true` when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with `failureCount: 0` and `atomic: true`.\n\nRetry an aborted atomic batch with **new** per-item `idempotencyKey` values (and a new batch `idempotencyKey` if you sent one). Replaying the same keys returns the stored abort and does not pay again.\n\n**Why batch?** Sending 50+ parallel requests to `/accounts/transfer` causes Firestore transaction contention on the source wallet, resulting in `INTERNAL_ERROR` failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call.\n\n**Limits:** Maximum 200 transfers per batch.\n\n**Idempotency and evidence:** Every transfer requires its own `idempotencyKey`. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\n","requestBody":"a2edbcb0-660b-42a3-a576-6cf6a1a050ce","responses":{"200":"c0e53439-7c5a-4a8b-967b-9bedd812fe3c","400":"14f337c6-8153-4e81-84f8-922ed83e1944","409":"195b55a2-d893-4380-bdd8-ac3ca31e3213","429":"aa9dd371-c73b-446e-92fe-e213a6e25cf3"},"method":"post","type":"path","servers":["5f705a65-a17e-4362-8eca-1f2d43e1caa1"],"security":["3522e4bc-d90f-4dda-9017-ccbd326e93de"],"path":"/accounts/transfer/batch","baseUrlOptions":["https://app.sideshift.app/api/embed"],"title":"Batch transfer","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["transfers"],"properties":{"transfers":{"type":"array","maxItems":200,"items":{"type":"object","required":["amountCents","idempotencyKey"],"properties":{"amountCents":{"type":"integer","minimum":1,"description":"Amount in cents","isRequired":true,"uniqueKey":"transfers.items.[INDEX].amountCents","typeLabel":"integer"},"idempotencyKey":{"type":"string","description":"Unique key for safe retries","isRequired":true,"uniqueKey":"transfers.items.[INDEX].idempotencyKey","typeLabel":"string"},"fromAccountId":{"type":"string","description":"Source account (omit for company→user)","uniqueKey":"transfers.items.[INDEX].fromAccountId","typeLabel":"string"},"toAccountId":{"type":"string","description":"Destination account (omit for user→company)","uniqueKey":"transfers.items.[INDEX].toAccountId","typeLabel":"string"},"destinationBalance":{"type":"string","enum":["withdrawal","wallet"],"default":"withdrawal","description":"Settlement target for company→user and user→user transfers","uniqueKey":"transfers.items.[INDEX].destinationBalance","typeLabel":"enum\u003cstring>"},"metadata":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"transfers.items.[INDEX].metadata.additionalProperties","typeLabel":"string"},"description":"Required for live transfers. Include obligationType, obligationReference, description, and approvalReference; campaign transfers also need programId or contractId.","uniqueKey":"transfers.items.[INDEX].metadata","typeLabel":"object"}},"uniqueKey":"transfers.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"transfers","typeLabel":"object[]"},"atomic":{"type":"boolean","default":false,"description":"When true, the batch is all-or-nothing. Default false keeps best-effort per-item results.","uniqueKey":"atomic","typeLabel":"boolean"},"idempotencyKey":{"type":"string","minLength":8,"description":"Optional batch-level key for atomic retries. If omitted, SideShift derives one from the per-item keys.","uniqueKey":"idempotencyKey","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"payoutBatch":{"title":"payoutBatch","value":{"transfers":[{"toAccountId":"acct_user1","amountCents":5000,"idempotencyKey":"payout-user1-2026-04","metadata":{"obligationType":"campaign","obligationReference":"contract-user1","description":"Approved April payout for completed content","approvalReference":"approval-user1","programId":"campaign-april"}},{"toAccountId":"acct_user2","amountCents":7500,"idempotencyKey":"payout-user2-2026-04","metadata":{"obligationType":"campaign","obligationReference":"contract-user2","description":"Approved April payout for completed content","approvalReference":"approval-user2","programId":"campaign-april"}},{"toAccountId":"acct_user3","amountCents":3000,"idempotencyKey":"payout-user3-2026-04","metadata":{"obligationType":"campaign","obligationReference":"contract-user3","description":"Approved April payout for completed content","approvalReference":"approval-user3","programId":"campaign-april"}}]}},"atomicPayoutBatch":{"title":"atomicPayoutBatch","value":{"atomic":true,"idempotencyKey":"payroll-april-2026","transfers":[{"toAccountId":"acct_user1","amountCents":5000,"idempotencyKey":"payout-user1-2026-04","metadata":{"obligationType":"campaign","obligationReference":"contract-user1","description":"Approved April payout for completed content","approvalReference":"approval-user1","programId":"campaign-april"}},{"toAccountId":"acct_user2","amountCents":7500,"idempotencyKey":"payout-user2-2026-04","metadata":{"obligationType":"campaign","obligationReference":"contract-user2","description":"Approved April payout for completed content","approvalReference":"approval-user2","programId":"campaign-april"}}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"c0e53439-7c5a-4a8b-967b-9bedd812fe3c":{"description":"Batch completed. Best-effort batches may still contain per-item failures; atomic batches only return 200 when every item committed.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","uniqueKey":"success","typeLabel":"boolean"},"data":{"type":"object","properties":{"totalCount":{"type":"integer","description":"Number of transfers in the batch","uniqueKey":"data.totalCount","typeLabel":"integer"},"successCount":{"type":"integer","description":"Number of transfers that succeeded","uniqueKey":"data.successCount","typeLabel":"integer"},"failureCount":{"type":"integer","description":"Number of transfers that failed","uniqueKey":"data.failureCount","typeLabel":"integer"},"atomic":{"type":"boolean","description":"True when the request was processed as an all-or-nothing batch","uniqueKey":"data.atomic","typeLabel":"boolean"},"results":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","description":"Position in the original transfers array","uniqueKey":"data.results.items.[INDEX].index","typeLabel":"integer"},"success":{"type":"boolean","uniqueKey":"data.results.items.[INDEX].success","typeLabel":"boolean"},"data":{"type":"object","properties":{"transferId":{"type":"string","example":"txfr_abc123def456","uniqueKey":"data.results.items.[INDEX].data.transferId","typeLabel":"string"},"fromAccountId":{"type":"string","description":"Source account (your company ID for company→user transfers)","uniqueKey":"data.results.items.[INDEX].data.fromAccountId","typeLabel":"string"},"toAccountId":{"type":"string","description":"Destination account","uniqueKey":"data.results.items.[INDEX].data.toAccountId","typeLabel":"string"},"amountCents":{"type":"integer","description":"Amount in cents","example":5000,"uniqueKey":"data.results.items.[INDEX].data.amountCents","typeLabel":"integer"},"amountUsd":{"type":"number","format":"double","description":"Amount in USD","example":50,"uniqueKey":"data.results.items.[INDEX].data.amountUsd","typeLabel":"number\u003cdouble>"},"status":{"type":"string","enum":["completed","pending","failed"],"uniqueKey":"data.results.items.[INDEX].data.status","typeLabel":"enum\u003cstring>"},"direction":{"type":"string","enum":["company_to_user","user_to_company","user_to_user"],"uniqueKey":"data.results.items.[INDEX].data.direction","typeLabel":"enum\u003cstring>"},"destinationBalance":{"type":"string","enum":["wallet","withdrawal"],"description":"Where the transfer settled","uniqueKey":"data.results.items.[INDEX].data.destinationBalance","typeLabel":"enum\u003cstring>"},"paymentTransferId":{"oneOf":[{"type":"string","description":"Underlying payment provider transfer ID","uniqueKey":"data.results.items.[INDEX].data.paymentTransferId.oneOf.0","typeLabel":"string"},{"type":"null","description":"Underlying payment provider transfer ID","uniqueKey":"data.results.items.[INDEX].data.paymentTransferId.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.results.items.[INDEX].data.paymentTransferId","typeLabel":"string | null"},"idempotencyKey":{"oneOf":[{"type":"string","uniqueKey":"data.results.items.[INDEX].data.idempotencyKey.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"data.results.items.[INDEX].data.idempotencyKey.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.results.items.[INDEX].data.idempotencyKey","typeLabel":"string | null"},"metadata":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"data.results.items.[INDEX].data.metadata.oneOf.0.additionalProperties","typeLabel":"string"},"uniqueKey":"data.results.items.[INDEX].data.metadata.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"data.results.items.[INDEX].data.metadata.oneOf.1.additionalProperties","typeLabel":"string"},"uniqueKey":"data.results.items.[INDEX].data.metadata.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.results.items.[INDEX].data.metadata","typeLabel":"object | null"},"createdAt":{"type":"string","format":"date-time","uniqueKey":"data.results.items.[INDEX].data.createdAt","typeLabel":"string\u003cdate-time>"},"completedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"data.results.items.[INDEX].data.completedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"data.results.items.[INDEX].data.completedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.results.items.[INDEX].data.completedAt","typeLabel":"string\u003cdate-time> | null"},"failureReason":{"oneOf":[{"type":"string","description":"Reason for failure (only when status is `failed`)","uniqueKey":"data.results.items.[INDEX].data.failureReason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Reason for failure (only when status is `failed`)","uniqueKey":"data.results.items.[INDEX].data.failureReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.results.items.[INDEX].data.failureReason","typeLabel":"string | null"}},"uniqueKey":"data.results.items.[INDEX].data","typeLabel":"object"},"error":{"type":"object","properties":{"code":{"type":"string","uniqueKey":"data.results.items.[INDEX].error.code","typeLabel":"string"},"message":{"type":"string","uniqueKey":"data.results.items.[INDEX].error.message","typeLabel":"string"},"details":{"type":"object","additionalProperties":true,"description":"Machine-readable error context. Amount-limit failures include `requestedAmountCents` and `maximumAmountCents`.","uniqueKey":"data.results.items.[INDEX].error.details","typeLabel":"object"}},"uniqueKey":"data.results.items.[INDEX].error","typeLabel":"object"}},"uniqueKey":"data.results.items.[INDEX]","typeLabel":"object"},"uniqueKey":"data.results","typeLabel":"object[]"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"success":true,"data":{"totalCount":3,"successCount":2,"failureCount":1,"results":[{"index":0,"success":true,"data":{"transferId":"txfr_abc123","fromAccountId":"company","toAccountId":"acct_user1","amountCents":5000,"amountUsd":50,"status":"completed","direction":"company_to_user","destinationBalance":"withdrawal","createdAt":"2026-04-03T12:00:00.000Z"}},{"index":1,"success":true,"data":{"transferId":"txfr_def456","fromAccountId":"company","toAccountId":"acct_user2","amountCents":7500,"amountUsd":75,"status":"completed","direction":"company_to_user","destinationBalance":"withdrawal","createdAt":"2026-04-03T12:00:01.000Z"}},{"index":2,"success":false,"error":{"code":"AMOUNT_TOO_LARGE","message":"Amount too large. Maximum is $1000.00","details":{"requestedAmountCents":128394,"maximumAmountCents":100000,"configuredMaximumAmountCents":100000,"systemMaximumAmountCents":10000000}}}]}},"examples":{"Example":{"title":"Example","value":{"success":true,"data":{"totalCount":3,"successCount":2,"failureCount":1,"results":[{"index":0,"success":true,"data":{"transferId":"txfr_abc123","fromAccountId":"company","toAccountId":"acct_user1","amountCents":5000,"amountUsd":50,"status":"completed","direction":"company_to_user","destinationBalance":"withdrawal","createdAt":"2026-04-03T12:00:00.000Z"}},{"index":1,"success":true,"data":{"transferId":"txfr_def456","fromAccountId":"company","toAccountId":"acct_user2","amountCents":7500,"amountUsd":75,"status":"completed","direction":"company_to_user","destinationBalance":"withdrawal","createdAt":"2026-04-03T12:00:01.000Z"}},{"index":2,"success":false,"error":{"code":"AMOUNT_TOO_LARGE","message":"Amount too large. Maximum is $1000.00","details":{"requestedAmountCents":128394,"maximumAmountCents":100000,"configuredMaximumAmountCents":100000,"systemMaximumAmountCents":10000000}}}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"14f337c6-8153-4e81-84f8-922ed83e1944":{"description":"Invalid request body, transfers array, or atomic preflight failure (nothing committed)","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false],"isRequired":true,"uniqueKey":"success","typeLabel":"enum\u003cboolean>"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","additionalProperties":true,"description":"Machine-readable error context. Amount-limit failures include cent-denominated requested and effective limits.","uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"notArray":{"title":"notArray","value":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Request body must contain a \"transfers\" array"}}},"tooMany":{"title":"tooMany","value":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"transfers array exceeds maximum batch size of 200"}}},"atomicPreflight":{"title":"atomicPreflight","value":{"success":false,"error":{"code":"ACCOUNT_NOT_FOUND","message":"Destination account not found","details":{"atomic":true,"phase":"preflight","failedIndex":12}}}}},"exampleType":"examples"}},"exampleType":"examples"},"195b55a2-d893-4380-bdd8-ac3ca31e3213":{"description":"Atomic batch aborted after execution started, or a batch-level idempotency conflict","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false],"isRequired":true,"uniqueKey":"success","typeLabel":"enum\u003cboolean>"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"object","additionalProperties":true,"description":"Machine-readable error context. Amount-limit failures include cent-denominated requested and effective limits.","uniqueKey":"error.details","typeLabel":"object"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"aborted":{"title":"aborted","value":{"success":false,"error":{"code":"BATCH_ABORTED","message":"Atomic batch did not complete. No net transfers were committed.","details":{"atomic":true,"phase":"execute","failedIndex":40}}}},"compensationFailed":{"title":"compensationFailed","value":{"success":false,"error":{"code":"BATCH_COMPENSATION_FAILED","message":"Atomic batch failed after some transfers settled, and not all could be reversed","details":{"atomic":true,"phase":"compensation","failedIndex":40}}}}},"exampleType":"examples"}},"exampleType":"examples"},"aa9dd371-c73b-446e-92fe-e213a6e25cf3":{"description":"Rate limit exceeded","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"3522e4bc-d90f-4dda-9017-ccbd326e93de":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Your SideShift Connect API key (`sk_live_*` or `sk_test_*`). Generate from Settings → Connect.","scopes":[],"schemeName":"apiKeyAuth"}}},"servers":{"5f705a65-a17e-4362-8eca-1f2d43e1caa1":{"url":"https://app.sideshift.app/api/embed","description":"Production / Sandbox (determined by API key prefix)"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-api-key","description":"Your SideShift Connect API key (`sk_live_*` or `sk_test_*`). Generate from Settings → Connect.","scopes":[],"schemeName":"apiKeyAuth"},"schema":{"title":"x-api-key","type":"string","description":"Your SideShift Connect API key (`sk_live_*` or `sk_test_*`). Generate from Settings → Connect.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKeyAuth","name":"x-api-key"}],"title":"apiKeyAuth"}]},"originalFileLocation":"openapi/connect.yaml"},"subdomain":"sideshift","siteName":"SideShift","title":"Batch transfer - SideShift","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T20:08:01.838Z","originalFileLocation":"connect/reference/transfers/batch-transfer.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"light\";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=\"light\"}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=\"Process multiple transfers in a single request. Transfers are executed sequentially — use this instead of sending many parallel single-transfer requests. Each transfer in the array supports the same parameters as the single transfer endpoint. Best-effort (default): omit atomic or set atomic: false. Results are returned per-transfer; a failure in one item does not stop the others. Atomic: set atomic: true when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with failureCount: 0 and atomic: true. Retry an aborted atomic batch with new per-item idempotencyKey values (and a new batch idempotencyKey if you sent one). Replaying the same keys returns the stored abort and does not pay again. Why batch? Sending 50+ parallel requests to /accounts/transfer causes Firestore transaction contention on the source wallet, resulting in INTERNAL_ERROR failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call. Limits: Maximum 200 transfers per batch. Idempotency and evidence: Every transfer requires its own idempotencyKey. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\">\u003cmeta data-mint-head name=\"application-name\" content=\"SideShift\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sideshift/HER0K4eGvuEqC4Kt/_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/sideshift/HER0K4eGvuEqC4Kt/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sideshift/HER0K4eGvuEqC4Kt/_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/sideshift/HER0K4eGvuEqC4Kt/_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/sideshift/HER0K4eGvuEqC4Kt/_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/sideshift/HER0K4eGvuEqC4Kt/_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/sideshift/HER0K4eGvuEqC4Kt/_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/sideshift/HER0K4eGvuEqC4Kt/_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/sideshift/HER0K4eGvuEqC4Kt/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Batch transfer - SideShift\">\u003cmeta data-mint-head property=\"og:description\" content=\"Process multiple transfers in a single request. Transfers are executed sequentially — use this instead of sending many parallel single-transfer requests. Each transfer in the array supports the same parameters as the single transfer endpoint. Best-effort (default): omit atomic or set atomic: false. Results are returned per-transfer; a failure in one item does not stop the others. Atomic: set atomic: true when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with failureCount: 0 and atomic: true. Retry an aborted atomic batch with new per-item idempotencyKey values (and a new batch idempotencyKey if you sent one). Replaying the same keys returns the stored abort and does not pay again. Why batch? Sending 50+ parallel requests to /accounts/transfer causes Firestore transaction contention on the source wallet, resulting in INTERNAL_ERROR failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call. Limits: Maximum 200 transfers per batch. Idempotency and evidence: Every transfer requires its own idempotencyKey. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SideShift\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://sideshift.mintlify.site/_mintlify/api/og/v2?division=Transfers\u0026amp;title=Batch+transfer\u0026amp;description=Process+multiple+transfers+in+a+single+request.+Transfers+are+executed+**sequentially**+%E2%80%94+use+this+instead+of+sending+many+parallel+single-transfer+requests.%0A%0AE\u0026amp;theme=401dd8d7e2b95a95e9b00b05\u0026amp;signature=33be23f05dedb4c9b091ccb9b3ca334397ad088d2dd21cdf1659870768d3b216\">\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=\"Batch transfer - SideShift\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Process multiple transfers in a single request. Transfers are executed sequentially — use this instead of sending many parallel single-transfer requests. Each transfer in the array supports the same parameters as the single transfer endpoint. Best-effort (default): omit atomic or set atomic: false. Results are returned per-transfer; a failure in one item does not stop the others. Atomic: set atomic: true when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with failureCount: 0 and atomic: true. Retry an aborted atomic batch with new per-item idempotencyKey values (and a new batch idempotencyKey if you sent one). Replaying the same keys returns the stored abort and does not pay again. Why batch? Sending 50+ parallel requests to /accounts/transfer causes Firestore transaction contention on the source wallet, resulting in INTERNAL_ERROR failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call. Limits: Maximum 200 transfers per batch. Idempotency and evidence: Every transfer requires its own idempotencyKey. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sideshift.mintlify.site/_mintlify/api/og/v2?division=Transfers\u0026amp;title=Batch+transfer\u0026amp;description=Process+multiple+transfers+in+a+single+request.+Transfers+are+executed+**sequentially**+%E2%80%94+use+this+instead+of+sending+many+parallel+single-transfer+requests.%0A%0AE\u0026amp;theme=401dd8d7e2b95a95e9b00b05\u0026amp;signature=33be23f05dedb4c9b091ccb9b3ca334397ad088d2dd21cdf1659870768d3b216\">\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/sideshift/HER0K4eGvuEqC4Kt/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SideShift\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2E6FE0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/connect/reference/transfers/batch-transfer.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.sideshift.app/#organization\",\"name\":\"SideShift\",\"url\":\"https://docs.sideshift.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/sideshift/oTyWBbQpawmh0yna/logo/light.svg?fit=max\u0026auto=format\u0026n=oTyWBbQpawmh0yna\u0026q=85\u0026s=067b5f4d28c1d362dd1035d42fd4cf61\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.sideshift.app#website\",\"name\":\"SideShift\",\"url\":\"https://docs.sideshift.app\",\"publisher\":{\"@id\":\"https://docs.sideshift.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer#webpage\",\"url\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer\",\"name\":\"Batch transfer\",\"description\":\"Process multiple transfers in a single request. Transfers are executed sequentially — use this instead of sending many parallel single-transfer requests. Each transfer in the array supports the same parameters as the single transfer endpoint. Best-effort (default): omit atomic or set atomic: false. Results are returned per-transfer; a failure in one item does not stop the others. Atomic: set atomic: true when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with failureCount: 0 and atomic: true. Retry an aborted atomic batch with new per-item idempotencyKey values (and a new batch idempotencyKey if you sent one). Replaying the same keys returns the stored abort and does not pay again. Why batch? Sending 50+ parallel requests to /accounts/transfer causes Firestore transaction contention on the source wallet, resulting in INTERNAL_ERROR failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call. Limits: Maximum 200 transfers per batch. Idempotency and evidence: Every transfer requires its own idempotencyKey. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\",\"dateModified\":\"2026-10-22T20:08:01.838Z\",\"isPartOf\":{\"@id\":\"https://docs.sideshift.app#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reference\",\"item\":\"https://docs.sideshift.app/connect/reference/configuration/read-the-brands-multi-currency-preference\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transfers\",\"item\":\"https://docs.sideshift.app/connect/reference/transfers/list-transfers\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Batch transfer\",\"item\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer#apireference\",\"headline\":\"Batch transfer\",\"name\":\"Batch transfer\",\"description\":\"Process multiple transfers in a single request. Transfers are executed sequentially — use this instead of sending many parallel single-transfer requests. Each transfer in the array supports the same parameters as the single transfer endpoint. Best-effort (default): omit atomic or set atomic: false. Results are returned per-transfer; a failure in one item does not stop the others. Atomic: set atomic: true when every transfer must commit, or none should. SideShift validates the whole batch (accounts, amounts, commercial evidence, and combined source balances) before moving money. If any item would fail, the API returns an error and executes nothing. If an item fails after money has started moving, remaining items are not attempted and already-settled items are reversed. A successful atomic batch returns the same per-item result envelope with failureCount: 0 and atomic: true. Retry an aborted atomic batch with new per-item idempotencyKey values (and a new batch idempotencyKey if you sent one). Replaying the same keys returns the stored abort and does not pay again. Why batch? Sending 50+ parallel requests to /accounts/transfer causes Firestore transaction contention on the source wallet, resulting in INTERNAL_ERROR failures. The batch endpoint eliminates this by processing transfers one at a time within a single HTTP call. Limits: Maximum 200 transfers per batch. Idempotency and evidence: Every transfer requires its own idempotencyKey. Live batch items also require the same commercial-evidence metadata as the single-transfer endpoint. Atomic batches also reject duplicate per-item keys.\",\"url\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sideshift.app/connect/reference/transfers/batch-transfer#webpage\"},\"dateModified\":\"2026-10-22T20:08:01.838Z\",\"publisher\":{\"@id\":\"https://docs.sideshift.app/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.sideshift.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SideShift\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SideShift","nav":{"global":null,"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Home","href":""}]},{"tab":"Platform API","icon":"briefcase-business","pages":[{"title":"Platform API","href":"/platform"}]},{"tab":"Connect","icon":"wallet","pages":[{"group":"Overview","pages":[{"title":"Connect","href":"/connect"},{"title":"Getting started","href":"/connect/getting-started"},{"title":"Testing","href":"/connect/testing"},{"title":"Embedding and customization","href":"/connect/widgets"},{"title":"Playground","href":"/connect/playground"},{"title":"Webhooks","href":"/connect/webhooks"},{"title":"Configuration","href":"/connect/configuration"},{"title":"Multi-currency wallets","href":"/connect/multi-currency"},{"title":"Guides","href":"/connect/guides"},{"title":"Errors","href":"/connect/errors"},{"title":"Status","href":"/connect/status"}]},{"group":"Reference","pages":[{"group":"Currency settings","pages":[{"title":"Read the brand's multi-currency preference","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /settings/currencies","href":"/connect/reference/configuration/read-the-brands-multi-currency-preference"},{"title":"Opt the brand into or out of multi-currency","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml patch /settings/currencies","href":"/connect/reference/configuration/opt-the-brand-into-or-out-of-multi-currency"}]},{"group":"Accounts","pages":[{"title":"List connected accounts","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /accounts","href":"/connect/reference/accounts/list-connected-accounts"},{"title":"Get balance \u0026 transactions","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /accounts/balance","href":"/connect/reference/accounts/get-balance-\u0026-transactions"},{"title":"Read currency balances (pilot)","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /accounts/currencies","href":"/connect/reference/accounts/read-currency-balances-pilot"},{"title":"Estimate USD funding or convert a sub-account balance (pilot)","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/currencies","href":"/connect/reference/transfers/estimate-usd-funding-or-convert-a-sub-account-balance-pilot"},{"title":"Get invoice transactions","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /accounts/invoices","href":"/connect/reference/accounts/get-invoice-transactions"},{"title":"Create account","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/create","href":"/connect/reference/accounts/create-account"},{"title":"Check an existing account and duplicate verified identity","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/check","href":"/connect/reference/accounts/check-an-existing-account-and-duplicate-verified-identity"},{"title":"Create account invoice","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/invoices/create","href":"/connect/reference/accounts/create-account-invoice"},{"title":"Send account invoice","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/invoices/{invoiceId}/send","href":"/connect/reference/accounts/send-account-invoice"},{"title":"Move wallet funds into withdrawal balance","deprecated":true,"version":null,"openapi":"/openapi/connect.yaml post /accounts/withdrawal-balance","href":"/connect/reference/accounts/move-wallet-funds-into-withdrawal-balance"},{"title":"Update account","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml patch /accounts/{id}","href":"/connect/reference/accounts/update-account"},{"title":"Bulk delete connected accounts","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml delete /accounts","href":"/connect/reference/accounts/bulk-delete-connected-accounts"},{"title":"Get withdrawal","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /withdrawals/{withdrawalId}","href":"/connect/reference/withdrawals/get-withdrawal"},{"title":"Withdrawalcreated","version":null,"deprecated":null,"sidebarTitle":"Withdrawal created","openapi":"/openapi/connect.yaml webhook withdrawal.created","href":"/connect/reference/accounts/withdrawalcreated"},{"title":"Withdrawalupdated","version":null,"deprecated":null,"sidebarTitle":"Withdrawal updated","openapi":"/openapi/connect.yaml webhook withdrawal.updated","href":"/connect/reference/accounts/withdrawalupdated"},{"title":"Withdrawalcompleted","version":null,"deprecated":null,"sidebarTitle":"Withdrawal completed","openapi":"/openapi/connect.yaml webhook withdrawal.completed","href":"/connect/reference/accounts/withdrawalcompleted"},{"title":"Withdrawalfailed","version":null,"deprecated":null,"sidebarTitle":"Withdrawal failed","openapi":"/openapi/connect.yaml webhook withdrawal.failed","href":"/connect/reference/accounts/withdrawalfailed"},{"title":"Accountrisk flagged","version":null,"deprecated":null,"sidebarTitle":"Account risk flagged","openapi":"/openapi/connect.yaml webhook account.risk_flagged","href":"/connect/reference/accounts/accountrisk_flagged"}]},{"group":"Verifications","pages":[{"title":"Read the account's guardian declaration","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /accounts/{id}/guardian","href":"/connect/reference/verifications/read-the-accounts-guardian-declaration"},{"title":"List verifications","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /accounts/{id}/verifications","href":"/connect/reference/verifications/list-verifications"},{"title":"Get verification","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /accounts/{id}/verifications/{verificationId}","href":"/connect/reference/verifications/get-verification"}]},{"group":"Transfers","pages":[{"title":"List transfers","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /transfers","href":"/connect/reference/transfers/list-transfers"},{"title":"Get transfer","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /transfers/{transferId}","href":"/connect/reference/transfers/get-transfer"},{"title":"Create transfer","description":"Move funds between accounts. Three directions are supported:\n\n| Direction | `fromAccountId` | `toAccountId` |\n|-----------|-----------------|---------------|\n| Company → User | _(omit)_ | User account |\n| User → Company | User account | _(omit)_ |\n| User → User | Source account | Destination account |\n\n**Funding behavior:** Transfers use the source SideShift wallet first. If a source user is short in SideShift wallet but has enough withdrawal-ready balance, SideShift automatically moves the needed funds through the supported child-to-platform path first, then completes the transfer.\n\n**Settlement behavior:** Company→User and User→User transfers settle into the destination's withdrawable balance at the payment provider. User→Company transfers settle into your company SideShift wallet, and are funded from the user's withdrawable balance when their SideShift wallet is short, which is how a payout is pulled back. `destinationBalance: wallet` (parking the money in the destination's internal wallet) is deprecated.\n\n**Idempotency:** An `idempotencyKey` is required. A replay returns the original successful transfer result.\n\n**Commercial evidence:** New live integrations require string metadata for `obligationType`, `obligationReference`, `description`, and `approvalReference`. Campaign transfers also require `programId` or `contractId`. Allowed obligation types are `campaign`, `creator_agreement`, `subscription`, `refund`, `wallet_reconciliation`, `platform_correction`, and `other_approved`. Existing authorizations created before this requirement remain backward-compatible during migration; new authorizations enforce it automatically. This metadata is optional in sandbox.\n\n**Sandbox:** All transfer directions remain isolated SideShift-ledger simulations.\nNo provider payout is attempted because the payment provider does not support payouts in sandbox.\n","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/transfer","href":"/connect/reference/transfers/create-transfer"},{"title":"Batch transfer","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /accounts/transfer/batch","href":"/connect/reference/transfers/batch-transfer"},{"title":"Cancel an unsettled transfer","description":"Reverse a transfer that has been reserved but not yet sent to the payment\nprovider. The funds held against the source wallet are credited back, the\npending ledger entry is marked reversed, and the transfer's daily-limit\nreservation is released.\n\n**This does not delete anything.** The transfer row remains. It comes back\nwith `status` of `failed`, and a `failureReason` reading\n`Cancelled before provider settlement`. There is no `cancelled` status.\n\n**Only unsettled transfers qualify.** `POST /accounts/transfer` settles\nsynchronously, so a transfer is normally already `completed` by the time\nyou could call this. It applies to the narrow window where a transfer holds\na reservation that was never submitted, typically because the creating\nrequest failed part-way. Anything the provider has already seen is refused\nwith `409`, because reversing it would need a refund and this endpoint does\nnot perform one.\n\n**Not idempotent.** A second call returns `409`, since the transfer is\nterminal by then. The reversal itself is transactional, so concurrent calls\ncannot credit the source twice.\n\n**Sandbox:** sandbox transfers never reach the provider boundary and settle\nimmediately, so in practice they are never cancellable and return `409`.\n","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml delete /transfers/{transferId}","href":"/connect/reference/transfers/cancel-an-unsettled-transfer"},{"title":"Transfercompleted","version":null,"deprecated":null,"sidebarTitle":"Transfer completed","openapi":"/openapi/connect.yaml webhook transfer.completed","href":"/connect/reference/transfers/transfercompleted"}]},{"group":"Tokens","pages":[{"title":"Generate widget token","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /auth/token","href":"/connect/reference/tokens/generate-widget-token"}]},{"group":"Domains","pages":[{"title":"Read the embed domain allowlist","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /domains","href":"/connect/reference/domains/read-the-embed-domain-allowlist"},{"title":"Update the embed domain allowlist","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml patch /domains","href":"/connect/reference/domains/update-the-embed-domain-allowlist"}]},{"group":"Checkout","pages":[{"title":"Create hosted checkout session","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /checkout/sessions","href":"/connect/reference/checkout/create-hosted-checkout-session"},{"title":"Depositpending","version":null,"deprecated":null,"sidebarTitle":"Deposit pending","openapi":"/openapi/connect.yaml webhook deposit.pending","href":"/connect/reference/checkout/depositpending"},{"title":"Depositconfirmed","version":null,"deprecated":null,"sidebarTitle":"Deposit confirmed","openapi":"/openapi/connect.yaml webhook deposit.confirmed","href":"/connect/reference/checkout/depositconfirmed"},{"title":"Depositfailed","version":null,"deprecated":null,"sidebarTitle":"Deposit failed","openapi":"/openapi/connect.yaml webhook deposit.failed","href":"/connect/reference/checkout/depositfailed"}]},{"group":"Webhooks","pages":[{"title":"List webhook delivery logs","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml get /webhook-logs","href":"/connect/reference/webhooks/list-webhook-delivery-logs"},{"title":"Send a test webhook","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /webhooks/test","href":"/connect/reference/webhooks/send-a-test-webhook"},{"title":"Replay a webhook event","deprecated":null,"version":null,"openapi":"/openapi/connect.yaml post /webhooks/{eventId}/replay","href":"/connect/reference/webhooks/replay-a-webhook-event"}]}]}]},{"tab":"Scraper","icon":"search","pages":[{"title":"Scraper","href":"/scraper"}]},{"tab":"Sidekick","icon":"blocks","pages":[{"title":"Sidekick","href":"/sidekick/connectors"}]},{"tab":"MCP","icon":"plug","pages":[{"title":"MCP","href":"/mcp-server"}]}]},"basePath":"","title":"Batch transfer - SideShift","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CBsVopKK.js","utils-DZAk68jJ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D32AYZrP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D_A5_cny.js","snippetPresets-xNRfS9th.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BIB25-tq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CydJ4w4j.js","shallow-CYPBeQSG.js","getApiPlaygroundDisplay-A5xJVBOu.js","CodeSnippet-BVRTgi3m.js","CodeSnippets-DjD6BSlt.js","Page-Dr40SSJq.js","getPastedJson-D4V4JyrR.js","icon-uhcnG22T.js","MethodPill-CM-ZQdGH.js","DuplicateIcon-B_WnOiNf.js","createIcon-CJsb8utt.js","DynamicMarkdown-D-2HDKEp.js","SectionHeading-KP5xmMgQ.js","axios-vUo_bRtp.js","Markdown-D_k0dg6k.js","clsx-DK3K4Z1S.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DE3EVdvd.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-fN9H9n9g.js"]}