Skip to main content

Create BRE-B disbursement

The disbursement creation endpoint allows you to send payments to beneficiaries identified by their BRE-B key, without needing to know traditional banking details (bank, account type, account number). It also supports mixed batches where BRE-B transactions and bank transactions are combined in a single request.

Best practice

Before creating a BRE-B disbursement, use the preview endpoint to resolve the key and confirm the beneficiary with your user. This reduces failed payments.

Endpoint

POST /v2/payouts
Base URL

Production:

https://api.payouts.wompi.co/v2

Sandbox:

https://api.sandbox.payouts.wompi.co/v2

Headers

HeaderRequiredDescription
x-api-keyYesMerchant API Key for authentication
user-principal-idYesUnique user identifier (UUID)
idempotency-keyYesUnique key to prevent duplicate payments. Only letters, numbers and hyphens. Maximum 64 characters. Expires in 24 hours.
Content-TypeYesapplication/json
business-application-idNoBusiness application identifier. Value: WOMPI_PAYOUTS
x-api-key: exMsrSQwTL2vgrIQ2RdNL5MOlmNfOt7taSyMgzlJ
user-principal-id: 63416484-e3e2-48ff-8f0d-20877cd0d161
idempotency-key: payout-breb-unique-key-001
Content-Type: application/json

Request body

Batch fields

FieldTypeRequiredDescription
referencestringYesUnique payment batch reference
accountIdstringYesSource account ID. Obtain from GET /accounts endpoint
paymentTypestringYesPayment type: PAYROLL, PROVIDERS, OTHER
transactionsarrayYesList of transactions in the batch (minimum 1)
dispersionDatetimestringNoScheduled date in YYYY-MM-DDTHH:mm format. If not sent, payment is immediate
recurringobjectNoRecurrence configuration (see Recurring payments)

BRE-B transaction fields

To send a payment using a BRE-B key, use the key field instead of traditional banking fields.

FieldTypeRequiredDescription
keystringYesBeneficiary's BRE-B key. When this field is sent, bankId, accountType and accountNumber are not required
amountintegerYesAmount in cents (COP). Must be positive. E.g.: $1,000 = 100000
namestringYesBeneficiary name
emailstringYesBeneficiary email address
legalIdTypestringNoDocument type: CC, CE, NIT, PP, TI, DNI
legalIdstringNoBeneficiary document number
phonestringNoBeneficiary phone number
descriptionstringNoPayment description
personTypestringNoPerson type: NATURAL, JURIDICA
referencestringNoIndividual transaction reference. Maximum 40 characters, only letters, numbers and hyphens
Difference from bank payment

In a traditional bank payment, you send bankId, accountType, accountNumber, legalIdType and legalId. With BRE-B, the key field replaces the banking data. The system resolves the key and routes the payment automatically.

Immediate payments

Example of an immediate disbursement with BRE-B key:

{
"reference": "payout-breb-001",
"accountId": "84a339e8-c277-45bd-b652-50f0b689edf7",
"paymentType": "PROVIDERS",
"transactions": [
{
"amount": 150000,
"name": "Juan Perez",
"email": "juan@example.com",
"key": "@juanperez"
}
]
}

Example with multiple BRE-B transactions

{
"reference": "payout-breb-002",
"accountId": "84a339e8-c277-45bd-b652-50f0b689edf7",
"paymentType": "PAYROLL",
"transactions": [
{
"amount": 250000,
"name": "Juan Perez",
"email": "juan@example.com",
"key": "@juanperez"
},
{
"amount": 180000,
"name": "Maria Lopez",
"email": "maria@example.com",
"key": "maria@email.com"
},
{
"amount": 320000,
"name": "Carlos Gomez",
"email": "carlos@example.com",
"key": "3001234567"
}
]
}

Mixed batch example (BRE-B + bank account)

You can combine BRE-B and bank transactions in the same batch:

{
"reference": "payout-mixed-001",
"accountId": "84a339e8-c277-45bd-b652-50f0b689edf7",
"paymentType": "PROVIDERS",
"transactions": [
{
"amount": 150000,
"name": "Juan Perez",
"email": "juan@example.com",
"key": "@juanperez"
},
{
"amount": 250000,
"name": "Carlos Gomez",
"email": "carlos@example.com",
"legalIdType": "CC",
"legalId": "1234567890",
"bankId": "9183a03b-cd82-451a-a6c7-6a9ab406a477",
"accountType": "AHORROS",
"accountNumber": "9876543210"
}
]
}

Scheduled payments

To schedule a payment for a future date, add the dispersionDatetime field:

{
"reference": "payout-breb-scheduled-001",
"accountId": "84a339e8-c277-45bd-b652-50f0b689edf7",
"paymentType": "PROVIDERS",
"dispersionDatetime": "2025-07-15T10:00",
"transactions": [
{
"amount": 500000,
"name": "Juan Perez",
"email": "juan@example.com",
"key": "@juanperez"
}
]
}
info

The scheduled date must be at least the next day after the request. Otherwise, the payment is rejected.

Recurring payments

To create recurring payments, add dispersionDatetime and the recurring object:

FieldTypeRequiredDescription
recurring.intervalstringYesInterval: biweek (biweekly), month (monthly)
recurring.monthsintegerYesDuration in months: 3, 6, 12
recurring.descriptionstringNoRecurrence description
{
"reference": "payout-breb-recurring-001",
"accountId": "84a339e8-c277-45bd-b652-50f0b689edf7",
"paymentType": "PAYROLL",
"dispersionDatetime": "2025-07-15T10:00",
"recurring": {
"interval": "month",
"months": 6,
"description": "Monthly payment to provider"
},
"transactions": [
{
"amount": 350000,
"name": "Juan Perez",
"email": "juan@example.com",
"key": "@juanperez"
}
]
}

Successful response

HTTP 201 Created

{
"status": 201,
"meta": {
"trace_id": "6fbfdee0-1ed8-11f0-acf5-eb60899d3e82"
},
"code": "OK",
"message": "Solicitud ejecutada correctamente.",
"data": {
"payoutId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transactions": 3,
"success": 3,
"failed": 0
}
}
FieldDescription
data.payoutIdUnique identifier for the created batch (UUID)
data.transactionsTotal transactions sent in the batch
data.successTransactions accepted for processing
data.failedTransactions rejected by validation

Error responses

400 — Validation error

Returned when required fields are missing or have an invalid format.

{
"status": 400,
"meta": {
"trace_id": "6fbfdee0-1ed8-11f0-acf5-eb60899d3e82"
},
"code": "400",
"message": [
"reference must be a string",
"reference should not be empty"
],
"data": {
"message": [
"reference must be a string",
"reference should not be empty"
],
"error": "Bad Request",
"statusCode": 400
}
}

Invalid idempotency key

{
"status": 400,
"meta": {
"trace_id": "6fbfdee0-1ed8-11f0-acf5-eb60899d3e82"
},
"code": "400",
"message": [
"The key can only contain letters, numbers, and hyphens"
],
"data": {
"message": [
"The key can only contain letters, numbers, and hyphens"
],
"error": "Bad Request",
"statusCode": 400
}
}

Recommended action: Verify that all required fields are present and correctly formatted. The idempotency-key only accepts letters, numbers and hyphens.

401 — Unauthorized

Returned when the x-api-key is invalid or was not provided.

{
"message": "Unauthorized"
}

Recommended action: Verify that you are sending the correct x-api-key in the headers.

403 — Forbidden

Returned when the payer is not registered, does not have permissions or does not have an active product.

{
"status": 403,
"meta": {
"trace_id": "6fbfdee0-1ed8-11f0-acf5-eb60899d3e82"
},
"code": "403",
"message": "Payer not found",
"data": {
"message": "Payer not found",
"error": "Forbidden",
"statusCode": 403
}
}

Possible messages:

  • Payer not found — The user-principal-id does not correspond to a registered payer
  • Customer is employed and not allowed — The client does not have disbursement permissions
  • Payer not have active product — The payer does not have the Third-Party Payments product active

Recommended action: Verify that the user-principal-id corresponds to an active payer with the Third-Party Payments product enabled.

409 — Duplicate idempotency

Returned when the idempotency-key has already been processed.

{
"status": 409,
"meta": {
"trace_id": "6fbfdee0-1ed8-11f0-acf5-eb60899d3e82"
},
"code": "EXC_032",
"message": "La llave de idempotencia ya fue procesada.",
"type": "Business"
}

Recommended action: Use a new idempotency-key. Each key expires in 24 hours and cannot be reused within that period.

500 — Internal error

Returned when an unexpected server error occurs.

{
"status": 500,
"meta": {
"trace_id": "6fbfdee0-1ed8-11f0-acf5-eb60899d3e82"
},
"code": "EXC_001",
"message": "Se presentó error interno procesando la solicitud."
}

Recommended action: Retry the request. If the error persists, contact support with the trace_id.

Supported BRE-B key types

TypeFormatExample key
Alphanumeric@ + 5 to 20 alphanumeric characters@JUANPEREZ
EmailValid emailjuan@email.com
Phone10 digits, starts with 33001234567
Identification document1 to 18 alphanumeric characters1234567890
Establishment code8 digits12345678

Considerations

  • Idempotency: Each request must include a unique idempotency-key. If the same key is sent within 24 hours, a 409 error is returned.
  • Amounts in cents: The amount field is expressed in COP cents. For example, $10,000 COP is represented as 1000000.
  • Mixed batches: A single batch can contain BRE-B transactions (with key) and bank transactions (with bankId + accountType + accountNumber).
  • Key validation: The system resolves the BRE-B key when processing the transaction. If the key is not valid or not active, the individual transaction will be rejected.
  • Limits: The same transactional limits apply as for bank disbursements. Check GET /limits.
  • Source account: The accountId must correspond to an active payer account. Check GET /accounts.