1. Kushki One
English
  • English
  • Español
  • API Docs Mexico 🇲🇽
  • Online Payments
    • Release Notes
    • Kushki API errors
    • ISO errors
    • 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
    • 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 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
    • Fraud Report
      • Query fraud alerts
  • Card Present Billpocket
    • Release Notes
    • Android SDK Release Notes
    • Android App Release Notes
    • iOS App Release Notes
    • Get Started
      • Create Account
      • User Token
      • API Keys
    • Webhooks
      • 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
        • 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
      • Void & Reverse
    • Card information
      • Get BIN Info
      • Bin Info V2
      • Request deferred options
    • Query Transactions
      • Transaction Search
    • Webhooks
      • Webhooks — Introduction
      • Good Practices
      • Webhooks — Card Payments
      • Webhooks — Refunds
      • Check Your Webhooks
    • Chargebacks
      • Query Chargebacks
      • Request Chargeback Export
    • Fraud Report
      • Query fraud alerts
  • Kushki One
    • Release notes
    • Transaction Examples
    • Webhooks
    • Error Catalog
    • Cloud Services
      • Payment
        • Sync
          • Charge
          • Authorization (Pre-auth)
          • Capture
          • Re-authorization
          • Post-tip
          • Void
          • 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
      • Diagnostics
        • Terminal info
        • Connection test
    • Local Services
      • Payment
        • Sync
          • Charge
          • Authorization (Pre-auth)
          • Capture
          • Re-authorization
          • Post-tip
          • Void
          • 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)
      • Diagnostics
        • Connection test
        • Terminal info
  • 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
    • StatusComponent
    • SettlementDateRangeRequest
    • SubscriptionTransactionsResponse
    • amount
    • PrintJobRequest
    • one-and-two-step-payment-2
    • Card Present (CP)
    • one-and-two-step-payment-2
    • FraudAlertRequest
    • TransactionResponse
    • networkToken
    • Deferred
    • ChargebackItem
    • SubscriptionTransaction
    • extra_taxes
    • CommandText
    • Card Not Present (CNP)
    • FraudAlertResponse
    • RawResponse
    • currency
    • ErrorResponse400
    • ErrorResponse
    • SettlementResponse
    • SettlementRecord
    • webhooksItem
    • card
    • CommandColumns
    • FraudAlertRecord
    • CardData
    • Amount
    • Country
    • ErrorResponse401
    • card_details
    • ColumnItem
    • ValidationError
    • LinkFailure
    • extraTaxes
    • ErrorResponse403
    • enc_tlv
    • CommandDivider
    • TransactionEvent
    • payment_method
    • ErrorResponse500
    • deferred
    • CommandFeed
    • TransactionStatus
    • pos_details
    • CommandSpace
    • ReadingType
    • ContactDetails
    • contact_details
    • sub_merchant
    • CommandCut
    • FailureReason
    • documentType
    • Subscription
    • metadata
    • CommandImage
    • EventTerminal
    • orderDetails
    • Language
    • TransactionSearchRequest
    • CommandQR
    • EventOperation
    • Shipping Address
    • payment_submethod
    • CommandBarcode
    • EventAmount
    • Billing-Address
    • EventExtraTaxes
    • PrintJobAccepted
    • SubscriptionUpdate
    • product
    • SubscriptionAdjustmentRequest
    • EventMetadata
    • PrinterError
    • threeDomainSecure
    • AmountWithTaxes
    • PrintJobStatus
    • PrintJobStatusRequest
    • webhooks
    • AmountCore
    • headers
    • ExtraTaxes
    • PrintWebhookPayload
    • Metadata
    • webhooksChargeback
    • citMit
    • AmountWithTip
    • TransactionSearchOnlineBody
    • TransactionSearchBody
    • binInfo
    • AmountWithOptionalTip
    • TransactionSearchLocalBody
    • messageFields
    • TransactionEvent_2
    • UnexpectedErrorResponse
    • FailureReason_2
    • transactionType
    • ExternalReferenceId
    • EventTerminal_2
    • ExternalSubscriptionId
    • EventOperation_2
    • EventAmount_2
    • EventExtraTaxes_2
    • EventMetadata_2
    • SettlementTicketRequest
    • network
HomePerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
HomePerú 🇵🇪México 🇲🇽
Ecuador 🇪🇨Colombia 🇨🇴Chile 🇨🇱
Status
Soporte / Support
English
  • English
  • Español
  1. Kushki One

Cloud Services

In Cloud mode, your POS sends HTTP requests to Kushki's cloud infrastructure, which forwards the commands to the target terminal via push. Use this mode when your POS runs in the cloud or on a network that cannot route traffic directly to the terminal.
Beta — Early Access
Kushki ONE Cloud is currently in Beta for México 🇲🇽. Do not deploy to production without coordinating with the Kushki integration team.

Base URLs#

EnvironmentURLSelector
Productionhttps://cloudt.kushkipagos.comKushki ONE Cloud — Producción
UAThttps://uat-cloudt.kushkipagos.comKushki ONE Cloud — UAT
INFO
Pick one of those two in the environment selector at the top right before using Try it. The default UAT Testing Env points at api-uat.kushkipagos.com, which is the Online Payments host — Kushki ONE does not answer there.
If your POS runs behind a corporate firewall, these are the hosts to allow on port 443. Open only the row for your environment — uat-cloudt is a test host and does not belong on a production network:
PurposeUATProductionWho needs it
Cloud relayuat-cloudt.kushkipagos.comcloudt.kushkipagos.comThe terminal and the POS network
Processingapi-uat.kushkipagos.comapi.kushkipagos.comThe terminal only
Terminal managementuat-tms.kushkipagos.comtms.kushkipagos.comThe terminal only
All endpoints follow the pattern:
POST https://cloudt.kushkipagos.com/terminal/v1/{terminalSerial}/{mode}/{operation}
The terminalSerial is the serial number of the target SmartPOS terminal — the integration team gives it to you during onboarding, along with your businessCode. {mode} is sync or async — see below.

Authentication#

Kushki ONE uses one authentication mechanism, and it is the same in Cloud, local network and localhost: hash + encryption. Your terminal ships with encryption enabled, so this is the only path.
Authorization: Basic <SHA512>
timestamp: 1748476800
Content-Type: application/json
{ "data": "<iv_hex>:<cipher_hex>" }
ElementRule
AuthorizationBasic prefix followed by the SHA512 hash. The Basic prefix is required
timestampUnix timestamp in seconds (10 digits) — must be within ±5 minutes of server time
BodyAlways the encrypted envelope {"data":"<iv_hex>:<cipher_hex>"}. The payloads documented below are the plaintext you encrypt, not what travels on the wire
WARNING
On operations with no payload — /sync/abort — you sign the literal {}, not an empty string. Signing an empty string returns AUTH-001 with no further hint.
Full details, including the data query-parameter variant used by GET operations on the local network, are on the Authentication page.
WARNING
Set your HTTP client timeout to at least 90 seconds. The cloud relay adds latency on top of the terminal's own processing time, which depends on how fast the cardholder interacts with the device.

Sync vs Async#

Every terminal-mediated payment operation ships in two variants, under two path prefixes.
VariantPrefixHTTP responseWhere the outcome arrives
Sync/sync/Blocks until the acquirer answers, then returns the full transaction resultIn the HTTP response
Async/async/Returns immediately with a TERMINAL_ACKNOWLEDGED eventWebhook only
Async exists because card-present flows depend on human interaction and routinely exceed the ~15 second timeout budget of most POS architectures.
WARNING
The async response is an acknowledgement, not a result. It confirms only that the terminal accepted the payment intent. To learn whether the transaction was approved you must consume the webhook.
Supply events_webhook_url in the request body to receive events. Without it the transaction still executes, but you get no state notifications and no final outcome. The field is accepted on /async/ endpoints only.
Async is available for charge, authorization, capture, re-authorization, post-tip and void. Abort and transaction search are sync-only — and in Cloud there is no /async/abort at all.

Reading the HTTP status#

DANGER
On payment endpoints the HTTP status is always 200, whatever happened. It confirms that the terminal processed your request — not that the operation succeeded. Always evaluate the response body.
A POS that branches on response.ok treats a busy terminal, an expired PIN and a cardholder cancellation as successes. The print endpoints are the exception: they return real HTTP codes (404 when the job does not exist, 409 while the queue is busy).
Error bodies are flat — {type, code, param, message, object}, with no wrapper. See the Error Catalog.

Amount format#

Every amount field is an integer — no thousands separator, no decimal separator, no spaces. This applies to subtotal_iva0, subtotal_iva, iva, tip, cashback_amount and every member of extra_taxes.
The currency is always MXN, which has two decimal places — the last two digits are the cents, so amounts without a fraction still carry their trailing zeros:
To chargeSend
12.44 MXN1244
12.00 MXN1200
1,000.00 MXN100000
DANGER
Never drop the cents. 1200 is 12.00 MXN — sending 12 charges 0.12 MXN instead. If your POS also serves a zero-decimal market such as Colombia, resolve the decimal handling per terminal; do not share one code path.
WARNING
The payload carries no currency field — the terminal resolves the currency from its own configuration, and the integration team confirms which one your terminal uses during onboarding. Requests take integers, but event and webhook payloads echo amounts back as decimals (12000.0). Never re-send an echoed value as an amount.
INFO
Amounts in this documentation are displayed with Mexican separators — comma for thousands, period for cents (1,000.00) — purely for readability. Never send separators to the API.

Payment operations#

OperationSyncAsyncDescription
ChargePOST /sync/chargePOST /async/chargeOne-step authorization + capture
AuthorizationPOST /sync/authorizationPOST /async/authorizationReserve funds, capture later (Visa / Mastercard)
CapturePOST /sync/capturePOST /async/captureCollect reserved funds
Re-authorizationPOST /sync/re_authorizationPOST /async/re_authorizationExtend or increase a pre-auth
Post-tipPOST /sync/pos_tipPOST /async/pos_tipAdd tip to an authorized transaction
ReversalPOST /sync/voidPOST /async/voidReverse a transaction — see below
AbortPOST /sync/abort—Cancel a transaction in progress
Transaction SearchPOST /sync/transaction_search_online—Query terminal transaction history
Connection testPOST /sync/local/test—Check that your POS reaches the terminal. Moves no money
Terminal infoPOST /sync/config/terminal_info—Returns {model, room, serialNumber}. room is the app version running on the terminal

Optional fields, by operation#

These are the only optional fields, and they are the same in sync and async:
FieldApplies to
amount.tip/charge and /authorization — the tip can be set at pre-authorization time, not only when charging
cashback_amount/charge
query_deferred/charge — Meses Sin Intereses, see below
omit_card/capture, /re_authorization and /void
metadata/charge, /authorization and /pos_tip. Subfields: reference, customer_email, device
On /pos_tip, amount.tip is not an optional field — it is the amount of the operation.
If a capability is not enabled for your terminal, the terminal ignores the field instead of rejecting the request. To have it enabled, write to soporte@kushkipagos.com.
INFO
Beta coverage. Only /charge has been exercised end-to-end with these fields, in sync and async. amount.tip on /authorization and omit_card on its six combinations are defined but not yet exercised — expect to be the first to run them.

Installments (query_deferred)#

In Mexico, installments are a boolean: send query_deferred: true and the terminal offers Meses Sin Intereses (MSI) to the cardholder after reading the card.
{ "query_deferred": true }
WARNING
Your POS does not choose the number of months and does not learn them from the request — the terminal presents the options and the cardholder picks. This is the opposite of Chile, Colombia and Peru, where the POS sends a deferred object with months. That object does not apply in Mexico and must not be sent; the two fields are mutually exclusive and never travel together.

Charge#

Single-step payment — authorization and capture in one operation.
{
  "amount": {
    "subtotal_iva0": 10000,
    "subtotal_iva": 0,
    "iva": 0,
    "extra_taxes": {
      "airport_tax": 0,
      "iac": 0,
      "ice": 0,
      "travel_agency": 0
    }
  },
  "client_transaction_id": "c5a3f3be-9d6f-4d39-8af5-58dbb589af79",
  "metadata": {
    "reference": "ORD-20240317-001",
    "customer_email": "user@example.com",
    "device": "SUNMI-P3"
  }
}
WARNING
Save transaction_reference from the response — required to reverse the transaction.

Charge (Async)#

The async variant takes the same body plus the webhook URL:
{
  "events_webhook_url": "https://api.negocio.mx/webhook/terminal-events",
  "amount": {
    "subtotal_iva0": 10000,
    "subtotal_iva": 0,
    "iva": 0,
    "tip": 0
  },
  "client_transaction_id": "c5a3f3be-9d6f-4d39-8af5-58dbb589af79",
  "cashback_amount": 0,
  "query_deferred": false
}
FieldPurpose
amount.tipTip amount. Send 0 when not applicable
cashback_amountCash withdrawal amount. Send 0 for none
query_deferredWhen true, the terminal prompts the cardholder for Meses Sin Intereses (MSI)

Authorization (Pre-auth)#

Reserves funds without capturing. Use for hotels, gas stations, or open-tab scenarios.
{
  "amount": {
    "subtotal_iva0": 10000,
    "subtotal_iva": 0,
    "iva": 0,
    "tip": 0
  },
  "client_transaction_id": "auth-20240317-001"
}
Card typeValidity
Debit7 days
Credit28 days

Capture#

Collects funds reserved by a prior authorization. Amount must be ≤ 110% of the authorization plus all non-canceled re-authorizations. Only one capture per authorization cycle.
{
  "transaction_reference": "6f16659e-b711-4995-a9ae-161aecbd6521",
  "amount": {
    "subtotal_iva0": 10000,
    "subtotal_iva": 0,
    "iva": 0
  },
  "client_transaction_id": "cap-20240317-001",
  "omit_card": true
}
omit_card decides whether the terminal asks the cardholder for the card. With true the operation runs without it — which is what makes the hotel case work: extending or capturing a pre-authorization after the guest has left the desk. It applies to /capture, /re_authorization and /void, in sync and async.

Reversal (/void)#

There is one reversal endpoint, and the system decides what the operation becomes based on when you call it. The cutoff is 23:59 local time: within the same calendar day as the original transaction the reversal is a cancellation; from midnight onwards it enters the refund cycle and takes business days.
Wait at least 1 minute after the original transaction before reversing it, or it fails for no apparent reason.
{
  "transaction_reference": "6f16659e-b711-4995-a9ae-161aecbd6521",
  "amount": {
    "subtotal_iva0": 10000,
    "subtotal_iva": 0,
    "iva": 0
  },
  "client_transaction_id": "void-20240317-001"
}
The type returned by transaction search tells you what actually happened:
TypeWhat it means
VOIDYou called /void on the same calendar day. Cancellation — the cardholder never sees the charge
REFUNDYou called /void after the cutoff. It entered the refund cycle and takes business days
REVERSEYou did not ask for it. The system generates it on its own when communication fails
INFO
REVERSE is the one worth handling explicitly: your POS can find a reversal in transaction search that it never requested. It is not an error — it is how the platform resolves a charge whose communication was cut mid-flight.

Transaction Search#

Only page and size are required — filters and every property inside it are optional.
{
  "page": 1,
  "size": 10,
  "filters": {
    "last_four_digits": "9130",
    "transaction_type": "SALE",
    "start_date": 1785564000000,
    "end_date": 1788242399000
  }
}
Available filters: bin, last_four_digits, client_transaction_id, transaction_reference, start_date, end_date and transaction_type.
start_date and end_date are Unix timestamps in milliseconds (13 digits). Send 0 in both to disable date filtering.
DANGER
A 10-digit value in seconds lands in January 1970. If only start_date is wrong, the request succeeds and returns your entire history instead of the range you asked for — check the digit count before you reconcile.
Mexico dropped daylight saving time in 2022, so most of the country stays on UTC-6 all year — but resolve America/Mexico_City anyway, because the northern border municipalities still follow US DST:

transaction_type#

The filter accepts eight values, in uppercase: CAPTURE, DEFERRED, PREAUTH, REAUTH, REFUND, REVERSE, SALE, VOID.
They are not the names of the routes. This table is how you correlate one transaction across the route you called, the search you queried and the event you received:
RouteSearch typeEvent
/chargeSALEcharge
/charge with query_deferredDEFERREDcharge
/authorizationPREAUTHauthorization
/captureCAPTUREcapture
/re_authorizationREAUTHre_authorization
/void same calendar dayVOIDvoid
/void after cutoffREFUNDvoid
(system-generated)REVERSE—
/pos_tipSALEpos_tip
Two consequences worth knowing. A /pos_tip is recorded as a sale, so there is no dedicated type for tips — to tell one from a normal charge, look at the original transaction_reference or at the tip inside the amount. And PREAUTH here is authorization as an event name: three naming conventions for the same thing, which is why this table exists.

Transaction lifecycle#

A terminal-mediated payment moves through seven states. Five originate in the terminal; only APPROVAL and DECLINED come from the acquirer.
StatusOriginMeaning
TERMINAL_ACKNOWLEDGEDTerminalPayment intent received. Always the first state
TERMINAL_CANCELEDTerminalCanceled by the cardholder, or aborted by the POS
CARD_PRESENTEDTerminalThe cardholder presented the card. See reading_type
TERMINAL_REJECTEDTerminalRejected locally — timeout, max retries, or validation
APPROVAL_REQUESTEDTerminalSent to the acquirer for authorization
DECLINEDAcquirerThe acquirer declined
APPROVALAcquirerThe acquirer approved
TERMINAL_ACKNOWLEDGED ─┬─→ CARD_PRESENTED ──┬─→ APPROVAL_REQUESTED ─┬─→ APPROVAL
                       │         │      ▲   │                       └─→ DECLINED
                       │         │      └───┘  card re-presented after rejection
                       │         └─→ TERMINAL_CANCELED
                       ├─→ TERMINAL_CANCELED
                       └─→ TERMINAL_REJECTED
DANGER
APPROVAL_REQUESTED is the point of no return. Once the transaction reaches the acquirer you can no longer abort it — wait for APPROVAL or DECLINED, then reverse it with /void.

Event payload#

Every event — including the immediate async acknowledgement — uses the same envelope:
{
  "event_id": "c08211a1-344c-4f1c-850b-41e33fb08cca",
  "previous_status": "TERMINAL_ACKNOWLEDGED",
  "occurred_at": "2026-08-03T20:53:34.859Z",
  "status": "CARD_PRESENTED",
  "merchant_id": "20000000103802320000",
  "client_transaction_id": "c5a3f3be-9d6f-4d39-8af5-58dbb589af79",
  "interaction_attempt": 1,
  "reading_type": "CHIP",
  "terminal": {
    "serialNumber": "TJ54241P20911",
    "model": "P2SE-BPKT",
    "wifiMac": "",
    "room": "3.0.10"
  },
  "operation": {
    "type": "charge",
    "amount": {
      "iva": 0.0,
      "subtotalIva": 0.0,
      "subtotalIva0": 12000.0,
      "extraTaxes": { "airportTax": 0.0, "iac": 0.0, "ice": 0.0, "travelAgency": 0.0 }
    },
    "clientTransactionId": "c5a3f3be-9d6f-4d39-8af5-58dbb589af79",
    "eventsWebHook": "https://api.negocio.mx/webhook/terminal-events",
    "metadata": {
      "customerEmail": "user@example.com",
      "device": "SUNMI-P3",
      "reference": "ORD-20240317-001"
    }
  }
}
WARNING
Mixed casing is intentional. Top-level event fields use snake_case; everything inside terminal and operation uses camelCase (serialNumber, subtotalIva0, eventsWebHook). This mirrors the terminal's internal representation — deserialize it as-is.
FieldPresent when
previous_statusAlways. Empty string ("") on the first event
interaction_attemptFrom CARD_PRESENTED onward. Only TERMINAL_ACKNOWLEDGED can carry 0
reading_typeFrom CARD_PRESENTED onward — CHIP, CONTACTLESS or MAGNETIC_STRIPE
failure_reasonOnly on TERMINAL_REJECTED and DECLINED
operation.transactionReferenceOn capture, re-authorization, post-tip and void
Correlate all events of a transaction by client_transaction_id. Deduplicate deliveries by event_id.

Webhook delivery#

Your endpoint must acknowledge with any 2xx.
OutcomeBehavior
2xxSuccess — delivery complete
Timeout, connection reset, DNS failureRetry
408, 429, 500, 502, 503, 504Retry
400, 401, 403, 404, 409, 422No retry — permanent rejection
Backoff is exponential with jitter (base = 2s): delay = min(60s, base * 2^attempt) + random(0..base). Delivery stops after 10 attempts or 15 minutes, whichever comes first.
INFO
If the terminal loses connectivity it queues events locally and replays them once the network returns, preserving per-transaction ordering. Make your consumer idempotent: use event_id to discard duplicates and previous_status to detect gaps.

Print operations#

OperationEndpointDescription
Create Print JobPOST /sync/printQueue a print job on the terminal printer
Get Print Job StatusPOST /sync/print_jobPoll the status of a queued print job
Printing is asynchronous — the create endpoint returns 202 Accepted immediately. Supply a webhookUrl or poll for the result. Both endpoints use the same hash + encryption authentication as the payment operations.

Create Print Job#

Write type in lowercase; every other enum value (align, dividerType, algorithm, errorLevel) is UPPERCASE.
{
  "printJobId": "RECEIPT-20240317-001",
  "webhookUrl": "https://pos.yourstore.com/webhooks/print",
  "skipIfBusy": false,
  "commands": [
    { "type": "text", "text": "MI COMERCIO MÉXICO\n", "align": "CENTER", "size": 32, "bold": true },
    { "type": "divider", "dividerType": "SOLID", "offset": 10 },
    { "type": "columns", "columns": [
        { "text": "Producto Premium", "weight": 2, "align": "LEFT" },
        { "text": "$100.00", "weight": 1, "align": "RIGHT" }
    ]},
    { "type": "divider", "dividerType": "DOTTED", "offset": 10 },
    { "type": "text", "text": "TOTAL: $100.00\n", "align": "RIGHT", "size": 32, "bold": true },
    { "type": "qr", "content": "https://facturacion.micomercio.mx/ticket/7788", "dotSize": 8, "errorLevel": "H", "align": "CENTER" },
    { "type": "feed", "lines": 3 },
    { "type": "cut" }
  ]
}
Response — 202 Accepted:
{
  "printJobId": "RECEIPT-20240317-001",
  "status": "PENDING",
  "message": "Impresión encolada correctamente."
}
INFO
Reuse the same printJobId on retries — the terminal deduplicates by it and will not print twice. Always end with feed + cut, advancing at least 3 lines.

Get Print Job Status#

print_job_id travels in the request body, not as a query parameter. Poll every 2–3 seconds and stop on COMPLETED or FAILED.
{
  "print_job_id": "RECEIPT-20240317-001"
}
StatusDescription
PENDINGJob queued — not yet printed
COMPLETEDPrinted and cut successfully
FAILEDHardware error — see errorCode
Unlike the payment endpoints, these return real HTTP codes: 404 if the job does not exist and 409 while the printer is busy. A TER-004 here means the printer is busy and the job can be retried in a few seconds — the same code on a payment endpoint means the cardholder canceled on the terminal, which must not be retried.

Available Endpoints#

Charge
One-step authorization + capture.
Charge (Async)
Non-blocking charge. Outcome arrives on the events webhook.
Authorization
Reserve funds for later capture.
Authorization (Async)
Non-blocking pre-authorization.
Capture
Collect reserved funds from a prior authorization. Supports omit_card.
Capture (Async)
Non-blocking capture. Supports omit_card.
Re-authorization
Extend or increase a pre-authorization. Supports omit_card.
Re-authorization (Async)
Non-blocking re-authorization. Supports omit_card.
Post-tip
Add gratuity to an authorized transaction.
Post-tip (Async)
Non-blocking post-tip.
Reversal
Reverse a transaction. Cancellation within the calendar day, refund after cutoff. Supports omit_card.
Reversal (Async)
Non-blocking reversal. Supports omit_card.
Abort
Cancel a transaction currently in progress. Sync only — sign {}.
Transaction Search
Query terminal transaction history. Sync only.
Create Print Job
Queue a print job. Returns immediately — result via webhook or polling.
Get Print Job Status
Poll the status of a queued print job.

Got a suggestion on this documentation? Contact us.
Modified at 2026-09-09 22:26:49
Previous
Error Catalog
Next
Payment
Built with