1. Webhooks
Español
  • English
  • Español
  • Docs de API 🇲🇽
  • Online Payments
    • Errores ISO
    • Errores del API de Kushki
    • Notas de versión
    • Card Payments
      • Solicitar un token de tarjeta
      • Hacer un cargo o cargo diferido
      • Crear pago (sin token)
      • Solicitar opciones de diferido
      • Reembolsar una transacción
      • Autorizar pagos
      • Preautorización (sin token)
      • Anular una transacción
      • Reautorizar pagos
      • Capturar un pago autorizado
      • Información de BIN V2
      • Información de BIN
      • Validar OTP
    • One-Click and Scheduled Payments
      • Solicitar un token de cargo recurrente
      • Crear un cargo recurrente
      • Hacer un pago One-click
      • Actualizar los datos de la tarjeta del cargo recurrente
      • Cancelar un cargo recurrente
      • Actualizar un cargo recurrente
      • Agregar un cargo o descuento temporal
      • Autorizar pagos
      • Capturar un pago autorizado
      • Consultar información del cargo recurrente
    • Transfer in
      • Consultar lista de bancos
      • Solicitar un token de Transfer In
      • Iniciar transacción
      • Consultar estado
    • Transfer Out
      • Consultar lista de bancos
      • Consultar lista de bancos V2
      • Solicitar un token de Transfer Out
      • Iniciar transacción
      • Consultar estado
      • Saldo para payouts
    • Smartlinks
      • Crear un Smartlink
      • Consultar un Smartlink
      • Eliminar un Smartlink
      • Actualizar un Smartlink
    • Payment Button
      • Crear un Payment Button
    • Analytics
      • Consultar listado de transacciones v2
    • Chargebacks
      • Consultar chargebacks
      • Solicitar exportación de chargebacks
    • Commissions
      • Consultar configuración de comisiones
    • Payment Credentials
      • Crear una credencial
      • Activar o desactivar
      • Eliminar credencial
      • Regenerar una credencial
      • Actualizar credencial
      • Búsqueda avanzada
      • Buscar credenciales
    • Platform Status
      • Consultar estado de la plataforma
      • Consultar estado del gateway
    • Settlement
      • Consultar liquidación
    • Subscription Transactions
      • Consultar transacciones de suscripción
    • Fraud Report
      • Consultar alertas de fraude
  • Card Present Billpocket
    • Notas de versión
    • Notas de versión del SDK de Android
    • Notas de versión de la app de Android
    • Notas de versión de la app de iOS
    • Get Started
      • Crear una cuenta
      • User Token
      • API Keys
    • Webhooks
      • Webhooks — Transferencia de fondos a tu cuenta bancaria
      • Errores de transferencia de fondos
    • Terminals
      • App Review
      • Splash Screen
    • Card not Present Billpocket Services
      • 3DS Checkout
        • Crear checkout
        • Consultar detalles del checkout
      • E-commerce Flex
        • Obtener token
        • Validar token
        • Cobrar pagos
        • Reembolso
        • Capturar un pago autorizado
        • Consultar estado
    • Catalogs
      • Estados
      • Municipios
      • Empresas de impuestos
      • Actividades comerciales
    • Accounts
      • Clabe Account Setup
        • Agregar cuenta CLABE
      • Deposit Accounts
        • Agregar o actualizar cuenta CLABE
    • User Settings
      • Crear usuario
    • Card Present Payment Services
      • Cloud Terminal API
        • Cobrar pagos con tarjeta
        • Imprimir ticket
        • Cancelar notificación push
        • Consultar estado de la transacción
        • Cobrar pagos con tarjeta v2
      • App-to-App
        • Android intents
        • App to App — iOS
        • App to App — Mobile Web
      • Terminal SDK
        • Terminal SDK Android
        • Errores del SDK de Android
    • Transactions
      • Transaction List
        • Obtener token
        • Consultar listado de transacciones
        • Consultar listado de transacciones v2
        • Consultar listado de transacciones v3
        • Consultar listado de transacciones v4
      • Cancel Payments
        • Códigos de error de cancelación
        • Cancelar pagos
  • API Raw Card Present
    • El objeto Amount
    • Catálogo de errores
    • Proceso de intercambio de llaves
    • Notas de versión
    • Datos de prueba
    • One-time payments
      • Pago único
    • Two-step-payments
      • Autorización y captura
    • Voids & Refunds
      • Reembolsar una transacción
      • Anular y reversar
    • Card information
      • Consultar información de BIN
      • Información de BIN V2
      • Solicitar opciones de diferido
    • Query Transactions
      • Búsqueda de transacciones
    • Webhooks
      • Webhooks — Pagos con tarjeta
      • Webhooks — Reembolsos
      • Webhooks — Introducción
      • Buenas prácticas
      • Revisa tus webhooks
    • Chargebacks
      • Consultar chargebacks
      • Solicitar exportación de chargebacks
    • Fraud Report
      • Consultar alertas de fraude
  • Kushki One
    • Error Catalog
    • Release notes
    • Transaction Examples
    • Webhooks
    • Cloud Services
      • Payment
        • Sync
          • Charge
          • Authorization (Pre-auth)
          • Capture
          • Re-authorization
          • Post-tip
          • Void
          • Refund
          • Abort
        • Async
          • Charge (Async)
          • Authorization — Pre-auth (Async)
          • Capture (Async)
          • Re-authorization (Async)
          • Post-tip (Async)
          • Void (Async)
        • Search
          • Transaction Search
      • Print
        • Create Print Job
        • Get Print Job Status
    • Local Services
      • Payment
        • Sync
          • Charge
          • Authorization (Pre-auth)
          • Capture
          • Re-authorization
          • Post-tip
          • Void
          • Refund
          • Abort
        • Async
          • Charge (Async)
          • Authorization — Pre-auth (Async)
          • Capture (Async)
          • Re-authorization (Async)
          • Post-tip (Async)
          • Void (Async)
          • Abort (Async)
        • Search
          • Transaction Search — Online
          • Transaction Search — Local
      • Print
        • Create Print Job
        • Get Print Job Status
        • Print Job Webhook (inbound — implemented by your POS)
  • Appian - Submerchant Register
    • Release Notes
    • Submerchant Validation in Batch
    • Query submerchant status by requestId/submerchantId
    • Submerchant Document Upload
    • Get submerchantIds
    • Get credentials for submerchants
  • Schemas
    • RequestBodies
      • one-and-two-step-payment
    • Card
    • Channel
    • Amount-cash-in
    • ChargebackListResponse
    • TransactionResponse
    • PrintJobRequest
    • one-and-two-step-payment-2
    • Card Present (CP)
    • one-and-two-step-payment-2
    • SubscriptionTransactionsResponse
    • FraudAlertRequest
    • StatusComponent
    • SettlementDateRangeRequest
    • amount
    • ChargebackItem
    • SubscriptionTransaction
    • extra_taxes
    • RawResponse
    • CommandText
    • Card Not Present (CNP)
    • Deferred
    • networkToken
    • FraudAlertResponse
    • ErrorResponse400
    • SettlementRecord
    • card
    • CardData
    • CommandColumns
    • FraudAlertRecord
    • SettlementResponse
    • currency
    • webhooksItem
    • ErrorResponse
    • Country
    • ErrorResponse401
    • LinkFailure
    • ColumnItem
    • ValidationError
    • Amount
    • card_details
    • ErrorResponse403
    • enc_tlv
    • CommandDivider
    • TransactionEvent
    • extraTaxes
    • payment_method
    • ErrorResponse500
    • CommandFeed
    • TransactionStatus
    • deferred
    • CommandSpace
    • ReadingType
    • pos_details
    • ContactDetails
    • sub_merchant
    • CommandCut
    • FailureReason
    • contact_details
    • Subscription
    • metadata
    • CommandImage
    • EventTerminal
    • documentType
    • orderDetails
    • Language
    • TransactionSearchRequest
    • CommandQR
    • EventOperation
    • Shipping Address
    • payment_submethod
    • CommandBarcode
    • EventAmount
    • Billing-Address
    • SubscriptionUpdate
    • EventExtraTaxes
    • PrintJobAccepted
    • PrinterError
    • EventMetadata
    • SubscriptionAdjustmentRequest
    • product
    • AmountWithTaxes
    • PrintJobStatus
    • PrintJobStatusRequest
    • threeDomainSecure
    • AmountCore
    • webhooks
    • headers
    • ExtraTaxes
    • PrintWebhookPayload
    • webhooksChargeback
    • Metadata
    • AmountWithTip
    • citMit
    • TransactionSearchBody
    • TransactionSearchOnlineBody
    • network
    • binInfo
    • AmountWithOptionalTip
    • TransactionSearchLocalBody
    • TransactionEvent_2
    • messageFields
    • UnexpectedErrorResponse
    • FailureReason_2
    • transactionType
    • ExternalReferenceId
    • EventTerminal_2
    • ExternalSubscriptionId
    • EventOperation_2
    • EventAmount_2
    • EventExtraTaxes_2
    • EventMetadata_2
    • SettlementTicketRequest
HomePerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
HomePerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
  1. Webhooks

Buenas prácticas

Sigue estas recomendaciones para construir una integración presencial confiable y segura.

Idempotencia#

Envía siempre un client_transaction_id único (UUID v4) en cada transacción. Si una petición sufre un timeout o falla por un problema de red, reinténtala con el mismo client_transaction_id: Kushki devuelve el resultado original en vez de crear un cargo duplicado.
{
  "client_transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
WARNING
Nunca reutilices un client_transaction_id para una transacción distinta. Eso devolvería el resultado de la transacción original en vez de procesar una nueva.

Guarda el transaction_reference#

Toda respuesta aprobada de cargo, autorización y captura incluye un transaction_reference. Guarda ese valor de inmediato: es obligatorio para hacer anulaciones, reembolsos, capturas y reautorizaciones sobre esa transacción.
{
  "transaction_reference": "f2f29080-0214-42c0-95a5-77ecf3434cd7"
}
Si se pierde la referencia, hay que recuperarla consultando el endpoint Query Transactions con el client_transaction_id original.

Maneja los timeouts con reversos#

Si una petición de cargo sufre un timeout y no sabes si la transacción se procesó:
1.
Espera al menos 1 minuto después de la petición original.
2.
Envía un reverso con el mismo client_transaction_id para cancelar de forma segura la transacción incierta.
3.
Los reversos solo son válidos el mismo día y antes de las 22:59 hora local de México.
{
  "transaction_type": "charge",
  "transaction_mode": "Reverse",
  "client_transaction_id": "<same-id-as-original>",
  "amount": { "currency": "MXN", "subtotal_iva": 0, "subtotal_iva0": 500, "iva": 0 }
}

Anula antes del corte#

En México las anulaciones son válidas hasta las 22:59 hora local de México del mismo día de la transacción. Pasado ese corte, usa un reembolso.
WARNING
No intentes una anulación después de las 22:59 hora local: la petición será rechazada. Usa POST /pos/v1/refund para transacciones del mismo día pasado el corte o para transacciones de días anteriores.

Usa operaciones sin tarjeta para los flujos de back-office#

Las operaciones sin tarjeta (omit_card: true) están en fase Beta en México. Cuando estén disponibles, úsalas para:
Capturas cuando el cliente ya se fue de la terminal
Reautorizaciones desde un sistema de back-office
Anulaciones o reembolsos masivos procesados al cierre del día
Cualquier operación en la que volver a leer la tarjeta no sea práctico
{
  "transaction_type": "capture",
  "transaction_mode": "Authorization",
  "omit_card": true,
  "transaction_reference": "f2f29080-0214-42c0-95a5-77ecf3434cd7",
  "amount": { "currency": "MXN", "subtotal_iva": 0, "subtotal_iva0": 500, "iva": 0 }
}

Consulta siempre las opciones de MSI antes de diferir#

Antes de iniciar un cargo diferido (MSI — Meses Sin Intereses), llama a los endpoints de consulta de BIN y de opciones de MSI para verificar que la tarjeta admite diferido y obtener los meses válidos.
1. POST /pos/v1/bin            → check if card supports MSI
2. GET /card/v1/deferred/{bin} → get available months
3. POST /pos/v1/transaction    → charge with is_deferred: true
Nunca fijes los meses de diferido en el código: varían según el BIN de la tarjeta y pueden cambiar.
WARNING
MSI exige un monto mínimo de transacción. Contacta a Kushki o revisa la tabla de montos mínimos de MSI antes de enviar un cargo diferido.

Los montos en MXN admiten dos decimales#

El peso mexicano admite dos decimales. Los montos se expresan en pesos (por ejemplo, 500.00 = $500 MXN).
"amount": {
  "currency": "MXN",
  "subtotal_iva": 0,
  "subtotal_iva0": 500,
  "iva": 0
}

Incluye la ubicación de la terminal#

Envía pos_details.location con las coordenadas GPS de la terminal siempre que estén disponibles. Este dato mejora la detección de fraude y puede ser obligatorio para ciertas categorías de comercio.
"pos_details": {
  "terminal_id": "PB04209860189",
  "brand": "SUNMI",
  "model": "P2-EU",
  "has_print": true,
  "location": {
    "latitude": 19.4326,
    "longitude": -99.1332
  }
}

Buenas prácticas de webhooks#

Responde de inmediato#

Devuelve HTTP 200 en cuanto recibas una notificación de webhook, antes de ejecutar tu lógica de negocio. Si tu endpoint tarda demasiado, Kushki puede reintentar el envío.

Diseña para la idempotencia#

Kushki almacena las notificaciones en varios servidores para lograr alta disponibilidad. En casos poco frecuentes podrías recibir la misma notificación más de una vez. Tu manejador de webhooks debe ser idempotente: procesar la misma notificación dos veces no debe producir efectos duplicados.

Valida las firmas de los webhooks#

Verifica siempre la firma del webhook antes de procesar el payload, para asegurarte de que proviene de Kushki.

Política de reintentos#

Si una petición falla con un error 5xx, reinténtala con backoff exponencial:
IntentoEspera antes de reintentar
1.er reintento1 segundo
2.º reintento2 segundos
3.er reintento4 segundos
4.º reintento8 segundos
No reintentes errores 4xx (por ejemplo, 400, 401, 403): indican un problema con la petición en sí que reintentar no va a resolver.

¿Tienes una sugerencia sobre esta documentación? Contáctanos.
Modified at 2026-09-11 14:46:24
Previous
Webhooks — Introducción
Next
Revisa tus webhooks
Built with