Private-Merchant-Id). Never expose it in client-side or frontend code — always call the token endpoint from your backend.POST /card/v1/tokens from your backend with the card data and transaction amount. The response returns a one-time token valid for a single charge.{
"card": {
"name": "Camila Rodríguez",
"number": "5451951574925480",
"expiryMonth": "08",
"expiryYear": "28",
"cvv": "121"
},
"totalAmount": 150000,
"currency": "COP"
}⚠️ Token expiry: Tokens expire after a short window. Use them immediately — do not store them for later use.
POST /card/v1/charges with the token and amount breakdown. Include contactDetails and, optionally, orderDetails and productDetails for fraud scoring.{
"token": "f5c64f7ac8ea42d5a58dcdc74de973dc",
"amount": {
"subtotalIva": 0,
"subtotalIva0": 150000,
"ice": 0,
"iva": 0,
"currency": "COP"
},
"contactDetails": {
"documentType": "CC",
"documentNumber": "1234567890",
"firstName": "Camila",
"lastName": "Rodríguez",
"email": "user@example.com",
"phoneNumber": "+573001234567"
}
}ticketNumber and transactionReference.transactionStatus — "APPROVAL" means the charge was authorized.{
"ticketNumber": "922513792073660814",
"transactionReference": "6f16659e-b711-4995-a9ae-161aecbd6521"
}"fullResponse": "v2" in your charge request.| Currency | Code |
|---|---|
| Colombian Peso | COP |
| Value | Description |
|---|---|
CC | Cédula de Ciudadanía 🇨🇴 |
NIT | Número de Identificación Tributaria 🇨🇴 |
CE | Cédula de Extranjería 🇨🇴 |
TI | Tarjeta de Identidad 🇨🇴 |
PP | Passport 🇨🇴 |
GET /card/v1/deferred/{bin}type:[
{
"months": ["2", "3", "4", "5", "6", "7"],
"monthsOfGrace": [],
"type": "all"
}
]months as a top-level field in the charge body (not inside a deferred object):{
"token": "24e5cc0d47fc4b2ab098bdb7d0b94569",
"amount": {
"subtotalIva": 0,
"subtotalIva0": 300000,
"ice": 0,
"iva": 0,
"currency": "COP"
},
"months": 3,
"contactDetails": {
"documentType": "CC",
"documentNumber": "1234567890",
"firstName": "Camila",
"lastName": "Rodríguez",
"email": "user@example.com",
"phoneNumber": "+573001234567"
}
}POST /card/v1/preAuthorization — Reserves funds on the card. Returns a ticketNumber.POST /card/v1/reauthorization — Extends the authorization window or adjusts the reserved amount. Pass the original ticketNumber.POST /card/v1/capture — Captures the reserved amount (or a partial amount). Pass the original ticketNumber.DELETE /v1/charges/{ticketNumber} — Cancels the authorization and releases the reserved funds.| Operation | Endpoint | Notes |
|---|---|---|
| Void | DELETE /v1/charges/{ticketNumber} | Cancel a transaction. Supported: total and partial void. |
| Refund | DELETE /v1/refund/{ticketNumber} | Return funds to the cardholder. Supported: total and partial refund. |
amount object in the request body with the partial amount.transactionMode)transactionMode in the token request for recurring flows or zero-amount card validation:| Value | Description |
|---|---|
initialRecurrence | Marks the first transaction in a recurring series. |
subsequentRecurrence | Subsequent recurring charges — CVV is not required once an initialRecurrence has been processed. |
accountValidation | Zero-amount card validation. Confirms the card is valid without charging it. |
POST /card/v2/charges accepts card data directly in the request body — no prior token call required. Useful for server-to-server integrations where you already hold the card data.webhooks array in your charge or pre-auth request to receive real-time notifications:{
"webhooks": ["https://yoursite.com/kushki/notify"]
}POST to each URL when the transaction status changes.| Mode | Description |
|---|---|
| Insecure 3DS | Kushki handles the 3DS flow through kushki.js. Include the jwt obtained from the library when requesting the token. |
| Own 3DS engine | You run your own 3DS server. Include the authentication result fields in threeDomainSecure — cavv, eci, and specificationVersion for Visa; directoryServerTransactionID, eci, ucaf, specificationVersion, and collectionIndicator for Mastercard. |
05 and 06 are secure; 07 is risky.01 and 02 are secure; 00 is risky.acceptRisk: true. By doing so the merchant assumes liability for chargebacks.isNetworkToken: true in your token or tokenless charge request and include the networkToken object with the additional metadata:| Field | Description |
|---|---|
deviceType | Type of device originating the tokenized transaction |
requestorId | Unique ID assigned to the token requestor by the card network |
source | Source of the token |
walletId | Digital wallet identifier — "01" for Apple Pay, "04" for other wallets |
authenticationLevel | Authentication level performed during token provisioning |
mvv | 10-digit Merchant Verification Value (Visa transactions only) |
cryptogram field on the card object when the network token carries a cryptogram from the digital wallet or issuer token service. The value must be between 20 and 28 alphanumeric characters.⚠️ BETA: This feature is available in Colombia. Contact your Kushki account manager before enabling it.
GET /card/v1/bin/{bin} and GET /deferred/v2/bin/{bin} return card metadata (bank, brand, card type, issuing country) for a given BIN. Use this to determine deferred eligibility and display the card brand logo at checkout.totalAmount: 0. The token flow runs a zero-amount validation against the card.https://api.kushkipagos.com/Got a suggestion on this documentation? Contact us.