This product is in early access. Parameters, response structures and behaviors may change without prior notice. Do not use this version in production without coordinating with the Kushki integrations team first.
The Payment API lets you process card-present payments from your POS system to a Kushki ONE terminal running in semi-integrated mode. The terminal handles the entire cardholder interaction and the EMV chip: your system sends the amount and receives the result.
Every operation that requires terminal interaction exists in two variants, under separate path prefixes.
Mode
Prefix
Behavior
Where the result arrives
Sync
/sync/
Holds the connection open until the acquirer answers
In the HTTP response
Async
/async/
Returns immediately with a TERMINAL_ACKNOWLEDGED acknowledgement. Never blocks
Webhook only
When to use async mode
A card-present payment depends on a person's interaction and frequently exceeds the 15 seconds most POS architectures tolerate. If your system cannot hold a connection open that long, use async mode and consume the events over webhook.
A UUID v4 identifier that your POS system generates. It works as an idempotency key: if the terminal already processed that identifier, it detects the duplicate and prevents a double charge.Generate a new one for every sale. Reuse it only when you are retrying the exact same operation after a network failure.
An identifier that Kushki generates and returns in the response of every approved transaction, inside rawResponse. It is the link between operations in the same lifecycle.
Persist this value
Store the transaction_reference in your database the moment you receive the response. Without it you cannot capture, re-authorize, void or refund that transaction.
On /pos_tip, amount.tip is not an optional field — it is the amount of the operation.omit_card is what makes the hotel case work: extending or capturing a pre-authorization after the guest has left the desk.
The two fields are mutually exclusive and never travel together:
Country
Field
Shape
Maximum
Mexico
query_deferred
Boolean. The terminal offers Meses Sin Intereses to the cardholder after reading the card; your POS does not choose the months
—
Chile
deferred
months, plus credit_type: "03" for cuotas comercio — a string, not a number
12 with credit_type, 48 without it
Colombia
deferred
months only. credit_type does not apply
48
Peru
deferred
months only. credit_type does not apply
2–48, every network
If a capability is not enabled for your terminal, the terminal ignores the field instead of rejecting the request — so a 200 does not prove the tip was applied. To have it enabled, write to soporte@kushkipagos.com.
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.
Whatever happened, payment endpoints answer 200. The status 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 codes, 404 when the job does not exist and 409 while the queue is busy.
Use this when the final amount is unknown at the time of the interaction: hotels, fuel stations, open-tab restaurants.
POST /sync/authorization → store transaction_reference
↓ (hours or days later)
POST /sync/capture → with the stored transaction_reference
You can insert /re_authorization to raise the reserved amount or extend the window before capturing. Send subtotal_iva0: 0 to extend the validity only.
A re-authorization can be canceled
Once you cancel a re-authorization, the transaction accepts no further re-authorizations.
The capture can reach up to 110% of the total authorized, adding the authorization and every non-canceled re-authorization. Only one capture is allowed per cycle.
Adds a tip to an already-authorized transaction. Use it when the cardholder decides the amount after the initial charge. Send the value in amount.tip alongside the original transaction_reference.
There is a single reversal endpoint, /void, and the system decides what the operation becomes based on when you call it. The cut-off is 23:59 local time in every country: within the same calendar day the reversal is a cancellation; from midnight onwards it enters the refund cycle and takes business days.
Wait at least 1 minute
Wait at least 1 minute after the original transaction before reversing it, or it fails for no apparent reason.
The type returned by transaction search tells you what actually happened:
Type
What it means
VOID
You called /void on the same calendar day. Cancellation — the cardholder never sees the charge
REFUND
You called /void after the cut-off. It entered the refund cycle and takes business days
REVERSE
You did not ask for it. The platform generates it on its own when communication with the terminal fails
A REVERSE you never requested is not an error
Your POS can find a REVERSE in transaction search without having called anything. It is how the platform resolves a charge whose communication was cut mid-flight — the scenario where the POS charges, the link drops, and nobody knows whether the transaction landed.
Kushki ONE uses one mechanism — hash + encryption — and it is the same in Cloud, on the local network and on localhost: Authorization: Basic <SHA512>, timestamp in seconds, and the body as the encrypted envelope {"data":"<iv_hex>:<cipher_hex>"}.Every payload shown on this page is the plaintext you encrypt, not what travels on the wire. The full flow, the key derivation chain and the diagnostic tree are on Authentication and request encryption.
Local Network and Localhost: send the encrypted_http_communication header
In Local Network and Localhost, every request also carries the header encrypted_http_communication: true, in UAT and in production. Cloud does not require it. Details in Authentication and request encryption.
Do not confuse Business-Code with private_credential_id
The signing key is your Business-Code. The private_credential_id is a terminal configuration field and is not used to sign requests.
Set a long client timeout
Card-present flows wait on a person. Use at least 90 seconds on Cloud, where the relay adds latency on top of the terminal's own processing time, and 15 seconds on the local network. A 30-second timeout on Cloud produces phantom failures on charges that were in fact approved.
A charge of 12000 minor units with no tax breakdown. What that represents depends on the country's decimals — check Amount format in Kushki ONE before your first integration.