{ "success": true, "data": { "bulkId": "12a121ad-cbea-4ec4-9e0a-5c861e528bba", "results": [ { "transactionId": "3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11", "status": "UPLOADED" }, { "transactionId": "8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10", "status": "ALREADY_UPLOADED" }, { "transactionId": "c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34", "status": "ERROR", "error": { "code": "CROSS_RAMP_NOT_AWAITING_INVOICE", "message": "Cross ramp c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34 is CANCELLED and does not accept an invoice" } } ] }}
Cross-Ramp
Upload Bulk Cross-Ramp Invoices
Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk’s invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.
{ "success": true, "data": { "bulkId": "12a121ad-cbea-4ec4-9e0a-5c861e528bba", "results": [ { "transactionId": "3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11", "status": "UPLOADED" }, { "transactionId": "8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10", "status": "ALREADY_UPLOADED" }, { "transactionId": "c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34", "status": "ERROR", "error": { "code": "CROSS_RAMP_NOT_AWAITING_INVOICE", "message": "Cross ramp c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34 is CANCELLED and does not accept an invoice" } } ] }}
Uploads the commercial invoices for several transactions of a bulk cross-ramp that were created without one (status WAITING_INVOICE). Each invoice that is accepted moves its transaction to PENDING_FUNDS; read the transaction afterwards to get the sourceBankAccount the user needs to deposit.
Bulk cross-ramp is enabled on request, and so is this endpoint: until it is enabled for your environment it returns 404.
The response is 200 whenever the request itself is valid, even if some invoices failed. Always read every entry of results and handle each status.
This route does not support the Idempotency-Key header. It is naturally idempotent: an invoice for a transaction that already passed the invoice step is answered ALREADY_UPLOADED and nothing new is stored, so a failed or timed-out request can be sent again as is.
invoices: between 1 and 25 entries per request, with no repeated transactionId.
transactionId: a transaction of this bulk, as returned when the bulk was created.
invoiceFile: Base64-encoded PDF, no whitespace, maximum 25 MB once decoded. Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR entry with INVALID_COMMERCIAL_INVOICE.
The Base64 text of all the invoices together must stay under about 25 MiB. Split larger sets across several requests.
results has one entry per requested invoice, in request order.
status
Meaning
UPLOADED
The invoice was accepted now; the transaction moved to PENDING_FUNDS.
ALREADY_UPLOADED
The transaction had already passed the invoice step. Nothing was stored.
ERROR
error.code and error.message say why. The transaction is unchanged and the entry can be retried.
An ERROR entry carries the same codes as Upload Cross-Ramp Invoice: CROSS_RAMP_NOT_AWAITING_INVOICE, USER_NOT_VERIFIED_ERROR, SIGNATURE_REQUIREMENT_NOT_MET, INVALID_COMMERCIAL_INVOICE, COMMERCIAL_INVOICE_UPLOAD_FAILED, and INTERNAL_ERROR for an unexpected failure. Three more apply to bulks:
error.code
Meaning
CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED
The stored invoices of one bulk may total at most 24 MiB (decoded), and this one would go over. Nothing is stored and the transaction stays WAITING_INVOICE; retry it with a smaller file. Cancelled transactions free their share.
CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED
The stored invoices of one bulk may total at most 500 pages, and this one would go over. Nothing is stored and the transaction stays WAITING_INVOICE; retry it with a shorter file. Cancelled transactions free their share.
CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE
The size or page count of an invoice already stored for the bulk can’t be read yet. Nothing is stored. Wait a moment and retry that entry.
The request still answers 200 for these: retry only the failed entries.If another invoice of the same bulk is being processed (it stays busy for about 2 seconds), the whole request fails with HTTP 503CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed, not even entries that would have been rejected. Wait a second or two and resend the same request.
Entries are processed one by one, in order. A rejected invoice never blocks the others.
A malformed request, one that names a transaction that is not part of the bulk, or one that finds the bulk busy (503), processes nothing and answers with an HTTP error (see below).
The bulk is processed only when every transaction has its invoice and is funded. The single payout to the payment provider is placed at that moment, in every country; for China and Hong Kong the supporting document sent to the provider is one PDF merged from all the bulk’s invoices.
”Invalid User Input” (invoices missing or empty, more than 25 entries, a repeated transactionId, an invoiceFile that is not Base64, or invoices above about 25 MiB of Base64 in total; the failing rule is in errors[].message)
404
NOT_FOUND_ERROR
”Cross ramp bulk was not found” (unknown bulk or another partner’s bulk)
404
CROSS_RAMP_BULK_ITEMS_NOT_FOUND
”Transactions are not part of cross ramp bulk “
404
—
“Not Found”: bulk cross-ramp is not enabled for this environment yet
503
CROSS_RAMP_BULK_INVOICE_BUSY
”Another invoice of this bulk is being processed; retry in a moment”. Another upload of the same bulk held it for about 2 seconds. Nothing is processed; wait a second or two and resend the request
Invoices to attach, one per transaction of the bulk. At most 25 entries, no repeated transactionId, and about 25 MiB of Base64 text in total.
Required array length: 1 - 25 elements
Show child attributes
Response
The request was well-formed. Each entry of results is UPLOADED, ALREADY_UPLOADED or ERROR (with a code and message); some entries may fail while others succeed. A failed entry leaves its transaction unchanged and can be retried. An entry that would take the stored invoices of the bulk above 24 MiB decoded or 500 pages is an ERROR with code CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED; CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary, retry those entries after a short wait.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Capa.fi","colors":{"primary":"#191f14","light":"#fff","dark":"#191f14"},"logo":{"light":"https://mintcdn.com/capa/sdievWamxx2n0U65/logo/logo.svg?fit=max\u0026auto=format\u0026n=sdievWamxx2n0U65\u0026q=85\u0026s=cd1c9b9fcff02ef9bd460d71d7823292","dark":"https://mintcdn.com/capa/sdievWamxx2n0U65/logo/logo.svg?fit=max\u0026auto=format\u0026n=sdievWamxx2n0U65\u0026q=85\u0026s=cd1c9b9fcff02ef9bd460d71d7823292"},"favicon":"https://mintcdn.com/capa/sdievWamxx2n0U65/favicon.svg?fit=max\u0026auto=format\u0026n=sdievWamxx2n0U65\u0026q=85\u0026s=154093ec8e5f8f060d360b5932060b3b","navbar":{"links":[{"href":"https://status.capa.fi","label":"Status"}]},"fonts":{"heading":{"family":"Space Grotesk"},"body":{"family":"Space Grotesk"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"capa","hasAudioNarration":false,"actualSubdomain":"capa","customDomains":["docs.capa.fi"],"gitSource":{"type":"github","owner":"capalabs","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aebc98896646699dc716e08","collectionId":"8753bd68-97c5-4867-8714-9086b3369a85","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aebc98896646699dc716e08"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aebcd30b96915a375932852","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"API Reference","count":37},{"language":"default","tag":"Capa Partner API - V2","count":37},{"language":"default","tag":"Guides","count":20},{"language":"default","tag":"Documentation","count":20},{"language":"default","tag":"Cross-Ramp","count":6},{"language":"default","tag":"📣 Webhooks","count":5},{"language":"default","tag":"Users","count":5},{"language":"default","tag":"Wallets","count":4},{"language":"default","tag":"Webhooks · Notifications","count":3},{"language":"default","tag":"Transactions","count":3}]},"assistantConfig":{"deflection":{"enabled":true,"email":"developers@capa.fi","showHelpButton":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":"vite-origin","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":"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}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":".table th,.table td{text-align:left}ol ol{list-style-type:lower-alpha}ol ol ol{list-style-type:lower-roman}"}],"page":{"pagePath":"reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices","slug":"/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices","pageMetadata":{"title":"Upload Bulk Cross-Ramp Invoices","openapi":"reference/openapi/CrossRampPartnerV2Controller_uploadPartnerCrossRampBulkInvoices.json POST /api/partner/v2/cross-ramp/bulk/{bulkId}/invoices","description":"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk's invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.","href":"/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices"},"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: \"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk’s invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.\"\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`,hr:`hr`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Uploads the commercial invoices for several transactions of a `,_jsx(_components.a,{href:`/reference/crossramppartnerv2controller_createpartnercrossrampbulk`,children:`bulk cross-ramp`}),` that were created without one (status `,_jsx(_components.code,{children:`WAITING_INVOICE`}),`). Each invoice that is accepted moves its transaction to `,_jsx(_components.code,{children:`PENDING_FUNDS`}),`; read the transaction afterwards to get the `,_jsx(_components.code,{children:`sourceBankAccount`}),` the user needs to deposit.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Bulk cross-ramp is `,_jsx(_components.strong,{children:`enabled on request`}),`, and so is this endpoint: until it is enabled for your environment it returns `,_jsx(_components.code,{children:`404`}),`.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The response is `,_jsx(_components.code,{children:`200`}),` whenever the request itself is valid, `,_jsx(_components.strong,{children:`even if some invoices failed`}),`. Always read every entry of `,_jsx(_components.code,{children:`results`}),` and handle each `,_jsx(_components.code,{children:`status`}),`.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`idempotency`,children:`Idempotency`}),`\n`,_jsxs(_components.p,{children:[`This route does not support the `,_jsx(_components.code,{children:`Idempotency-Key`}),` header. It is naturally idempotent: an invoice for a transaction that already passed the invoice step is answered `,_jsx(_components.code,{children:`ALREADY_UPLOADED`}),` and nothing new is stored, so a failed or timed-out request can be sent again as is.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`request`,children:`Request`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"invoices\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"transactionId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"invoiceFile\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"JVBERi0xLjQK...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"transactionId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"invoiceFile\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"JVBERi0xLjQK...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`invoices`}),`: between 1 and `,_jsx(_components.strong,{children:`25`}),` entries per request, with no repeated `,_jsx(_components.code,{children:`transactionId`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`transactionId`}),`: a transaction of this bulk, as returned when the bulk was created.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`invoiceFile`}),`: Base64-encoded PDF, no whitespace, maximum 25 MB once decoded. Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an `,_jsx(_components.code,{children:`ERROR`}),` entry with `,_jsx(_components.code,{children:`INVALID_COMMERCIAL_INVOICE`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The Base64 text of all the invoices together must stay under about `,_jsx(_components.strong,{children:`25 MiB`}),`. Split larger sets across several requests.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`response`,children:`Response`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`15`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"success\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"bulkId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"12a121ad-cbea-4ec4-9e0a-5c861e528bba\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"results\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"transactionId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"UPLOADED\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"transactionId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ALREADY_UPLOADED\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"transactionId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ERROR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USER_NOT_VERIFIED_ERROR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`results`}),` has one entry per requested invoice, `,_jsx(_components.strong,{children:`in request order`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:_jsx(_components.code,{children:`status`})}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`UPLOADED`})}),_jsxs(_components.td,{children:[`The invoice was accepted now; the transaction moved to `,_jsx(_components.code,{children:`PENDING_FUNDS`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ALREADY_UPLOADED`})}),_jsx(_components.td,{children:`The transaction had already passed the invoice step. Nothing was stored.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ERROR`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`error.code`}),` and `,_jsx(_components.code,{children:`error.message`}),` say why. The transaction is unchanged and the entry can be retried.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`An `,_jsx(_components.code,{children:`ERROR`}),` entry carries the same codes as `,_jsx(_components.a,{href:`/reference/crossramppartnerv2controller_uploadpartnercrossrampinvoice`,children:`Upload Cross-Ramp Invoice`}),`: `,_jsx(_components.code,{children:`CROSS_RAMP_NOT_AWAITING_INVOICE`}),`, `,_jsx(_components.code,{children:`USER_NOT_VERIFIED_ERROR`}),`, `,_jsx(_components.code,{children:`SIGNATURE_REQUIREMENT_NOT_MET`}),`, `,_jsx(_components.code,{children:`INVALID_COMMERCIAL_INVOICE`}),`, `,_jsx(_components.code,{children:`COMMERCIAL_INVOICE_UPLOAD_FAILED`}),`, and `,_jsx(_components.code,{children:`INTERNAL_ERROR`}),` for an unexpected failure. Three more apply to bulks:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:_jsx(_components.code,{children:`error.code`})}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED`})}),_jsxs(_components.td,{children:[`The stored invoices of one bulk may total at most `,_jsx(_components.strong,{children:`24 MiB`}),` (decoded), and this one would go over. Nothing is stored and the transaction stays `,_jsx(_components.code,{children:`WAITING_INVOICE`}),`; retry it with a smaller file. Cancelled transactions free their share.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED`})}),_jsxs(_components.td,{children:[`The stored invoices of one bulk may total at most `,_jsx(_components.strong,{children:`500 pages`}),`, and this one would go over. Nothing is stored and the transaction stays `,_jsx(_components.code,{children:`WAITING_INVOICE`}),`; retry it with a shorter file. Cancelled transactions free their share.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE`})}),_jsx(_components.td,{children:`The size or page count of an invoice already stored for the bulk can’t be read yet. Nothing is stored. Wait a moment and retry that entry.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The request still answers `,_jsx(_components.code,{children:`200`}),` for these: retry only the failed entries.`]}),`\n`,_jsxs(_components.p,{children:[`If another invoice of the same bulk is being processed (it stays busy for about 2 seconds), the `,_jsx(_components.strong,{children:`whole request`}),` fails with HTTP `,_jsx(_components.code,{children:`503`}),` `,_jsx(_components.code,{children:`CROSS_RAMP_BULK_INVOICE_BUSY`}),` and nothing is processed, not even entries that would have been rejected. Wait a second or two and resend the same request.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`rules`,children:`Rules`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Entries are processed one by one, in order. A rejected invoice never blocks the others.`}),`\n`,_jsxs(_components.li,{children:[`A malformed request, one that names a transaction that is not part of the bulk, or one that finds the bulk busy (`,_jsx(_components.code,{children:`503`}),`), `,_jsx(_components.strong,{children:`processes nothing`}),` and answers with an HTTP error (see below).`]}),`\n`,_jsxs(_components.li,{children:[`The bulk is processed only when `,_jsx(_components.strong,{children:`every`}),` transaction has its invoice and is funded. The single payout to the payment provider is placed at that moment, in every country; for China and Hong Kong the supporting document sent to the provider is one PDF merged from all the bulk’s invoices.`]}),`\n`,_jsxs(_components.li,{children:[`A transaction can also receive its invoice on its own with `,_jsx(_components.a,{href:`/reference/crossramppartnerv2controller_uploadpartnercrossrampinvoice`,children:`Upload Cross-Ramp Invoice`}),`.`]}),`\n`,_jsx(_components.li,{children:`Replacing an invoice that was already uploaded is not supported.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See the `,_jsx(_components.a,{href:`/docs/cross-ramp#upload-bulk-invoices`,children:`Cross-Ramp guide`}),` for the full flow.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`error-codes`,children:`Error Codes`}),`\n`,_jsxs(_components.p,{children:[`These errors apply to the whole request and process nothing. Errors of an individual invoice are returned inside `,_jsx(_components.code,{children:`results`}),` instead.`]}),`\n`,_jsx(Heading,{level:`3`,id:`common-errors`,children:`Common Errors`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`HTTP Status`}),_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Message`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UNAUTHORIZED`})}),_jsx(_components.td,{children:`”API Key is missing”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UNAUTHORIZED`})}),_jsx(_components.td,{children:`”Invalid API Key format”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UNAUTHORIZED`})}),_jsx(_components.td,{children:`”Invalid API Key”`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`endpoint-specific-errors`,children:`Endpoint-Specific Errors`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`HTTP Status`}),_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Message`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`INVALID_USER_INPUT_ERROR`})}),_jsxs(_components.td,{children:[`”Invalid User Input” (`,_jsx(_components.code,{children:`invoices`}),` missing or empty, more than 25 entries, a repeated `,_jsx(_components.code,{children:`transactionId`}),`, an `,_jsx(_components.code,{children:`invoiceFile`}),` that is not Base64, or invoices above about 25 MiB of Base64 in total; the failing rule is in `,_jsx(_components.code,{children:`errors[].message`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`NOT_FOUND_ERROR`})}),_jsxs(_components.td,{children:[`”Cross ramp bulk `,` was not found” (unknown bulk or another partner’s bulk)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`CROSS_RAMP_BULK_ITEMS_NOT_FOUND`})}),_jsxs(_components.td,{children:[`”Transactions `,` are not part of cross ramp bulk `,`“`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:`—`}),_jsx(_components.td,{children:`“Not Found”: bulk cross-ramp is not enabled for this environment yet`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`503`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`CROSS_RAMP_BULK_INVOICE_BUSY`})}),_jsx(_components.td,{children:`”Another invoice of this bulk is being processed; retry in a moment”. Another upload of the same bulk held it for about 2 seconds. Nothing is processed; wait a second or two and resend the request`})]})]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Upload Bulk Cross-Ramp Invoices","openapi":"reference/openapi/CrossRampPartnerV2Controller_uploadPartnerCrossRampBulkInvoices.json POST /api/partner/v2/cross-ramp/bulk/{bulkId}/invoices","description":"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk's invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.","href":"/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Idempotency","slug":"idempotency","depth":2,"children":[]},{"title":"Request","slug":"request","depth":2,"children":[]},{"title":"Response","slug":"response","depth":2,"children":[]},{"title":"Rules","slug":"rules","depth":2,"children":[]},{"title":"Error Codes","slug":"error-codes","depth":2,"children":[{"title":"Common Errors","slug":"common-errors","depth":3,"children":[]},{"title":"Endpoint-Specific Errors","slug":"endpoint-specific-errors","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"CrossRampPartnerV2Controller_uploadPartnerCrossRampBulkInvoices","summary":"Upload Bulk Cross-Ramp Invoices","description":"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk's invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.","parameters":["187551b9-333d-4335-a589-651654f7fa4a"],"requestBody":"e38ca3f5-10e5-4acd-a78a-d44ef84f2377","responses":{"200":"39e261cf-cec0-4587-93ac-a47dd89ba896","400":"2189b4f0-b96b-4f1e-867d-ad91c61f5e51","401":"ca7d422b-5629-4c94-a317-9035507cc34a","404":"82e762e3-99c3-4cbc-aa5a-1e2332996b15","503":"8353a407-171c-4252-bfe7-d2fa40cfbce2"},"tags":["cross-ramp"],"security":["67247c4b-468a-4d71-a7ee-3537ec7a44a5"],"method":"post","type":"path","servers":["1f02e78b-1e88-4934-95b0-2b4a35fef7a5","9b7c0a4a-66ef-4ce6-8027-2edbfc7a2efd"],"path":"/api/partner/v2/cross-ramp/bulk/{bulkId}/invoices","baseUrlOptions":["https://api.sandbox.capa.fi","https://api.capa.fi"],"title":"Upload Bulk Cross-Ramp Invoices","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"187551b9-333d-4335-a589-651654f7fa4a":{"name":"bulkId","in":"path","required":true,"description":"Bulk ID returned when the bulk was created.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"Bulk ID returned when the bulk was created.","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"invoices":{"type":"array","minItems":1,"maxItems":25,"description":"Invoices to attach, one per transaction of the bulk. At most 25 entries, no repeated transactionId, and about 25 MiB of Base64 text in total.","items":{"type":"object","properties":{"transactionId":{"type":"string","format":"uuid","description":"ID of a transaction of this bulk, as returned when the bulk was created.","isRequired":true,"uniqueKey":"invoices.items.[INDEX].transactionId","typeLabel":"string\u003cuuid>"},"invoiceFile":{"type":"string","description":"Base64-encoded PDF commercial invoice, no whitespace. Maximum 25 MB once decoded. Parsed as a real PDF: an unreadable or encrypted file, or one with 0 or more than 500 pages, is an ERROR entry with INVALID_COMMERCIAL_INVOICE.","isRequired":true,"uniqueKey":"invoices.items.[INDEX].invoiceFile","typeLabel":"string"}},"required":["transactionId","invoiceFile"],"uniqueKey":"invoices.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"invoices","typeLabel":"object[]"}},"required":["invoices"],"x-readme-ref-name":"UploadPartnerCrossRampBulkInvoicesV2RequestBody","uniqueKey":"","typeLabel":"object"},"example":{"invoices":[{"transactionId":"3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11","invoiceFile":"JVBERi0xLjQK..."},{"transactionId":"8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10","invoiceFile":"JVBERi0xLjQK..."}]},"examples":{"Example":{"title":"Example","value":{"invoices":[{"transactionId":"3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11","invoiceFile":"JVBERi0xLjQK..."},{"transactionId":"8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10","invoiceFile":"JVBERi0xLjQK..."}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"39e261cf-cec0-4587-93ac-a47dd89ba896":{"description":"The request was well-formed. Each entry of results is UPLOADED, ALREADY_UPLOADED or ERROR (with a code and message); some entries may fail while others succeed. A failed entry leaves its transaction unchanged and can be retried. An entry that would take the stored invoices of the bulk above 24 MiB decoded or 500 pages is an ERROR with code CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED; CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary, retry those entries after a short wait.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"uniqueKey":"success","typeLabel":"boolean"},"data":{"type":"object","properties":{"bulkId":{"type":"string","description":"Bulk ID","example":"12a121ad-cbea-4ec4-9e0a-5c861e528bba","isRequired":true,"uniqueKey":"data.bulkId","typeLabel":"string"},"results":{"type":"array","description":"One result per requested invoice, in request order. The request answers 200 even when some entries failed, so always read each entry.","items":{"type":"object","properties":{"transactionId":{"type":"string","example":"3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11","isRequired":true,"uniqueKey":"data.results.items.[INDEX].transactionId","typeLabel":"string"},"status":{"type":"string","enum":["UPLOADED","ALREADY_UPLOADED","ERROR"],"description":"UPLOADED: the invoice was accepted now. ALREADY_UPLOADED: the transaction had already passed the invoice step, so nothing was stored. ERROR: see error; the transaction is unchanged and the entry can be retried.","isRequired":true,"uniqueKey":"data.results.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"error":{"type":"object","description":"Present only when status is ERROR. Same codes as Upload Cross-Ramp Invoice, e.g. CROSS_RAMP_NOT_AWAITING_INVOICE, USER_NOT_VERIFIED_ERROR, SIGNATURE_REQUIREMENT_NOT_MET, INVALID_COMMERCIAL_INVOICE, COMMERCIAL_INVOICE_UPLOAD_FAILED, CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED (bulk invoices above 24 MiB decoded; retry with a smaller file), CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED (bulk invoices above 500 pages; retry with a shorter file), CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE (temporary; retry after a short wait), or INTERNAL_ERROR for an unexpected failure.","properties":{"code":{"type":"string","example":"CROSS_RAMP_NOT_AWAITING_INVOICE","isRequired":true,"uniqueKey":"data.results.items.[INDEX].error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"data.results.items.[INDEX].error.message","typeLabel":"string"}},"required":["code","message"],"uniqueKey":"data.results.items.[INDEX].error","typeLabel":"object"}},"required":["transactionId","status"],"uniqueKey":"data.results.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data.results","typeLabel":"object[]"}},"required":["bulkId","results"],"x-readme-ref-name":"UploadCrossRampBulkInvoicesResponse","uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"success":true,"data":{"bulkId":"12a121ad-cbea-4ec4-9e0a-5c861e528bba","results":[{"transactionId":"3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11","status":"UPLOADED"},{"transactionId":"8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10","status":"ALREADY_UPLOADED"},{"transactionId":"c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34","status":"ERROR","error":{"code":"CROSS_RAMP_NOT_AWAITING_INVOICE","message":"Cross ramp c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34 is CANCELLED and does not accept an invoice"}}]}},"examples":{"Example":{"title":"Example","value":{"success":true,"data":{"bulkId":"12a121ad-cbea-4ec4-9e0a-5c861e528bba","results":[{"transactionId":"3f6c1e0a-6d0b-4d4e-9a52-1b2f7d6e8c11","status":"UPLOADED"},{"transactionId":"8d1f0c3e-2b7a-4e55-9c1d-6a4f2e9b7c10","status":"ALREADY_UPLOADED"},{"transactionId":"c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34","status":"ERROR","error":{"code":"CROSS_RAMP_NOT_AWAITING_INVOICE","message":"Cross ramp c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34 is CANCELLED and does not accept an invoice"}}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"2189b4f0-b96b-4f1e-867d-ad91c61f5e51":{"description":"Bad Request. Malformed request; nothing is processed.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"code":{"type":"string","description":"Machine-readable error code.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","description":"Optional per-field validation details.","items":{"type":"object","properties":{"field":{"type":"string","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"required":["success","code","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"INVALID_USER_INPUT_ERROR":{"title":"INVALID_USER_INPUT_ERROR","value":{"success":false,"code":"INVALID_USER_INPUT_ERROR","message":"Invalid User Input","errors":[{"field":"invoices","message":"invoices must not repeat a transactionId"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"ca7d422b-5629-4c94-a317-9035507cc34a":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"code":{"type":"string","description":"Machine-readable error code.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","description":"Optional per-field validation details.","items":{"type":"object","properties":{"field":{"type":"string","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"required":["success","code","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"UNAUTHORIZED":{"title":"UNAUTHORIZED","value":{"success":false,"code":"UNAUTHORIZED","message":"API Key is missing"}},"UNAUTHORIZED_2":{"title":"UNAUTHORIZED_2","value":{"success":false,"code":"UNAUTHORIZED","message":"Invalid API Key format"}},"UNAUTHORIZED_3":{"title":"UNAUTHORIZED_3","value":{"success":false,"code":"UNAUTHORIZED","message":"Invalid API Key"}}},"exampleType":"examples"}},"exampleType":"examples"},"82e762e3-99c3-4cbc-aa5a-1e2332996b15":{"description":"Not Found. Nothing is processed.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"code":{"type":"string","description":"Machine-readable error code.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","description":"Optional per-field validation details.","items":{"type":"object","properties":{"field":{"type":"string","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"required":["success","code","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"NOT_FOUND_ERROR":{"title":"NOT_FOUND_ERROR","value":{"success":false,"code":"NOT_FOUND_ERROR","message":"Cross ramp bulk 12a121ad-cbea-4ec4-9e0a-5c861e528bba was not found"}},"CROSS_RAMP_BULK_ITEMS_NOT_FOUND":{"title":"CROSS_RAMP_BULK_ITEMS_NOT_FOUND","value":{"success":false,"code":"CROSS_RAMP_BULK_ITEMS_NOT_FOUND","message":"Transactions c2a9e4b1-5f3d-4a8e-8b6c-1d7e0f9a2b34 are not part of cross ramp bulk 12a121ad-cbea-4ec4-9e0a-5c861e528bba"}}},"exampleType":"examples"}},"exampleType":"examples"},"8353a407-171c-4252-bfe7-d2fa40cfbce2":{"description":"Service Unavailable. Another invoice of the same bulk is being processed (the wait is about 2 seconds). Nothing is processed; wait a second or two and resend the request.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"code":{"type":"string","description":"Machine-readable error code.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","description":"Optional per-field validation details.","items":{"type":"object","properties":{"field":{"type":"string","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"}},"required":["success","code","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"CROSS_RAMP_BULK_INVOICE_BUSY":{"title":"CROSS_RAMP_BULK_INVOICE_BUSY","value":{"success":false,"code":"CROSS_RAMP_BULK_INVOICE_BUSY","message":"Another invoice of this bulk is being processed; retry in a moment"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"67247c4b-468a-4d71-a7ee-3537ec7a44a5":{"PartnerApiKey":{"type":"apiKey","in":"header","name":"partner-api-key","description":"API key for the affiliated partner performing the request.","scopes":[],"schemeName":"PartnerApiKey"}}},"servers":{"1f02e78b-1e88-4934-95b0-2b4a35fef7a5":{"url":"https://api.sandbox.capa.fi"},"9b7c0a4a-66ef-4ce6-8027-2edbfc7a2efd":{"url":"https://api.capa.fi"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"partner-api-key","description":"API key for the affiliated partner performing the request.","scopes":[],"schemeName":"PartnerApiKey"},"schema":{"title":"partner-api-key","type":"string","description":"API key for the affiliated partner performing the request.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"PartnerApiKey","name":"partner-api-key"}],"title":"PartnerApiKey"}]},"originalFileLocation":"reference/openapi/CrossRampPartnerV2Controller_uploadPartnerCrossRampBulkInvoices.json"},"subdomain":"capa","siteName":"Capa.fi","title":"Upload Bulk Cross-Ramp Invoices - Capa.fi","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-05T00:11:01.529Z","originalFileLocation":"reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices.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=\"system\"}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=\"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk\u0026#x27;s invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Capa.fi\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/capa/Gj5tlmaKVowjgoAW/_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/capa/Gj5tlmaKVowjgoAW/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/capa/Gj5tlmaKVowjgoAW/_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/capa/Gj5tlmaKVowjgoAW/_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/capa/Gj5tlmaKVowjgoAW/_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/capa/Gj5tlmaKVowjgoAW/_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/capa/Gj5tlmaKVowjgoAW/_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/capa/Gj5tlmaKVowjgoAW/_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/capa/Gj5tlmaKVowjgoAW/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Upload Bulk Cross-Ramp Invoices - Capa.fi\">\u003cmeta data-mint-head property=\"og:description\" content=\"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk\u0026#x27;s invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Capa.fi\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://capa.mintlify.app/_mintlify/api/og/v2?division=Cross-Ramp\u0026amp;title=Upload+Bulk+Cross-Ramp+Invoices\u0026amp;description=Uploads+the+commercial+invoices+%28Base64+PDFs%29+for+several+transactions+of+a+bulk+created+without+them.+Each+entry+is+processed+on+its+own%2C+in+request+order%2C+and\u0026amp;theme=8042dca758d2679cfe40adac\u0026amp;signature=510bf4b01d0ad421daf187e60b1eac5a204608b5acc6347d9ec6683ab32ae088\">\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=\"Upload Bulk Cross-Ramp Invoices - Capa.fi\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk\u0026#x27;s invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://capa.mintlify.app/_mintlify/api/og/v2?division=Cross-Ramp\u0026amp;title=Upload+Bulk+Cross-Ramp+Invoices\u0026amp;description=Uploads+the+commercial+invoices+%28Base64+PDFs%29+for+several+transactions+of+a+bulk+created+without+them.+Each+entry+is+processed+on+its+own%2C+in+request+order%2C+and\u0026amp;theme=8042dca758d2679cfe40adac\u0026amp;signature=510bf4b01d0ad421daf187e60b1eac5a204608b5acc6347d9ec6683ab32ae088\">\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/capa/Gj5tlmaKVowjgoAW/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Capa.fi\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#191f14\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.capa.fi/#organization\",\"name\":\"Capa.fi\",\"url\":\"https://docs.capa.fi\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/capa/sdievWamxx2n0U65/logo/logo.svg?fit=max\u0026auto=format\u0026n=sdievWamxx2n0U65\u0026q=85\u0026s=cd1c9b9fcff02ef9bd460d71d7823292\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.capa.fi#website\",\"name\":\"Capa.fi\",\"url\":\"https://docs.capa.fi\",\"publisher\":{\"@id\":\"https://docs.capa.fi/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices#webpage\",\"url\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices\",\"name\":\"Upload Bulk Cross-Ramp Invoices\",\"description\":\"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk's invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.\",\"dateModified\":\"2026-11-05T00:11:01.529Z\",\"isPartOf\":{\"@id\":\"https://docs.capa.fi#website\"},\"breadcrumb\":{\"@id\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Capa Partner API - V2\",\"item\":\"https://docs.capa.fi/reference/userpartnercontrollerv2_createuser\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cross-Ramp\",\"item\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_createpartnercrossramp\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Upload Bulk Cross-Ramp Invoices\",\"item\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices#apireference\",\"headline\":\"Upload Bulk Cross-Ramp Invoices\",\"name\":\"Upload Bulk Cross-Ramp Invoices\",\"description\":\"Uploads the commercial invoices (Base64 PDFs) for several transactions of a bulk created without them. Each entry is processed on its own, in request order, and gets its own result: one rejected invoice never blocks the others. The response is 200 whenever the request itself is valid, so always read every entry of results. A transaction whose invoice is accepted moves from WAITING_INVOICE to PENDING_FUNDS; the bulk is processed only when every transaction has its invoice and is funded, and the single payout to the provider is placed at that moment in every country (for China and Hong Kong the supporting document is one PDF merged from all the bulk's invoices). The stored invoices of one bulk may total at most 24 MiB decoded and 500 pages: an entry that would go over is an ERROR with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED, nothing is stored and the transaction stays WAITING_INVOICE (retry with a smaller or shorter file; cancelled transactions free their share). Each file is parsed: an unreadable or encrypted PDF, or one with 0 or more than 500 pages, is an ERROR with INVALID_COMMERCIAL_INVOICE. An ERROR with CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE is temporary: retry that entry after a short wait. If another invoice of the same bulk is being processed (the wait is about 2 seconds), the whole request fails with 503 CROSS_RAMP_BULK_INVOICE_BUSY and nothing is processed: wait a second or two and resend it. At most 25 entries and about 25 MiB of Base64 text per request: split larger sets across several requests. Envelope errors (400, 404) process nothing. Naturally idempotent: an invoice for a transaction that already passed the invoice step answers ALREADY_UPLOADED. This route does not support the Idempotency-Key header and requires bulk cross-ramp to be enabled for your environment.\",\"url\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices\",\"mainEntityOfPage\":{\"@id\":\"https://docs.capa.fi/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices#webpage\"},\"dateModified\":\"2026-11-05T00:11:01.529Z\",\"publisher\":{\"@id\":\"https://docs.capa.fi/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.capa.fi#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Capa.fi\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Capa.fi","nav":{"global":null,"tabs":[{"tab":"Guides","icon":"book-open","pages":[{"title":"Guides","href":"/docs/getting-started"}]},{"tab":"API Reference","icon":"Code","pages":[{"group":"Capa Partner API - V2","pages":[{"group":"Users","pages":[{"title":"Create User","openapi":"reference/openapi/UserPartnerControllerV2_createUser.json POST /api/partner/v2/users","href":"/reference/userpartnercontrollerv2_createuser"},{"title":"Start KYC","openapi":"reference/openapi/UserPartnerControllerV2_createUserKYC.json POST /api/partner/v2/users/{userId}/kyc","href":"/reference/userpartnercontrollerv2_createuserkyc"},{"title":"Create KYC Link","openapi":"reference/openapi/UserPartnerControllerV2_createVerificationLink.json POST /api/partner/v2/users/{userId}/kyc/verification-link","href":"/reference/userpartnercontrollerv2_createverificationlink"},{"title":"Create KYB Link","openapi":"reference/openapi/UserPartnerControllerV2_generateKYBVerificationLink.json POST /api/partner/v2/users/{userId}/kyb/verification-link","href":"/reference/userpartnercontrollerv2_generatekybverificationlink"},{"title":"Request Signature","openapi":"reference/openapi/UserPartnerControllerV2_requestDocumentSignature.json POST /api/partner/v2/users/{userId}/documents/sign","href":"/reference/userpartnercontrollerv2_requestdocumentsignature"}]},{"group":"KYC","pages":[{"title":"Get KYC Details","openapi":"reference/openapi/KYCPartnerControllerV2_getUserVerificationDetails.json GET /api/partner/v2/kyc/details","href":"/reference/kycpartnercontrollerv2_getuserverificationdetails"}]},{"group":"KYB","pages":[{"title":"Submit Business Profile","openapi":"reference/openapi/KYBPartnerControllerV2_submitBusinessProfile.json POST /api/partner/v2/kyb","href":"/reference/kybpartnercontrollerv2_submitbusinessprofile"},{"title":"Get KYB Details","openapi":"reference/openapi/KYBPartnerControllerV2_getUserKYBDetails.json GET /api/partner/v2/kyb/details","href":"/reference/kybpartnercontrollerv2_getuserkybdetails"}]},{"group":"Quotes","pages":[{"title":"Create Quote","openapi":"reference/openapi/QuotePartnerV2Controller_createPartnerQuote.json POST /api/partner/v2/quotes","href":"/reference/quotepartnerv2controller_createpartnerquote"},{"title":"Get Quote Rate","openapi":"reference/openapi/QuotePartnerV2Controller_getPartnerQuoteRate.json GET /api/partner/v2/quotes","href":"/reference/quotepartnerv2controller_getpartnerquoterate"}]},{"group":"On-Ramp","pages":[{"title":"Create On-Ramp","openapi":"reference/openapi/OnRampPartnerV2Controller_createPartnerOnRamp.json POST /api/partner/v2/on-ramp","href":"/reference/onramppartnerv2controller_createpartneronramp"}]},{"group":"Off-Ramp","pages":[{"title":"Create Off-Ramp","openapi":"reference/openapi/OffRampPartnerV2Controller_createPartnerOffRamp.json POST /api/partner/v2/off-ramp","href":"/reference/offramppartnerv2controller_createpartnerofframp"},{"title":"Execute Off-Ramp","openapi":"reference/openapi/OffRampPartnerV2Controller_executeOffRamp.json POST /api/partner/v2/off-ramp/execute","href":"/reference/offramppartnerv2controller_executeofframp"}]},{"group":"Cross-Ramp","pages":[{"title":"Create Cross-Ramp","openapi":"reference/openapi/CrossRampPartnerV2Controller_createPartnerCrossRamp.json POST /api/partner/v2/cross-ramp","href":"/reference/crossramppartnerv2controller_createpartnercrossramp"},{"title":"Create Bulk Cross-Ramp","description":"Create several cross-ramps for one user from a single quote, each funded and paid out on its own.","openapi":"reference/openapi/CrossRampPartnerV2Controller_createPartnerCrossRampBulk.json POST /api/partner/v2/cross-ramp/bulk","href":"/reference/crossramppartnerv2controller_createpartnercrossrampbulk"},{"title":"Upload Bulk Cross-Ramp Invoices","openapi":"reference/openapi/CrossRampPartnerV2Controller_uploadPartnerCrossRampBulkInvoices.json POST /api/partner/v2/cross-ramp/bulk/{bulkId}/invoices","href":"/reference/crossramppartnerv2controller_uploadpartnercrossrampbulkinvoices"},{"title":"Upload Cross-Ramp Invoice","openapi":"reference/openapi/CrossRampPartnerV2Controller_uploadPartnerCrossRampInvoice.json POST /api/partner/v2/cross-ramp/{id}/invoice","description":"Uploads the commercial invoice (Base64 PDF) for a cross-ramp in WAITING_INVOICE. On success the cross-ramp moves to PENDING_FUNDS. The response does not include funding instructions: read the cross-ramp to get sourceBankAccount. Naturally idempotent: repeating an upload after it succeeded returns 200 with the current status. This route does not support the Idempotency-Key header. Nothing is paid out for a cross-ramp until its invoice is uploaded, in every country; the payout to the provider is placed after the upload. The file is parsed as a real PDF: an unreadable or encrypted file, or one with 0 or more than 500 pages, is rejected with INVALID_COMMERCIAL_INVOICE (400). For a transaction of a bulk, the stored invoices of the bulk may total at most 24 MiB decoded and 500 pages: a file that would go over is rejected with CROSS_RAMP_BULK_INVOICE_BUDGET_EXCEEDED or CROSS_RAMP_BULK_INVOICE_PAGES_EXCEEDED (400), nothing is stored and the transaction stays WAITING_INVOICE. A 503 (CROSS_RAMP_BULK_INVOICE_BUSY after a wait of about 2 seconds, or CROSS_RAMP_BULK_INVOICE_SIZE_UNAVAILABLE) is temporary and stores nothing: wait a second or two and retry.","href":"/reference/crossramppartnerv2controller_uploadpartnercrossrampinvoice"},{"title":"Create Cross-Ramp Quote","openapi":"reference/openapi/CrossRampPartnerV2Controller_createPartnerCrossRampQuote.json POST /api/partner/v2/cross-ramp/quotes","href":"/reference/crossramppartnerv2controller_createpartnercrossrampquote"},{"title":"Get Cross-Ramp Rate","openapi":"reference/openapi/CrossRampPartnerV2Controller_getPartnerCrossRampQuoteRate.json GET /api/partner/v2/cross-ramp/quotes","href":"/reference/crossramppartnerv2controller_getpartnercrossrampquoterate"}]},{"group":"Associated Person Signatures","pages":[{"title":"Request Beneficial Owner Signatures","openapi":"reference/openapi/AssociatedPersonPartnerControllerV2_requestUboFormSignatures.json POST /api/partner/v2/users/{userId}/associated-persons/signatures","href":"/reference/associatedpersonpartnercontrollerv2_requestuboformsignatures"},{"title":"Get Beneficial Owner Signature Status","openapi":"reference/openapi/AssociatedPersonPartnerControllerV2_listUboFormSignatures.json GET /api/partner/v2/users/{userId}/associated-persons/signatures","href":"/reference/associatedpersonpartnercontrollerv2_listuboformsignatures"}]},{"group":"Transactions","pages":[{"title":"Cancel Transaction","openapi":"reference/openapi/TransactionPartnerV2Controller_cancelPartnerTransaction.json PUT /api/partner/v2/transactions/{id}/cancel","href":"/reference/transactionpartnerv2controller_cancelpartnertransaction"},{"title":"List Transactions","openapi":"reference/openapi/TransactionPartnerV2Controller_listPartnerUserTransactions.json GET /api/partner/v2/transactions","href":"/reference/transactionpartnerv2controller_listpartnerusertransactions"},{"title":"Mock Testing Guide","openapi":"reference/openapi/TransactionPartnerV2Controller_getMockTestingGuide.json GET /api/partner/v2/transactions/mock-testing-guide","href":"/reference/transactionpartnerv2controller_getmocktestingguide"}]},{"group":"Bank Accounts","pages":[{"title":"List Bank Accounts (User)","openapi":"reference/openapi/UserBankInfoPartnerV2Controller_getUserBankInfosByUserId.json GET /api/partner/v2/banks/users/{userId}/accounts","href":"/reference/userbankinfopartnerv2controller_getuserbankinfosbyuserid"},{"title":"Add Bank Account (User)","openapi":"reference/openapi/UserBankInfoPartnerV2Controller_createUserBankInfoByUserId.json POST /api/partner/v2/banks/users/{userId}/accounts","href":"/reference/userbankinfopartnerv2controller_createuserbankinfobyuserid"},{"title":"Delete Bank Account (User)","openapi":"reference/openapi/UserBankInfoPartnerV2Controller_deleteUserBankInfoByUserId.json DELETE /api/partner/v2/banks/users/{userId}/accounts/{userBankInfoId}","href":"/reference/userbankinfopartnerv2controller_deleteuserbankinfobyuserid"}]},{"group":"Virtual Accounts","pages":[{"title":"Get Virtual Account Status (User)","openapi":"reference/openapi/BankingOnboardingPartnerV2Controller_getOnboardingStatus.json GET /api/partner/v2/banks/users/{userId}/banking-onboarding","href":"/reference/bankingonboardingpartnerv2controller_getonboardingstatus"},{"title":"Request Virtual Account (User)","openapi":"reference/openapi/BankingOnboardingPartnerV2Controller_requestOnboarding.json POST /api/partner/v2/banks/users/{userId}/banking-onboarding","href":"/reference/bankingonboardingpartnerv2controller_requestonboarding"}]},{"group":"Wallets","pages":[{"title":"List Wallets","openapi":"reference/openapi/WalletAddressPartnerV2Controller_listUserWallets.json GET /api/partner/v2/users/{userId}/wallets","href":"/reference/walletaddresspartnerv2controller_listuserwallets"},{"title":"Create Wallet","openapi":"reference/openapi/WalletAddressPartnerV2Controller_createUserWallet.json POST /api/partner/v2/users/{userId}/wallets","href":"/reference/walletaddresspartnerv2controller_createuserwallet"},{"title":"Delete Wallet","openapi":"reference/openapi/WalletAddressPartnerV2Controller_deleteUserWallet.json DELETE /api/partner/v2/users/{userId}/wallets/{walletId}","href":"/reference/walletaddresspartnerv2controller_deleteuserwallet"},{"title":"Get Wallet Balances","openapi":"reference/openapi/UserBalancePartnerV2Controller_getUserWalletBalances.json GET /api/partner/v2/users/{userId}/wallets/balance","href":"/reference/userbalancepartnerv2controller_getuserwalletbalances"}]},{"group":"Webhooks · Settings","pages":[{"title":"Update Webhook Settings","openapi":"reference/openapi/PartnerWebhookSettingsV2Controller_update.json PUT /api/partner/v2/webhook-settings","href":"/reference/partnerwebhooksettingsv2controller_update"}]},{"group":"Webhooks · Notifications","pages":[{"title":"List Webhooks","openapi":"reference/openapi/PartnerWebhookNotificationV2Controller_listWebhookNotifications.json GET /api/partner/v2/webhook-notifications","href":"/reference/partnerwebhooknotificationv2controller_listwebhooknotifications"},{"title":"Get Webhook","openapi":"reference/openapi/PartnerWebhookNotificationV2Controller_getWebhookNotificationDetail.json GET /api/partner/v2/webhook-notifications/{id}","href":"/reference/partnerwebhooknotificationv2controller_getwebhooknotificationdetail"},{"title":"Retry Webhook","openapi":"reference/openapi/PartnerWebhookNotificationV2Controller_retry.json POST /api/partner/v2/webhook-notifications/{id}/retry","href":"/reference/partnerwebhooknotificationv2controller_retry"}]}]}]},{"tab":"Changelog","icon":"megaphone","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Upload Bulk Cross-Ramp Invoices - Capa.fi","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DX1Meug0.js","utils-B_OMIQVC.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-ChxhRPMa.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CuKvD8Iv.js","snippetPresets-C5d7p2hp.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CfHcE8m4.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C1zZV314.js","shallow-CmQhqCJn.js","getApiPlaygroundDisplay-YRo9s1O7.js","CodeSnippet-RN1MTdfk.js","CodeSnippets-DKLPHxJA.js","Page-BAvA99GL.js","getPastedJson-bz0M41mU.js","icon-CsmhpPrv.js","MethodPill-CNGsVE77.js","DuplicateIcon-DilfU_Z2.js","createIcon-BdsYzQck.js","DynamicMarkdown-CbqEDjbV.js","SectionHeading-O6hXpFCN.js","axios-vUo_bRtp.js","Markdown-nKm-uidQ.js","clsx-ClVdStUn.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CIQkMg3R.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-ImrFS4Fy.js"]}