1. Webhooks
  • API Docs Mexico 🇲🇽
  • Online Payments
    • Release Notes
    • Card Payments
      • Request a card token
      • Make a charge or deferred charge
      • Create payment (tokenless)
      • Request deferred options
      • Refund a transaction
      • Authorize payments
      • Preauthorization (tokenless)
      • Void a transaction
      • Reauthorize payments
      • Capture an authorized payment
      • Bin Info V2
      • Bin Info
      • Validate OTP
      • Verify Account
    • One-Click and Scheduled Payments
      • Request a recurring charge token
      • Create a recurring charge
      • Make an One-click payment
      • Update recurring charge card data
      • Cancel a recurring charge
      • Update a recurring charge
      • Add a temporary charge or discount
      • Authorize payments
      • Capture an authorized payment
      • Get recurring charge Info
    • Transfer in
      • Get Bank List
      • Request a Transfer In token
      • Init Transaction
      • Get Status
    • Transfer Out
      • Get Bank List
      • Get Bank List V2
      • Request a Transfer Out token
      • Init Transaction
      • Get Status
      • Balance for Payouts
    • Smartlinks
      • Create a Smartlink
      • Get a Smartlink
      • Delete a smartlink
      • Update a Smartlink
    • Payment Button
      • Create a payment button
    • Analytics
      • Get transactions list v1
      • Get transactions list v2
    • Chargebacks
      • Query chargebacks
      • Request chargeback export
    • Commissions
      • Get Commission Configuration
    • Payment Credentials
      • Create a credential
      • Activate or deactivate
      • Delete credential
      • Regenerate a credential
      • Update credential
      • Advanced search
      • Search credentials
    • Platform Status
      • Get platform status
      • Get gateway status
    • Settlement
      • Query settlement
    • Subscription Transactions
      • Get subscription transactions
  • Card Present Billpocket
    • Get Started
      • Create Account
      • User Token
      • API Keys
    • Webhooks
      • Webhooks — Transfer Funds (v1)
      • Webhooks — Transfer Funds to Your Bank Account
      • Transfer Funds Errors
    • Terminals
      • App Review
      • Splash Screen
    • Card Present Payment Services
      • Cloud Terminal API
        • Collect card payments
        • Print Ticket
        • Cancel Push Notification
        • Get transaction status
        • Collect card payments v2
      • App-to-App
        • Android intents
        • App to App — iOS
        • App to App — Mobile Web
      • Terminal SDK
        • Terminal SDK
        • Android SDK errors
    • Card not Present Billpocket Services
      • 3DS Checkout
        • Create checkout
        • Get checkout details
      • E-commerce Flex
        • Get token
        • Validate token
        • Collect payments
        • Refund
        • Capture an authorized payment
        • Get status
    • Catalogs
      • States
      • Municipalities
      • Tax companies
      • Commercial activities
    • User Settings
      • Create user
    • Accounts
      • Clabe Account Setup
        • Add CLABE account
      • Deposit Accounts
        • Add or update CLABE account
    • Transactions
      • Transaction List
        • Get token
        • Get transaction list
        • Get transaction list v2
        • Get transaction list v3
        • Get transaction list v4
      • Cancel Payments
        • Cancel payments Error Codes
        • Cancel payments
  • API Raw Card Present
    • The Amount Object
    • Error Catalog
    • Key Exchange Process
    • Release Notes
    • Test Data
    • One-time payments
      • Single payment
    • Two-step-payments
      • Authorization and capture
    • Voids & Refunds
      • Refund a transaction
    • Card information
      • Get BIN Info
      • Balance inquiries
      • Bin Info V2
      • Request deferred options
    • Query Transactions
      • Transaction Search
    • Webhooks
      • Webhooks — Introduction
      • Good Practices
      • Webhooks — Card Payments
      • Webhooks — Refunds
      • Check Your Webhooks
  • Kushki One
    • Cloud Services
      • Payment
        • Charge
        • Authorization (Pre-auth)
        • Capture
        • Re-authorization
        • Post-tip
        • Void
        • Refund
        • Abort
      • Search
        • Transaction Search
      • Print
        • Create Print Job
        • Get Print Job Status
    • Local Services
      • Print
        • Create Print Job
        • Get Print Job Status
        • Print Job Webhook (inbound — implemented by your POS)
      • Payment
        • Charge
        • Authorization (Pre-auth)
        • Capture
        • Re-authorization
        • Post-tip
        • Void
        • Refund
        • Abort
      • Search
        • Transaction Search — Online
        • Transaction Search — Local
  • Appian - Submerchant Register
    • 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
    • StatusComponent
    • SettlementDateRangeRequest
    • SubscriptionTransactionsResponse
    • amount
    • AmountWithTaxes
    • PrintJobRequest
    • networkToken
    • ChargebackItem
    • SettlementTicketRequest
    • SubscriptionTransaction
    • extra_taxes
    • AmountCore
    • CommandText
    • currency
    • ErrorResponse400
    • ErrorResponse
    • SettlementResponse
    • webhooksItem
    • card
    • ExtraTaxes
    • CommandColumns
    • Amount
    • Country
    • ErrorResponse401
    • SettlementRecord
    • card_details
    • ColumnItem
    • extraTaxes
    • ErrorResponse403
    • enc_tlv
    • TransactionResponse
    • CommandDivider
    • Deferred
    • payment_method
    • ErrorResponse500
    • deferred
    • RawResponse
    • CommandFeed
    • Metadata
    • pos_details
    • CardData
    • CommandSpace
    • ContactDetails
    • contact_details
    • sub_merchant
    • AmountWithTip
    • CommandCut
    • documentType
    • Subscription
    • metadata
    • LinkFailure
    • CommandImage
    • orderDetails
    • Language
    • TransactionSearchRequest
    • CommandQR
    • Shipping Address
    • payment_submethod
    • CommandBarcode
    • Billing-Address
    • SubscriptionUpdate
    • PrinterError
    • product
    • SubscriptionAdjustmentRequest
    • PrintJobStatus
    • threeDomainSecure
    • PrintWebhookPayload
    • webhooks
    • headers
    • webhooksChargeback
    • citMit
    • network
    • binInfo
    • messageFields
    • UnexpectedErrorResponse
    • transactionType
    • ExternalReferenceId
    • ExternalSubscriptionId
BienvenidaPerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
BienvenidaPerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
  1. Webhooks

Good Practices

Follow these recommendations to build a reliable and secure Card Present integration.

Idempotency#

Always send a unique client_transaction_id (UUID v4) for each transaction. If a request times out or fails due to a network issue, retry it with the same client_transaction_id — Kushki will return the original result instead of creating a duplicate charge.
{
  "client_transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
WARNING
Never reuse a client_transaction_id for a different transaction. This would return the original transaction result instead of processing a new one.

Persist transaction_reference#

Every approved charge, authorization, and capture response includes a transaction_reference. Store this value immediately — it is required to perform voids, refunds, captures, and reauthorizations on that transaction.
{
  "transaction_reference": "f2f29080-0214-42c0-95a5-77ecf3434cd7"
}
If the reference is lost, recovery requires querying the Query Transactions endpoint using the original client_transaction_id.

Handle timeouts with reversals#

If a charge request times out and you are unsure whether the transaction was processed:
1.
Wait at least 1 minute after the original request.
2.
Send a reversal using the same client_transaction_id to safely cancel the uncertain transaction.
3.
Reversals are only valid on the same day and before 22:00 México local time.
{
  "transaction_type": "charge",
  "transaction_mode": "Reverse",
  "client_transaction_id": "<same-id-as-original>",
  "amount": { "currency": "MXN", "subtotal_iva": 0, "subtotal_iva0": 500, "iva": 0 }
}

Void before the cutoff#

Voids in Mexico are valid until 22:00 México local time on the same day as the transaction. After that cutoff, use a refund instead.
WARNING
Do not attempt a void after 22:00 local time — the request will be rejected. Use POST /pos/v1/refund for same-day transactions past the cutoff or for transactions from previous days.

Use cardless operations for back-office flows#

Cardless operations (omit_card: true) are in Beta phase in México. When available, use them for:
Captures after the customer has left the terminal
Reauthorizations from a back-office system
Bulk voids or refunds processed at end of day
Any operation where re-reading the card is not practical
{
  "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 }
}

Always check MSI options before installments#

Before initiating a deferred charge (MSI — Meses Sin Intereses), call the BIN lookup and MSI options endpoints to verify the card supports installments and retrieve the valid months.
1. POST /pos/v1/bin          → check if card supports MSI
2. GET /deferred/v2/bin/{bin} → get available months and credit_type
3. POST /pos/v1/transaction  → charge with is_deferred: true
Never hard-code installment months — they vary by card BIN and may change.
WARNING
MSI requires a minimum transaction amount. Contact Kushki or check the MSI minimum amounts table before sending a deferred charge.

MXN amounts support two decimal places#

The Mexican Peso supports two decimal places. Amounts are expressed in pesos (e.g., 500.00 = $500 MXN).
"amount": {
  "currency": "MXN",
  "subtotal_iva": 0,
  "subtotal_iva0": 500,
  "iva": 0
}

Include terminal location#

Send pos_details.location with the terminal's GPS coordinates whenever available. This data improves fraud detection and may be required for certain merchant categories.
"pos_details": {
  "terminal_id": "PB04209860189",
  "brand": "SUNMI",
  "model": "P2-EU",
  "has_print": true,
  "location": {
    "latitude": 19.4326,
    "longitude": -99.1332
  }
}

Webhook best practices#

Respond immediately#

Return HTTP 200 as soon as you receive a webhook notification, before running any business logic. If your endpoint takes too long, Kushki may retry the delivery.

Design for idempotency#

Kushki stores notifications on multiple servers for high availability. On rare occasions, you may receive the same notification more than once. Your webhook handler must be idempotent — processing the same notification twice should not produce duplicate side effects.

Validate webhook signatures#

Always verify the webhook signature before processing the payload to ensure it originated from Kushki.

Retry policy#

If a request fails with a 5xx error, retry with exponential backoff:
AttemptWait before retry
1st retry1 second
2nd retry2 seconds
3rd retry4 seconds
4th retry8 seconds
Do not retry 4xx errors (e.g., 400, 401, 403) — these indicate a problem with the request itself that retrying will not fix.

Got a suggestion on this documentation? Contact us.
Modified at 2026-07-09 23:36:33
Previous
Webhooks — Introduction
Next
Webhooks — Card Payments
Built with