| Applies in | Available | Implementation |
|---|---|---|
| Colombia 🇨🇴 México 🇲🇽 Chile 🇨🇱 Perú 🇵🇪 | ☑Acquirer ☐ Aggregator | API |
NOTE: It is required to validate if this service is available for your commerce and activate it on demand before being able to use it.
{
"card": {
"name": "John Doe",
"number": "5451951574925480",
"expiryMonth": "05",
"expiryYear": "30"
},
"totalAmount": 50,
"currency": "PEN"
}externalSubscriptionID field with the ID of the subscription from your external engine, with a length equal to or less than 20 alphanumeric characters. This way, Kushki will identify that it corresponds to a subscription managed by an external engine. You can do this when executing one-time charge{
"token": "{{token}}",
"amount": {
"subtotalIva": 0,
"subtotalIva0": 50,
"ice": 0,
"iva": 0,
"currency": "PEN",
"extraTaxes": {
"iac": 0,
"tasaAeroportuaria": 0,
"agenciaDeViaje": 0
}
},
"metadata": {
"contractID": "157AB"
},
"contactDetails": {
"documentType": "PAS",
"documentNumber": "1234567890",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+513912345678"
},
"orderDetails": {
"siteDomain": "example.com",
"shippingDetails": {
"name": "John Doe",
"phone": "+513912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipcode": "15084"
},
"billingDetails": {
"name": "John Doe",
"phone": "+593912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipCode": "15084"
}
},
"productDetails": {
"product": [
{
"id": "198952AB",
"title": "eBook Digital Services",
"price": 30,
"sku": "10101042",
"quantity": 1
},
{
"id": "198953AB",
"title": "eBook Virtual Selling",
"price": 20,
"sku": "004834GQ",
"quantity": 1
}
]
},
"fullResponse": "v2",
"externalSubscriptionID": "SUB1228930920"
}externalSubscriptionIDparameter.| Applies in | Available | Implementation |
|---|---|---|
| Colombia 🇨🇴 México 🇲🇽 Chile 🇨🇱 Ecuador 🇪🇨 Perú 🇵🇪 | ☑Acquirer ☑ Aggregator | API |
initialRecurrence), it is necessary to send all the transactional data of the card, including the cvv and the transactionMode field with the value of initialRecurrence to generate a token which can be used later to make a charge. "card": {
"name": "John Doe",
"number": "5451951574925480",
"expiryMonth": "05",
"expiryYear": "30",
"cvv": "123"
},
"totalAmount": 50,
"currency": "PEN",
"transactionMode": "initialRecurrence"
}transactionReferencein the case of an approved transaction, as it will be required for subsequent charges without cvv.{
"token": "{{token}}",
"amount": {
"subtotalIva": 0,
"subtotalIva0": 50,
"ice": 0,
"iva": 0,
"currency": "PEN",
"extraTaxes": {
"iac": 0,
"tasaAeroportuaria": 0,
"agenciaDeViaje": 0
}
},
"metadata": {
"contractID": "157AB"
},
"contactDetails": {
"documentType": "PAS",
"documentNumber": "1234567890",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+513912345678"
},
"orderDetails": {
"siteDomain": "example.com",
"shippingDetails": {
"name": "John Doe",
"phone": "+513912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipcode": "15084"
},
"billingDetails": {
"name": "John Doe",
"phone": "+593912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipCode": "15084"
}
},
"productDetails": {
"product": [
{
"id": "198952AB",
"title": "eBook Digital Services",
"price": 30,
"sku": "10101042",
"quantity": 1
},
{
"id": "198953AB",
"title": "eBook Virtual Selling",
"price": 20,
"sku": "004834GQ",
"quantity": 1
}
]
},
"fullResponse": "v2"
}validateOnly field at the root of the charge from the previous step. Kushki processes a merchant-configurable micro-charge and automatically voids it; no funds are retained on the cardholder's card.validateOnly only applies to the initial-recurrence charge (step 3). Do not send it on subsequent-recurrence charges (step 5).{
"token": "{{token}}",
"validateOnly": true,
"amount": {
"subtotalIva": 0,
"subtotalIva0": 50,
"ice": 0,
"iva": 0,
"currency": "PEN",
"extraTaxes": {
"iac": 0,
"tasaAeroportuaria": 0,
"agenciaDeViaje": 0
}
},
"metadata": {
"contractID": "157AB"
},
"contactDetails": {
"documentType": "PAS",
"documentNumber": "1234567890",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+513912345678"
},
"orderDetails": {
"siteDomain": "example.com",
"shippingDetails": {
"name": "John Doe",
"phone": "+513912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipcode": "15084"
},
"billingDetails": {
"name": "John Doe",
"phone": "+593912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipCode": "15084"
}
},
"productDetails": {
"product": [
{
"id": "198952AB",
"title": "eBook Digital Services",
"price": 30,
"sku": "10101042",
"quantity": 1
},
{
"id": "198953AB",
"title": "eBook Virtual Selling",
"price": 20,
"sku": "004834GQ",
"quantity": 1
}
]
},
"fullResponse": "v2"
}validateOnly field must be sent in exact camelCase. If you send it as validateonly (lowercase), the charge is processed as a normal charge and the automatic void of the micro-charge is not triggered.transactionMode field with the value of subsequentRecurrence to generate a token which can be used later to make a charge.{
"card": {
"name": "John Doe",
"number": "5451951574925480",
"expiryMonth": "05",
"expiryYear": "30"
},
"totalAmount": 50,
"currency": "PEN",
"transactionMode": "subsequentRecurrence"
}initialRecurrenceReference with the value of the transactionReference obtained in the response of step 3 when performing the charge.{
"token": "{{token}}",
"amount": {
"subtotalIva": 0,
"subtotalIva0": 50,
"ice": 0,
"iva": 0,
"currency": "PEN",
"extraTaxes": {
"iac": 0,
"tasaAeroportuaria": 0,
"agenciaDeViaje": 0
}
},
"metadata": {
"contractID": "157AB"
},
"contactDetails": {
"documentType": "PAS",
"documentNumber": "1234567890",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "+513912345678"
},
"orderDetails": {
"siteDomain": "example.com",
"shippingDetails": {
"name": "John Doe",
"phone": "+513912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipcode": "15084"
},
"billingDetails": {
"name": "John Doe",
"phone": "+593912345678",
"address": "Av. Simón Bolivar 1515",
"city": "Lima",
"region": "Pueblo Libre",
"country": "Perú",
"zipCode": "15084"
}
},
"productDetails": {
"product": [
{
"id": "198952AB",
"title": "eBook Digital Services",
"price": 30,
"sku": "10101042",
"quantity": 1
},
{
"id": "198953AB",
"title": "eBook Virtual Selling",
"price": 20,
"sku": "004834GQ",
"quantity": 1
}
]
},
"fullResponse": "v2",
"initialRecurrenceReference": "6c21b4b4-d78d-4e50-8f89-b9f81b0ff509"
}storeCredential so Kushki explicitly records the cardholder's consent to store their card and use it for future charges. The key difference from the flow above is that initialRecurrenceReference is sent in the token, not in the charge, for the subsequent recurrence.storeCredential: true together with transactionMode: "initialRecurrence" when generating the token.{
"card": {
"name": "John Doe",
"number": "5451951574925480",
"expiryMonth": "05",
"expiryYear": "30",
"cvv": "123"
},
"totalAmount": 50,
"currency": "PEN",
"transactionMode": "initialRecurrence",
"storeCredential": true
}transactionReference from the response.storeCredential: true, transactionMode: "subsequentRecurrence", and initialRecurrenceReference with the saved transactionReference — this time inside the token request, not in the charge.card object is not required — Kushki uses the card already on file via initialRecurrenceReference.{
"totalAmount": 50,
"currency": "PEN",
"transactionMode": "subsequentRecurrence",
"storeCredential": true,
"initialRecurrenceReference": "6c21b4b4-d78d-4e50-8f89-b9f81b0ff509"
}initialRecurrenceReference in the charge.storeCredential must be sent in exact camelCase. If the initial token is sent with incorrect casing (storecredential), a subsequent-recurrence token referencing it will fail with {"code": "K105", "message": "Decrypt error"}.