Skip to main content
POST
cURL
Creates several cross-ramp transactions from one cross-ramp quote, for a single verified user paying several beneficiaries. The quote’s exchange is executed once, for the total, and each transaction is then funded and paid out on its own.
Bulk cross-ramp is enabled on request. Ask your Capa contact to enable it for your sandbox and production environments; until then this endpoint returns 404.

Idempotency

Retry safely without creating a duplicate bulk: pass an optional Idempotency-Key header (UUIDv4). A retry with the same key and body replays the original response. See the Idempotency Guide for the full contract.

Field Relationships

  • One quote for the total. Create it with Create Cross-Ramp Quote for the sum of all the transactions, with bulkTransactionCount set to the number of transactions. Exactly one side of the quote must be USD: for example MXN→USD (including USD delivered to CN/HK) or USD→MXN. A quote where neither side is USD is rejected.
  • The quote fixes the currencies and the source route, as on the single endpoint with a quoteId. The body has no sourceCurrency, targetCurrency, premiumSpread or forwardingDays.
  • Size every transaction on the quote’s non-USD side, using the same field the quote was created with:
    • quote targets USD (e.g. MXN→USD): create the quote with sourceAmount, and give every transaction a sourceAmount;
    • quote starts from USD (e.g. USD→MXN): create the quote with targetAmount, and give every transaction a targetAmount.
    The amounts must add up exactly to the quote’s amount on that side.
  • 2 to 50 transactions per bulk. Every transaction gives either targetBankAccount or targetBankAccountId.
  • Beneficiaries may differ. One bulk can pay, for example, US and CN beneficiaries under the same MXN→USD quote. targetCountry, targetRail, invoiceFile and reference work per transaction exactly as on Create Cross-Ramp.
  • invoiceFile is required for CN and HK beneficiaries. The whole request, every invoice included, must stay under 25 MB.

Fees

Each transaction pays the fixed fee of its own USD leg, for its own route (for example a CN SWIFT payout and a US payout differ). The quote already nets one such fee per transaction, priced for the quote’s route, because you set bulkTransactionCount. When every transaction uses that route, their payouts add up exactly to the quote’s targetAmount:
  • Quote targets USD: the fee comes out of that transaction’s USD payout.
  • Quote starts from USD: the fee is added to that transaction’s USD deposit.
The fee of the non-USD leg, which runs once for the total, is shared across the transactions in proportion to their amounts. Each transaction in the response shows its own sourceAmount, targetAmount and fees.

Funding

Every transaction in the response has its own sourceBankAccount, and is funded with its own deposit for its own sourceAmount. For MXN deposits by SPEI, put the transaction’s sourceBankAccount.message (its id) in the concepto, so each deposit is matched to the right transaction. Nothing is executed with the liquidity provider until every transaction in the bulk is funded. A transaction that is never funded holds the whole bulk; contact Capa support to resolve it.

Integration Flow

1

Create a user and complete KYC

2

Get one cross-ramp quote for the total

POST /api/partner/v2/cross-ramp/quotes, priced on the non-USD side, with bulkTransactionCount set to the number of transactions
3

Create the bulk

POST /api/partner/v2/cross-ramp/bulk (this endpoint), before the quote expires
4

Fund each transaction

One deposit per transaction to its sourceBankAccount. For SPEI, use its message as the concepto.
5

Track each transaction

Each transaction moves through the normal cross-ramp statuses and sends its own webhooks.

Important Notes

  • User must be KYC-verified before creating transactions.
  • Each transaction is a normal cross-ramp. It has its own id, statuses, webhooks and proof of payment, and it appears in transaction listings like any other cross-ramp. Group them with the bulkId and quoteId returned here.
  • Amount limits apply to each transaction, including the 10–10,000 USD range for USD delivered to CN/HK.
  • The quote is consumed by the bulk. It cannot be reused for another bulk or a single cross-ramp.

Error Codes

Common Errors

Verified User Errors

Endpoint-Specific Errors

A transaction can also fail with any error of Create Cross-Ramp, such as an invalid or foreign bank account. In that case nothing is created and the quote is consumed, so request a new quote before retrying.

Authorizations

partner-api-key
string
header
required

API key for the affiliated partner performing the request.

Headers

Idempotency-Key
string

Optional. Unique key (UUIDv4 recommended) to safely retry this request without creating a duplicate transaction. A retry with the same key and body replays the original response. See /docs/idempotency.

Required string length: 16 - 128
Example:

"550e8400-e29b-41d4-a716-446655440000"

Body

application/json
userId
string
required

User's identifier

Example:

"12a121ad-cbea-4ec4-9e0a-5c861e528bba"

quoteId
string
required

A cross-ramp quote for the total of all the transactions. Its currencies and source route apply to every transaction. Exactly one side of the quote must be USD.

Example:

"12a121ad-cbea-4ec4-9e0a-5c861e528bbb"

transactions
object[]
required

One entry per beneficiary. Each becomes its own cross-ramp, funded and paid out separately.

Required array length: 2 - 50 elements

Response

Bulk created. Returns one cross-ramp per requested transaction, in request order, each funded through its own sourceBankAccount.

success
boolean
Example:

true

data
object