Disbursing payments with Bre-B means delivering funds in real time to your users using only the recipient's payment key — without needing to know their bank account number. The key can be their national ID, phone number, email address, alphanumeric alias, or merchant code.
Beta version product 🔐👨We are working on our beta version. Stay tuned for the official launch! You can also contact your account manager for more information.
Ideal for:
Supplier or vendor payments
Marketplaces
Delivery applications
Gig economy platforms
Refunds and compensations
Important
Available exclusively for Colombia with the Bre-B processor configured on your MID. Due to our risk policies, available payment methods and integration types may vary at the time of onboarding. We will let you know how to proceed if this applies to your business.
The Bre-B disbursement process in Colombia follows this flow: Merchant → Kushki → Banco de la República (SPBVI) → Receiving Bank → Beneficiary.
Parameter
Detail
Minimum amount per transaction
1 COP
Maximum amount per transaction
Equivalent to 1,000 UVT (Tax Value Units, updated annually by the DIAN). Each financial institution or user may set lower daily or per-transaction limits.
Currency
COP
Available banks
All Colombian banks (Banco de la República regulation)
API processing hours
24/7
Settlement time
Real-time (maximum 30 seconds from initiation)
Response type
Asynchronous — the final result is delivered via webhook or by querying the Get Status endpoint
Important note: The Kushki API accepts and processes requests 24/7. Unlike ACH, Bre-B does not use banking cycles — processing is real-time through the SPBVI of the Banco de la República. You do not need to query the bank list before tokenizing.
The first step is to obtain a token by sending the recipient's key to Kushki. Unlike ACH, you do not need to query the bank list before this step — all Colombian banks support key-based transfers by Banco de la República regulation.You must make the token request using our tokenization endpoint.
The accountNumber format is validated before sending any request to the payment network (fail-fast). An invalid format returns HTTP 400 immediately, without reaching the network.
accountType
Required format for accountNumber
KI
Uppercase alphanumeric characters. Minimum 1 character. No spaces or special characters.
KP
Exactly 10 digits. Must start with 3, followed by 9 digits.
KE
Valid email address. Maximum 30 characters before @ and 61 after. Must include a valid domain.
KA
Must start with @. Uppercase alphanumeric characters only. No spaces or special characters.
KM
Exactly 10 digits. Must start with 00, followed by 8 digits.
JavaScript
Python
PHP
The response includes the token and the keyResolution object with the recipient's data resolved by the payment network:
Once you have obtained the token and the keyResolution object, you must show the operator or end user the recipient's information to confirm it is correct before initializing the transaction. This step is required by the Banco de la República.Show the operator or user:
The key value: keyResolution.keyValue
The account holder name: keyResolution.ownerName (masked, e.g. M**** G**** L****)
Keep in mind that you may not know the name of the key holder (for example, if you only have an ID number). The payment network resolves the name associated with that key so the user can confirm the recipient's identity. Only proceed to the next step after receiving explicit confirmation.
Once the recipient's data has been confirmed, you must send the obtained token to start the disbursement process with Kushki. You must make a call to our initialization endpoint to start the payment. This step deducts the balance immediately from your disbursement account.
Check your balance before initializing
Check your merchant funds in Kushki before initiating. You can verify your balance in the Console or using the Balance for Payouts endpoint.
Note that the webhooks field in the Init request body must be sent as an array. Wrap your configuration object in square brackets [ ].
JavaScript
Python
PHP
See our API Reference for more information on available response fields, including fullResponse V2 where the keyResolution object is included inside details.
The response delivers a ticket number and the transaction status:
The transaction status is automatically notified at the moment the transfer is approved or declined. The payload includes the keyResolution object with keyValue and ownerName.
To configure a webhook on your test merchant, you must notify our agents specifying the URL and the payment method via email. When you receive the notification, always respond with HTTP 200.
You can use our Get Status endpoint to manually query the status of a specific transaction.
JavaScript
Python
PHP
For Bre-B transactions, the fields bankId, documentNumber, and documentType return empty or null in the response. Recipient information will only be available in the keyResolution object.
The Bre-B UAT environment runs on a payment network sandbox. Responses are simulated and replicate production behavior, but do not generate real money movements or network operations.
The test values below are exclusive to the UAT environment (api-uat.kushkipagos.com). Do not use them in production.
Use these values to obtain a token with a resolved keyResolution. All of them return an approved transaction.
accountType
Test accountNumber
Simulated keyResolution.ownerName
KP
3001234567
JUAN PEREZ
KE
USUARIO@CORREO.COM
MARIA LOPEZ
KA
@COLOMBIA
ANA MARTINEZ
KM
0012345678
COMERCIO PRINCIPAL SAS
KI
CC12345678
LUIS GOMEZ
ownerName in UAT
In the sandbox, keyResolution.ownerName is returned unmasked to make verification easier during development. In production, the name always arrives masked (e.g. J*** P****).
To simulate error responses in payment processing, send the exact value indicated in the totalAmount field of the tokenization request. If the amount does not match any value in the table, the transaction will result in approved.
These are simulations only
These amounts have no economic meaning. They are only scenario identifiers within the sandbox. Do not use them in production.
Synchronous errors — returned directly in the /init endpoint response, without waiting for the webhook:
totalAmount
Kushki responseCode
Description
4001
002
An unexpected error occurred
4002
068
Invalid amount
5001
073
Transaction not permitted
5003
074
Bank or account not registered
Asynchronous errors — delivered via webhook or when querying Get Status, after /init returns INITIALIZED: