# Peru

## Required fields

| Field                  | Format                                                                                                                       | Description                                                                                                               |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `login`                | String                                                                                                                       | Cashouts login                                                                                                            |
| `pass`                 | String                                                                                                                       | Cashouts pass                                                                                                             |
| `external_id`          | String (max length: 100)                                                                                                     | Transaction's ID on your end                                                                                              |
| `document_id`          | See [document validations](https://apidocs.onekeypayments.com/knowledge-base/countries-specifications#documents-validations) | Beneficiary's document ID                                                                                                 |
| `document_type`        | See [document validations](https://apidocs.onekeypayments.com/knowledge-base/countries-specifications#documents-validations) | Beneficiary's document type                                                                                               |
| `country`              | `PE`                                                                                                                         | See [country codes](https://apidocs.onekeypayments.com/knowledge-base/countries-specifications#countries-and-currencies)  |
| `currency`             | `PEN` / `USD`                                                                                                                | See [currency codes](https://apidocs.onekeypayments.com/knowledge-base/countries-specifications#countries-and-currencies) |
| `amount`               | Number with up to 2 decimals                                                                                                 | Cashout amount                                                                                                            |
| `bank_account`         | See [validations below](#bank-account-validations)                                                                           | Beneficiary's bank account                                                                                                |
| `account_type`         | See[ account types](#account-types)                                                                                          | Beneficiary's bank account type                                                                                           |
| `beneficiary_name`     | String (max length: 100)                                                                                                     | Beneficiary's name                                                                                                        |
| `beneficiary_lastname` | String (max length: 100)                                                                                                     | Beneficiary's last name                                                                                                   |

## Bank Account Validations

| Bank name | Bank code | Description                          | Format                                                                       | Example              |
| --------- | :-------: | ------------------------------------ | ---------------------------------------------------------------------------- | -------------------- |
| All       |     -     | CCI - Código de Cuenta Interbancaria | Length 20 (with verifying digits - a validation algorithm is ran over these) | 00219300153895206813 |

### CCI validation algorithm

Since the first three digits of the CCI are the bank code, it is not mandatory to send the `bank_code` field. However, we validate those 3 first digits to be a valid `bank_code`.

{% tabs %}
{% tab title="Java" %}
{% code title="Peru CCI validation algorithm in Java" %}

```java
public final class Validations {
   static Integer CCI_LENGTH_ST = 18;
   static Integer CCI_LENGTH_FST = 20;
   static String EMPTY_CHECK_DIGITS = "00";
    
   public static boolean validateBankAccount(String bankAccount) {
      if (!ValidationsUtils.validateOnlyNumbers(bankAccount)) {
         return false;
      } else {
         int accountLength = bankAccount.length();
         String lastDigits = bankAccount.substring(bankAccount.length() - 2);

         if (accountLength == CCI_LENGTH_ST && lastDigits.equals(EMPTY_CHECK_DIGITS)) {
            return true;
         }
         return validateCCI(bankAccount);
      }
   }

   //Validate CCI bank account
   public static boolean validateCCI(String cci) {
      if (validateCCILength(cci)) {
         String cciWithoutCheck = cci.substring(0, cci.length() - 2);
         String checkDigits = cci.substring(cci.length() - 2);
         String calculatedCheckDigits = getCciCheckDigits(cciWithoutCheck);

         return checkDigits.equals(calculatedCheckDigits);
      }
      return false;
   }

   public static boolean validateCCILength(String cci) {
      return cci.length() == CCI_LENGTH_FST;
   }

   public static String getCciCheckDigits(String cci) {
      int firstControlNumber = calculateCheckDigit(cci.substring(0, 6));
      int secondControlNumber = calculateCheckDigit(cci.substring(6, 18));

      return String.valueOf(firstControlNumber) + String.valueOf(secondControlNumber);
   }

   private static int calculateCheckDigit(String cci) {
      int total = 0;
      int factor = 1;

      for (int i = 0; i < cci.length(); i++) {
         String[] cciArray = cci.split("");
         int num = Integer.parseInt(cciArray[i]);

         if (num * factor < 10) {
            total += (num * factor);
         } else {
            int product = (num * factor);
            String product_str = Integer.toString(product);
            int firstDigit = Integer.parseInt(product_str.substring(0, 1));
            int lastDigit = product % 10;
            total += firstDigit + lastDigit;
         }

         factor = factor == 1 ? 2 : 1;
      }
      return (total % 10) > 0 ? 10 - (total % 10) : 0;
   }

}


```

{% endcode %}
{% endtab %}
{% endtabs %}

## Account Types

The `account_type` is specified with only one character as described below.

| `account_type` | Description       |
| :------------: | ----------------- |
|     **`C`**    | Checkings account |
|     **`S`**    | Savings account   |
|     **`M`**    | Master account    |

## Document Validations

[Click here](https://apidocs.onekeypayments.com/knowledge-base/countries-specifications#documents-validations) to check document types and validations.

## Example Request

```java
{
    "login": "xxxxxxx",
    "pass": "xxxxxxx",
    "external_id": "30000000001",
    "country": "PE",
    "currency": "PEN",
    "amount": 100,
    "document_id": "848392783",
    "document_type": "CE",
    "bank_account": "00219300153895206813",
    "account_type": "C",
    "beneficiary_name": "User",
    "beneficiary_lastname": "Test",
    "notification_url": "https://webhook.site/url",
    "type": "json"
}
```

## Bank Codes

| Bank                                         | Code |
| -------------------------------------------- | ---- |
| Banco de Crédito del Peru                    | 002  |
| Interbank                                    | 003  |
| Citibank                                     | 007  |
| Scotiabank                                   | 009  |
| BBVA Continental                             | 011  |
| Banco de la Nación                           | 018  |
| Banco de Comercio                            | 023  |
| Banco Financiero                             | 035  |
| Banco Interamericano de Finanzas (BIF)       | 038  |
| Crediscotia Financiera                       | 043  |
| Mi Banco                                     | 049  |
| Banco GNB Peru S.A                           | 053  |
| Banco Falabella                              | 054  |
| Santander                                    | 056  |
| Caja Metropolitana de Lima                   | 800  |
| Caja Municipal de Ahorro y Credito Piura SAC | 801  |
| Caja Municipal de Ahorro y Crédito Trujillo  | 802  |
| Caja Municipal de Ahorro y Crédito Arequipa  | 803  |
| Caja Municipal de Ahorro y Crédito Sullana   | 805  |
| Caja Municipal de Ahorro y Crédito Cuzco     | 806  |
| Caja Municipal de Ahorro y Crédito Huancayo  | 808  |

{% hint style="info" %}
For the full and most up-to-date list of banks and its codes, please check the [Cashout Bank Code endpoint.](https://apidocs.onekeypayments.com/api-documentation/cashouts-api/endpoints/cashout-bank-codes)
{% endhint %}
