Payment disbursement to bank accounts
Disburse payments to your customers' or vendor's bank accounts
Payment disbursement by wire transfer consists of sending money to your customers’ accounts. In other words, if you have their bank details, you can use your Kushki disbursement account and send the money to their accounts by wire transfer, using whatever logic you prefer.
This is ideal for:
- Payments for suppliers or sellers
- Marketplaces
- Delivery applications
Operation Details
The payout process in Peru follows this flow: Merchant > Kushki > Processor > Recipient.
Parameter | Detail |
---|---|
Processing hours | Monday–Friday, 7:00 a.m. – 8:00 p.m.; Saturdays, 7:00 a.m. – 2:30 p.m.; Sundays and holidays: no processing. |
Processing days | Monday–Saturday |
Time to credit BCP account | Up to 40 minutes after BCP processes the payment. |
Time to credit other banks | - Amount < S/. 420 000: • Sent before 12:00 p.m.: credited same day. • Sent after 12:00 p.m.: credited next business day. - Amount ≥ S/. 420 000: • Sent before 12:30 p.m.: credited same day. • Sent after 12:30 p.m.: credited next business day. |
Final status notification | The bank notifies when funds have been credited (max. 40 minutes after processing). |
Minimum transaction amount | S/. 1.00 |
Maximum transaction amount | To BCP accounts: no limit To other banks: S/. 420 000 |
Recipient account types | Individual and corporate accounts |
Supported currencies
The transfer out service in Peru is available in local currency (PEN).
Flow
The flow that you will integrate is shown below:
Here you will learn how to integrate money distributions by wire transfer.
1. Obtain the list of partner banks
The first step is to check the list of banks available to make the wire transfer. To do so, you must use this endpoint, which will show you the banking institutions available to make the transaction.
- Javascript
- Python
- PHP
var request = require('request');var bankList = [];var options = {'method': 'GET','url': 'https://api-uat.kushkipagos.com/payouts/transfer/v1/bankList', // Test environment'headers': {'Public-Merchant-Id': '' // Replace with your Public Key}};request(options, function (error, response) {if (error) throw new Error(error);console.log(response.body);bankList = response.body;// Submit your code to filter the bank you need and send its id in token request});
import requestsurl = "https://api-uat.kushkipagos.com/payouts/transfer/v1/bankList" // Test environmentbankList = []payload = {}headers = {'Public-Merchant-Id': '' // Replace with your Public Key}response = requests.request("GET", url, headers=headers, data = payload)print(response.text.encode('utf8'))bankList = response.text// Submit your code to filter the bank you need and send its id in token request
$client = new http\Client;$request = new http\Client\Request;$request->setRequestUrl('https://api-uat.kushkipagos.com/payouts/transfer/v1/bankList'); // Test environment$request->setRequestMethod('GET');$request->setOptions(array());$request->setHeaders(array('Public-Merchant-Id' => '' // Replace with your Public Key));$client->enqueue($request)->send();$response = $client->getResponse();echo $response->getBody();bankList = $response->getBody();// Submit your code to filter the bank you need and send its id in token request
In response to this call, you will receive the name
and code
of the available banks. The latter must be sent in the transfer out token request.
Below is an example of the response to this call:
[{"code": "093","name": "FINANCIERA QAPAQ"},{"code": "023","name": "BANCO DE COMERCIO"},{"code": "011","name": "BBVA PERÚ"},{"code": "007","name": "CITIBANK DEL PERÚ S.A."},{"code": "058","name": "ALFIN BANCO S.A."},{"code": "808","name": "CMAC HUANCAYO"},{"code": "038","name": "BANCO INTERAMERICANO DE FINANZAS"},{"code": "096","name": "FINANCIERA EFECTIVA"},{"code": "094","name": "FINANCIERA OH"},{"code": "003","name": "INTERBANK"},{"code": "009","name": "SCOTIABANK PERÚ S.A.A."},{"code": "803","name": "CMAC AREQUIPA"},{"code": "809","name": "CMAC ICA"},{"code": "836","name": "CAJA RAIZ"},{"code": "091","name": "COMPARTAMOS FINANCIERA S.A."},{"code": "056","name": "BANCO SANTANDER PERU"},{"code": "055","name": "BANCO RIPLEY"},{"code": "062","name": "BANK OF CHINA"},{"code": "805","name": "CMAC SULLANA"},{"code": "049","name": "MIBANCO, BANCO DE LA MICROEMPRESA S.A."},{"code": "002","name": "BANCO DE CRÉDITO DEL PERÚ"},{"code": "800","name": "CAJA METROPOLITANA"},{"code": "060","name": "ICBC PERÚ BANK"},{"code": "813","name": "CMAC TACNA"},{"code": "801","name": "CMAC PIURA"},{"code": "806","name": "CMAC CUSCO"},{"code": "035","name": "BANCO PICHINCHA"},{"code": "099","name": "FINANCIERA CONFIANZA"},{"code": "802","name": "CMAC TRUJILLO"},{"code": "811","name": "CMAC MAYNAS"},{"code": "043","name": "CREDISCOTIA FINANCIERA S.A."},{"code": "053","name": "BANCO GNB PERU"},{"code": "018","name": "BANCO DE LA NACIÓN"},{"code": "054","name": "BANCO FALABELLA PERÙ S.A."},{"code": "063","name": "BANCO BCI PERU S.A."}]
2. Tokenize the information
After obtaining the bank code of the account where the transfer will be received, you have to request a token by using our transfer out token request endpoint.
Document Type and Number
In this token request, you must include, among other details, the type (documentType
) and number (documentNumber
) of the recipient:
CE
: Foreign Identification Card. Up to 12 characters.DNI
: Peruvian National Identity Document, 8 characters.PAS
: Passport. Up to 12 characters.RUC
: Tax ID. Up to 11 characters.
Account Type and Number
You must also include the account type (accountType
) and account number (accountNumber
):
CC
: checking account.CA
: savings account.CM
: master account.
Disbursement to BCP
If the BankId
(the code
, received in the previous step) is 002
, which corresponds to BCP or Banco de Crédito del Perú, the following specifications must be considered:
- If
BankId
is002
andaccountType
isCC
, theaccountNumber
must have 13 digits. - If
BankId
is002
andaccountType
isCA
, theaccountNumber
must have 14 digits.
Disbursement to Banks Other Than BCP
If the BankId
value is different from 002
, you are required to provide the CCI (Código de Cuenta Interbancaria). This must contain exactly 20 digits and be presented without spaces, hyphens, or special characters.
- Javascript
- Python
- PHP
var request = require('request');var options = {'method': 'POST','url': 'https://api-uat.kushkipagos.com/payouts/transfer/v1/tokens', // Test environment'headers': {'Public-Merchant-Id': '', // Replace with you Public Key'Content-Type': 'application/json'},body: JSON.stringify({"name":"John Doe","documentNumber":"19885521","accountNumber":"06","accountType":"CA","bankId":"002","totalAmount":30,"documentType":"RUC","currency":"PEN","paymentDescription": "A short description of the payment","mail": "user@example.com"})};request(options, function (error, response) {if (error) throw new Error(error);console.log(response.body);// Submit your code to send the token you received to the next request});
import requestsurl = "https://api-uat.kushkipagos.com/payouts/transfer/v1/tokens"payload = {"documentNumber": "70274647","accountNumber": "00230513322677808816","accountType": "CA","bankId": "002","totalAmount": 30,"documentType": "DNI","currency": "PEN","paymentDescription": "A short description of the payment","name": "Prueba Peru","mail": "user@example.com"}headers = {"Public-Merchant-Id": "","Content-Type": "application/json","Accept": "application/json"}response = requests.post(url, json=payload, headers=headers)print(response.json())
<?php$curl = curl_init();curl_setopt_array($curl, [CURLOPT_URL => "https://api-uat.kushkipagos.com/payouts/transfer/v1/tokens",CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => "",CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 30,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => "POST",CURLOPT_POSTFIELDS => json_encode(['documentNumber' => '70274647','accountNumber' => '00230513322677808816','accountType' => 'CA','bankId' => '002','totalAmount' => 30,'documentType' => 'DNI','currency' => 'PEN','paymentDescription' => 'A short description of the payment','name' => 'Prueba Peru','mail' => 'user@example.com']),CURLOPT_HTTPHEADER => ["Accept: application/json","Content-Type: application/json","Public-Merchant-Id: "],]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) {echo "cURL Error #:" . $err;} else {echo $response;}
3. Initialize the transaction
In this step, you should have obtained a token, and then you will be able to start the distribution process with Kushki. You will need to make a call to our initialization endpoint to process the payment.
- Javascript
- Python
- PHP
var request = require('request');var options = {'method': 'POST','url': 'https://api-uat.kushkipagos.com/payouts/transfer/v1/init', // Test environment'headers': {'Private-Merchant-Id': '', // Replace with your Private Key'Content-Type': 'application/json'},body: JSON.stringify({"amount":{"subtotalIva":0,"subtotalIva0":100,"iva":0},"token":"53de1cb6bbb54011a0a98053d48677e0" // Replace with the token you received})};request(options, function (error, response) {if (error) throw new Error(error);console.log(response.body);});
import requestsurl = "https://api-uat.kushkipagos.com/payouts/transfer/v1/init" // Test environmentpayload = "{\n \"amount\": {\n \"subtotalIva\": 0,\n \"subtotalIva0\": 100,\n \"iva\": 0\n },\n \"token\": \"53de1cb6bbb54011a0a98053d48677e0\"\n}" // Replace with the token you receivedheaders = {'Private-Merchant-Id': '', // Replace with your Private Key'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data = payload)print(response.text.encode('utf8'))
$client = new http\Client;$request = new http\Client\Request;$request->setRequestUrl('https://api-uat.kushkipagos.com/payouts/transfer/v1/init'); // Test environment$request->setRequestMethod('POST');$body = new http\Message\Body;$body->append('{"amount": {"subtotalIva": 0,"subtotalIva0": 100,"iva": 0},"token": "53de1cb6bbb54011a0a98053d48677e0" // Replace with the token you received}');$request->setBody($body);$request->setOptions(array());$request->setHeaders(array('Private-Merchant-Id' => '', // Replace with your Private Key'Content-Type' => 'application/json'));$client->enqueue($request)->send();$response = $client->getResponse();echo $response->getBody();
In the response, a ticket number and a status are issued for the transaction.
4. Track the transaction status (optional)
Now that the transfer is close to being processed, you can check the transaction status via webhooks or manually, by using our API.
Webhook
The transaction status is automatically notified when the money has been deposited in the bank account.
API
In our API, you can use our Get Status endpoint to manually track the status of a specific transaction.
5. Test your integration
There are test ID numbers that you can use in the UAT environment to ensure that your integration is ready.
Account number: 00316301312597216937
Identification number: 70015100
Identification type: DNI
Account type: CA
Bank identification number:003
6. Prepare your certification
Read the following guidelines for technical certification approval (required to obtain productive account credentials):
- Display messages on screen according to Kushki’s answers.
- Save and log all Kushki responses (required in case support is needed).
- If webhook notifications are received successfully, respond to the request with a status 200.
- Make sure that in the body of the request all the fields required in the API reference are included.
Accept webhooks
Handle postpaid events the right way.