1. Recurring Card Payments (Online)
Kushki Docs
English
  • Español
  • English
  • Home
  • Quick Start
    • Frequently Asked Questions
    • Moving to Production
    • Policy for Important API Changes
    • Test Data
    • Error Codes
    • Latest Features
  • Payment Glossary
    • Payments Glossary
  • One-time card payments (Online)
    • Supported card brands
    • Functionalities by business model
    • How do third party commissions work?
    • Integration guide Third Party Commissions
    • Network Tokens
    • One-step Payments
      • How do Card Payments Work?
      • Accept a Card Payment
      • Direct charge (without token)
      • Accept One-Time Payments with OTP
      • OTP Authentication Error Codes
      • Error codes for single card payments
    • Two-steps Payments
      • How do single payments with authorization and capture work?
      • Receive payments with authorization and capture
    • Refunds
      • Returns, cancellations, and refunds
    • 3DS Authentication
      • Introduction to 3DS
      • 3DS API integration
      • 3DS integration with kushki.js library
      • 3DS API integration plus kushki.js library
      • 3DS Error Codes
    • Apple Pay Payments
      • Apple Pay Configuration
      • Apple Pay Sandbox testing
  • Recurring Card Payments (Online)
    • Functionalities by business model
    • External subscriptions to Kushki
    • Authenticate your subscriptions with 3DS
    • Accept one-click payments with 3DS
    • Error codes in recurring charges
    • Apple Pay for Subscriptions
    • Scheduled payments
      • How do Credit or Debit Card Payment Recurring Charges Work?
      • Create a recurring charge
      • Manage your Scheduled Charges
    • OneClick Payments
      • Accepting One-Click Payments
      • How do OneClick payments with authorization and capture work?
      • Receive one-click payments with authorization and capture
  • Card-present payments
    • Card present payments
    • Accept card present payments
    • Test data
    • Webhooks for card present
    • Cloud Terminal API
      • Cloud terminal API overview
      • Take payments
      • Cancel a payment request
      • Check the status of a payment request
      • How to print a customized ticket?
    • App-to-app
      • App-to-app overview
      • Take payments
    • Terminal SDK
      • Terminal SDK Introduction
      • Take payments
    • Raw card-present API
      • Raw card-present API overview
      • Cryptographic key exchange
      • Sample script to encrypt information
      • Take Payments
      • Frequently Asked Questions
      • Error codes for card-present transactions
    • Transactions
      • Transactions
      • Cancel payments
    • Kushki One
      • First Steps
      • Autenticación y Cifrado de Requests
      • Accept payments with Kushki One
      • Amount Format
      • Async services and webhooks
      • Printing on SmartPOS terminal
      • Unified Error Catalog — Kushki ONE Connect
    • Kushki One Payment App
      • Overview
      • Process a payment
      • Split payment on the terminal
      • Refunds and PreAuth & Capture
      • Review Your Transactions
      • Terminal Setup
  • Wire Transfers
    • How do Payments by Wire Transfers Work?
    • Banks and transaction details for bank transfer payments
    • Receive Wire Transfers
    • Check the Status of a Transaction
  • Money Disbursement
    • Wire Transfer
      • How Does a Payment Distribution by Wire Transfer Work?
      • Payment Distribution to Bank Accounts
      • Error codes for transfer dispersions
  • Payment Links
    • Smartlinks
  • Plugins
    • Shopify
      • Shopify
      • Plugin Operation
    • VTEX
      • VTEX Integration Guide
  • Payment forms and buttons
    • Kajita
      • How Does it Work?
      • Payment Kajitas
    • Payment Button
      • Overview
      • Generate a payment button
  • Branch Offices Management
    • How to Onboard Submerchants via API
  • Notifications
    • Webhooks
    • Good Practices
    • Check your Webhooks
    • One-time Payments Webhooks
      • Webhook for One-Time Payments made with a card
      • Webhook for One-Time Payments by Wire Transfer
      • Webhook for One-Time Payments in Cash
    • Recurring Payments Webhooks
      • Webhook for Recurring Payments Made with Card
    • Payment Distribution Webhooks
      • Webhook for payment disbursement through wire transfer
    • Payment button Webhooks
      • Webhooks with Payment Button
    • Smartlinks Webhooks
      • Webhooks with Smartlinks
    • Refunds Webhooks
      • Webhook for Voids and Refunds
      • Chargeback Webhooks
HomeMexico 🇲🇽
Ecuador 🇪🇨Chile 🇨🇱Colombia 🇨🇴Peru 🇵🇪
HomeMexico 🇲🇽
Ecuador 🇪🇨Chile 🇨🇱Colombia 🇨🇴Peru 🇵🇪
Status
Soporte / Support
English
  • Español
  • English
  1. Recurring Card Payments (Online)

External subscriptions to Kushki

Manage your subscriptions externally and charge with Kushki

Types of subscriptions#

With Kushki, you have 2 options to manage your subscriptions externally:
1.
Recurring transactions without CVV (with external subscription engine): ideal for payment orchestrators, in this case the tokenization of the card is 100% on your side and Kushki is exclusively in charge of processing the on-demand payments.
2.
Recurring transactions with external subscription engine: use your own subscription engine and submit an initial transaction in Kushki with full card information and then execute subsequent charges without CVV.
Important
Due to our risk policies, the above mentioned options require a prior evaluation by the Kushki team. Please contact your account executive or pre-sales engineer to assess feasibility.

1. CVV-less Transactions (with an external subscription engine)#

Kushki, through its acquiring services, allows you to process on-demand payments using card credentials tokenized outside of its platform (for example, by an orchestrator or external subscription engine). To use this flow, the merchant must have valid PCI DSS certification and must properly manage the security, storage, and usage of the card token.
The acceptance of these transactions fully depends on the issuer's risk logic and policies.

Usage Conditions#

Important
Due to our risk policies, implementing this form of processing requires a prior evaluation by the Kushki team. Please contact your account executive or pre-sales engineer to assess feasibility.
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.
To process payments with an external recurrence engine and omitting the cvv, you need to follow these steps:

1. Request service activation from Kushki#

Contact your account executive to request the activation of the external subscription acceptance service so that you can process charges with Kushki while omitting the cvv.

2. Request a token for card charge, omitting the cvv#

To generate a token without cvv, simply omit it in the request. Remember that it is necessary to activate this service first before using it; otherwise, it will return a K015 error,  Transaction not allowed without ccv2.
{
   "card": {
       "name": "John Doe",
       "number": "5451951574925480",
       "expiryMonth": "05",
       "expiryYear": "30"
   },
   "totalAmount": 50,
   "currency": "PEN"
}

3. Execute a charge#

For a charge to be considered recurrent, it is necessary to send the 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"
}
If, on the other hand, you want to execute a charge not tied to a subscription, omit the externalSubscriptionIDparameter.

2. Recurring transactions with external subscription engine#

In this model, you manage the subscriptions with your engine of choice and execute the charges with Kushki indicating whether it is an initial recurrence or the execution of the charge for a subsequent recurrence.
To implement this option you must be PCI compliant due to the handling of sensitive card data.
Applies in  Available    Implementation   
Colombia 🇨🇴
México 🇲🇽
Chile 🇨🇱
Ecuador 🇪🇨
Perú 🇵🇪
☑Acquirer
☑ Aggregator
API
Important
Due to our risk policies, implementing this form of processing requires a prior evaluation by the Kushki team. Please contact your account executive or pre-sales engineer to assess feasibility.
To process one-click or recurring payments without sending the cvv, you need to follow these steps:

Step 1. Request service activation from Kushki#

Contact your account executive to request the activation of the external subscription acceptance service so that you can process charges with Kushki while omitting the cvv.

Step 2. Initial recurrence#

If it is the first time executing the initial recurrence (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"
}

Step 3. Make an initial charge#

After generating a token, you can make a charge. To do this, send the required information.
Important
It's important to save the 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"
}

Validate the card without completing the charge (validateOnly)#

If instead of capturing the full amount on the initial recurrence you only need to confirm the card is valid, add the 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.
Important
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"
}
Keep in mind
The 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.

Step 4. Subsequent recurrence#

If you need to process a charge omitting the cvv, it is required to have executed an initial recurrence (step 1). You must send the card's transactional information, omitting the card's cvv and sending the 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"
}

Step 5. Perform a subsequent charge#

In order to charge without cvv it is necessary to send the additional field 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"
}

Card-on-file with explicit cardholder consent (storeCredential)#

As an alternative to the flow in steps 2 through 5, you can use 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.

Initial recurrence with storeCredential#

Send 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
}
Run the initial charge with this token as in step 3, and save the transactionReference from the response.

Subsequent recurrence with storeCredential#

Send storeCredential: true, transactionMode: "subsequentRecurrence", and initialRecurrenceReference with the saved transactionReference — this time inside the token request, not in the charge.
Important
In this case, the 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"
}
With this token, run the subsequent charge as usual, without including initialRecurrenceReference in the charge.
Keep in mind
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"}.
Modificado en 2026-10-20 16:17:56
Anterior
Functionalities by business model
Siguiente
Authenticate your subscriptions with 3DS
Built with