Search

Are you looking for test card numbers?

Would you like to contact support?

Online-payment icon

Create a token to make recurring payments

Learn how to create and use tokens you stored with Adyen.

You can use tokens for:

  • One-off payments: One-off transactions where a shopper can either store their payment details or pay in your website or app at a later time using their saved details.
  • Subscriptions: A recurring transaction made at regular intervals for a product or a service.
  • Automatic top-ups: Contracts that occur on a non-fixed schedule using stored card details. This includes automatic top-ups when the cardholder's balance drops below a certain amount.

Set parameters to flag transactions

To flag the type of recurring transaction (one-off, subscription,or automatic top-up), use the recurringProcessingModel field. Pass it when you first create a token (to indicate what you intend to use the token for), and for each payment that you make with the token. The shopperInteraction field indicates whether you're creating a token, or using a previously created token.

Business model recurringProcessingModel shopperInteraction
Initial payment Later payment(s)
One-off payments CardOnFile Ecommerce ContAuth
Subscriptions Subscription Ecommerce ContAuth
Automatic top-ups and other non-fixed schedule contracts UnscheduledCardOnFile
Ecommerce ContAuth

If you are implementing 3D Secure for PSD2 SCA compliance and would like to know how the regulation will impact your recurring business model, see SCA requirements based on business model.

Create a token and pay

Select the tab that fits your business model and follow the integration steps:

One-off transactions where a shopper stores payment details or where the shopper purchases from your website or app at a later time using the saved details.

If you're using one of our client-side solutions, refer to Cards Drop-in pages for Web, iOS, and Android or Component pages for Web, iOS, and Android.

Save payment details for one-off payments

  1. From your server, make a POST /payments request and include the following values:
    • paymentMethod: Object that contains the shopper's payment details.
    • shopperReference: Your unique identifier for the shopper.
    • shopperInteraction: Ecommerce
    • recurringProcessingModel: CardOnFile
    • storePaymentMethod: true
    • amount: Object that contains the value to be paid. You can set the amount.value to 0 to validate the payment details with a zero-auth transaction before processing payments.

If you are implementing 3D Secure for PSD2 SCA compliance and are doing zero-auth transactions, contact our Support Team to enable 3D Secure for zero-auth transactions.

curl https://checkout-test.adyen.com/v53/payments \
-H "X-API-key: [Your API Key here]" \
-H "Content-Type: application/json" \
-d '{
   "amount":{
      "value":0,
      "currency":"USD"
   },
   "paymentMethod":{
      "type":"scheme",
      "number":"4111111111111111",
      "expiryMonth":"10",
      "expiryYear":"2020",
      "cvc":"737",
      "holderName":"John Smith"
   },
   "storePaymentMethod":true,
   "reference":"YOUR_ORDER_NUMBER",
   "shopperInteraction": "Ecommerce",
   "recurringProcessingModel": "CardOnFile",
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
   "returnUrl":"https://your-company.com/..."
}'
# Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen::Client.new
adyen.api_key = "YOUR X-API-KEY"
 
response = adyen.checkout.payments({
  :amount => {
    :currency => "USD",
    :value => 0
  },
  :reference => "YOUR_ORDER_NUMBER",
  :paymentMethod => {
    :type => "scheme",
    :number => "4111111111111111",
    :expiryMonth => "10",
    :expiryYear => "2020",
    :cvc => "737"
  },
  :storePaymentMethod => true,
  :shopperInteraction => Ecommerce,
  :recurringProcessingModel => CardOnFile,
  :shopperReference => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  :returnUrl => "https://your-company.com/...",
  :merchantAccount => "YOUR_MERCHANT_ACCOUNT"
})
// Set your X-API-KEY with the API key from the Customer Area.
Config config = new Config();
        config.setApiKey("Your X-API-KEY"));
        Client client = new Client(config);
         
        Checkout checkout = new Checkout(client);
        PaymentsRequest paymentsRequest = new PaymentsRequest();
        Amount amount = new Amount();
        amount.setCurrency("USD");
        amount.setValue(0L);
        paymentsRequest.setAmount(amount);
        paymentsRequest.setReference("YOUR_ORDER_NUMBER");
        paymentsRequest.setPaymentMethod(new HashMap<String, String>());
        paymentsRequest.putPaymentMethodItem("type","scheme");
        paymentsRequest.putPaymentMethodItem("number", "4111111111111111");
        paymentsRequest.putPaymentMethodItem("expiryMonth", "10");
        paymentsRequest.putPaymentMethodItem("expiryYear", "2020");
        paymentsRequest.putPaymentMethodItem("cvc", "737");
        paymentsRequest.putPaymentMethodItem("storePaymentMethod", "true");
        paymentsRequest.setShopperReference("YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j");
        paymentsRequest.setReturnUrl("https://your-company.com/...");
        paymentsRequest.setMerchantAccount("YOUR_MERCHANT_ACCOUNT");
        paymentsRequest.setShopperInteraction("Ecommerce");
        paymentsRequent.setRecurringProcessingModel("CardOnFile");
        PaymentsResponse response = checkout.payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("YOUR X-API-KEY");
$service = new \Adyen\Service\Checkout($client);

$params = array(
  "amount" => array(
    "currency" => "USD",
    "value" => 0
  ),
  "reference" => "Your order number",
  "paymentMethod" => array(
    "type" => "scheme",
    "number" => "4111111111111111",
    "expiryMonth" => "10",
    "expiryYear" => "2020",
    "cvc" => "737",
    "holderName" => "John Smith"
  ),
  "storePaymentMethod" => true,
  "returnUrl" => "https://your-company.com/checkout/",
  "shopperInteraction" => "Ecommerce",
  "recurringProcessingModel" => "CardOnFile",
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT",
  "reference" => "YOUR_ORDER_NUMBER",
  "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "returnUrl" => "https://your-company.com/..."
);
$result = $service->payments($params);
#Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen.Adyen()
adyen.client.xapikey = 'YOUR_X-API-KEY'

result = adyen.checkout.payments({
   'amount': {
      'value': 0,
      'currency': 'USD'
   },
   'reference': 'YOUR_ORDER_NUMBER',
   'paymentMethod': {
      'type': 'scheme',
      'number': '4111111111111111',
      'expiryMonth': '10',
      'expiryYear': '2020',
      'cvc': '737',
      'holderName': 'John Smith'
   },
   'storePaymentMethod': 'true',
   'shopperInteraction': 'Ecommerce',
   'recurringProcessingModel': 'CardOnFile',
   'shopperReference': 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
   'returnUrl': 'https://your-company.com/...',
   'merchantAccount': 'YOUR_MERCHANT_ACCOUNT'
})
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("YOUR_X-API-KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Model.Checkout.Amount("USD", 0);
var details = new Model.Checkout.DefaultPaymentMethodDetails{
  Type = "scheme",
  Number = "4111111111111111",
  ExpiryMonth = "10",
  ExpiryYear = "2020",
  Cvc = "737",
  HolderName = "John Smith"
};
var paymentsRequest = new Model.Checkout.PaymentRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  ReturnUrl = @"https://your-company.com/...",
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  StorePaymentMethod = "true",
  ShopperInteraction = "Ecommerce",
  RecurringProcessingModel = "CardOnFile",
  ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  PaymentMethod = details
};

var paymentResponse = checkout.Payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
const {Client, Config, CheckoutAPI} = require('@adyen/api-library');
const config = new Config();
// Set your X-API-KEY with the API key from the Customer Area.
config.apiKey = '[API_KEY]';
config.merchantAccount = '[YOUR_MERCHANT_ACCOUNT]';
const client = new Client({ config });
client.setEnvironment("TEST");
const checkout = new CheckoutAPI(client);
checkout.payments({
    amount: { currency: "USD", value: 0 },
    paymentMethod: {
        type: 'scheme',
        number: '4111111111111111',
        expiryMonth: '10',
        expiryYear: '2020',
        cvc: '737',
        holderName: 'John Smith'
    },
    reference: "YOUR_ORDER_NUMBER",
    merchantAccount: config.merchantAccount,
    storePaymentMethod: "true",
    shopperInteraction: "Ecommerce",
    recurringProcessingModel: "CardOnFile",
    returnUrl: "https://your-company.com/..."
}).then(res => res);

The token is created after a successful payment authorization to ensure that the payment details the shopper provided are linked to an active, chargeable account.

Authorised result code

If the payment authorization was successful, you will get a response with:

  • resultCode: Authorised
  • additionalData.recurring.recurringDetailReference: This contains the value that is the token for the saved payment detail. You will need this value to make future payments where the shopper uses their saved payment details.

To get the recurringDetailReference synchronously in your payments response, you have to enable the feature.

{
    "additionalData": {
        "recurring.recurringDetailReference": "8415698462516992",
        "recurring.shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j"
    },
    "pspReference": "8515815919501547",
    "resultCode": "Authorised",
    "amount": {
        "currency": "USD",
        "value": 0
    },
    "merchantReference": "YOUR_ORDER_NUMBER"
}

If you receive a Refused resultCode, then the details were not tokenized. You need to submit another payment request to try tokenizing again.

Make a one-off payment with saved payment details

  • From your server, make a POST /payments request and include the following parameters:

    • paymentMethod: Object that contains the shopper's tokenized payment details.
    • storedPaymentMethodId(for API 49 and later): This is the recurringDetailReference returned in the response when you created the token.
    • shopperReference: This is the shopperReference that you used the first time when you created the token for the shopper's card details.
    • shopperInteraction: ContAuth
    • recurringProcessingModel: CardOnFile
    • encryptedSecurityCode: (optional) Encrypted card verification code. If your shopper stored their card details, you can choose whether or not they need to send their CVC in subsequent payments.

    You cannot store your shopper's CVC as that violates PCI compliance rules.

If you are implementing 3D Secure for PSD2 SCA compliance, issuing banks might require SCA for ContAuth with CardOnFile transactions. Contact our Support Team to enable 3D Secure.

curl https://checkout-test.adyen.com/v53/payments \
-H "X-API-key: [Your API Key here]" \
-H "Content-Type: application/json" \
-d '{
   "amount":{
      "value":2000,
      "currency":"USD"
   },
   "paymentMethod":{
      "type":"scheme",
      "{hint:Previously known as recurringDetailReference}storedPaymentMethodId{/hint}":"7219687191761347",
      "encryptedSecurityCode": "adyenjs_0_1_18$MT6ppy0FAMVMLH..."
   },
   "reference":"YOUR_ORDER_NUMBER",
   "shopperInteraction": "ContAuth",
   "recurringProcessingModel": "CardOnFile",
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
   "returnUrl":"https://your-company.com/..."
}'
# Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen::Client.new
adyen.api_key = "YOUR X-API-KEY"
 
response = adyen.checkout.payments({
  :amount => {
    :currency => "USD",
    :value => 2000
  },
  :reference => "YOUR_ORDER_NUMBER",
  :paymentMethod => {
    :type => "scheme",
    :storedPaymentMethodId => "7219687191761347",
    :encryptedSecurityCode => "adyenjs_0_1_18$MT6ppy0FAMVMLH..."
  },
  :shopperInteraction => ContAuth,
  :recurringProcessingModel => CardOnFile,
  :shopperReference => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  :returnUrl => "https://your-company.com/...",
  :merchantAccount => "YOUR_MERCHANT_ACCOUNT"
})
// Set your X-API-KEY with the API key from the Customer Area.
Config config = new Config();
        config.setApiKey("Your X-API-KEY"));
        Client client = new Client(config);
         
        Checkout checkout = new Checkout(client);
        PaymentsRequest paymentsRequest = new PaymentsRequest();
        Amount amount = new Amount();
        amount.setCurrency("USD");
        amount.setValue(2000L);
        paymentsRequest.setAmount(amount);
        paymentsRequest.setReference("YOUR_ORDER_NUMBER");
        paymentsRequest.setPaymentMethod(new HashMap<String, String>());
        paymentsRequest.putPaymentMethodItem("type","scheme");
        paymentsRequest.putPaymentMethodItem("storedPaymentMethodId", "7219687191761347");
        paymentsRequest.putPaymentMethodItem("encryptedSecurityCode", "adyenjs_0_1_18$MT6ppy0FAMVMLH...");
        paymentsRequest.setShopperReference("YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j");
        paymentsRequest.setReturnUrl("https://your-company.com/...");
        paymentsRequest.setMerchantAccount("YOUR_MERCHANT_ACCOUNT");
        paymentsRequest.setShopperInteraction("ContAuth");
        paymentsRequent.setRecurringProcessingModel("CardOnFile");
        PaymentsResponse response = checkout.payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("YOUR X-API-KEY");
$service = new \Adyen\Service\Checkout($client);

$params = array(
  "amount" => array(
    "currency" => "USD",
    "value" => 2000
  ),
  "reference" => "Your order number",
  "paymentMethod" => array(
    "type" => "scheme",
    "storedPaymentMethodId" => "7219687191761347",
    "encryptedSecurityCode" => "adyenjs_0_1_18$MT6ppy0FAMVMLH..."
  ),
  "returnUrl" => "https://your-company.com/checkout/",
  "shopperInteraction" => "ContAuth",
  "recurringProcessingModel" => "CardOnFile",
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT",
  "reference" => "YOUR_ORDER_NUMBER",
  "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "returnUrl" => "https://your-company.com/..."
);
$result = $service->payments($params);
#Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen.Adyen()
adyen.client.xapikey = 'YOUR_X-API-KEY'

result = adyen.checkout.payments({
   'amount': {
      'value': 2000,
      'currency': 'USD'
   },
   'reference': 'YOUR_ORDER_NUMBER',
   'paymentMethod': {
      'type': 'scheme',
      'storedPaymentMethodId': '7219687191761347',
      'encryptedSecurityCode': 'adyenjs_0_1_18$MT6ppy0FAMVMLH...'
   },
   'shopperInteraction': 'ContAuth',
   'recurringProcessingModel': 'CardOnFile',
   'shopperReference': 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
   'returnUrl': 'https://your-company.com/...',
   'merchantAccount': 'YOUR_MERCHANT_ACCOUNT'
})
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("YOUR_X-API-KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Model.Checkout.Amount("USD", 2000);
var details = new Model.Checkout.DefaultPaymentMethodDetails{
  Type = "scheme",
  StoredPaymentMethodId = "7219687191761347",
  EncryptedSecurityCode = "adyenjs_0_1_18$MT6ppy0FAMVMLH..."
};
var paymentsRequest = new Model.Checkout.PaymentRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  ReturnUrl = @"https://your-company.com/...",
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  ShopperInteraction = "ContAuth",
  RecurringProcessingModel = "CardOnFile",
  ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  PaymentMethod = details
};

var paymentResponse = checkout.Payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
const {Client, Config, CheckoutAPI} = require('@adyen/api-library');
const config = new Config();
// Set your X-API-KEY with the API key from the Customer Area.
config.apiKey = '[API_KEY]';
config.merchantAccount = '[YOUR_MERCHANT_ACCOUNT]';
const client = new Client({ config });
client.setEnvironment("TEST");
const checkout = new CheckoutAPI(client);
checkout.payments({
    amount: { currency: "USD", value: 2000 },
    paymentMethod: {
        type: 'scheme',
        storedPaymentMethodId: '7219687191761347',
        encryptedSecurityCode: 'adyenjs_0_1_18$MT6ppy0FAMVMLH...'
    },
    reference: "YOUR_ORDER_NUMBER",
    merchantAccount: config.merchantAccount,
    shopperInteraction: "ContAuth",
    recurringProcessingModel: "CardOnFile",
    returnUrl: "https://your-company.com/..."
}).then(res => res);

If the payment was successful, you'll receive a resultCode of Authorised.

{
   "pspReference": "8815329842815468",
   "resultCode": "Authorised"
}

Let your shoppers set up subscriptions with you. Subscriptions are a series of transactions with fixed or variable amounts, charged at a fixed time interval.

Save payment details for subscriptions

  1. From your server, make a POST /payments request and include the following values:

    For zero-auth transactions, specify the amount.value to 0 to validate the card details.

If you are implementing 3D Secure for PSD2 SCA compliance and are doing zero-auth transactions, contact our Support Team to enable 3D Secure for zero-auth transactions.

curl https://checkout-test.adyen.com/v53/payments \
-H "X-API-key: [Your API Key here]" \
-H "Content-Type: application/json" \
-d '{
   "amount":{
      "value":0,
      "currency":"USD"
   },
   "paymentMethod":{
      "type":"scheme",
      "number":"4111111111111111",
      "expiryMonth":"10",
      "expiryYear":"2020",
      "cvc":"737",
      "holderName":"John Smith"
   },
   "reference":"YOUR_ORDER_NUMBER",
   "shopperInteraction": "Ecommerce",
   "recurringProcessingModel": "Subscription",
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
   "returnUrl":"https://your-company.com/..."
}'
# Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen::Client.new
adyen.api_key = "YOUR X-API-KEY"
 
response = adyen.checkout.payments({
  :amount => {
    :currency => "USD",
    :value => 0
  },
  :reference => "YOUR_ORDER_NUMBER",
  :paymentMethod => {
    :type => "scheme",
    :number => "4111111111111111",
    :expiryMonth => "10",
    :expiryYear => "2020",
    :cvc => "737"
  },
  :storePaymentMethod => true,
  :shopperInteraction => Ecommerce,
  :recurringProcessingModel => Subscription,
  :shopperReference => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  :returnUrl => "https://your-company.com/...",
  :merchantAccount => "YOUR_MERCHANT_ACCOUNT"
})
// Set your X-API-KEY with the API key from the Customer Area.
Config config = new Config();
        config.setApiKey("Your X-API-KEY"));
        Client client = new Client(config);
         
        Checkout checkout = new Checkout(client);
        PaymentsRequest paymentsRequest = new PaymentsRequest();
        Amount amount = new Amount();
        amount.setCurrency("USD");
        amount.setValue(0L);
        paymentsRequest.setAmount(amount);
        paymentsRequest.setReference("YOUR_ORDER_NUMBER");
        paymentsRequest.setPaymentMethod(new HashMap<String, String>());
        paymentsRequest.putPaymentMethodItem("type","scheme");
        paymentsRequest.putPaymentMethodItem("number", "4111111111111111");
        paymentsRequest.putPaymentMethodItem("expiryMonth", "10");
        paymentsRequest.putPaymentMethodItem("expiryYear", "2020");
        paymentsRequest.putPaymentMethodItem("cvc", "737");
        paymentsRequest.putPaymentMethodItem("storePaymentMethod", "true");
        paymentsRequest.setShopperReference("YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j");
        paymentsRequest.setReturnUrl("https://your-company.com/...");
        paymentsRequest.setMerchantAccount("YOUR_MERCHANT_ACCOUNT");
        paymentsRequest.setShopperInteraction("Ecommerce");
        paymentsRequent.setRecurringProcessingModel("Subscription");
        PaymentsResponse response = checkout.payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("YOUR X-API-KEY");
$service = new \Adyen\Service\Checkout($client);

$params = array(
  "amount" => array(
    "currency" => "USD",
    "value" => 0
  ),
  "reference" => "Your order number",
  "paymentMethod" => array(
    "type" => "scheme",
    "number" => "4111111111111111",
    "expiryMonth" => "10",
    "expiryYear" => "2020",
    "cvc" => "737",
    "holderName" => "John Smith"
  ),
  "storePaymentMethod" => true,
  "returnUrl" => "https://your-company.com/checkout/",
  "shopperInteraction" => "Ecommerce",
  "recurringProcessingModel" => "Subscription",
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT",
  "reference" => "YOUR_ORDER_NUMBER",
  "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "returnUrl" => "https://your-company.com/..."
);
$result = $service->payments($params);
#Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen.Adyen()
adyen.client.xapikey = 'YOUR_X-API-KEY'

result = adyen.checkout.payments({
   'amount': {
      'value': 0,
      'currency': 'USD'
   },
   'reference': 'YOUR_ORDER_NUMBER',
   'paymentMethod': {
      'type': 'scheme',
      'number': '4111111111111111',
      'expiryMonth': '10',
      'expiryYear': '2020',
      'cvc': '737',
      'holderName': 'John Smith'
   },
   'storePaymentMethod': 'true',
   'shopperInteraction': 'Ecommerce',
   'recurringProcessingModel': 'Subscription',
   'shopperReference': 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
   'returnUrl': 'https://your-company.com/...',
   'merchantAccount': 'YOUR_MERCHANT_ACCOUNT'
})
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("YOUR_X-API-KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Model.Checkout.Amount("USD", 0);
var details = new Model.Checkout.DefaultPaymentMethodDetails{
  Type = "scheme",
  Number = "4111111111111111",
  ExpiryMonth = "10",
  ExpiryYear = "2020",
  Cvc = "737",
  HolderName = "John Smith"
};
var paymentsRequest = new Model.Checkout.PaymentRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  ReturnUrl = @"https://your-company.com/...",
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  ShopperInteraction = "Ecommerce",
  StorePaymentMethod = "true",
  RecurringProcessingModel = "Subscription",
  ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  PaymentMethod = details
};

var paymentResponse = checkout.Payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
const {Client, Config, CheckoutAPI} = require('@adyen/api-library');
const config = new Config();
// Set your X-API-KEY with the API key from the Customer Area.
config.apiKey = '[API_KEY]';
config.merchantAccount = '[YOUR_MERCHANT_ACCOUNT]';
const client = new Client({ config });
client.setEnvironment("TEST");
const checkout = new CheckoutAPI(client);
checkout.payments({
    amount: { currency: "USD", value: 0 },
    paymentMethod: {
        type: 'scheme',
        number: '4111111111111111',
        expiryMonth: '10',
        expiryYear: '2020',
        cvc: '737',
        holderName: 'John Smith'
    },
    reference: "YOUR_ORDER_NUMBER",
    merchantAccount: config.merchantAccount,
    storePaymentMethod: "true",
    shopperInteraction: "Ecommerce",
    recurringProcessingModel: "Subscription",
    returnUrl: "https://your-company.com/..."
}).then(res => res);

Authorised result code

You will get a response with the Authorised resultCode and the additionalData.recurring.recurringDetailReference.

To get the recurringDetailReference synchronously in your payments response, you have to enable the feature.

The recurringDetailReference is the token for the saved payment detail. You will need this value to make future payments where the shopper uses their saved payment details. The token is created after a successful payment authorization to ensure that the payment details the shopper provided are linked to an active, chargeable account.

{
   "additionalData": {
      "recurring.recurringDetailReference":"7219687191761347",
      "recurring.shopperReference": "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j"
   },
   "pspReference":"8814689190961342",
   "resultCode":"Authorised"
}

Pending and Refusal result codes

Cards always return a synchronous response. Other payment methods can send a Pending status instead of an immediate Authorised response. We don't tokenize payment details until the payment has reached the Authorised status. You will receive this updated status through a notification webhook.

If you receive a Refused resultCode, then the details were not tokenized. You need to submit another payment request to try tokenizing again.

Make a subscription payment

  • From your server, make a POST /payments request and include the following parameters:

    • paymentMethod: Object that contains the shopper's tokenized payment details.
    • storedPaymentMethodId(for API 49 and later): This is the recurringDetailReference returned in the response when you created the token.
    • shopperReference: This is the shopperReference that you used the first time when you created the token for the shopper's card details.
    • shopperInteraction: ContAuth
    • recurringProcessingModel: Subscription
    curl https://checkout-test.adyen.com/v53/payments \
    -H "X-API-key: [Your API Key here]" \
    -H "Content-Type: application/json" \
    -d '{
       "amount":{
          "value":2000,
          "currency":"USD"
       },
       "paymentMethod":{
          "type":"scheme",
          "{hint:Previously known as recurringDetailReference}storedPaymentMethodId{/hint}":"7219687191761347"
       },
       "reference":"YOUR_ORDER_NUMBER",
       "shopperInteraction": "ContAuth",
       "recurringProcessingModel": "Subscription",
       "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
       "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j"
    }'
    # Set your X-API-KEY with the API key from the Customer Area.
    adyen = Adyen::Client.new
    adyen.api_key = "YOUR X-API-KEY"
     
    response = adyen.checkout.payments({
      :amount => {
        :currency => "USD",
        :value => 2000
      },
      :reference => "YOUR_ORDER_NUMBER",
      :paymentMethod => {
        :type => "scheme",
        :storedPaymentMethodId => "7219687191761347"
      },
      :shopperInteraction => ContAuth,
      :recurringProcessingModel => Subscription,
      :shopperReference => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
      :merchantAccount => "YOUR_MERCHANT_ACCOUNT"
    })
    // Set your X-API-KEY with the API key from the Customer Area.
    Config config = new Config();
            config.setApiKey("Your X-API-KEY"));
            Client client = new Client(config);
             
            Checkout checkout = new Checkout(client);
            PaymentsRequest paymentsRequest = new PaymentsRequest();
            Amount amount = new Amount();
            amount.setCurrency("USD");
            amount.setValue(2000L);
            paymentsRequest.setAmount(amount);
            paymentsRequest.setReference("YOUR_ORDER_NUMBER");
            paymentsRequest.setPaymentMethod(new HashMap<String, String>());
            paymentsRequest.putPaymentMethodItem("type","scheme");
            paymentsRequest.putPaymentMethodItem("storedPaymentMethodId", "7219687191761347");
            paymentsRequest.setShopperReference("YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j");
            paymentsRequest.setMerchantAccount("YOUR_MERCHANT_ACCOUNT");
            paymentsRequest.setShopperInteraction("ContAuth");
            paymentsRequent.setRecurringProcessingModel("Subscription");
            PaymentsResponse response = checkout.payments(paymentsRequest);
    // Set your X-API-KEY with the API key from the Customer Area.
    $client = new \Adyen\Client();
    $client->setXApiKey("YOUR X-API-KEY");
    $service = new \Adyen\Service\Checkout($client);
    
    $params = array(
      "amount" => array(
        "currency" => "USD",
        "value" => 2000
      ),
      "reference" => "Your order number",
      "paymentMethod" => array(
        "type" => "scheme",
        "storedPaymentMethodId" => "7219687191761347"
      ),
      "returnUrl" => "https://your-company.com/checkout/",
      "shopperInteraction" => "ContAuth",
      "recurringProcessingModel" => "Subscription",
      "merchantAccount" => "YOUR_MERCHANT_ACCOUNT",
      "reference" => "YOUR_ORDER_NUMBER",
      "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j"
    );
    $result = $service->payments($params);
    #Set your X-API-KEY with the API key from the Customer Area.
    adyen = Adyen.Adyen()
    adyen.client.xapikey = 'YOUR_X-API-KEY'
    
    result = adyen.checkout.payments({
       'amount': {
          'value': 2000,
          'currency': 'USD'
       },
       'reference': 'YOUR_ORDER_NUMBER',
       'paymentMethod': {
          'type': 'scheme',
          'storedPaymentMethodId': '7219687191761347'
       },
       'shopperInteraction': 'ContAuth',
       'recurringProcessingModel': 'Subscription',
       'shopperReference': 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
       'merchantAccount': 'YOUR_MERCHANT_ACCOUNT'
    })
    // Set your X-API-KEY with the API key from the Customer Area.
    var client = new Client ("YOUR_X-API-KEY", Environment.Test);
    var checkout = new Checkout(client);
    
    var amount = new Model.Checkout.Amount("USD", 2000);
    var details = new Model.Checkout.DefaultPaymentMethodDetails{
      Type = "scheme",
      StoredPaymentMethodId = "7219687191761347"
    };
    var paymentsRequest = new Model.Checkout.PaymentRequest
    {
      Reference = "YOUR_ORDER_NUMBER",
      Amount = amount,
      MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
      ShopperInteraction = "ContAuth",
      RecurringProcessingModel = "Subscription",
      ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
      PaymentMethod = details
    };
    
    var paymentResponse = checkout.Payments(paymentsRequest);
    // Set your X-API-KEY with the API key from the Customer Area.
    const {Client, Config, CheckoutAPI} = require('@adyen/api-library');
    const config = new Config();
    // Set your X-API-KEY with the API key from the Customer Area.
    config.apiKey = '[API_KEY]';
    config.merchantAccount = '[YOUR_MERCHANT_ACCOUNT]';
    const client = new Client({ config });
    client.setEnvironment("TEST");
    const checkout = new CheckoutAPI(client);
    checkout.payments({
        amount: { currency: "USD", value: 2000 },
        paymentMethod: {
            type: 'scheme',
            storedPaymentMethodId: '7219687191761347'
        },
        reference: "YOUR_ORDER_NUMBER",
        merchantAccount: config.merchantAccount,
        shopperInteraction: "ContAuth",
        recurringProcessingModel: "Subscription"
    }).then(res => res);

    If the payment was successful, you'll receive a resultCode of Authorised.

    {
       "pspReference": "8815329842815468",
       "resultCode": "Authorised"
    }

Offer contracts that occur on a non-fixed schedule using stored card details, for example, automatic top-ups when the cardholder's balance drops below a certain amount.

Save payment details for auto top-ups

  1. From your server, make a POST /payments request and include the following values:

    For zero-auth transactions, specify the amount.value to 0 to validate the card details.

If you are implementing 3D Secure for PSD2 SCA compliance and are doing zero-auth transactions, contact our Support Team to enable 3D Secure for zero-auth transactions.

curl https://checkout-test.adyen.com/v53/payments \
-H "X-API-key: [Your API Key here]" \
-H "Content-Type: application/json" \
-d '{
   "amount":{
      "value":0,
      "currency":"USD"
   },
   "paymentMethod":{
      "type":"scheme",
      "number":"4111111111111111",
      "expiryMonth":"10",
      "expiryYear":"2020",
      "cvc":"737",
      "holderName":"John Smith"
   },
   "reference":"YOUR_ORDER_NUMBER",
   "shopperInteraction": "Ecommerce",
   "recurringProcessingModel": "UnscheduledCardOnFile",
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
   "returnUrl":"https://your-company.com/..."
}'
# Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen::Client.new
adyen.api_key = "YOUR X-API-KEY"
 
response = adyen.checkout.payments({
  :amount => {
    :currency => "USD",
    :value => 0
  },
  :reference => "YOUR_ORDER_NUMBER",
  :paymentMethod => {
    :type => "scheme",
    :number => "4111111111111111",
    :expiryMonth => "10",
    :expiryYear => "2020",
    :cvc => "737"
  },
  :storePaymentMethod => true,
  :shopperInteraction => Ecommerce,
  :recurringProcessingModel => UnscheduledCardOnFile,
  :shopperReference => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  :returnUrl => "https://your-company.com/...",
  :merchantAccount => "YOUR_MERCHANT_ACCOUNT"
})
// Set your X-API-KEY with the API key from the Customer Area.
Config config = new Config();
        config.setApiKey("Your X-API-KEY"));
        Client client = new Client(config);
         
        Checkout checkout = new Checkout(client);
        PaymentsRequest paymentsRequest = new PaymentsRequest();
        Amount amount = new Amount();
        amount.setCurrency("USD");
        amount.setValue(0L);
        paymentsRequest.setAmount(amount);
        paymentsRequest.setReference("YOUR_ORDER_NUMBER");
        paymentsRequest.setPaymentMethod(new HashMap<String, String>());
        paymentsRequest.putPaymentMethodItem("type","scheme");
        paymentsRequest.putPaymentMethodItem("number", "4111111111111111");
        paymentsRequest.putPaymentMethodItem("expiryMonth", "10");
        paymentsRequest.putPaymentMethodItem("expiryYear", "2020");
        paymentsRequest.putPaymentMethodItem("cvc", "737");
        paymentsRequest.putPaymentMethodItem("storePaymentMethod", "true");
        paymentsRequest.setShopperReference("YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j");
        paymentsRequest.setReturnUrl("https://your-company.com/...");
        paymentsRequest.setMerchantAccount("YOUR_MERCHANT_ACCOUNT");
        paymentsRequest.setShopperInteraction("Ecommerce");
        paymentsRequent.setRecurringProcessingModel("UnscheduledCardOnFile");
        PaymentsResponse response = checkout.payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("YOUR X-API-KEY");
$service = new \Adyen\Service\Checkout($client);

$params = array(
  "amount" => array(
    "currency" => "USD",
    "value" => 0
  ),
  "reference" => "Your order number",
  "paymentMethod" => array(
    "type" => "scheme",
    "number" => "4111111111111111",
    "expiryMonth" => "10",
    "expiryYear" => "2020",
    "cvc" => "737",
    "holderName" => "John Smith"
  ),
  "storePaymentMethod" => true,
  "returnUrl" => "https://your-company.com/checkout/",
  "shopperInteraction" => "Ecommerce",
  "recurringProcessingModel" => "UnscheduledCardOnFile",
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT",
  "reference" => "YOUR_ORDER_NUMBER",
  "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "returnUrl" => "https://your-company.com/..."
);
$result = $service->payments($params);
#Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen.Adyen()
adyen.client.xapikey = 'YOUR_X-API-KEY'

result = adyen.checkout.payments({
   'amount': {
      'value': 0,
      'currency': 'USD'
   },
   'reference': 'YOUR_ORDER_NUMBER',
   'paymentMethod': {
      'type': 'scheme',
      'number': '4111111111111111',
      'expiryMonth': '10',
      'expiryYear': '2020',
      'cvc': '737',
      'holderName': 'John Smith'
   },
   'storePaymentMethod': 'true',
   'shopperInteraction': 'Ecommerce',
   'recurringProcessingModel': 'UnscheduledCardOnFile',
   'shopperReference': 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
   'returnUrl': 'https://your-company.com/...',
   'merchantAccount': 'YOUR_MERCHANT_ACCOUNT'
})
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("YOUR_X-API-KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Model.Checkout.Amount("USD", 0);
var details = new Model.Checkout.DefaultPaymentMethodDetails{
  Type = "scheme",
  Number = "4111111111111111",
  ExpiryMonth = "10",
  ExpiryYear = "2020",
  Cvc = "737",
  HolderName = "John Smith"
};
var paymentsRequest = new Model.Checkout.PaymentRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  ReturnUrl = @"https://your-company.com/...",
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  ShopperInteraction = "Ecommerce",
  StorePaymentMethod = "true",
  RecurringProcessingModel = "UnscheduledCardOnFile",
  ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  PaymentMethod = details
};

var paymentResponse = checkout.Payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
const {Client, Config, CheckoutAPI} = require('@adyen/api-library');
const config = new Config();
// Set your X-API-KEY with the API key from the Customer Area.
config.apiKey = '[API_KEY]';
config.merchantAccount = '[YOUR_MERCHANT_ACCOUNT]';
const client = new Client({ config });
client.setEnvironment("TEST");
const checkout = new CheckoutAPI(client);
checkout.payments({
    amount: { currency: "USD", value: 0 },
    paymentMethod: {
        type: 'scheme',
        number: '4111111111111111',
        expiryMonth: '10',
        expiryYear: '2020',
        cvc: '737',
        holderName: 'John Smith'
    },
    reference: "YOUR_ORDER_NUMBER",
    merchantAccount: config.merchantAccount,
    storePaymentMethod: "true",
    shopperInteraction: "Ecommerce",
    recurringProcessingModel: "UnscheduledCardOnFile",
    returnUrl: "https://your-company.com/..."
}).then(res => res);

Authorised result code

You will get a response with the Authorised resultCode and the additionalData.recurring.recurringDetailReference.

To get the recurringDetailReference synchronously in your payments response, you have to enable the feature.

The recurringDetailReference is the token for the saved payment detail. You will need this value to make future payments where the shopper uses their saved payment details. The token is created after a successful payment authorization to ensure that the payment details the shopper provided are linked to an active, chargeable account.

  {
   "additionalData": {
      "recurring.recurringDetailReference":"7219687191761347",
      "recurring.shopperReference": "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j"
   },
   "pspReference":"8814689190961342",
   "resultCode":"Authorised"
  }

Pending and Refusal result codes

Cards always return a synchronous response. Other payment methods can send a Pending status instead of an immediate Authorised response. We don't tokenize payment details until the payment has reached the Authorised status. You will receive this updated status through a notification webhook.

If you receive a Refused resultCode, then the details were not tokenized. You need to submit another payment request to try tokenizing again.

Make auto top-up payments

  • From your server, make a POST /payments request and include the following parameters:
    • paymentMethod: Object that contains the shopper's tokenized payment details.
      • storedPaymentMethodId(for API 49 and later): This is the recurringDetailReference returned in the response when you created the token.
    • shopperReference: This is the shopperReference that you used the first time when you created the token for the shopper's card details.
    • shopperInteraction: ContAuth
    • recurringProcessingModel: UnscheduledCardOnFile
curl https://checkout-test.adyen.com/v53/payments \
-H "X-API-key: [Your API Key here]" \
-H "Content-Type: application/json" \
-d '{
   "amount":{
      "value":2000,
      "currency":"USD"
   },
   "paymentMethod":{
      "type":"scheme",
      "{hint:Previously known as recurringDetailReference}storedPaymentMethodId{/hint}":"7219687191761347"
   },
   "reference":"YOUR_ORDER_NUMBER",
   "shopperInteraction": "ContAuth",
   "recurringProcessingModel": "UnscheduledCardOnFile",
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j"
}'
# Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen::Client.new
adyen.api_key = "YOUR X-API-KEY"
 
response = adyen.checkout.payments({
  :amount => {
    :currency => "USD",
    :value => 2000
  },
  :reference => "YOUR_ORDER_NUMBER",
  :paymentMethod => {
    :type => "scheme",
    :storedPaymentMethodId => "7219687191761347"
  },
  :shopperInteraction => ContAuth,
  :recurringProcessingModel => UnscheduledCardOnFile,
  :shopperReference => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  :merchantAccount => "YOUR_MERCHANT_ACCOUNT"
})
// Set your X-API-KEY with the API key from the Customer Area.
Config config = new Config();
        config.setApiKey("Your X-API-KEY"));
        Client client = new Client(config);
         
        Checkout checkout = new Checkout(client);
        PaymentsRequest paymentsRequest = new PaymentsRequest();
        Amount amount = new Amount();
        amount.setCurrency("USD");
        amount.setValue(2000L);
        paymentsRequest.setAmount(amount);
        paymentsRequest.setReference("YOUR_ORDER_NUMBER");
        paymentsRequest.setPaymentMethod(new HashMap<String, String>());
        paymentsRequest.putPaymentMethodItem("type","scheme");
        paymentsRequest.putPaymentMethodItem("storedPaymentMethodId", "7219687191761347");
        paymentsRequest.setShopperReference("YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j");
        paymentsRequest.setMerchantAccount("YOUR_MERCHANT_ACCOUNT");
        paymentsRequest.setShopperInteraction("ContAuth");
        paymentsRequent.setRecurringProcessingModel("UnscheduledCardOnFile");
        PaymentsResponse response = checkout.payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("YOUR X-API-KEY");
$service = new \Adyen\Service\Checkout($client);

$params = array(
  "amount" => array(
    "currency" => "USD",
    "value" => 2000
  ),
  "reference" => "Your order number",
  "paymentMethod" => array(
    "type" => "scheme",
    "storedPaymentMethodId" => "7219687191761347"
  ),
  "shopperInteraction" => "ContAuth",
  "recurringProcessingModel" => "UnscheduledCardOnFile",
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT",
  "reference" => "YOUR_ORDER_NUMBER",
  "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "returnUrl" => "https://your-company.com/..."
);
$result = $service->payments($params);
#Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen.Adyen()
adyen.client.xapikey = 'YOUR_X-API-KEY'

result = adyen.checkout.payments({
   'amount': {
      'value': 2000,
      'currency': 'USD'
   },
   'reference': 'YOUR_ORDER_NUMBER',
   'paymentMethod': {
      'type': 'scheme',
      'storedPaymentMethodId': '7219687191761347'
   },
   'shopperInteraction': 'ContAuth',
   'recurringProcessingModel': 'UnscheduledCardOnFile',
   'shopperReference': 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
   'merchantAccount': 'YOUR_MERCHANT_ACCOUNT'
})
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("YOUR_X-API-KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Model.Checkout.Amount("USD", 2000);
var details = new Model.Checkout.DefaultPaymentMethodDetails{
  Type = "scheme",
  StoredPaymentMethodId = "7219687191761347"
};
var paymentsRequest = new Model.Checkout.PaymentRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  ShopperInteraction = "ContAuth",
  RecurringProcessingModel = "UnscheduledCardOnFile",
  ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  PaymentMethod = details
};

var paymentResponse = checkout.Payments(paymentsRequest);
// Set your X-API-KEY with the API key from the Customer Area.
const {Client, Config, CheckoutAPI} = require('@adyen/api-library');
const config = new Config();
// Set your X-API-KEY with the API key from the Customer Area.
config.apiKey = '[API_KEY]';
config.merchantAccount = '[YOUR_MERCHANT_ACCOUNT]';
const client = new Client({ config });
client.setEnvironment("TEST");
const checkout = new CheckoutAPI(client);
checkout.payments({
    amount: { currency: "USD", value: 2000 },
    paymentMethod: {
        type: 'scheme',
        storedPaymentMethodId: '7219687191761347'
    },
    reference: "YOUR_ORDER_NUMBER",
    merchantAccount: config.merchantAccount,
    shopperInteraction: "ContAuth",
    recurringProcessingModel: "UnscheduledCardOnFile"
}).then(res => res);

If the payment was successful, you'll receive a resultCode of Authorised.

{
   "pspReference": "8815329842815468",
    "resultCode": "Authorised"
}

Test and go live

To receive the recurringDetailReference synchronously in the payments response in your test environment, do the following:

  1. Log in to your test Customer Area.
  2. Go to Account > API URLs > Additional Data settings.
  3. Select Recurring details and save your settings.

To ensure that you always receive the recurringDetailReference value synchronously in your response, contact Support Team.

Before going live, make sure to go to your live Customer Area and follow the exact instructions as described above.

Next steps