1. Kushki One
Kushki Docs
Español
  • Español
  • English
  • Inicio
  • Inicio rápido
    • Últimas novedades
    • Preguntas frecuentes
    • Paso a producción
    • Política de cambios importantes del API
    • Datos de prueba
    • Códigos de error
  • Glosario de pagos
    • Glosario de pagos
  • Pagos únicos con tarjeta (Online)
    • Network Tokens
    • Marcas de tarjeta soportadas
    • Funcionalidades por modelo de negocio
    • Guía de integración Comisiones a terceros
    • ¿Cómo funcionan las Comisiones a terceros?
    • Pagos en un paso
      • Acepta un pago con tarjeta
      • Cargo directo (sin token)
      • ¿Cómo funcionan los pagos con tarjeta?
      • Acepta pagos únicos con OTP
      • Códigos de error autenticación OTP
      • Códigos de error pagos únicos con tarjeta
    • Pagos en dos pasos
      • Recibe pagos con autorización y captura
      • ¿Cómo funcionan los pagos únicos con autorización y captura?
    • Devoluciones
      • Devoluciones, anulaciones y reembolsos
    • Autenticación 3DS
      • Integración 3DS API + librería kushki.js
      • Introducción a 3DS
      • Integración 100% API de 3DS
      • Integración 3DS con librería kushki.js
      • Códigos de error autenticación 3DS
    • Pagos con Apple Pay
      • Configuración de Apple Pay
      • Pruebas en Sandbox Apple Pay
  • Pagos recurrentes con tarjeta (Online)
    • Autentica tus suscripciones con 3DS
    • Apple Pay en Suscripciones
    • Suscripciones externas a Kushki
    • Acepta pagos one click con 3DS
    • Funcionalidades por modelo de negocio
    • Códigos de error en cargos recurrentes
    • Pagos calendarizados
      • ¿Cómo funcionan los cargos recurrentes con tarjeta?
      • Maneja tus cargos calendarizados
      • Crea un cargo recurrente
    • Pagos OneClick
      • Genera pagos one click
      • Recibe pagos OneClick con autorización y captura
      • ¿Cómo funcionan los pagos OneClick con autorización y captura?
  • Pagos con tarjeta presente
    • Acepta pagos con tarjeta presente
    • Datos de prueba
    • Webhooks para tarjeta presente
    • Cloud Terminal API
      • Acepta pagos
      • Anula una solicitud de pago
      • Consulta el estado de una petición de cobro
      • ¿Cómo imprimir un ticket personalizado?
    • App-to-app
      • Acepta pagos
    • Transacciones
      • Anula un pago
      • Transacciones
    • Terminal SDK
      • Acepta pagos
    • Kushki One
      • Autenticación y Cifrado de Requests
      • Realiza cobros con Kushki One
      • Formato de montos en Kushki ONE
      • Impresión en terminal SmartPOS
      • Catálogo Unificado de Errores — Kushki ONE Connect
      • Servicios asíncronos y webhooks
    • Raw card-present API
      • Acepta pagos
      • Script de ejemplo para cifrar información
      • Intercambio de claves criptográficas
      • Preguntas frecuentes
      • Códigos de error para transacciones con tarjeta presente
    • Kushki One App de Pagos
      • Devoluciones y PreAuth & Capture
      • Procesa un cobro
      • Pago Dividido en la terminal
      • Consulta tus transacciones
      • Configuración del terminal
  • Pagos con transferencias
    • Bancos y detalles de operación para pagos con transferencia bancaria
    • Recibe transferencias bancarias
    • Consulta el estado de una transacción
  • Dispersión de dinero
    • Transferencia bancaria
      • Dispersa a cuentas bancarias
      • Códigos de error para dispersiones por transferencia
  • Plugins
    • Shopify
      • Operación del Plugin
    • Vtex
      • Guía de integración VTEX
  • Links de pago
    • Smartlinks
  • Formularios y botones de pago
    • Kajita
      • Kajitas de pago
      • ¿Cómo funciona?
    • Botón de pago
      • ¿Cómo funciona el botón de pago?
      • Genera un botón de pago
  • Administración de sucursales
    • ¿Cómo realizar el onboarding de subcomercios vía API?
  • Notificaciones
    • Buenas prácticas
    • Consulta tus webhooks
    • Webhooks para pagos únicos
      • Webhook para pagos únicos con tarjeta
      • Webhook para pagos únicos con transferencia bancaria
      • Webhook para pagos únicos con efectivo
    • Webhooks para dispersiones
      • Webhook para dispersión de dinero con transferencia
    • Webhooks para botón de pagos
      • Webhooks con Botón de pago
    • Webhooks para smartlinks
      • Webhooks con Smartlinks
    • Webhooks para pagos recurrentes
      • Webhook para pagos recurrentes con tarjeta
    • Webhooks para devoluciones
      • Webhook para devoluciones
      • Webhook para contracargos
HomeMexico 🇲🇽
Ecuador 🇪🇨Chile 🇨🇱Colombia 🇨🇴Peru 🇵🇪
HomeMexico 🇲🇽
Ecuador 🇪🇨Chile 🇨🇱Colombia 🇨🇴Peru 🇵🇪
Status
Soporte / Support
Español
  • Español
  • English
  1. Kushki One

Autenticación y Cifrado de Requests

🚧 Early Release — Beta
Este producto está en acceso temprano. Los parámetros, estructuras de respuesta y comportamientos pueden cambiar sin previo aviso. No uses esta versión en producción sin coordinarlo previamente con el equipo de integraciones de Kushki.
Todas las comunicaciones hacia Kushki ONE Connect se autentican con una firma que calculas a partir de tu Business-Code, y el payload viaja cifrado. Hay un solo mecanismo, y es el mismo en todas partes.
El mecanismo no cambia entre topologías
Tu lógica de firma y cifrado es idéntica en Cloud, en red local y en localhost. Escríbela una sola vez. La única diferencia es el header encrypted_http_communication, que solo envías en red local y localhost.
Envía siempre el header encrypted_http_communication en true
En las integraciones por Red Local y Localhost, envía el header encrypted_http_communication: true en cada request, en UAT y en producción.
Si certificas con el header en false o sin enviarlo, tus requests no se firman ni se cifran, y al pasar a producción cada llamada falla con AUTH-001 («Invalid or expired credentials»).
La integración por Nube (Cloud) no requiere este header.

Requisitos#

Antes de empezar
Tu Business-Code: la llave privada que autentica a tu comercio. La entrega el equipo de integraciones durante el onboarding.
El terminalSerial del dispositivo. También lo entrega el equipo de integraciones durante el onboarding.
Business-Code no es private_credential_id
La llave de firma es tu Business-Code. El private_credential_id es un campo de configuración de la terminal y nunca se usa para firmar requests. Confundirlos produce un error de autenticación en cada llamada.

Qué lleva cada request#

Cada request va firmado y cifrado. El payload original nunca viaja en texto plano.

Variables que necesitas#

VariableDescripción
businessCodeLlave privada que autentica a tu comercio
terminalSerialNúmero de serie de la terminal SmartPOS
timestampUnix timestamp en segundos, en UTC
requestDataPayload original del request

Flujo general#

Cada request pasa por dos procesos independientes que parten del mismo requestData. Uno produce la firma y el otro produce el payload cifrado. Ambos se envían juntos.
Flujo general de firma y cifrado en Kushki ONE Connect
dataWithKey nunca se envía
dataWithKey solo existe para generar la firma. No se cifra ni se transmite. Incluir el campo key dentro del payload cifrado provoca un error de autenticación.

Cadena de derivación de claves#

Las tres variables de entrada producen exactamente dos salidas: aesKey para el cifrado y encodedKeyTimestamp para la firma.
Cadena de derivación de claves de Kushki ONE Connect
El password es el valor central de la cadena. Cambia cada minuto porque depende de formattedDate, lo que hace que cualquier request firmado caduque automáticamente.

Paso 1: genera el timestamp#

Guarda este valor en una variable al inicio del flujo. Lo reutilizas en los pasos 3, 4 y 6.
Un solo timestamp por request
Nunca llames Date.now() más de una vez en el mismo flujo. Un timestamp distinto entre la firma, el cifrado y el header es la causa más silenciosa de los errores de autenticación.

Paso 2: genera formattedDate en UTC#

Calcula siempre en UTC
Un desfase de zona horaria es una de las causas más frecuentes de firma inválida. Usa los métodos getUTC*, nunca sus equivalentes de hora local.

Paso 3: genera el password temporal#

Paso 4: construye dataWithKey#

Es una copia de requestData con el campo key añadido. Solo se usa para firmar.

Paso 5: genera la firma#

Headers resultantes:
Authorization: Basic <hash>
timestamp: <timestamp>

Paso 6: cifra el payload#

Se cifra únicamente requestData, sin el campo key.

Paso 7: arma el request final#

Los headers son iguales en todos los métodos. Lo que cambia es cómo entregas el campo data. En Red Local y Localhost, agrega además el header encrypted_http_communication: true en cada request.
Anatomía de un request HTTP firmado y cifrado
En POST, PATCH y PUT, el dato cifrado va en el cuerpo:
{
  "data": "<iv_hex>:<ciphertext_hex>"
}
En GET, va como parámetro de consulta:
GET /endpoint?data=<iv_hex>:<ciphertext_hex>
Elimina los demás parámetros de consulta del request original antes de enviarlo.
Las operaciones sin payload firman un objeto vacío
En /abort no hay payload, así que lo que firmas es el literal {} — no una cadena vacía. Dos bytes de diferencia, y la respuesta no te da ninguna pista.

Errores de autenticación#

Una firma inválida siempre devuelve la misma respuesta, sin distinguir la causa:
{
  "type": "AUTH",
  "code": "AUTH-001",
  "message": "Invalid or expired credentials"
}
Revisa estas causas en orden. Cubren la gran mayoría de los casos:
CausaCómo la detectasSolución
Unidad de timestamp equivocadaEl valor tiene 13 dígitos en vez de 10Segundos, no milisegundos
Reloj fuera de la ventana de toleranciaLa firma falla de forma intermitenteSincroniza con NTP; la tolerancia es de ±5 min
formattedDate en hora localLa firma falla de forma intermitente según la hora del díaCalcula la fecha con métodos UTC
Cadena vacía firmada en vez de {}Falla solo en /abortFirma el literal {}, no una cadena vacía
Body re-serializado después de firmarFalla siempre, desde el primer requestFirma exactamente el mismo string que envías
Campo key incluido en el payload cifradoFalla siempre, desde el primer requestCifra requestData sin key; dataWithKey solo se usa para firmar
Header encrypted_http_communication ausente o en false (Red Local y Localhost)Pasa la certificación en UAT y falla al pasar a producciónEnvía encrypted_http_communication: true en cada request, también en UAT, y vuelve a certificar
Árbol de diagnóstico de errores de autenticación
No registres la firma completa
Nunca escribas el valor completo del header Authorization en tus registros de producción. Registra solo su presencia o ausencia para diagnóstico.

Script de referencia para Postman#

Configura este pre-request script a nivel de colección para que el flujo de firma y cifrado se ejecute automáticamente en cada request. Define las variables businessCode y terminalSerial en el entorno.
Acepta cobros con Kushki ONE
Con la autenticación resuelta, revisa los flujos de cobro presencial y sus variantes síncrona y asíncrona.
Errores de autenticación
Consulta el catálogo completo de códigos de error, incluidos los de credenciales y permisos.
Modificado en 2026-10-07 14:30:47
Anterior
Kushki One
Siguiente
Realiza cobros con Kushki One
Built with