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.
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.
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.
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.
Las tres variables de entrada producen exactamente dos salidas: aesKey para el cifrado y encodedKeyTimestamp para la firma.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.
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.
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.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.
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.