Private-Merchant-Id). Nunca la expongas en código de cliente o de frontend: llama siempre al endpoint de token desde tu backend.POST /card/v1/tokens desde tu backend con los datos de la tarjeta y el monto de la transacción. La respuesta devuelve un token de un solo uso, válido para un único cargo.{
"card": {
"name": "Luis García",
"number": "5451951574925480",
"expiryMonth": "08",
"expiryYear": "28",
"cvv": "121"
},
"totalAmount": 150.00,
"currency": "PEN"
}⚠️ Expiración del token: Los tokens expiran en poco tiempo. Úsalos de inmediato: no los guardes para usarlos después.
POST /card/v1/charges con el token y el desglose del monto. Incluye contactDetails y, opcionalmente, orderDetails y productDetails para el scoring antifraude.{
"token": "f5c64f7ac8ea42d5a58dcdc74de973dc",
"amount": {
"subtotalIva": 0,
"subtotalIva0": 150.00,
"ice": 0,
"iva": 0,
"currency": "PEN"
},
"contactDetails": {
"documentType": "DNI",
"documentNumber": "12345678",
"firstName": "Luis",
"lastName": "García",
"email": "user@example.com",
"phoneNumber": "+51912345678"
}
}ticketNumber y un transactionReference.💡 OTP en sandbox: Si la tarjeta requiere validación OTP en sandbox, usa 555tanto para transacciones en PEN como en USD.
transactionStatus: "APPROVAL" significa que el cargo fue autorizado.{
"ticketNumber": "922513792073660814",
"transactionReference": "6f16659e-b711-4995-a9ae-161aecbd6521"
}"fullResponse": "v2" en tu request de cargo.| Moneda | Código |
|---|---|
| Sol peruano | PEN |
| Dólar estadounidense | USD |
| Valor | Descripción |
|---|---|
DNI | Documento Nacional de Identidad 🇵🇪 |
CE | Carné de Extranjería 🇵🇪 |
PAS | Pasaporte 🇵🇪 |
RUC | Registro Único de Contribuyentes 🇵🇪 |
GET /card/v1/deferred/{bin}monthsOfGrace:[
{
"months": ["2", "3", "4", "5", "6", "7"],
"monthsOfGrace": [],
"type": "all"
}
]months como campo de primer nivel en el body del cargo (no dentro del objeto deferred):{
"token": "24e5cc0d47fc4b2ab098bdb7d0b94569",
"amount": {
"subtotalIva": 0,
"subtotalIva0": 300.00,
"ice": 0,
"iva": 0,
"currency": "PEN"
},
"months": 3,
"contactDetails": {
"documentType": "DNI",
"documentNumber": "12345678",
"firstName": "Luis",
"lastName": "García",
"email": "user@example.com",
"phoneNumber": "+51912345678"
}
}POST /card/v1/preAuthorization: reserva fondos en la tarjeta. Devuelve un ticketNumber.POST /card/v1/reauthorization: extiende la ventana de la autorización o ajusta el monto reservado. Envía el ticketNumber original.POST /card/v1/capture: captura el monto reservado (o una parte). Envía el ticketNumber original.DELETE /v1/charges/{ticketNumber}: cancela la autorización y libera los fondos reservados.| Operación | Endpoint | Notas |
|---|---|---|
| Void | DELETE /v1/charges/{ticketNumber} | Anula una transacción. Admite anulación total y parcial. |
| Refund | DELETE /v1/refund/{ticketNumber} | Devuelve los fondos al tarjetahabiente. Admite reembolso total y parcial. |
amount en el body del request con el monto parcial.transactionMode)transactionMode en la solicitud de token para flujos recurrentes o validación de tarjeta con monto cero:| Valor | Descripción |
|---|---|
initialRecurrence | Marca la primera transacción de una serie recurrente. |
subsequentRecurrence | Cargos recurrentes posteriores: no se requiere CVV una vez procesado un initialRecurrence. |
accountValidation | Validación de tarjeta con monto cero. Confirma que la tarjeta es válida sin cobrarla. |
POST /card/v2/charges acepta los datos de la tarjeta directamente en el body del request, sin necesidad de una llamada previa de token. Útil para integraciones servidor a servidor donde ya tienes los datos de la tarjeta.webhooks en tu request de cargo o de preautorización para recibir notificaciones en tiempo real:{
"webhooks": ["https://yoursite.com/kushki/notify"]
}POST a cada URL cuando cambia el estado de la transacción.| Modo | Descripción |
|---|---|
| Insecure 3DS | Kushki maneja el flujo 3DS. Incluye threeDomainSecure con el JWT del paso de autenticación. |
| Motor 3DS propio | Operas tu propio servidor 3DS. Incluye los campos con el resultado de la autenticación en threeDomainSecure. Compatible con Mastercard y Visa. |
isNetworkToken: true en tu request de token o de cargo sin token e incluye el objeto networkToken con los metadatos adicionales:| Campo | Descripción |
|---|---|
deviceType | Tipo de dispositivo que origina la transacción tokenizada |
requestorId | ID único que la red de tarjetas asigna al solicitante del token |
source | Origen del token |
walletId | Identificador de la wallet digital: "01" para Apple Pay, "04" para otras wallets |
authenticationLevel | Nivel de autenticación realizado durante el aprovisionamiento del token |
mvv | Merchant Verification Value de 10 dígitos (solo transacciones Visa) |
cryptogram en el objeto card cuando el network token traiga un criptograma de la wallet digital o del servicio de tokens del emisor. El valor debe tener entre 20 y 28 caracteres alfanuméricos.⚠️ BETA: Esta funcionalidad está disponible en Perú. Contacta a tu ejecutivo de cuenta de Kushki antes de habilitarla.
GET /card/v1/bin/{bin} y GET /deferred/v2/bin/{bin} devuelven los metadatos de la tarjeta (banco, marca, tipo de tarjeta, país emisor) para un BIN dado. Úsalos para determinar la elegibilidad de diferido y mostrar el logo de la marca en el checkout.totalAmount: 0. El flujo de token ejecuta una validación con monto cero contra la tarjeta.https://api.kushkipagos.com/¿Tienes una sugerencia sobre esta documentación? Escríbenos.