Accept payments with Kushki One
Payments with SmartPOS terminal
The Payment API allows you to process in-person card payments from your checkout system to a Kushki ONE terminal (Sunmi P3, Sunmi P2 SE) in Semi-Integrated mode. The terminal manages all interaction with the customer and the EMV chip β your system only sends the amount and receives the result.
How it works
All endpoints share the same request and response structure regardless of how your POS connects to the terminal. The only thing that varies between topologies is the base URL:
| Topology | Base URL |
|---|---|
| Local Network (LAN / Wi-Fi) | http://{TERMINAL_IP}:6868/terminal/v1/sync |
| Cloud (Internet) β UAT | https://uat-cloudt.kushkipagos.com/terminal/v1/{terminalSerial}/sync |
| Cloud (Internet) β Production | https://cloudt.kushkipagos.com/terminal/v1/{terminalSerial}/sync |
Available Endpoints
| Endpoint | Method | Description |
|---|---|---|
/charge | POST | Single-step payment: authorization and capture in one operation |
/authorization | POST | Pre-authorization: reserves funds without capturing them |
/capture | POST | Captures funds from an approved pre-authorization |
/re_authorization | POST | Extends the amount or validity of an active pre-authorization |
/pos_tip | POST | Adds a tip to an already-authorized transaction |
/void | POST | Cancels a transaction on the same day, before the processor cutoff |
/refund | POST | Refunds a previously settled transaction |
/abort | GET | Immediately cancels a transaction currently in progress on the terminal |
/transaction_search_online | POST | Queries transaction history from the acquirer (Kushki) |
/transaction_search_local | POST | Queries transaction history stored locally on the terminal, no internet required |
Payment flows
Direct charge
The most common flow for retail merchants. The terminal activates the card reader and blocks until the customer completes the interaction and the acquirer responds.
POST /charge β 200 OK (approved: true)
Pre-authorization and capture
Ideal for hotels, gas stations, and open-tab restaurants, where the final amount is not known at the time of customer interaction.
POST /authorization β saves transaction_referenceβ (days later)POST /capture β using the saved transaction_reference
Validity of pre-authorizations
| Card type | Validity from authorization |
|---|---|
| Debit (Visa / Mastercard) | 7 days |
| Credit (Visa / Mastercard) | 28 days |
Capture can be up to 110% of the total authorized amount (authorization + re-authorizations). Only one capture is allowed per authorization cycle.
Key concepts
client_transaction_id
UUID v4 identifier generated by your checkout system. It acts as an idempotency key: if the terminal has already processed that ID, it detects the duplicate and prevents double charging. Generate a unique one per attempt and reuse it only if you are retrying exactly the same operation.
transaction_reference
Identifier generated by Kushki and returned in the response of each approved transaction. It is the link between operations of the same lifecycle. Persist this value in your system β without it, you cannot capture, re-authorize, void, or refund.
Amount Structure
All endpoints that involve an amount use the same amount object.
| Field | Type | Req. | Endpoints | Description |
|---|---|---|---|---|
iva | number | β | All | Value-added tax. Use 0 if not applicable |
subtotal_iva | number | β | All | Subtotal subject to VAT |
subtotal_iva0 | number | β | All | Subtotal exempt from VAT. Principal transaction amount |
tip | number | β | /pos_tip only | Tip amount. Do not send in /charge or /authorization |
extra_taxes | object | β | /charge, /authorization, /pos_tip | Additional taxes: airport_tax, iac, ice, travel_agency |
Authentication
Include these headers in every request:
| Header | Description |
|---|---|
Authorization | HMAC-SHA256 signature calculated over the request body using your Private-Credential-Id |
timestamp | Unix timestamp in milliseconds |
Voids and refunds
| Operation | When to use it |
|---|---|
| Void | Same day of the transaction, before the processorβs cutoff time |
| Refund | Once the transaction has already been settled, or if the cutoff time has passed |
Endpoint reference
Charge β Direct charge
POST /terminal/v1/sync/charge
Authorization and capture in a single operation. The terminal activates the card reader upon receiving the request and blocks until the customer completes the interaction. Use it as the standard flow for most retail merchants.
Authorization β Pre-authorization
POST /terminal/v1/sync/authorization
Reserves funds in the cardholderβs account without capturing them. Use this flow when the final amount is not known at the time of customer interaction: hotels, gas stations, open-tab restaurants.
Capture β Capture
POST /terminal/v1/sync/capture
Charges the funds reserved by a previous authorization. Requires the transaction_reference returned in the /authorization response. The amount to capture can be equal to or less than the authorized amount, up to a maximum of 110% of the total (authorization + re-authorizations).
Re-authorization β Re-authorization
POST /terminal/v1/sync/re_authorization
Extends the reserved amount or the validity of an active pre-authorization before capture. It can be executed multiple times on the same base authorization. Send subtotal_iva0: 0 to extend only the validity without modifying the amount.
Post-tip β Post-tip
POST /terminal/v1/sync/pos_tip
Adds a tip to a transaction that has already been authorized. Use it in flows where the customer decides the tip amount after the initial charge. Send the tip amount in amount.tip.
Void β Void
POST /terminal/v1/sync/void
Cancels a transaction on the same day before the processorβs cutoff. The amount is never debited from the customerβs account. Wait at least 1 minute after the original transaction before executing a void.
Refund β Refund
POST /terminal/v1/sync/refund
Refunds an already captured and settled transaction. It can be executed days after the original charge. Requires the transaction_reference from the original charge or capture response.
Abort β Cancel active transaction
GET /terminal/v1/sync/abort
Immediately cancels any transaction in progress on the terminal. Does not require a request body. Call it only while a transaction is active β after it has completed (approved or declined), it returns 409 Conflict.
Transaction Search β History Query
Kushki ONE provides two search variants depending on the data source:
POST /terminal/v1/sync/transaction_search_online
Queries transaction history directly from the acquirer (Kushki). Returns the most complete and up-to-date data. Requires internet connectivity. Results are paginated and can be filtered by card, date range, or transaction type.
POST /terminal/v1/sync/transaction_search_local
Queries transaction history stored locally on the terminal. Useful for
offline reconciliation or when the acquirer backend is unavailable.
Does not support transaction_type as a filter.
Best practices
- Generate a unique
client_transaction_idper attempt. Reuse it only in retries of the same logical operation. - Persist
transaction_referencein your database immediately upon receiving the authorization response. - Verify that the
amountfields sum correctly before sending the request. - Log the sent
client_transaction_idand the received HTTP code for each operation to facilitate reconciliation and support. - Use
abortonly while a transaction is active on the terminal β calling it after it has completed returns409 Conflict.
Error catalog
Consult the error models, codes, and recommended corrective actions for all Payment API endpoints in the Kushki ONE Error Catalog.
Chile
Colombia
Ecuador
Mexico