# Payku API — 🇵🇪 Perú (ES)

> Documentación oficial de la API de Payku para Perú, generada automáticamente desde la especificación OpenAPI (v2.1.01). Fuente: https://docs.payku.com/ · Sandbox: https://des.payku.cl/

URL base: `https://app.payku.cl/` (Default server) · `https://des.payku.cl/` (Sandbox server)

## Introducción

Bienvenido a la API de payku. Puedes usar nuestra API para acceder a los distintos
endpoints de payku, donde podrás generar y gestionar pagos mediante distintos
métodos y obtener información de ellos.

El API está organizado alrededor de REST. Posee URLs predecibles y
orientadas a recursos, y utiliza códigos de respuesta HTTP para indicar el
resultado de la llamada. Todas las respuestas de la API retornan objetos
JSON, incluyendo los errores.

El solicitante debe buscar un código de resultado 200. Si se recibe
cualquier código de resultado distinto de 200, la solicitud o la respuesta
no es válida, lo que significa que los campos no pasaron los controles de
validación de parte de payku. Utilizamos características incluidas en el
protocolo HTTP, como autenticación, los cuales son soportados por la gran
mayoría de los clientes HTTP.

**Importante — ¿Cómo saber si una operación falló?**

No te fíes solo del código HTTP (por ejemplo, 200). En nuestra API, muchas
respuestas con error también llegan con código HTTP 200. Esto es intencional y
forma parte del diseño de la API.

Siempre revisa el contenido JSON de la respuesta y busca el campo `status`:
- Si `status` es `"success"`, la operación se realizó correctamente.
- Si `status` es `"failed"`, hubo un error (por ejemplo, datos inválidos o una
  operación rechazada). Revisa también el mensaje de error que venga en la
  misma respuesta.

## Autenticación

payku utiliza Token Based Authentication sobre HTTPS para la autenticación. Para tener acceso a nuestra API, accede a tu cuenta en la sección de Integración encontrarás la opción de Tokens integración y API. Los request no autenticados o incorrectos retornarán una respuesta de token Invalido.

## API Seguridad

Cada solicitud es requerido tener incluido en el header:
  - Authorization: Bearer **TOKEN-PÚBLICO**

## Firma

En el caso del API de suscripciones, anulación y mall se agregó una capa más de seguridad a través de una firma que se envía en el header del request, para obtener dicha firma es necesario lo siguiente:

Se debe concatenar en formato para url el Request Path junto a todos los parámetros del request, los cuales deben ser ordenados alfabéticamente por key, tal que key=value. Por lo tanto, si el valor de email cliente es “example@domain.com” el formato correcto sería “example%40domain.com” y luego concatenados con el carácter ‘&’.

Una vez que los sets de caracteres son ordenados y concatenados, el hash es calculado usando la función HMAC con cifrado tipo sha256, y el token privado.

**Nota:** Si un elemento de la data, tiene como valor un objeto o arreglo, se excluye de la data. Esta función esta en el ejemplo de PHP y de Javascript.

### Ejemplo PHP
Endpoint de la API:
```php
$request_path = urlencode('/api/suclient');
```
Ordenando los parámetros:
```php
$data = [
  'email' => 'johndoe@example.com',
  'name' => 'John Doe',
  'phone' => '923122312',
  'address' => 'Moneda 101',
  'country' => 'Chile',
  'region' => 'Metropolitana',
  'city' => 'Santiago',
  'postal_code' => '850000',
  'additional_parameters' => [
    'parameter_1' => 'example',
    'parameter_2' => 'example 2',
  ]
];
ksort($data);
```
Transformación de los parámetros a formato url:
```php
    $contador = 0;
    $concatenar = null;

    if (!empty($data) && !is_null($data)) {
        foreach ($data as $key => $val) {
            if(gettype($val)!='array' && gettype($val)!='object'){
                if ($contador>0) {
                    $concatenar .= '&';
                }
                $concatenar .= $key . '=' . urlencode($val);
                $contador++;
            }
        }
    };
```
Concatenación de los parámetros en formato url con el endpoint de la API:
```php
$concat = $request_path.'&'.$concatenar;
```
Firma:
```php
$sign = hash_hmac('sha256', $concat, 'fe551abcef62fcf002dc598922e68f0a');
```

### Ejemplo JavaScript
Importar dependencia CryptoJS:
```javascript
const CryptoJS = require("crypto-js");
```
Endpoint de la API:
```javascript
const requestPath = encodeURIComponent('/api/suclient');
```
Ordenando los parámetros:
```javascript
const data = {
  email: "johndoe@example.com",
  name: "John Doe",
  phone: "923122312",
  address: "Moneda 101",
  country: "Chile",
  region: "Metropolitana",
  city: "Santiago",
  postal_code: "850000"
};
const orderedData = {};
Object.keys(data).sort().forEach(function(key) {
  orderedData[key] = data[key];
  if (typeof orderedData[key] === 'object') {
        delete orderedData[key];
  }
});
```
Transformación de los parámetros a formato url:
```javascript
const arrayConcat = new URLSearchParams(orderedData).toString();
```
Concatenación de los parámetros en formato url con el endpoint de la API:
```javascript
const concat = requestPath + "&" + arrayConcat;
```
Firma:
```javascript
const sign = CryptoJS.HmacSHA256(concat, "fe551abcef62fcf002dc598922e68f0a").toString();
```

El resultado de la firma obtenida para ambos ejemplos es:

```javascript
"c9c86202b1246f6ebeb080d08b3b99a22d36d0e8cffb7fd4e65af0fea4dd12bb"
```

## Errores

payku usa respuestas HTTP convencionales para indicar el éxito o fracaso de un request.
En general, códigos en el rango de los 2xx indican éxito, códigos en el rango 4xx indican
un error que falló debido a la información proporcionada (ej: un parámetro requerido fue
omitido, un pago falló, etc.), y códigos en el rango de los 5xx indican un error con
los servidores de payku (estos son raros).

## Códigos de error
<div class="errorContent">
<table>
  <tbody>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">400</strong>
        <p class="psmall">Bad Request</p>
      </td>
      <td class="errorDescription">Hay un problema con tu request</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">401</strong>
        <p class="psmall">Unauthorized</p>
      </td>
      <td class="errorDescription">Tu token es incorrecto o error de firma</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">403</strong>
        <p class="psmall">Forbidden</p>
      </td>
      <td class="errorDescription">No tienes permiso para ver esta página</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">404</strong>
        <p class="psmall">Not Found</p>
      </td>
      <td class="errorDescription">El recurso especificado no fue encontrado </td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">405</strong>
        <p class="psmall">Method Not Allowed</p>
      </td>
      <td class="errorDescription">Trataste de ingresar a un recurso con un método inválido</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">406</strong>
        <p class="psmall">Not Acceptable</p>
      </td>
      <td class="errorDescription">Solicitaste un formato que no es json</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">410</strong>
        <p class="psmall">Gone</p>
      </td>
      <td class="errorDescription">El recurso solicitado fue removido de nuestros servidores</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">422</strong>
        <p class="psmall">Unprocessable Entity</p>
      </td>
      <td class="errorDescription">No podemos procesar tu solicitud, revísala.</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">429</strong>
        <p class="psmall">Too Many Requests</p>
      </td>
      <td class="errorDescription">¡Estás solicitando muchos recursos! ¡Detente!</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">500</strong>
        <p class="psmall">Internal Server Error</p>
      </td>
      <td class="errorDescription">Tuvimos un problema con nuestro servidor. Inténtalo nuevamente más tarde.</td>
    </tr>
    <tr>
      <td style="text-align: right"><strong class="errorTitle">503</strong>
        <p class="psmall">Service Unavailable</p>
      </td>
      <td class="errorDescription">Estamos offline por mantenimiento. Inténtalo nuevamente más tarde</td>
    </tr>
  </tbody>
</table>
</div>

## Acceso a la API

Si tienes una cuenta en payku, puedes acceder a la API REST mediante los siguientes endpoints:

<div class="content">
  <table class="center smallTable">
    <thead>
      <tr>
        <th style="text-align:center;"><strong>Site</strong></th>
        <th style="text-align:center;"><strong>BASE URL FOR REST ENDPOINT</strong></th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><strong>Production</strong></td>
        <td align="center"><a target="_blank" href="https://app.payku.cl/api">https://app.payku.cl/api</a></td>
      </tr>
      <tr>
        <td><strong>Sandbox</strong></td>
        <td><a target="_blank" href="https://des.payku.cl/api">https://des.payku.cl/api</a></td>
      </tr>
    </tbody>
  </table>
</div>

- **Producción**: proporciona acceso directo para generar transacciones reales.
- **Sandbox**: permite probar su integración sin afectar los datos reales.

Cuando aparece el formulario de autenticación con DNI y clave, se debe usar el DNI 11111111 y la clave 123.

## Transacción

Permite la creación de transacciones y posteriormente consultar su estado.
<br>
<div class='container'>
  <img src='https://docs.payku.com/img/diagrams/Diagram-Transaction.png' alt='Avatar' class='image' style='width:100%'>
  <div class='middle'>
    <a target='_blank' href='https://docs.payku.com/img/diagrams/Diagram-Transaction.png' class='text'>Ver diagrama</a>
  </div>
</div>

### Crear transacción

`POST /api/transaction`

Este método permite crear una orden de pago a **payku** y recibe como respuesta la **URL** para redirigir el browser del pagador y el **token** que identifica la transacción.
Una vez que el pagador efectúe el pago exitoso, **payku** notificará el resultado a la página del comercio que se envió en el parámetro **urlnotify**.

**additional_parameters** = permite enviar información adicional para ser registrada en payku asociada a la transacción **order_ext** dentro de additional_parameters, es una palabra reservada, y es útil para asociar la transacción a un identificador único del comercio

**Cuerpo de la solicitud**

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `email` | string | ✓ | Email del usuario — máximo 100 caracteres — Ejemplo: `support@youwebsite.cl` |
| `order` | string | ✓ | Orden del comercio — máximo 40 caracteres — Ejemplo: `987450011` |
| `subject` | string | ✓ | Descripción de la orden — máximo 2000 caracteres — Ejemplo: `test subject` |
| `amount` | float | ✓ | Monto de la orden. **Importante:** si el monto incluye decimales, debe enviarse como texto entre comillas (por ejemplo, "150.50" en vez de 150.50). — máximo 14 dígitos — Ejemplo: `150.50` |
| `currency` | string |  | Moneda. — máximo 6 caracteres — Ejemplo: `PEN` |
| `payment` | integer |  | Identificador del medio de pago. Si se envía el identificador, el pagador será redireccionado directamente al medio de pago que se indique. - 21 QR Interoperable (Yape, Plin y Otros; Moneda PEN) - 25 Débito, Crédito, Mastercard, Visa y Diners Club — máximo 2 caracteres — Ejemplo: `21` |
| `expired` | string |  | Fecha en la cual expira la transacción **Este campo no es requerido.** Formato permitido (Año-mes-día hora:minuto:segundo) Ejemplo: 2023-10-18 23:59:59 En caso de ser enviado, debe cumplir con las siguiente reglas: - Debe ser mayor a 5 minutos de la fecha actual (hora Santiago). - Se requiere urlreturn, se adjuntará como parámetros GET /?message_error=expired&id=trx60dc327d9e4c094 — Ejemplo: `2023-10-19 13:05:10` |
| `urlreturn` | string |  | url de retorno del comercio donde payku redirigirá al pagador luego de 3 segundos de obtener el resultado de la transacción. — máximo 200 caracteres — Ejemplo: `https://youwebsite.com/urlreturn?orderClient=98745` |
| `urlnotify` | string |  | url callback del comercio donde payku notificara el pago. - Nota: Luego de que el cliente finalice el proceso de pago en su entidad bancaria payku respondera de forma automática al endpoint ingresado en urlnotify el resultado de la operación bancaria. - **Ejemplo Aprobado:** - { - "transaction_id": "9916587765599311", - "payment_key" : "trx32cb779c0a777fc68", - "transaction_key" : "9916581777599311", - "verification_key": "8b3e2202fb086a7de93777ae34d5e18c", - "order": "199", - "status": "success" - } - **Ejemplo Rechazado:** - { - "transaction_id": "9916587765599311", - "payment_key" : "trx32cb779c0a777fc68", - "transaction_key" : "9916581777599311", - "verification_key": "8b3e2202fb086a7de93777ae34d5e18c", - "order": "199", - "status": "failed" - } — máximo 600 caracteres — Ejemplo: `https://www.youwebsite.com/urlnotify?orderClient=98745` |
| `additional_parameters` | object |  | Parámetros adicionales del cliente (Opcional). — máximo 4000 caracteres |
| ↳ `parameters1` | string |  | Nombre del parámetro dado por el usuario payku — Ejemplo: `keyValue` |
| ↳ `parameters2` | string |  | Nombre del parámetro dado por el usuario payku — Ejemplo: `keyValue` |
| ↳ `order_ext` | string |  | Identificador único proporcionado por el comercio, que permita a asociar la transacción a un identificador externo — Ejemplo: `fff-777` |

**cURL**

```bash
curl -X POST \
https://BASE-URL/api/transaction \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer TOKEN-PUBLICO' \
-H 'Content-Type: application/json' \
-H 'Host: BASE-URL' \
-d '{
  "email": "johndoe@example.com",
  "order": "987450011",
  "subject": "test subject",
  "amount": "150.50",
  "currency": "PEN",
  "payment": 21,
  "expired": "2023-10-19 13:05:10",
  "urlreturn": "https://youwebsite.com/urlreturn?orderClient=98745",
  "urlnotify": "https://www.youwebsite.com/urlnotify?orderClient=98745",
  "additional_parameters": {
    "parameters1": "keyValue",
    "parameters2": "keyValue",
    "order_ext": "fff-777"
  }
}'
```

**PHP**

```php
$client = new \GuzzleHttp\Client();
  $body = $client->request('POST', 'https://BASE_URL/api/transaction', [
    'json' => [
      'email' => 'johndoe@example.com',
      'order' => "987450011",
      'subject' => 'test subject',
      'amount' => '150.50',
      'currency'=> "PEN",
      'payment' => 21,
      'expired' => '2022-10-19 13:05:10',
      'urlreturn' => 'https://youwebsite.com/urlreturn?orderClient=123',
      'urlnotify' => 'https://youwebsite.com/urlnotify?orderClient=123',
        'additional_parameters' => [
          'parameters1'=>'keyValue',
          'parameters2'=>'keyValue2',
          'order_ext'=>'fff-777'
        ]
      ],
    'headers' => [
      'Authorization' => 'Bearer PUBLIC-TOKEN'
    ]
  ])->getBody();
$response = json_decode($body);
```

**JS**

```js
const request = async (data) => {
  const response = await fetch('https://BASE_URL/api/transaction', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer TOKEN-PUBLICO'
    },
    body: JSON.stringify(data)
  });
  const result = await response.json();
  console.log(result)
}

let data = {
  email: "johndoe@example.com",
  order: "987450011",
  subject: "test subject",
  amount: "150.50",
  currency: "PEN",
  payment: 21,
  expired: "2022-10-19 13:05:10",
  urlreturn: "https://youwebsite.com/urlreturn?orderClient=123",
  urlnotify: "https://youwebsite.com/urlnotify?orderClient=123",
  additional_parameters: {
    parameters1:"keyValue",
    parameters2:"keyValue2",
    order_ext:"fff-777"
  }
};

request(data);
```

**Respuestas**

*200*

```json
{
  "status": "pending",
  "id": "trx3b4d77b43acd9a720",
  "url": "https://BASE_URL/url_de_pago",
  "hash": "00020000000000000111111222233339030226304E245",
  "qr_image": "data:image/png;base64,......"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de transacción. Los posibles estados que puede obtener son los siguientes: - register - pending - success - rejected — Ejemplo: `pending` |
| `id` | string |  | Identificador de la transacción creado por payku. — Ejemplo: `trx3b4d77b43acd9a720` |
| `url` | string |  | URL a redireccionar al usuario. — Ejemplo: `https://BASE_URL/url_de_pago` |
| `hash` | string |  | Hash de la transacción para generar el QR. — Ejemplo: `00020000000000000111111222233339030226304E245` |
| `qr_image` | string |  | Imagen del QR. — Ejemplo: `data:image/png;base64,......` |

*400* — Error en la solicitud.

```json
{
  "status": "failed",
  "type": "Unprocessable Entity",
  "message_error": "subject:invalid,amount:is empty,email:is empty,order:invalid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unprocessable Entity` |
| `message_error` | string |  | Mensaje de error — Ejemplo: `subject:invalid,amount:is empty,email:is empty,order:invalid` |

*401* — Token Público incorrecto.

```json
{
  "type": "Unauthorized",
  "message_error": {
    "error": "waiting token public"
  }
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unauthorized` |
| `message_error` | object |  |  |
| ↳ `error` | string |  | Mensaje de error — Ejemplo: `waiting token public` |

### Obtener múltiples transacciones

`GET /api/transaction`

Este método permite obtener la información de las transacciones realizados en payku, este método permite una paginación con un máximo de 4000 registros por página, además, posee los siguientes filtros:
  - date_init: indica la fecha desde donde se desea comenzar la búsqueda de transacciones, si este parámetro no es enviado la busqueda iniciara la fecha actual .
  - date_end: indica la fecha donde se desea que termine la búsqueda de transacciones, si este parámetro no es enviado la busque tendrá como fecha final la fecha actual.
  - estatus: se puede filtrar la búsqueda de las transacciones dependiendo del estatus en la que se encuentra.  por ejemplo.  /api/transaction?success=true ó para traer multiples estatus /api/transaction?pending=true&rejected=true.

para la paginación es necesario agregar al final del endpoint lo siguiente ?page=1&per_page=100 siendo el primer parámetro el número de la página y el segundo el número de registros por página. En caso de querer buscar las transacciones entre las fechas 01-09-2021 y 15-09-2021, además que solo sean las transacciones de estado success, la url a utilizar seria la siguiente:  https://[URL_BASE]/api/transaction?date_init=2021-09-01&date_end=2021-09-15&success=true.

**CURL**

```text
curl -X GET \
https://BASE-URL/api/transaction  \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer TOKEN-PUBLICO' \
-H 'Content-Type: application/json' \
-H 'Host: BASE-URL' \
```

**PHP**

```php
$client = new \GuzzleHttp\Client();
  $body = $client->request('GET', 'https://BASE_URL/api/transaction', [
    'headers' => [
      'Authorization' => 'Bearer TOKEN_PUBLICO'
    ]
  ])->getBody();
$response = json_decode($body);
```

**JS**

```js
const request = async () => {
  const response = await fetch('https://BASE_URL/api/transaction', {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer TOKEN-PUBLICO'
    },
  });
  const result = await response.json();
  console.log(result)
}

request();
```

**Respuestas**

*200*

```json
{
  "transaction": [
    {
      "id": "107999",
      "status": "success",
      "created_at": "2019-10-25 14:10:03",
      "email": "johndoe@example.com",
      "amount": 98745,
      "order": "1572023402",
      "subject": "Description",
      "payment": {
        "start": "2023-12-16 15:10:33",
        "end": "2023-12-16 15:10:36",
        "media": "QR Interoperable",
        "transaction_id": 107999,
        "payment_key": "pra934939d607922f9e",
        "transaction_key": null,
        "deposit_date": "2023-10-05",
        "verification_key": "6669cbd982ef54c28f2f15fb9dc5262d",
        "authorization_code": "107742",
        "last_4_digits": "1233",
        "installments": 0,
        "card_type": "VN",
        "additional_parameters": {
          "identificador": "11.111.111-1",
          "banco": "Banco Estado",
          "numero_cuenta": "00126544977"
        },
        "currency": "PEN"
      },
      "nullify": {
        "status": "complete"
      },
      "gateway_response": {
        "status": "success",
        "message": "successful transaction"
      }
    }
  ]
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `transaction` | array of objects |  |  |
| ↳ `id` | string |  | Identificador de la transacción creado por payku. — Ejemplo: `107999` |
| ↳ `status` | string |  | Estatus de transacción. Los posibles estados que puede obtener son los siguientes: - register - pending - success - rejected — Ejemplo: `success` |
| ↳ `created_at` | string |  | Fecha de registro. — Ejemplo: `2019-10-25 14:10:03` |
| ↳ `email` | string |  | Email del usuario — Ejemplo: `johndoe@example.com` |
| ↳ `amount` | int |  | Monto. — Ejemplo: `98745` |
| ↳ `order` | string |  | Número de orden. — Ejemplo: `1572023402` |
| ↳ `subject` | string |  | Descripción de la orden de compra. — Ejemplo: `Description` |
| ↳ `payment` | object |  |  |
| ↳ ↳ `start` | string |  | Inicio de la transacción. — Ejemplo: `2023-12-16 15:10:33` |
| ↳ ↳ `end` | string |  | Fin de la transacción. — Ejemplo: `2023-12-16 15:10:36` |
| ↳ ↳ `media` | string |  | Medio de pago, utilizado por el usuario. — Ejemplo: `QR Interoperable` |
| ↳ ↳ `transaction_id` | int |  | Identificador de la transacción creado por payku. — Ejemplo: `107999` |
| ↳ ↳ `payment_key` | string |  | Identificador del cobro creado por payku. — Ejemplo: `pra934939d607922f9e` |
| ↳ ↳ `transaction_key` | string |  | Identificador de la transacción creado por payku. |
| ↳ ↳ `deposit_date` | string |  | Fecha el cual se realizará el depósito al cliente. — Ejemplo: `2023-10-05` |
| ↳ ↳ `verification_key` | string |  | Código de verificación creado por payku. — Ejemplo: `6669cbd982ef54c28f2f15fb9dc5262d` |
| ↳ ↳ `authorization_code` | string |  | Código de autorización. — Ejemplo: `107742` |
| ↳ ↳ `last_4_digits` | string |  | Últimos 4 dígitos de la tarjeta afiliada. — Ejemplo: `1233` |
| ↳ ↳ `installments` | int |  | Cuotas. — Ejemplo: `0` |
| ↳ ↳ `card_type` | string |  | Tipo de tarjeta. — Ejemplo: `VN` |
| ↳ ↳ `additional_parameters` | object |  | **Ejemplo** de parámetros adicionales que puede enviar payku. |
| ↳ ↳ ↳ `identificador` | string |  | **Ejemplo** del Identificador de la transacción: — Ejemplo: `11.111.111-1` |
| ↳ ↳ ↳ `banco` | string |  | **Ejemplo** del banco el cual se realizo la transacción: — Ejemplo: `Banco Estado` |
| ↳ ↳ ↳ `numero_cuenta` | string |  | **Ejemplo** del número de cuenta el cual se realizo la transacción: — Ejemplo: `00126544977` |
| ↳ ↳ `currency` | string |  | Moneda. — Ejemplo: `PEN` |
| ↳ `nullify` | object |  | Objeto que contiene información de la respuesta de la anulación |
| ↳ ↳ `status` | string |  | Estatus de anulación. Los posibles estados que puede obtener son los siguientes: - pending - awaiting_funds - waiting_bank_details - complete - reverse_deleted - reverse_completed - reverse_deleted — Ejemplo: `complete` |
| ↳ `gateway_response` | object |  | Objeto que contiene información de la respuesta de la transacción |
| ↳ ↳ `status` | string |  | Estatus de transacción.Los posibles estados que puede obtener son los siguientes: - pending - success - rejected - refunded partial - refunded — Ejemplo: `success` |
| ↳ ↳ `message` | string |  | Mensaje que describe el estado. - successful transaction - Rechazo de transacción. - Transacción debe reintentarse. - Error en transacción. - Rechazo por error de tasa. - Excede cupo máximo mensual. - Excede límite diario por transacción. - Rubro no autorizado. — Ejemplo: `successful transaction` |

*400* — Error en la solicitud.

```json
{
  "status": "failed",
  "type": "Unprocessable Entity",
  "message_error": "subject:invalid,amount:is empty,email:is empty,order:invalid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unprocessable Entity` |
| `message_error` | string |  | Mensaje de error — Ejemplo: `subject:invalid,amount:is empty,email:is empty,order:invalid` |

*401* — Token Público incorrecto.

```json
{
  "type": "Unauthorized",
  "message_error": {
    "error": "waiting token public"
  }
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unauthorized` |
| `message_error` | object |  |  |
| ↳ `error` | string |  | Mensaje de error — Ejemplo: `waiting token public` |

*404* — Identificador no existe.

```json
{
  "status": "failed",
  "type": "Not Found",
  "id": "is not valid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Not Found` |
| `id` | string |  | Información de id — Ejemplo: `is not valid` |

### Obtener transacción

`GET /api/transaction/{identificador}`

Este método permite obtener la información de una transacción realizado en **payku**

**Parámetros de ruta**

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `id` | string | ✓ | ID de la transacción a solicitar, payku puede recibir como id tanto el identificador de la transacción como el identificador de cobro: - payment_key - transaction_key — máximo 30 caracteres |

**CURL**

```text
curl -X GET \
https://BASE-URL/api/transaction/ID-IDENTIFICADOR  \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer TOKEN-PUBLICO' \
-H 'Content-Type: application/json' \
-H 'Host: BASE-URL' \
```

**PHP**

```php
$client = new \GuzzleHttp\Client();
  $body = $client->request('GET', 'https://BASE_URL/api/transaction/trx3b4d77b43acd9a720', [
    'headers' => [
      'Authorization' => 'Bearer TOKEN_PUBLICO'
    ]
  ])->getBody();
$response = json_decode($body);
```

**JS**

```js
const request = async () => {
  const response = await fetch('https://BASE_URL/api/transaction/trx3b4d77b43acd9a720', {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer TOKEN-PUBLICO'
    },
  });
  const result = await response.json();
  console.log(result)
}

request();
```

**Respuestas**

*200*

```json
{
  "status": "success",
  "id": "trx3b4d77b43acd9a720",
  "created_at": "2019-10-25 14:10:03",
  "order": "1572023402",
  "email": "johndoe@example.com",
  "subject": "Description",
  "amount": "98745",
  "payment": {
    "start": "2023-12-16 15:10:33",
    "end": "2023-12-16 15:10:36",
    "media": "QR Interoperable",
    "transaction_id": 107999,
    "payment_key": "pra934939d607922f9e",
    "transaction_key": null,
    "deposit_date": "2023-10-05",
    "verification_key": "6669cbd982ef54c28f2f15fb9dc5262d",
    "authorization_code": "107742",
    "last_4_digits": "1233",
    "installments": 0,
    "card_type": "VN",
    "additional_parameters": {
      "identificador": "11.111.111-1",
      "banco": "Banco Estado",
      "numero_cuenta": "00126544977",
      "network": {
        "ip_address": "192.0.2.123"
      }
    },
    "currency": "PEN"
  },
  "nullify": {
    "status": "complete"
  },
  "gateway_response": {
    "status": "success",
    "message": "successful transaction"
  }
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de transacción.Los posibles estados que puede obtener son los siguientes: - register - pending - success - rejected — Ejemplo: `success` |
| `id` | string |  | Identificador de la transacción creado por payku. — Ejemplo: `trx3b4d77b43acd9a720` |
| `created_at` | string |  | Fecha de registro. — Ejemplo: `2019-10-25 14:10:03` |
| `order` | string |  | Número de orden. — Ejemplo: `1572023402` |
| `email` | string |  | Email del usuario — Ejemplo: `johndoe@example.com` |
| `subject` | string |  | Descripción de la orden de compra. — Ejemplo: `Description` |
| `amount` | string |  | Monto. — Ejemplo: `98745` |
| `payment` | object |  |  |
| ↳ `start` | string |  | Inicio de la transacción. — Ejemplo: `2023-12-16 15:10:33` |
| ↳ `end` | string |  | Fin de la transacción. — Ejemplo: `2023-12-16 15:10:36` |
| ↳ `media` | string |  | Medio de pago, utilizado por el usuario. — Ejemplo: `QR Interoperable` |
| ↳ `transaction_id` | int |  | Identificador de la transacción creado por payku. — Ejemplo: `107999` |
| ↳ `payment_key` | string |  | Identificador del cobro creado por payku. — Ejemplo: `pra934939d607922f9e` |
| ↳ `transaction_key` | string |  | Identificador de la transacción creado por payku. |
| ↳ `deposit_date` | string |  | Fecha el cual se realizará el depósito al cliente. — Ejemplo: `2023-10-05` |
| ↳ `verification_key` | string |  | Código de verificación creado por payku. — Ejemplo: `6669cbd982ef54c28f2f15fb9dc5262d` |
| ↳ `authorization_code` | string |  | Código de autorización. — Ejemplo: `107742` |
| ↳ `last_4_digits` | string |  | Últimos 4 dígitos de la tarjeta afiliada. — Ejemplo: `1233` |
| ↳ `installments` | int |  | Cuotas. — Ejemplo: `0` |
| ↳ `card_type` | string |  | Tipo de tarjeta. — Ejemplo: `VN` |
| ↳ `additional_parameters` | object |  | **Ejemplo** de parámetros adicionales que puede enviar payku. |
| ↳ ↳ `identificador` | string |  | **Ejemplo** del Identificador de la transacción: — Ejemplo: `11.111.111-1` |
| ↳ ↳ `banco` | string |  | **Ejemplo** del banco el cual se realizo la transacción: — Ejemplo: `Banco Estado` |
| ↳ ↳ `numero_cuenta` | string |  | **Ejemplo** del número de cuenta el cual se realizo la transacción: — Ejemplo: `00126544977` |
| ↳ ↳ `network` | object |  | Datos de la red del usuario: |
| ↳ ↳ ↳ `ip_address` | string |  | **Ejemplo** de IP Address del usuario: — Ejemplo: `192.0.2.123` |
| ↳ `currency` | string |  | Moneda. — Ejemplo: `PEN` |
| `nullify` | object |  | Objeto que contiene información de la respuesta de la anulación |
| ↳ `status` | string |  | Estatus de anulación. Los posibles estados que puede obtener son los siguientes: - pending - awaiting_funds - waiting_bank_details - complete - reverse_deleted - reverse_completed — Ejemplo: `complete` |
| `gateway_response` | object |  | Objeto que contiene información de la respuesta de la transacción |
| ↳ `status` | string |  | Estatus de transacción.Los posibles estados que puede obtener son los siguientes: - pending - success - rejected - refunded partial - refunded — Ejemplo: `success` |
| ↳ `message` | string |  | Mensaje que describe el estado. - successful transaction - Rechazo de transacción. - Transacción debe reintentarse. - Error en transacción. - Rechazo por error de tasa. - Excede cupo máximo mensual. - Excede límite diario por transacción. - Rubro no autorizado. — Ejemplo: `successful transaction` |

*400* — Error en la solicitud.

```json
{
  "status": "failed",
  "type": "Unprocessable Entity",
  "message_error": "subject:invalid,amount:is empty,email:is empty,order:invalid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unprocessable Entity` |
| `message_error` | string |  | Mensaje de error — Ejemplo: `subject:invalid,amount:is empty,email:is empty,order:invalid` |

*401* — Token Público incorrecto.

```json
{
  "type": "Unauthorized",
  "message_error": {
    "error": "waiting token public"
  }
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unauthorized` |
| `message_error` | object |  |  |
| ↳ `error` | string |  | Mensaje de error — Ejemplo: `waiting token public` |

*404* — Identificador no existe.

```json
{
  "status": "failed",
  "type": "Not Found",
  "id": "is not valid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Not Found` |
| `id` | string |  | Información de id — Ejemplo: `is not valid` |

## Wallet

Permite generar transacciones bancarias desde tu billetera virtual **payku**.

### Realizar pagos a terceros desde mi wallet

`POST /api/wallet/payout`

Este método permite crear una orden de pago a un tercero utilizando los fondos de tu billetera virtual **payku**.

**Nota:** Para fines de prueba (Solo ambiente desarrollo), los montos específicos se procesarán automáticamente:
<br>
&bull;  Montos 1000, 2000, 3000: Se marcarán como **aprobados** automáticamente.
<br>
&bull;  Montos 1500, 2500, 3500: Se marcarán como **rechazados** automáticamente.

**Cuerpo de la solicitud**

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `email` | string | ✓ | Email del usuario — máximo 50 caracteres — Ejemplo: `johndoe@example.com` |
| `phone` | string |  | Télefono del usuario. **Formato:** 519YYYYYYYY — máximo 20 caracteres — Ejemplo: `51906310864` |
| `subject` | string | ✓ | Descripción de la orden — máximo 200 caracteres — Ejemplo: `test Gmoney peru` |
| `currency` | string | ✓ | Tipo de moneda (Formato ISO) — máximo 6 caracteres — Ejemplo: `PEN` |
| `order` | string | ✓ | Orden del comercio — máximo 50 caracteres — Ejemplo: `0011010101777` |
| `amount` | integer | ✓ | Monto de la orden. **Nota:** el monto mínimo es de 5 soles (PEN) y el monto máximo es de 30000 soles (PEN). — máximo 14 dígitos — Ejemplo: `1` |
| `accountbank_name` | string | ✓ | Nombre del titular de la cuenta — máximo 180 caracteres — Ejemplo: `PAYKU PERU SAC` |
| `accountbank_rut` | string | ✓ | Documento de identidad del titular de la cuenta en Perú: DNI, Cédula de Extranjería (CE) o Pasaporte. El nombre del campo se mantiene por compatibilidad. Ejemplo (DNI): 47566578 — entre 7 a 12 caracteres — Ejemplo: `47566578` |
| `accountbank_sbif` | string | ✓ | Código del banco al que pertenece la cuenta bancaria. — máximo 4 caracteres — Ejemplo: `011` |
| `accountbank_type` | string | ✓ | Tipo de cuenta. - 1 Corriente - 3 Ahorro — máximo 1 caracterer — Ejemplo: `1` |
| `accountbank_num` | string | ✓ | Número de CCI (Código de Cuenta Interbancario) del cliente. **Nota: El CCI interbancario es un número compuesto por 20 dígitos. Solo para el caso de YAPE, puede enviar el número de teléfono asociado.** **Formato:** 519YYYYYYYY — máximo 20 caracteres — Ejemplo: `01128901338000251968` |
| `url_notify` | string |  | url donde se notificare el resultado del pago. - Nota: Luego de realizar el pago a terceros payku respondera de forma automática al endpoint ingresado en urlnotify el resultado de la operación. - **Ejemplo Aprobado:** - { - "id": "mpexxzxxxx", - "identifier_payout": "mpexxzxxxx", - "order" : "367734544", - "status" : "success", - "update_at" : "2023-08-24 12:29:35", - "customer" : { - "name" : "Jhon Doe", - "phone" : "987654321", - "document" : "87654321", - "number" : "987654321" - } - } - **Ejemplo Rechazado:** - { - "id": "mpexxzxxxx", - "identifier_payout": "mpexxzxxxx", - "order" : "367734544", - "status" : "banking_error", - "update_at" : "2023-08-24 12:29:35", - "customer" : { - "name" : "Jhon Doe", - "phone" : "987654321", - "document" : "87654321", - "number" : "987654321" - } - } — máximo 600 caracteres — Ejemplo: `https://www.youwebsite.com/urlnotify?orderClient=98745` |
| `additional_parameters` | object |  | Parámetros adicionales del cliente (Opcional). — máximo 4000 caracteres |
| ↳ `parameter_1` | string |  | Nombre del parámetro dado por el usuario payku — Ejemplo: `keyValue` |
| ↳ `parameter_2` | string |  | Nombre del parámetro dado por el usuario payku — Ejemplo: `keyValue` |
| ↳ `order_ext` | string |  | Nombre de la orden externa dado por el usuario payku (Opcional) — Ejemplo: `fff-777` |

**cURL**

```bash
curl -X POST \
https://BASE-URL/api/wallet/payout \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer TOKEN-PUBLICO' \
-H 'Sign: SHA256-REQUEST-PATH-VALUE-TOKEN-PRIVADO'  \
-H 'Content-Type: application/json' \
-H 'Host: BASE-URL' \
-d '{
      "email": "johndoe@example.com",
      "phone": "51906310864",
      "subject": "test Gmoney peru",
      "currency": "PEN",
      "order": "0011010101777",
      "amount": 1,
      "accountbank_name": "PAYKU PERU SAC",
      "accountbank_rut": "47566578",
      "accountbank_sbif": "011",
      "accountbank_type": "1",
      "accountbank_num": "01128901338000251968",
      "url_notify": "https://www.youwebsite.com/urlnotify?orderClient=98745",
      "additional_parameters":
      {
        "parameter_1": "keyValue",
        "parameter_2": "keyValue",
        "order_ext": "fff-777"
      }
    }'
```

**PHP**

```php
$client = new \GuzzleHttp\Client();
  $body = $client->request('POST', 'https://BASE_URL/api/wallet/payout', [
    'json' => [
            "email" => "johndoe@example.com",
            "phone" => "51906310864",
            "subject" => "test Gmoney peru",
            "currency" => "PEN",
            "order" => "0011010101777",
            "amount" => 1,
            "accountbank_name" => "PAYKU PERU SAC",
            "accountbank_rut" => "47566578",
            "accountbank_sbif" => "011",
            "accountbank_type" => "1",
            "accountbank_num" => "01128901338000251968",
            "url_notify" => "https://www.youwebsite.com/urlnotify?orderClient=98745",
            "additional_parameters" => [
                "parameter_1" => "keyValue",
                "parameter_2" => "keyValue",
                "order_ext" => "fff-777"
            ]
        ],
    'headers' => [
      'Authorization' => 'Bearer TOKEN_PUBLICO',
      'Sign' => 'SHA256-REQUEST-PATH-VALUE-TOKEN-PRIVADO'
    ]
  ])->getBody();
$response = json_decode($body);
```

**JS**

```js
const request = async (data) => {
  const response = await fetch('https://BASE_URL/api/wallet/payout', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Sign': 'SHA256-REQUEST-PATH-VALUE-TOKEN-PRIVADO',
      'Authorization': 'Bearer TOKEN-PUBLICO'
    },
    body: JSON.stringify(data)
  });
  const result = await response.json();
  console.log(result)
}

let data = {
      "email": "johndoe@example.com",
      "phone": "51906310864",
      "subject": "test Gmoney peru",
      "currency": "PEN",
      "order": "0011010101777",
      "amount": 1,
      "accountbank_name": "PAYKU PERU SAC",
      "accountbank_rut": "47566578",
      "accountbank_sbif": "011",
      "accountbank_type": "1",
      "accountbank_num": "01128901338000251968",
      "url_notify": "https://www.youwebsite.com/urlnotify?orderClient=98745",
      "additional_parameters":
      {
        "parameter_1": "keyValue",
        "parameter_2": "keyValue",
        "order_ext": "fff-777"
      }
    };

request(data);
```

**Respuestas**

*200*

```json
{
  "status": "success",
  "identifier_wallet": "wab5f7232dafff18f9",
  "identifier_payout": "mpe33e36b01e8a11b9ee"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la carga a la wallet.Los posibles estados que puede obtener son los siguientes: - success - failed — Ejemplo: `success` |
| `identifier_wallet` | string |  | Identificador del movimiento de la billetera virtual de payku. — Ejemplo: `wab5f7232dafff18f9` |
| `identifier_payout` | string |  | Identificador del pago a tercero. — Ejemplo: `mpe33e36b01e8a11b9ee` |

*400* — Error en la solicitud.

```json
{
  "status": "failed",
  "type": "Unprocessable Entity",
  "message_error": "subject:invalid,amount:is empty,email:is empty,order:invalid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unprocessable Entity` |
| `message_error` | string |  | Mensaje de error — Ejemplo: `subject:invalid,amount:is empty,email:is empty,order:invalid` |

*401* — Token Público incorrecto.

```json
{
  "type": "Unauthorized",
  "message_error": {
    "error": "waiting token public"
  }
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unauthorized` |
| `message_error` | object |  |  |
| ↳ `error` | string |  | Mensaje de error — Ejemplo: `waiting token public` |

### Obtener payout V3

`GET /api/payoutv3/{identificadorPayout}`

Este método permite obtener un movimiento de pagos a terceros de su billetera virtual **payku** mediante un identificador:

Para realizar la consulta es necesario agregar al final del endpoint lo siguiente /{identificadorPayout} como por ejemplo: **api/payoutv3/mpe33e36b01e8a11b9ee**.

**CURL**

```text
curl -X GET \
https://BASE-URL/api/payoutv3/{identificadorPayout}  \
-H 'Accept: application/json, text/plain, */*' \
-H 'Authorization: Bearer TOKEN-PUBLICO' \
-H 'Sign: SHA256-REQUEST-PATH-VALUE-TOKEN-PRIVADO'  \
-H 'Content-Type: application/json' \
-H 'Host: BASE-URL' \
```

**PHP**

```php
$client = new \GuzzleHttp\Client();
  $body = $client->request('GET', 'https://BASE_URL/api/payoutv3/{identificadorPayout}', [
    'headers' => [
      'Authorization' => 'Bearer TOKEN_PUBLICO',
      'Sign' => 'SHA256-REQUEST-PATH-VALUE-TOKEN-PRIVADO'
    ]
  ])->getBody();
$response = json_decode($body);
```

**JS**

```js
const request = async () => {
  const response = await fetch('https://BASE_URL/api/payoutv3/{identificadorPayout}', {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer TOKEN-PUBLICO',
      'Sign': 'SHA256-REQUEST-PATH-VALUE-TOKEN-PRIVADO'
    },
  });
  const result = await response.json();
  console.log(result)
}

request();
```

**Respuestas**

*200*

```json
{
  "payout": {
    "id": "war3999847529816f2",
    "phone": "987654321",
    "email": "test@test.com",
    "subject": "subject order",
    "amount": "3680",
    "accountbank_rut": "111111111111",
    "accountbank_name": "test",
    "accountbank_type": 1,
    "accountbank_num": 123123123,
    "accountbank_sbif": "0001",
    "status": "pending",
    "update_at": "2023-06-09 21:10:46",
    "origin_wallet": "wa1933f37cdaf7d1c6",
    "reason_rejection": " Error CCA 51. Cuenta Beneficiario no Existe, error_creditor_account_not_found"
  }
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `payout` | object |  | Datos cuenta destino. |
| ↳ `id` | string |  | Identificador de la cuenta destino. — Ejemplo: `war3999847529816f2` |
| ↳ `phone` | string |  | Teléfono del titular de cuenta destino. — Ejemplo: `987654321` |
| ↳ `email` | string |  | Correo del titular de cuenta destino. — Ejemplo: `test@test.com` |
| ↳ `subject` | string |  | Estatus de la solicitud. — Ejemplo: `subject order` |
| ↳ `amount` | string |  | Monto a depositado en la cuenta destino. — Ejemplo: `3680` |
| ↳ `accountbank_rut` | string |  | Documento de identidad del titular de la cuenta destino: DNI, Cédula de Extranjería (CE) o Pasaporte. — Ejemplo: `111111111111` |
| ↳ `accountbank_name` | string |  | Nombre del titular de la cuenta destino. — Ejemplo: `test` |
| ↳ `accountbank_type` | integer |  | Tipo de cuenta del banco destino. — Ejemplo: `1` |
| ↳ `accountbank_num` | integer |  | Número de CCI (Código de Cuenta Interbancario) del banco destino o en caso de YAPE el número celular del beneficiario. — Ejemplo: `123123123` |
| ↳ `accountbank_sbif` | string |  | Código del banco al que pertenece la cuenta bancaria. — Ejemplo: `0001` |
| ↳ `status` | string |  | Estatus del movimiento. - pending ("payout registrado") - processing ("payout en proceso de pago") - success ("payout depositado exitosamente") - banking_error ("payout rechazado por el banco") - fraud_prevention ("payout rechazado por compliance") — Ejemplo: `pending` |
| ↳ `update_at` | string |  | Fecha que se realizo la solicitud. — Ejemplo: `2023-06-09 21:10:46` |
| ↳ `origin_wallet` | string |  | Id de la wallet origen. — Ejemplo: `wa1933f37cdaf7d1c6` |
| ↳ `reason_rejection` | string |  | Motivo del rechazo. — Ejemplo: `Error CCA 51. Cuenta Beneficiario no Existe, error_creditor_account_not_found` |

*400* — Error en la solicitud.

```json
{
  "status": "failed",
  "type": "Unprocessable Entity",
  "message_error": "subject:invalid,amount:is empty,email:is empty,order:invalid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unprocessable Entity` |
| `message_error` | string |  | Mensaje de error — Ejemplo: `subject:invalid,amount:is empty,email:is empty,order:invalid` |

*401* — Token Público incorrecto.

```json
{
  "type": "Unauthorized",
  "message_error": {
    "error": "waiting token public"
  }
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unauthorized` |
| `message_error` | object |  |  |
| ↳ `error` | string |  | Mensaje de error — Ejemplo: `waiting token public` |

*404* — Identificador no existe.

```json
{
  "status": "failed",
  "type": "Not Found",
  "id": "is not valid"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Not Found` |
| `id` | string |  | Información de id — Ejemplo: `is not valid` |

## Bancos

Permite ver la lista de los bancos asociados.

### Obtener lista de bancos por el tipo de moneda

`GET /api/banks?currency=pen`

Este método permite obtener una lista de los bancos asociados filtrados por la moneda.
Para filtrar por la moneda, hay que agregar el query params currency con el valor de la moneda.

**CURL**

```text
curl -X GET \
https://BASE-URL/api/banks?currency=pen  \
-H 'Accept: application/json, text/plain, */*' \
-H 'Content-Type: application/json' \
-H 'Host: BASE-URL' \
```

**PHP**

```php
$client = new \GuzzleHttp\Client();
  $body = $client->request('GET', 'https://BASE_URL/api/banks?currency=pen', [
  ])->getBody();
$response = json_decode($body);
```

**JS**

```js
const request = async () => {
  const response = await fetch('https://BASE_URL/api/banks?currency=pen', {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json'
    },
  });
  const result = await response.json();
  console.log(result)
}
request();
```

**Respuestas**

*200*

```json
{
  "status": "success",
  "banks": [
    {
      "code": "007",
      "name": "Citibank Perú S.A.",
      "currency": "PEN"
    }
  ]
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus del endpoint. Los posibles estados que puede obtener son los siguientes: - success — Ejemplo: `success` |
| `banks` | array of objects |  | Ejemplo: `[{"code":"007","name":"Citibank Perú S.A.","currency":"PEN"}]` |
| ↳ `code` | string |  | Código del banco al que pertenece la cuenta bancaria. — Ejemplo: `Citibank Perú S.A.` |
| ↳ `name` | string |  | Nombre de la entidad bancaria. — Ejemplo: `Citibank Perú S.A.` |
| ↳ `currency` | string |  | Moneda |

*400* — Error en la solicitud.

```json
{
  "status": "failed",
  "type": "Unprocessable Entity",
  "message_error": "Hay un problema con tu request"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unprocessable Entity` |
| `message_error` | string |  | Mensaje de error — Ejemplo: `Hay un problema con tu request` |

## Métodos de pago

Permite ver la lista de los métodos de pago utilizados por payku.

### Obtener lista de métodos de pago por el tipo de moneda

`GET /api/paymentmethods?currency=pen`

Este método permite obtener una lista de los métodos de pago en payku.
Para filtrar por la moneda, hay que agregar el query params currency con el valor de la moneda.

**CURL**

```text
curl -X GET \
https://BASE-URL/api/paymentmethods?currency=pen  \
-H 'Accept: application/json, text/plain, */*' \
-H 'Content-Type: application/json' \
-H 'Host: BASE-URL' \
```

**PHP**

```php
$client = new \GuzzleHttp\Client();
  $body = $client->request('GET', 'https://BASE_URL/api/paymentmethods?currency=pen', [
  ])->getBody();
$response = json_decode($body);
```

**JS**

```js
const request = async () => {
  const response = await fetch('https://BASE_URL/api/paymentmethods?currency=pen', {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json'
    },
  });
  const result = await response.json();
  console.log(result)
}
request();
```

**Respuestas**

*200*

```json
{
  "status": "success",
  "payment_methods": [
    {
      "currency": "PEN",
      "payment": 21,
      "name": "QR Interoperable",
      "description": ""
    }
  ]
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus del endpoint. Los posibles estados que puede obtener son los siguientes: - success — Ejemplo: `success` |
| `payment_methods` | array of objects |  | Ejemplo: `[{"currency":"PEN","payment":21,"name":"QR Interoperable","description":""}]` |
| ↳ `description` | string |  | Breve descripción del método de pago. |
| ↳ `payment` | number |  | Código que pertenece al método de pago. — Ejemplo: `21` |
| ↳ `name` | string |  | Nombre del método de pago. — Ejemplo: `QR Interoperable` |
| ↳ `currency` | string |  | Moneda — Ejemplo: `PEN` |

*400* — Error en la solicitud.

```json
{
  "status": "failed",
  "type": "Unprocessable Entity",
  "message_error": "Hay un problema con tu request"
}
```

| Campo | Tipo | Requerido | Descripción |
| --- | --- | --- | --- |
| `status` | string |  | Estatus de la solicitud. — Ejemplo: `failed` |
| `type` | string |  | Tipo de error ocurrido. — Ejemplo: `Unprocessable Entity` |
| `message_error` | string |  | Mensaje de error — Ejemplo: `Hay un problema con tu request` |
