> ## Documentation Index
> Fetch the complete documentation index at: https://razorpay-881012b3.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Charge First Payment Automatically after Emandate Registration

> Register a customer's mandate AND charge them the first recurring payment as part of the same transaction via Emandate.

<div style={{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"0.35rem 0.9rem",border:"1px solid rgba(128,128,128,0.28)",borderRadius:"0.5rem",padding:"0.45rem 0.75rem",margin:"0 0 1.25rem",fontSize:"0.875rem"}}>
  <span style={{fontWeight:600}}>Available in</span>
  <span>🇮🇳 India</span>
</div>

## 1. Create an Authorisation Transaction

<Info>
  **Authorisation transaction + auto-charge first payment**

  You can register a customer's mandate **AND** charge them the first recurring payment as part of the same transaction. To do this all you have to do is pass the `first_payment_amount` parameter while creating the order.
</Info>

You can create an authorisation transaction using [Razorpay APIs](#1-1-using-razorpay-apis) or [Registration Link](#1-2-using-a-registration-link).

### 1.1. Using Razorpay APIs

To create an authorisation transaction using Razorpay APIs, you need to:

1. [Create a Customer](#1-1-1-create-a-customer).
2. [Create an Order](#1-1-2-create-an-order).
3. [Create Authorisation Payment using Razorpay APIs](#1-1-3-create-an-authorisation-payment).

<Info>
  **Handy Tips**

  For the Authorisation Payment to be successful in a day (for example, 5th June), you should create an Order and the Authorisation Transaction on the same day (5th June) before 11:59 pm.
</Info>

#### 1.1.1. Create a Customer

Razorpay links recurring tokens to customers using a unique identifier generated through the Customer API.

You can create [customers](/docs/api/customers) with basic information such as `email` and `contact` and use them for various Razorpay offerings. The following endpoint creates a customer.

`POST /customers`

<AccordionGroup>
  <Accordion title="Sample Code">
    <CodeGroup>
      ```bash Curl theme={null}
      curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET] \
      -X POST https://api.razorpay.com/v1/customers \
      -H "Content-Type: application/json" \
      -d '{
        "name": "<name>",
        "email": "<email>",
        "contact": "<phone>",
        "fail_existing": "0",
        "notes":{
          "note_key_1": "September",
          "note_key_2": "Make it so."
        }
      }'
      ```

      ```java Java theme={null}
      RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

      JSONObject customerRequest = new JSONObject();
      customerRequest.put("name","<name>");
      customerRequest.put("contact","<phone>");
      customerRequest.put("email","<email>");
      customerRequest.put("fail_existing", "0");
      JSONObject notes = new JSONObject();
      notes.put("notes_key_1","Tea, Earl Grey, Hot");
      notes.put("notes_key_2","Tea, Earl Grey… decaf.");
      customerRequest.put("notes",notes);

      Customer customer = razorpay.customers.create(customerRequest);
      ```

      ```python Python theme={null}
      import razorpay
      client = razorpay.Client(auth=("YOUR_ID", "YOUR_SECRET"))

      client.customer.create({
          'name': '<name>',
          'email': '<email>',
          'contact': '<phone>',
          'fail_existing': "0",
          'notes': {'note_key_1': 'September', 'note_key_2': 'Make it so.'}
          })
      ```

      ```go Go theme={null}
      import ( razorpay "github.com/razorpay/razorpay-go" )
      client := razorpay.NewClient("YOUR_KEY_ID", "YOUR_SECRET")

      data := map[string]interface{}{
          "name": "<name>",
          "contact": <phone>,
          "email": "<email>",
          "fail_existing": "0",
          "notes": map[string]interface{}{
              "notes_key_1": "Tea, Earl Grey, Hot",
              "notes_key_2": "Tea, Earl Grey… decaf.",
          },
      }
      body, err := client.Customer.Create(data, nil)
      ```

      ```php PHP theme={null}
      $api = new Api($key_id, $secret);

      $api->customer->create(array('name' => '<name>', 'email' => '<email>','contact'=>'<phone>','fail_existing' => "0", 'notes'=> array('notes_key_1'=> 'Tea, Earl Grey, Hot','notes_key_2'=> 'Tea, Earl Grey… decaf'));
      ```

      ```csharp .NET theme={null}
      RazorpayClient client = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

      Dictionary<string, object> options = new Dictionary<string,object>();

      options.Add("name", "<name>"); 
      options.Add("contact", "<phone>"); 
      options.Add("email", "<email>"); 
      options.Add("fail_existing", "0"); 

      Customer customer = Customer.Create(options);
      ```

      ```ruby Ruby theme={null}
      require "razorpay"
      Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

      para_attr = {
        "name": "<name>",
        "contact": "<phone>",
        "email": "<email>",
        "fail_existing": "0",
        "notes": {
          "notes_key_1": "Tea, Earl Grey, Hot",
          "notes_key_2": "Tea, Earl Grey… decaf."
        }
      }

      Razorpay::Customer.create(para_attr)
      ```

      ```javascript Node.js theme={null}
      var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_SECRET' })

      instance.customers.create({
        name: "<name>",
        contact: "<phone>",
        email: "<email>",
        fail_existing: "0",
        notes: {
          notes_key_1: "Tea, Earl Grey, Hot",
          notes_key_2: "Tea, Earl Grey… decaf."
        }
      })
      ```

      ```json Response theme={null}
      {
        "id":"cust_1Aa00000000001",
        "entity":"customer",
        "name":"<name>",
        "email":"<email>",
        "contact":"<phone>",
        "gstin":null,
        "notes":{
            "note_key_1":"September",
            "note_key_2":"Make it so."
        },
        "created_at ":1234567890
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

#### Request Parameters

`name`
: `string` The name of the customer. For example, `Gaurav Kumar`.

`email`
: `string` The email address of the customer. For example, `gaurav.kumar@example.com`.

`contact`
: `string` The phone number of the customer. For example, `9876543210`.

`fail_existing` *optional*
: `string` The request throws an exception by default if a customer with the exact details already exists. You can pass an additional parameter `fail_existing` to get the existing customer's details in the response. Possible values:

* `1` (default): If a customer with the same details already exists, throws an error.
* `0`: If a customer with the same details already exists, fetches details of the existing customer.

`notes` *optional*
: `object` Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, `"note_key": "Beam me up Scotty”`.

### 1.1.2. Create an Order

The Orders API allows you to create a unique Razorpay `order_id`, for example, `order_1Aa00000000001`, that would be tied to a payment. This `order_id` has a 1:1 mapping with the order created for the authorisation payment at your end. To learn more about Razorpay Orders, refer our detailed [Order documentation](/docs/payments/orders).

Use the below endpoint to create an order.

`POST /orders`

You can create a payment against the `order_id` once it is created.

#### Emandate via Netbanking

Given below is the sample code to authenticate emandate with Netbanking.

<CodeGroup>
  ```bash Emandate via Netbanking theme={null}
  curl -u <YOUR_KEY_ID>:<YOUR_KEY_SECRET> \
  -X POST https://api.razorpay.com/v1/orders \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 0,
    "currency": "INR",
    "method": "emandate",
    "payment_capture":  true,
    "customer_id": "cust_1Aa00000000001",
    "receipt": "Receipt No. 1",
    "notes": {
      "notes_key_1": "Beam me up Scotty",
      "notes_key_2": "Engage"
    },
    "token": {
      "first_payment_amount": 100,
      "auth_type": "netbanking",
      "max_amount": 9999900,
      "expire_at": 4102444799,
      "notes": {
        "notes_key_1": "Tea, Earl Grey, Hot",
        "notes_key_2": "Tea, Earl Grey… decaf."
      },
      "bank_account": {
        "beneficiary_name": "Gaurav Kumar",
        "account_number": "1121431121541121",
        "account_type": "savings",
        "ifsc_code": "HDFC0000001"
      }
    }
  }'
  ```

  ```json Response theme={null}
  {
    "id": "order_1Aa00000000001",
    "entity": "order",
    "amount": 0,
    "amount_paid": 0,
    "amount_due": 0,
    "currency": "INR",
    "receipt": "Receipt No. 1",
    "offer_id": null,
    "status": "created",
    "attempts": 0,
    "notes": {
      "notes_key_1": "Beam me up Scotty",
      "notes_key_2": "Engage"
    },
    "created_at": 1579700597,
    "token": {
      "method": "emandate",
      "recurring_status": null,
      "failure_reason": null,
      "currency": "INR",
      "max_amount": 9999900,
      "auth_type": "netbanking",
      "expire_at": 4102444799,
      "notes": {
        "notes_key_1": "Tea, Earl Grey, Hot",
        "notes_key_2": "Tea, Earl Grey… decaf."
      },
      "bank_account": {
        "ifsc": "HDFC0000001",
        "bank_name": "HDFC Bank",
        "name": "Gaurav Kumar",
        "account_number": "1121431121541121",
        "account_type": "savings",
        "beneficiary_email": "gaurav.kumar@example.com",
        "beneficiary_mobile": "9000090000"
      },
      "first_payment_amount": 100
    }
  }
  ```

  ```bash Emandate via Debit Card theme={null}
  curl -u <YOUR_KEY_ID>:<YOUR_KEY_SECRET> \
  -X POST https://api.razorpay.com/v1/orders \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 0,
    "currency": "INR",
    "method": "emandate",
    "payment_capture": true,
    "customer_id": "cust_1Aa00000000001",
    "receipt": "Receipt No. 1",
    "notes": {
      "notes_key_1": "Beam me up Scotty",
      "notes_key_2": "Engage"
    },
    "token": {
      "first_payment_amount": 100,
      "auth_type": "debitcard",
      "max_amount": 9999900,
      "expire_at": 4102444799,
      "notes": {
        "notes_key_1": "Tea, Earl Grey, Hot",
        "notes_key_2": "Tea, Earl Grey… decaf."
      },
      "bank_account": {
        "beneficiary_name": "Gaurav Kumar",
        "account_number": "1121431121541121",
        "account_type": "savings",
        "ifsc_code": "HDFC0000001"
      }
    }
  }'
  ```

  ```json Response theme={null}
  {
    "id": "order_1Aa00000000001",
    "entity": "order",
    "amount": 0,
    "amount_paid": 0,
    "amount_due": 0,
    "currency": "INR",
    "receipt": "Receipt No. 1",
    "offer_id": null,
    "status": "created",
    "attempts": 0,
    "notes": {
      "notes_key_1": "Beam me up Scotty",
      "notes_key_2": "Engage"
    },
    "created_at": 1579700597,
    "token": {
      "method": "emandate",
      "notes": {
        "notes_key_1": "Tea, Earl Grey, Hot",
        "notes_key_2": "Tea, Earl Grey… decaf."
      },
      "recurring_status": null,
      "failure_reason": null,
      "currency": "INR",
      "max_amount": 9999900,
      "auth_type": "debitcard",
      "expire_at": 4102444799,
      "bank_account": {
        "ifsc": "HDFC0000001",
        "bank_name": "HDFC Bank",
        "name": "Gaurav Kumar",
        "account_number": "1121431121541121",
        "account_type": "savings",
        "beneficiary_email": "gaurav.kumar@example.com",
        "beneficiary_mobile": "9000090000"
      },
      "first_payment_amount": 100
    }
  }
  ```

  ```bash Emandate via Aadhaar theme={null}
  curl -u <YOUR_KEY_ID>:<YOUR_KEY_SECRET> \
  -X POST https://api.razorpay.com/v1/orders \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 0,
    "currency": "INR",
    "method": "emandate",
    "payment_capture": true,
    "customer_id": "cust_1Aa00000000001",
    "receipt": "Receipt No. 1",
    "notes": {
      "notes_key_1": "Beam me up Scotty",
      "notes_key_2": "Engage"
    },
    "token": {
      "first_payment_amount": 100,
      "auth_type": "aadhaar",
      "max_amount": 9999900,
      "expire_at": 4102444799,
      "notes": {
        "notes_key_1": "Tea, Earl Grey, Hot",
        "notes_key_2": "Tea, Earl Grey… decaf."
      },
      "bank_account": {
        "beneficiary_name": "Gaurav Kumar",
        "account_number": "1121431121541121",
        "account_type": "savings",
        "ifsc_code": "HDFC0000001"
      }
    }
  }'
  ```

  ```json Response theme={null}
  {
    "id": "order_1Aa00000000001",
    "entity": "order",
    "amount": 0,
    "amount_paid": 0,
    "amount_due": 0,
    "currency": "INR",
    "receipt": "Receipt No. 1",
    "offer_id": null,
    "status": "created",
    "attempts": 0,
    "notes": {
      "notes_key_1": "Beam me up Scotty",
      "notes_key_2": "Engage"
    },
    "created_at": 1579700597,
    "token": {
      "method": "emandate",
      "notes": {
        "notes_key_1": "Tea, Earl Grey, Hot",
        "notes_key_2": "Tea, Earl Grey… decaf."
      },
      "recurring_status": null,
      "failure_reason": null,
      "currency": "INR",
      "max_amount": 9999900,
      "auth_type": "aadhaar",
      "expire_at": 4102444799,
      "bank_account": {
        "ifsc": "HDFC0000001",
        "bank_name": "HDFC Bank",
        "name": "Gaurav Kumar",
        "account_number": "1121431121541121",
        "account_type": "savings",
        "beneficiary_email": "gaurav.kumar@example.com",
        "beneficiary_mobile": "9000090000"
      },
      "first_payment_amount": 100
    }
  }
  ```
</CodeGroup>

#### Request Parameters

`amount` *mandatory*
: `integer` Amount in currency subunits. For emandate, the amount has to be `0`.

`currency` *mandatory*
: `string` The 3-letter ISO currency code for the payment. Currently, we only support `INR`.

`method` *mandatory*
: `string` The authorization method. In this case, the value will be `emandate`.

`payment_capture` *mandatory*
: `boolean` Determines if payment should be automatically captured. Possible values:

* `true` (recommended): Automatically capture the payment.
* `false` (default/not recommended): You have to manually capture payments.

`customer_id` *mandatory*
: `string` The unique identifier of the customer who is to be charged. For example, `cust_D0cs04OIpPPU1F`.

`receipt` *optional*
: `string` A user-entered unique identifier for the order. For example, `Receipt No. 1`. This parameter should be mapped to the `order_id` sent by Razorpay.

`notes`*optional*
: `json object` Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, `"note_key": "Beam me up Scotty”`.

`token`
: `object` Details related to the authorisation such as max amount and bank account information. Pass a value in the `first_payment_amount` parameter if you want to auto-charge the customer the first payment immediately after authorisation using the same `order_id`. The first payment will be created automatically and executed within 2 days of emandate token confirmation.

`first_payment_amount` *optional*
: `integer` The amount, in paise, the customer should be auto-charged in addition to the authorization amount. For example, `100000`.

`auth_type` *optional*
: `string` Possible values:

* `netbanking`
* `debitcard`
* `aadhaar`

`max_amount` *optional*
: `integer` The maximum amount, in paise, that a customer can be charged in one transaction. Know about [maximum and default values](/docs/payments/recurring-payments/emandate/faqs#2-what-is-the-maximum-amount-which-can).

`expire_at` *optional*
: `integer` The timestamp, in Unix format, till when you can use the token (authorization on the payment method) to charge the customer subsequent payments. Defaults to 10 years for `emandate`. The value can range from the current date to 31-12-2099 (`4101580799`).

`bank_account`
: Customer bank account details.

`account_number` *optional*
: `string` Customer's bank account number.

`ifsc_code` *optional*
: `string` Customer's bank IFSC. For example `UTIB0000001`.

`beneficiary_name` *optional*
: `string` Customer's name. For example, `Gaurav Kumar`.

`account_type` *optional*
: `string` Customer's bank account type. Possible values:

* `savings` (default)
* `current`

`notes`*optional*
: `json object` Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, `"note_key": "Beam me up Scotty”`.

### 1.1.3. Create an Authorisation Payment

<Info>
  **Handler Function vs Callback URL**

  * **Handler Function**:
    <br />When you use the handler function, the response object of the successful payment (`razorpay_payment_id`, `razorpay_order_id` and `razorpay_signature`) is submitted to the Checkout Form. You need to collect these and send them to your server.
  * **Callback URL**:
    <br />When you use a Callback URL, the response object of the successful payment (`razorpay_payment_id`, `razorpay_order_id` and `razorpay_signature`) is submitted to the Callback URL.
</Info>

<AccordionGroup>
  <Accordion title="Netbanking">
    <CodeGroup>
      ```html Handler Function theme={null}
       <script
         type="text/javascript"
         src="https://checkout.razorpay.com/v1/razorpay.js">
       </script>
       <script
         src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js">
       </script>

       <body>
         <button
           id="btn"
           style="background-color: #3399cc; color: white; font-size: 16px; font-family: sans-serif">
           Pay
         </button>

         <script>
           const btn = document.querySelector("#btn");

           var razorpay = new Razorpay({
             key: "<YOUR_TEST_KEY>",
             image: "https://i.imgur.com/n5tjHFD.jpg"
           });

           razorpay.once("ready", function (response) {
             console.log(response.methods);
           })

           var data = {
             "amount": 100, // in currency subunits. Here 1000 = 1000 paise, which equals to ₹10
             "currency": "INR", // Default is INR. We support more than 90 currencies.
             "email": "gaurav.kumar@example.com",
             "contact": "9123456780",
             "notes": {
               "address": "Ground Floor, SJR Cyber, Laskar Hosur Road, Bengaluru",
             },
             "order_id": "order_00000000000001",
             "customer_id": "cust_00000000000001",
             "recurring": true,
             "method": "emandate",
             "bank": "HDFC",
             "auth_type": "netbanking",
             "bank_account[name]": "Gaurav Kumar",
             "bank_account[account_number]": "1121431121541121",
             "bank_account[account_type]": "savings",
             "bank_account[ifsc]": "HDFC0000001"
           };

           btn.addEventListener("click", function () { // has to be placed within user initiated context, such as click, in order for popup to open.
             razorpay.createPayment(data);

             razorpay.on("payment.success", function (resp) {
               alert(resp.razorpay_payment_id),
               alert(resp.razorpay_order_id),
               alert(resp.razorpay_signature)
             }); // will pass payment ID, order ID and Razorpay signature to success handler.

             razorpay.on("payment.error", function (resp) {
               alert(resp.error.description)
             }); // will pass error object to error handler
           })
         </script>
       </body>
      ```

      ```html Callback URL theme={null}
       <script
         type="text/javascript"
         src="https://checkout.razorpay.com/v1/razorpay.js">
       </script>
       <script
         src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js">
       </script>

       <body>
         <button
           id="btn"
           style="background-color: #3399cc; color: white; font-size: 16px; font-family: sans-serif">
           Pay
         </button>

         <script>
           const btn = document.querySelector("#btn");

           var razorpay = new Razorpay({
             key: "<YOUR_TEST_KEY>",
             image: "https://i.imgur.com/n5tjHFD.jpg"
           });

           razorpay.once("ready", function (response) {
             console.log(response.methods);
           })

           var data = {
             "callback_url": "www.example-callback-url.com",
             "amount": 100, // in currency subunits. Here 1000 = 1000 paise, which equals to ₹10
             "currency": "INR", // Default is INR. We support more than 90 currencies.
             "email": "gaurav.kumar@example.com",
             "contact": "9123456780",
             "notes": {
               "address": "Ground Floor, SJR Cyber, Laskar Hosur Road, Bengaluru",
             },
             "order_id": "order_00000000000001",
             "customer_id": "cust_00000000000001",
             "recurring": true,
             "method": "emandate",
             "bank": "HDFC",
             "auth_type": "netbanking",
             "bank_account[name]": "Gaurav Kumar",
             "bank_account[account_number]": "1121431121541121",
             "bank_account[account_type]": "savings",
             "bank_account[ifsc]": "HDFC0000001"
           };

           btn.addEventListener("click", function () { // has to be placed within user initiated context, such as click, in order for popup to open.
             razorpay.createPayment(data);
           })
         </script>
       </body>
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Debit Card">
    <CodeGroup>
      ```html Handler Function theme={null}
       <script
         type="text/javascript"
         src="https://checkout.razorpay.com/v1/razorpay.js">
       </script>
       <script
         src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js">
       </script>
       <body>
         <button
           id="btn"
           style="background-color: #3399cc; color: white; font-size: 16px; font-family: sans-serif">
           Pay
         </button>
         <script>
           const btn = document.querySelector("#btn");

           var razorpay = new Razorpay({
             key: "<YOUR_TEST_KEY>",
             image: "https://i.imgur.com/n5tjHFD.jpg"
           });

           razorpay.once("ready", function (response) {
             console.log(response.methods);
           })

           var data = {
             "amount": 100, // in currency subunits. Here 1000 = 1000 paise, which equals to ₹10
             "currency": "INR", // Default is INR. We support more than 90 currencies.
             "email": "gaurav.kumar@example.com",
             "contact": "9123456780",
             "notes": {
               "address": "Ground Floor, SJR Cyber, Laskar Hosur Road, Bengaluru",
             },
             "order_id": "order_00000000000001",
             "customer_id": "cust_00000000000001",
             "recurring": true,
             "method": "emandate",
             "bank": "HDFC",
             "auth_type": "debitcard",
             "bank_account[name]": "Gaurav Kumar",
             "bank_account[account_number]": "1121431121541121",
             "bank_account[account_type]": "savings",
             "bank_account[ifsc]": "HDFC0000001"
           };

           btn.addEventListener("click", function () { // has to be placed within user initiated context, such as click, in order for popup to open.
             razorpay.createPayment(data);

             razorpay.on("payment.success", function (resp) {
               alert(resp.razorpay_payment_id),
               alert(resp.razorpay_order_id),
               alert(resp.razorpay_signature)
             }); // will pass payment ID, order ID and Razorpay signature to success handler.

             razorpay.on("payment.error", function (resp) {
               alert(resp.error.description)
             }); // will pass error object to error handler
           })
         </script>
       </body>
      ```

      ```html Callback URL theme={null}
       <script
         type="text/javascript"
         src="https://checkout.razorpay.com/v1/razorpay.js">
       </script>
       <script
         src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js">
       </script>

       <body>
         <button
           id="btn"
           style="background-color: #3399cc; color: white; font-size: 16px; font-family: sans-serif">
           Pay
         </button>

         <script>
           const btn = document.querySelector("#btn");

           var razorpay = new Razorpay({
             key: "<YOUR_TEST_KEY>",
             image: "https://i.imgur.com/n5tjHFD.jpg"
           });

           razorpay.once("ready", function (response) {
             console.log(response.methods);
           })

           var data = {
             "callback_url": "www.example-callback-url.com",
             "amount": 100, // in currency subunits. Here 1000 = 1000 paise, which equals to ₹10
             "currency": "INR", // Default is INR. We support more than 90 currencies.
             "email": "gaurav.kumar@example.com",
             "contact": "9123456780",
             "notes": {
               "address": "Ground Floor, SJR Cyber, Laskar Hosur Road, Bengaluru",
             },
             "order_id": "order_00000000000001",
             "customer_id": "cust_00000000000001",
             "recurring": true,
             "method": "emandate",
             "bank": "HDFC",
             "auth_type": "debitcard",
             "bank_account[name]": "Gaurav Kumar",
             "bank_account[account_number]": "1121431121541121",
             "bank_account[account_type]": "savings",
             "bank_account[ifsc]": "HDFC0000001"
           };

           btn.addEventListener("click", function () { // has to be placed within user initiated context, such as click, in order for popup to open.
             razorpay.createPayment(data);
           })
         </script>
       </body>
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Aadhaar">
    <CodeGroup>
      ```html Handler Function theme={null}
       <script
         type="text/javascript"
         src="https://checkout.razorpay.com/v1/razorpay.js">
       </script>
       <script
         src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js">
       </script>

       <body>
         <button
           id="btn"
           style="background-color: #3399cc; color: white; font-size: 16px; font-family: sans-serif">
           Pay
         </button>

         <script>
           const btn = document.querySelector("#btn");

           var razorpay = new Razorpay({
             key: "<YOUR_TEST_KEY>",
             image: "https://i.imgur.com/n5tjHFD.jpg"
           });

           razorpay.once("ready", function (response) {
             console.log(response.methods);
           })

           var data = {
             "amount": 100, // in currency subunits. Here 1000 = 1000 paise, which equals to ₹10
             "currency": "INR", // Default is INR. We support more than 90 currencies.
             "email": "gaurav.kumar@example.com",
             "contact": "9123456780",
             "notes": {
               "address": "Ground Floor, SJR Cyber, Laskar Hosur Road, Bengaluru",
             },
             "order_id": "order_00000000000001",
             "customer_id": "cust_00000000000001",
             "recurring": true,
             "method": "emandate",
             "bank": "HDFC",
             "auth_type": "aadhaar",
             "bank_account[name]": "Gaurav Kumar",
             "bank_account[account_number]": "1121431121541121",
             "bank_account[account_type]": "savings",
             "bank_account[ifsc]": "HDFC0000001"
           };

           btn.addEventListener("click", function () { // has to be placed within user initiated context, such as click, in order for popup to open.
             razorpay.createPayment(data);

             razorpay.on("payment.success", function (resp) {
               alert(resp.razorpay_payment_id),
               alert(resp.razorpay_order_id),
               alert(resp.razorpay_signature)
             }); // will pass payment ID, order ID and Razorpay signature to success handler.

             razorpay.on("payment.error", function (resp) {
               alert(resp.error.description)
             }); // will pass error object to error handler
           })
         </script>
       </body>
      ```

      ```html Callback URL theme={null}
       <script
         type="text/javascript"
         src="https://checkout.razorpay.com/v1/razorpay.js">
       </script>
       <script
         src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js">
       </script>

       <body>
         <button
           id="btn"
           style="background-color: #3399cc; color: white; font-size: 16px; font-family: sans-serif">
           Pay
         </button>

         <script>
           const btn = document.querySelector("#btn");

           var razorpay = new Razorpay({
             key: "<YOUR_TEST_KEY>",
             image: "https://i.imgur.com/n5tjHFD.jpg"
           });

           razorpay.once("ready", function (response) {
             console.log(response.methods);
           })

           var data = {
             "callback_url": "www.example-callback-url.com",
             "amount": 100, // in currency subunits. Here 1000 = 1000 paise, which equals to ₹10
             "currency": "INR", // Default is INR. We support more than 90 currencies.
             "email": "gaurav.kumar@example.com",
             "contact": "9123456780",
             "notes": {
               "address": "Ground Floor, SJR Cyber, Laskar Hosur Road, Bengaluru",
             },
             "order_id": "order_00000000000001",
             "customer_id": "cust_00000000000001",
             "recurring": true,
             "method": "emandate",
             "bank": "HDFC",
             "auth_type": "aadhaar",
             "bank_account[name]": "Gaurav Kumar",
             "bank_account[account_number]": "1121431121541121",
             "bank_account[account_type]": "savings",
             "bank_account[ifsc]": "HDFC0000001"
           };

           btn.addEventListener("click", function () { // has to be placed within user initiated context, such as click, in order for popup to open.
             razorpay.createPayment(data);
           })
         </script>
       </body>
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

#### Additional Checkout Fields

`customer_id` *mandatory*
: `string` Unique identifier of the customer created in the [first step](#1-1-1-create-a-customer).

`order_id` *mandatory*
: `string` Unique identifier of the  order created in the [second step](#1-1-2-create-an-order).

`recurring` *mandatory*
: `boolean` Determines whether the recurring is enabled or not. Possible values:

* `true`: Recurring payment is enabled.
* `false`: Recurring payment is not enabled.

### 1.2. Using a Registration Link

Registration Link is an alternate way of creating an authorisation transaction. You can create a registration link using the [API](#1-2-1-create-a-registration-link) or [Dashboard](/docs/payments/recurring-payments/create#1-create-a-registration-link).

<Info>
  **Handy Tips**

  * You do not have to create a customer if you choose the registration link method for creating an authorisation transaction.
  * You can [use Webhooks to get notifications about successful payments](/docs/api/payments/recurring-payments/webhooks#check-authorization-link-status-using-webhooks) against a registration link.
</Info>

When you create a registration link, an [invoice](/docs/payments/invoices) is automatically issued to the customer. They can use this invoice to make the authorisation payment.

A registration link must always have an amount (in paise) that the customer will be charged when making the authorisation payment. In the case of emandate, the order amount must be `0`.

### 1.2.1. Create a Registration Link

Use the below endpoint to create a registration link.

`POST /subscription_registration/auth_links`

<CodeGroup>
  ```bash Emandate via Netbanking theme={null}
  curl -u <YOUR_KEY_ID>:<YOUR_KEY_SECRET>
  -X POST https://api.razorpay.com/v1/subscription_registration/auth_links
  -H "Content-Type: application/json" \
  -d '{
    "customer": {
      "name": "Gaurav Kumar",
      "email": "gaurav.kumar@example.com",
      "contact": "9123456780"
    },
    "type": "link",
    "amount": 0,
    "currency": "INR",
    "description": "12 p.m. Meals",
    "subscription_registration": {
      "first_payment_amount": 100,
      "method": "emandate",
      "auth_type": "netbanking",
      "expire_at": 1580480689,
      "max_amount": 50000,
      "bank_account": {
        "beneficiary_name": "Gaurav Kumar",
        "account_number": "11214311215411",
        "account_type": "savings",
        "ifsc_code": "HDFC0001233"
      }
    },
    "receipt": "Receipt no. 1",
    "expire_by": 1880480689,
    "sms_notify": true,
    "email_notify": true,
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    }
  }'
  ```

  ```json Response theme={null}
  {
    "id": "inv_FHrY6tDtVP2dHg",
    "entity": "invoice",
    "receipt": "Receipt no. 1",
    "invoice_number": "Receipt no. 1",
    "customer_id": "cust_BMB3EwbqnqZ2EI",
    "customer_details": {
      "id": "cust_BMB3EwbqnqZ2EI",
      "name": "Gaurav Kumar",
      "email": "gaurav.kumar@example.com",
      "contact": "9123456780",
      "gstin": null,
      "billing_address": null,
      "shipping_address": null,
      "customer_name": "Gaurav Kumar",
      "customer_email": "gaurav.kumar@example.com",
      "customer_contact": "9123456780"
    },
    "order_id": "order_FHrY6tiC2y7NNN",
    "line_items": [],
    "payment_id": null,
    "status": "issued",
    "expire_by": 1880480689,
    "issued_at": 1595491063,
    "paid_at": null,
    "cancelled_at": null,
    "expired_at": null,
    "sms_status": "pending",
    "email_status": "pending",
    "date": 1595491063,
    "terms": null,
    "partial_payment": false,
    "gross_amount": 0,
    "tax_amount": 0,
    "taxable_amount": 0,
    "amount": 0,
    "amount_paid": 0,
    "amount_due": 0,
    "currency": "INR",
    "currency_symbol": "₹",
    "description": "test registration link",
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    },
    "comment": null,
    "short_url": "https://rzp.io/i/DxEcNtR",
    "view_less": true,
    "billing_start": null,
    "billing_end": null,
    "type": "link",
    "group_taxes_discounts": false,
    "created_at": 1595491063,
    "idempotency_key": null
  }
  ```

  ```bash Emandate via Debit Card theme={null}
  curl -u <YOUR_KEY_ID>:<YOUR_KEY_SECRET>
  -X POST https://api.razorpay.com/v1/subscription_registration/auth_links
  -H "Content-Type: application/json" \
  -d '{
    "customer": {
      "name": "Gaurav Kumar",
      "email": "gaurav.kumar@example.com",
      "contact": "9123456780"
    },
    "type": "link",
    "amount": 0,
    "currency": "INR",
    "description": "12 p.m. Meals",
    "subscription_registration": {
      "first_payment_amount": 100,
      "method": "emandate",
      "auth_type": "debitcard",
      "expire_at": 1580480689,
      "max_amount": 50000,
      "bank_account": {
        "beneficiary_name": "Gaurav Kumar",
        "account_number": "11214311215411",
        "account_type": "savings",
        "ifsc_code": "HDFC0001233"
      }
    },
    "receipt": "Receipt no. 1",
    "expire_by": 1880480689,
    "sms_notify": true,
    "email_notify": true,
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    }
  }'
  ```

  ```json Response theme={null}
  {
    "id": "inv_FHrZAOeCuB9HtK",
    "entity": "invoice",
    "receipt": "Receipt no. 1",
    "invoice_number": "Receipt no. 1",
    "customer_id": "cust_BMB3EwbqnqZ2EI",
    "customer_details": {
      "id": "cust_BMB3EwbqnqZ2EI",
      "name": "Gaurav Kumar",
      "email": "gaurav.kumar@example.com",
      "contact": "9123456780",
      "gstin": null,
      "billing_address": null,
      "shipping_address": null,
      "customer_name": "Gaurav Kumar",
      "customer_email": "gaurav.kumar@example.com",
      "customer_contact": "9123456780"
    },
    "order_id": "order_FHrZAPOStKd4xS",
    "line_items": [],
    "payment_id": null,
    "status": "issued",
    "expire_by": 1880480689,
    "issued_at": 1595491123,
    "paid_at": null,
    "cancelled_at": null,
    "expired_at": null,
    "sms_status": "pending",
    "email_status": "pending",
    "date": 1595491123,
    "terms": null,
    "partial_payment": false,
    "gross_amount": 0,
    "tax_amount": 0,
    "taxable_amount": 0,
    "amount": 0,
    "amount_paid": 0,
    "amount_due": 0,
    "currency": "INR",
    "currency_symbol": "₹",
    "description": "test registration link",
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    },
    "comment": null,
    "short_url": "https://rzp.io/i/RllVOmA",
    "view_less": true,
    "billing_start": null,
    "billing_end": null,
    "type": "link",
    "group_taxes_discounts": false,
    "created_at": 1595491123,
    "idempotency_key": null
  }
  ```

  ```bash Emandate via Aadhaar theme={null}
  curl -u <YOUR_KEY_ID>:<YOUR_KEY_SECRET>
  -X POST https://api.razorpay.com/v1/subscription_registration/auth_links
  -H "Content-Type: application/json" \
  -d '{
    "customer": {
      "name": "Gaurav Kumar",
      "email": "gaurav.kumar@example.com",
      "contact": "9123456780"
    },
    "type": "link",
    "amount": 0,
    "currency": "INR",
    "description": "12 p.m. Meals",
    "subscription_registration": {
      "first_payment_amount": 100,
      "method": "emandate",
      "auth_type": "aadhaar",
      "expire_at": 1580480689,
      "max_amount": 50000,
      "bank_account": {
        "beneficiary_name": "Gaurav Kumar",
        "account_number": "11214311215411",
        "account_type": "savings",
        "ifsc_code": "HDFC0001233"
      }
    },
    "receipt": "Receipt no. 1",
    "expire_by": 1880480689,
    "sms_notify": true,
    "email_notify": true,
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    }
  }'
  ```

  ```json Response theme={null}
  {
    "id": "inv_FHrZAOeCuB9HtK",
    "entity": "invoice",
    "receipt": "Receipt no. 1",
    "invoice_number": "Receipt no. 1",
    "customer_id": "cust_BMB3EwbqnqZ2EI",
    "customer_details": {
      "id": "cust_BMB3EwbqnqZ2EI",
      "name": "Gaurav Kumar",
      "email": "gaurav.kumar@example.com",
      "contact": "9123456780",
      "gstin": null,
      "billing_address": null,
      "shipping_address": null,
      "customer_name": "Gaurav Kumar",
      "customer_email": "gaurav.kumar@example.com",
      "customer_contact": "9123456780"
    },
    "order_id": "order_FHrZAPOStKd4xS",
    "line_items": [],
    "payment_id": null,
    "status": "issued",
    "expire_by": 1880480689,
    "issued_at": 1595491123,
    "paid_at": null,
    "cancelled_at": null,
    "expired_at": null,
    "sms_status": "pending",
    "email_status": "pending",
    "date": 1595491123,
    "terms": null,
    "partial_payment": false,
    "gross_amount": 0,
    "tax_amount": 0,
    "taxable_amount": 0,
    "amount": 0,
    "amount_paid": 0,
    "amount_due": 0,
    "currency": "INR",
    "currency_symbol": "₹",
    "description": "test registration link",
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    },
    "comment": null,
    "short_url": "https://rzp.io/i/RllVOmA",
    "view_less": true,
    "billing_start": null,
    "billing_end": null,
    "type": "link",
    "group_taxes_discounts": false,
    "created_at": 1595491123,
    "idempotency_key": null
  }
  ```
</CodeGroup>

#### Request Parameters

`customer`
: Details of the customer to whom the registration link will be sent.

`name` *mandatory*
: `string` Customer's name.

`email` *mandatory*
: `string` Customer's email address.

`contact`*mandatory*
: `string` Customer's phone number.

`type` *mandatory*
: `string` In this case, the value is `link`.

`currency` *mandatory*
: `string` The 3-letter ISO currency code for the payment. Currently, only `INR` is supported.

`amount` *mandatory*
: `integer` The payment amount in the smallest currency sub-unit.

`description` *mandatory*
: `string` A description that appears on the hosted page. For example, `12:30 p.m. Thali meals (Gaurav Kumar)`.

`subscription_registration`
: Details of the authorisation payment.

`method` *mandatory*
: `string` The authorization method. In this case, it will be `emandate`.

`auth_type` *optional*
: `string` Possible values:

* `netbanking`
* `debitcard`
* `aadhaar`

`first_payment_amount` *optional*
: `integer` The amount, in paise, the customer should be auto-charged in addition to the authorization amount. For example, `100000`.

`max_amount` *optional*
: `integer` The maximum amount, in paise, that a customer can be charged in one transaction. Know about [maximum and default values](/docs/payments/recurring-payments/emandate/faqs#2-what-is-the-maximum-amount-which-can).

`expire_at` *optional*
: `integer` The timestamp, in Unix, till when you can use the token (authorization on the payment method) to charge the customer subsequent payments. Defaults to 10 years for `emandate`. The value can range from the current date to 31-12-2099 (`4101580799`).

`bank_account`
: The customer's bank account details.

`beneficiary_name` *optional*
: `string` Name on the bank account. For example `Gaurav Kumar`.

`account_number` *optional*
: `integer` Customer's bank account number. For example `11214311215411`.

`account_type` *optional*
: `string` Customer's bank account type. Possible values:

* `savings` (default)
* `current`

`ifsc_code` *optional*
: `string` Customer's bank IFSC. For example `HDFC0000001`.

`sms_notify` *optional*
: `boolean` Indicates if SMS notifications are to be sent by Razorpay. Can have the following values:

* `true` (default): Notifications are sent by Razorpay.
* `false`: Notifications are not sent by Razorpay.

`email_notify` *optional*
: `boolean` Indicates if email notifications are to be sent by Razorpay. Can have the following values:

* `true` (default): Notifications are sent by Razorpay.
* `false`: Notifications are not sent by Razorpay.

`expire_by` *optional*
: `integer` The timestamp, in Unix, till when the registration link should be available to the customer to make the authorisation transaction.

`receipt` *optional*
: `string` A unique identifier entered by you for the order. For example, `Receipt No. 1`. This parameter should be mapped to the `order_id` sent by Razorpay.

`notes` *optional*
: `object` This is a key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, `"note_key": "Beam me up Scotty”`.

### 1.2.2. Send/Resend Notifications

The following endpoint sends/resends notifications with the short URL to the customer:

`POST /invoices/:id/notify_by/:medium`

<AccordionGroup>
  <Accordion title="Sample Code">
    <CodeGroup>
      ```bash Curl theme={null}
       curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET]
       -X POST https://api.razorpay.com/v1/invoices/inv_1Aa00000000001/notify_by/sms
      ```

      ```java Java theme={null}
       RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

       String invoiceId = "inv_1Aa00000000001";

       String medium = "sms";

       Invoice invoice = razorpay.invoices.notifyBy(invoiceId, medium);
      ```

      ```php PHP theme={null}
       $api = new Api($key_id, $secret);

       $api->invoice->fetch($invoiceId)->notify($medium);
      ```

      ```javascript Node.js theme={null}
       var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_SECRET' })

       instance.invoices.notifyBy(invoiceId, medium)
      ```

      ```python Python theme={null}
       client = razorpay.Client(auth=("YOUR_ID", "YOUR_SECRET"))

       client.invoice.notify_by(invoiceId, medium)
      ```

      ```ruby Ruby theme={null}
       require "razorpay"
       Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

       invoiceId = "inv_JDdNb4xdf4gxQ7"

       medium = "email" 

       Razorpay::Invoice.notify_by(invoiceId, medium)
      ```

      ```go Go theme={null}
       import ( razorpay "github.com/razorpay/razorpay-go" )
       client := razorpay.NewClient("YOUR_KEY_ID", "YOUR_SECRET")

       body, err := client.Invoice.Notify("<invoiceId>", "<medium>", nil, nil)
      ```

      ```csharp .NET theme={null}
       RazorpayClient client = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

       string invoiceId = "inv_Z6t7VFTb9xHeOs";

       string medium = "sms";

       Invoice invoice = client.Invoice.Fetch(invoiceId).NotifyBy(medium);
      ```
    </CodeGroup>

    ```json Response theme={null}
    {
      "success": true
    }
    ```
  </Accordion>
</AccordionGroup>

#### Path Parameters

`id`*mandatory*
: `string` The unique identifier of the invoice linked to the registration link for which you want to send the notification. For example, `inv_1Aa00000000001`.

`medium` *mandatory*
: `string` Determines through which medium you want to resend the notification. Possible values:

* `sms`
* `email`

### 1.2.3. Cancel a Registration Link

The following endpoint cancels a registration link.

`POST /invoices/:id/cancel`

<Info>
  **Handy Tips**

  You can only cancel registration link in the `issued` state.
</Info>

<AccordionGroup>
  <Accordion title="Sample Code">
    <CodeGroup>
      ```bash Curl theme={null}
       curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET]
       -X POST https://api.razorpay.com/v1/invoices/inv_1Aa00000000001/cancel
      ```

      ```java Java theme={null}
       RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

       String invoiceId = "inv_1Aa00000000001";

       Invoice invoice = razorpay.invoices.cancel(invoiceId);
      ```

      ```php PHP theme={null}
       $api = new Api($key_id, $secret);

       $api->invoice->fetch($invoiceId)->cancel();
      ```

      ```javascript Node.js theme={null}
       var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_SECRET' })

       instance.invoices.cancel(invoiceId)
      ```

      ```python Python theme={null}
       client = razorpay.Client(auth=("YOUR_ID", "YOUR_SECRET"))

       client.invoice.cancel(invoiceId)
      ```

      ```ruby Ruby theme={null}
       require "razorpay"
       Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

       invoiceId = "inv_1Aa00000000001"

       Razorpay::Invoice.cancel(invoiceId)
      ```

      ```go Go theme={null}
       import ( razorpay "github.com/razorpay/razorpay-go" )
       client := razorpay.NewClient("YOUR_KEY_ID", "YOUR_SECRET")

       body, err := client.Invoice.Cancel("<invoiceId>", nil, nil)
      ```

      ```csharp .NET theme={null}
       RazorpayClient client = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

       string invoiceId = "inv_Z6t7VFTb9xHeOs";

       Invoice invoice = client.Invoice.Fetch(invoiceId).Cancel();
      ```
    </CodeGroup>

    ```json Response theme={null}
    {
      "id": "inv_FHrfRupD2ouKIt",
      "entity": "invoice",
      "receipt": "Receipt No. 1",
      "invoice_number": "Receipt No. 1",
      "customer_id": "cust_BMB3EwbqnqZ2EI",
      "customer_details": {
          "id": "cust_BMB3EwbqnqZ2EI",
          "name": "<name>",
          "email": "<email>",
          "contact": "<phone>",
          "gstin": null,
          "billing_address": null,
          "shipping_address": null,
          "customer_name": "<name>",
          "customer_email": "<email>",
          "customer_contact": "<phone>"
      },
      "order_id": "order_FHrfRw4TZU5Q2L",
      "line_items": [],
      "payment_id": null,
      "status": "cancelled",
      "expire_by": 4102444799,
      "issued_at": 1595491479,
      "paid_at": null,
      "cancelled_at": 1595491488,
      "expired_at": null,
      "sms_status": "sent",
      "email_status": "sent",
      "date": 1595491479,
      "terms": null,
      "partial_payment": false,
      "gross_amount": 100,
      "tax_amount": 0,
      "taxable_amount": 0,
      "amount": 100,
      "amount_paid": 0,
      "amount_due": 100,
      "currency": "INR",
      "currency_symbol": "₹",
      "description": "Registration Link for Gaurav Kumar",
      "notes": {
          "note_key 1": "Beam me up Scotty",
          "note_key 2": "Tea. Earl Gray. Hot."
      },
      "comment": null,
      "short_url": "https://rzp.io/i/QlfexTj",
      "view_less": true,
      "billing_start": null,
      "billing_end": null,
      "type": "link",
      "group_taxes_discounts": false,
      "created_at": 1595491480,
      "idempotency_key": null
    }
    ```
  </Accordion>
</AccordionGroup>

#### Path Parameter

`id` *mandatory*
: `string` The unique identifier for the invoice linked to the registration link that you want to cancel. For example, `inv_1Aa00000000001`.

## 2. Fetch and Manage Tokens

Once you capture a payment, Razorpay Checkout returns a `razorpay_payment_id`. You can use this id to fetch the `token_id`, which is used to create and charge subsequent payments.

You can retrieve the `token_id` using the [Dashboard](/docs/payments/recurring-payments/create#3-search-for-the-token) or the APIs given below.

### 2.1. Fetch Token by Payment ID

Use the below endpoint to fetch the `token_id` using a `payment_id`.

`GET /payments/:id`

<CodeGroup>
  ```bash Curl theme={null}
  curl -u <YOUR_KEY_ID>:<YOUR_KEY_SECRET> \
  -X GET https://api.razorpay.com/v1/payments/pay_1Aa00000000002
  ```

  ```php PHP theme={null}
  $api = new Api($key_id, $secret);

  $api->payment->fetch($paymentId);
  ```

  ```json Response theme={null}
  {
    "id": "pay_FHf9a7AO0iXM9I",
    "entity": "payment",
    "amount": 0,
    "currency": "INR",
    "status": "captured",
    "order_id": "order_FHf9OwSeyetnKC",
    "invoice_id": "inv_FHf9P2hhXEti7i",
    "international": false,
    "method": "emandate",
    "amount_refunded": 0,
    "refund_status": null,
    "captured": true,
    "description": null,
    "card_id": null,
    "bank": "HDFC",
    "wallet": null,
    "vpa": null,
    "email": "gaurav.kumar@example.com",
    "contact": "+919876543210",
    "customer_id": "cust_DtHaBuooGHTuyZ",
    "token_id": "token_FHf9aAZR9hWJkq",
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    },
    "fee": 0,
    "tax": 0,
    "error_code": null,
    "error_description": null,
    "error_source": null,
    "error_step": null,
    "error_reason": null,
    "acquirer_data": {},
    "created_at": 1595447410
  }
  ```
</CodeGroup>

<Info>
  **Note**

  You can also retrieve the `token_id` via the [payment.authorized webhook](/docs/api/payments/recurring-payments/webhooks#payment-authorized).
</Info>

#### Path Parameter

`id` *mandatory*
: `string` The unique identifier of the payment to be retrieved. For example, `pay_1Aa00000000002`.

### 2.2. Fetch Tokens by Customer ID

Use the below endpoint to fetch all tokens linked to a customer.

A customer can have multiple tokens tied to them. These tokens can be used to create subsequent payments for multiple products or services.

`GET /customers/:id/tokens`

<CodeGroup>
  ```bash Curl theme={null}
  curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET] \
  -X GET https://api.razorpay.com/v1/customers/cust_1Aa00000000002/tokens
  ```

  ```php PHP theme={null}
  $api = new Api($key_id, $secret);

  $api->customer->fetch($customerId)->tokens()->all();
  ```

  ```json Response theme={null}
  {
    "entity": "collection",
    "count": 2,
    "items": [
      {
        "id": "token_FHf94Uym9tdYFJ",
        "entity": "token",
        "token": "2wDPM7VAlXtjAR",
        "bank": "HDFC",
        "wallet": null,
        "method": "emandate",
        "vpa": null,
        "recurring": true,
        "recurring_details": {
          "status": "confirmed",
          "failure_reason": null
        },
        "auth_type": "netbanking",
        "mrn": null,
        "used_at": 1595447381,
        "created_at": 1595447381,
        "bank_details": {
          "beneficiary_name": "Gaurav Kumar",
          "account_number": "1121431121541121",
          "ifsc": "HDFC0000001",
          "account_type": "savings"
        },
        "max_amount": 9999900,
        "expired_at": 1689971140,
        "dcc_enabled": false
      },
      {
        "id": "token_FHf9aAZR9hWJkq",
        "entity": "token",
        "token": "AwAwIFBmDSJ4p6",
        "bank": "HDFC",
        "wallet": null,
        "method": "emandate",
        "vpa": null,
        "recurring": true,
        "recurring_details": {
          "status": "confirmed",
          "failure_reason": null
        },
        "auth_type": "debitcard",
        "mrn": null,
        "used_at": 1595447410,
        "created_at": 1595447410,
        "bank_details": {
          "beneficiary_name": "Gaurav Kumar",
          "account_number": "1121431121541121",
          "ifsc": "HDFC0000001",
          "account_type": "savings"
        },
        "max_amount": 9999900,
        "expired_at": 4102444799,
        "dcc_enabled": false
      }
    ]
  }
  ```
</CodeGroup>

#### Path Parameter

`id` *mandatory*
: `string` The unique identifier of the customer for whom tokens are to be retrieved. For example, `cust_1Aa00000000002`.

### 2.3. Delete Tokens

The following endpoint deletes a token.

`DELETE /customers/:customer_id/tokens/:token_id`

<CodeGroup>
  ```bash Curl theme={null}
  curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET] \
  -X DELETE https://api.razorpay.com/v1/customers/cust_1Aa00000000002/tokens/token_1Aa00000000001
  ```

  ```java Java theme={null}
  RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  String customerId = "cust_1Aa00000000002";

  String tokenId = "token_1Aa00000000001";

  Customer customer = razorpay.customers.deleteToken(customerId, tokenId);
  ```

  ```php PHP theme={null}
  $api = new Api($key_id, $secret);

  $api->customer->fetch($customerId)->tokens()->delete($tokenId);
  ```

  ```javascript Node.js theme={null}
  var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_SECRET' })

  instance.customers.deleteToken(customerId, tokenId)
  ```

  ```python Python theme={null}
  client = razorpay.Client(auth=("YOUR_ID", "YOUR_SECRET"))

  client.token.delete(customerId, tokenId)
  ```

  ```ruby Ruby theme={null}
  require "razorpay"
  Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

  customerId = "cust_1Aa00000000004"

  tokenId = "token_Hxe0skTXLeg9pF"

  Razorpay::Customer.fetch(customerId).deleteToken(tokenId)
  ```

  ```go Go theme={null}
  import ( razorpay "github.com/razorpay/razorpay-go" )
  client := razorpay.NewClient("YOUR_KEY_ID", "YOUR_SECRET")

  body, err := client.Token.Delete("<customerId>", "<tokenId>", nil, nil)
  ```

  ```ruby Ruby theme={null}
  require "razorpay"
  Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

  customerId = "cust_1Aa00000000004"

  tokenId = "token_Hxe0skTXLeg9pF"

  Razorpay::fetch(customerId).deleteToken(tokenId)
  ```

  ```java Java theme={null}
  RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  String customerId = "cust_DtHaBuooGHTuyZ";

  String tokenId = "token_HouA2OQR5Z2jTL";

  Customer customer = instance.customers.deleteToken(customerId, tokenId);
  ```

  ```csharp .NET theme={null}
  RazorpayClient client = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  string customerId = "cust_Z6t7VFTb9xHeOs";

  string tokenId = "token_1Aa00000000001";

  Customer customer = client.Customer.Fetch(customerId).DeleteToken(tokenId);
  ```

  ```json Response theme={null}
  {
      "deleted": true
  }
  ```
</CodeGroup>

#### Path Parameter

`customer_id` *mandatory*
: `string` The unique identifier of the customer with whom the token is linked. For example, `cust_1Aa00000000002`.

`token_id` *mandatory*
: `string` The unique identifier of the token that is to be deleted. For example, `token_1Aa00000000001`.

## 3. Create Subsequent Payments

You should perform the following steps to create and charge your customer subsequent payments:

1. [Create an order to charge the customer](#3-1-create-an-order-to-charge-the-customer)
2. [Create a recurring payment](#3-2-create-a-recurring-payment)

### 3.1. Create an Order to Charge the Customer

You have to create a new order every time you want to charge your customers. This order is different from the one created during the authorisation transaction.

The following endpoint creates an order.

`POST /orders`

<CodeGroup>
  ```bash Curl theme={null}
  curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET] \
  -X POST https://api.razorpay.com/v1/orders \
  -H "Content-Type: application/json" \
  -d '{
    "amount":1000,
    "currency":"INR",
    "payment_capture": true,
    "receipt":"Receipt No. 1",
    "notes": {
      "notes_key_1":"Tea, Earl Grey, Hot",
      "notes_key_2":"Tea, Earl Grey… decaf."
    }
  }'
  ```

  ```java Java theme={null}
  RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  JSONObject orderRequest = new JSONObject();
  orderRequest.put("amount", 1000);
  orderRequest.put("currency", "INR");
  orderRequest.put("payment_capture", true);
  orderRequest.put("receipt", "Receipt No. 1");
  JSONObject notes = new JSONObject();
  notes.put("notes_key_1","Tea, Earl Grey, Hot");
  notes.put("notes_key_2","Tea, Earl Grey… decaf.");
  orderRequest.put("notes", notes);

  Order order = razorpay.orders.create(orderRequest);
  ```

  ```php PHP theme={null}
  $api = new Api($key_id, $secret);

  $api->order->create(array('receipt' => '123', 'amount' => 100, 'payment_capture' => true, 'currency' => 'INR', 'notes'=> array('key1'=> 'value3','key2'=> 'value2')));
  ```

  ```javascript Node.js theme={null}
  var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_SECRET' })

  instance.orders.create({
    "amount":1000,
    "currency":"INR",
    "payment_capture": true,
    "receipt":"Receipt No. 1",
    "notes": {
      "notes_key_1":"Tea, Earl Grey, Hot",
      "notes_key_2":"Tea, Earl Grey… decaf."
    }
  })
  ```

  ```python Python theme={null}
  client = razorpay.Client(auth=("YOUR_ID", "YOUR_SECRET"))

  client.order.create({
      'amount': 1000,
      'currency': 'INR',
      'payment_capture': True,
      'receipt': 'Receipt No. 1',
      'notes': {'notes_key_1': 'Tea, Earl Grey, Hot',
                'notes_key_2': 'Tea, Earl Grey... decaf.'}
      })
  ```

  ```ruby Ruby theme={null}
  require "razorpay"
  Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

  para_attr = {
    "amount": 1000,
    "currency": "INR",
    "payment_capture": true,
    "receipt": "Receipt No. 1",
    "notes": {
      "notes_key_1": "Tea, Earl Grey, Hot",
      "notes_key_2": "Tea, Earl Grey… decaf."
    }
  }

  Razorpay::Order.create(para_attr)
  ```

  ```go Go theme={null}
  import ( razorpay "github.com/razorpay/razorpay-go" )
  client := razorpay.NewClient("YOUR_KEY_ID", "YOUR_S ECRET")

  data:= map[string]interface{}{
    "amount":1000,
    "currency":"INR",
    "payment_capture": true,
    "receipt":"Receipt No. 1",
    "notes": map[string]interface{}{
      "notes_key_1":"Tea, Earl Grey, Hot",
      "notes_key_2":"Tea, Earl Grey… decaf.",
    },
  }
  body, err := client.Order.Create(data, nil)
  ```

  ```csharp .NET theme={null}
  RazorpayClient client = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  Dictionary<string, object> orderRequest = new Dictionary<string, object>();
  orderRequest.Add("amount", 100);
  orderRequest.Add("currency", "INR");
  orderRequest.Add("receipt", "receipt#12b");
  orderRequest.Add("payment_capture", true);
  Dictionary<string, object> notes = new Dictionary<string, object>();
  notes.Add("notes_key_1", "Tea, Earl Grey, Hot");
  notes.Add("notes_key_2", "Tea, Earl Grey… decaf.");
  orderRequest.Add("notes", notes);

  Order order = client.Order.Create(orderRequest);
  ```
</CodeGroup>

<CodeGroup>
  ```json Success Response theme={null}
  {
     "id":"order_1Aa00000000002",
     "entity":"order",
     "amount":1000,
     "amount_paid":0,
     "amount_due":1000,
     "currency":"INR",
     "receipt":"Receipt No. 1",
     "offer_id":null,
     "status":"created",
     "attempts":0,
     "notes":{
        "notes_key_1":"Tea, Earl Grey, Hot",
        "notes_key_2":"Tea, Earl Grey… decaf."
     },
     "created_at":1579782776
  }
  ```

  ```json Failure Response theme={null}
  {
     "error":{
        "code":"BAD_REQUEST_ERROR",
        "description":"The id provided does not exist",
        "source":"business",
        "step":"payment_initiation",
        "reason":"input_validation_failed",
        "metadata":{
           
        }
     }
  }
  ```
</CodeGroup>

#### Request Parameters

`amount` *mandatory*
: `integer` Amount in currency subunits.

`currency` *mandatory*
: `string` The 3-letter ISO currency code for the payment.

`receipt` *optional*
: `string` A user-entered unique identifier for the order. For example, `Receipt No. 1`. You should map this parameter to the `order_id` sent by Razorpay.

`notes` *optional*
: `object` Key-value pair you can use to store additional information about the entity. Maximum of 15 key-value pairs, 256 characters each. For example, `"note_key": "Beam me up Scotty”`.

`payment_capture` *mandatory*
: `boolean` Determines whether the payment status should be changed to `captured` automatically or not. Possible values:

* `true`: Payments are captured automatically.
* `false`: Payments are not captured automatically. You can manually capture payments using the [Manually Capture Payments API](/docs/api/payments/capture).

### 3.2. Create a Recurring Payment

Once you have generated an `order_id`, use it with the `token_id` to create a payment and charge the customer. The following endpoint creates a payment to charge the customer.

`POST /payments/create/recurring`

<CodeGroup>
  ```bash Curl theme={null}
  curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET] \
  -X POST https://api.razorpay.com/v1/payments/create/recurring \
  -H "Content-Type: application/json" \
  -d '{
    "email": "<email>",
    "contact": "<phone>",
    "amount": 1000,
    "currency": "INR",
    "order_id": "order_1Aa00000000002",
    "customer_id": "cust_1Aa00000000001",
    "token": "token_1Aa00000000001",
    "recurring": true,
    "description": "Creating recurring payment for <name>",
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    }
  }'
  ```

  ```java Java theme={null}
  RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  JSONObject paymentRequest = new JSONObject();
  paymentRequest.put("email", "<email>");
  paymentRequest.put("contact", "<phone>");
  paymentRequest.put("amount", 1000);
  paymentRequest.put("currency", "INR");
  paymentRequest.put("order_id", "order_1Aa00000000002");
  paymentRequest.put("customer_id", "cust_1Aa00000000001");
  paymentRequest.put("token", "token_1Aa00000000001");
  paymentRequest.put("recurring", true);
  paymentRequest.put("description", "Creating recurring payment for <name>");
  JSONObject notes = new JSONObject();
  paymentRequest.put("notes_key_1","Tea, Earl Grey, Hot");
  paymentRequest.put("notes_key_2","Tea, Earl Grey… decaf.");

  Payment payment = razorpay.payments.createRecurringPayment(paymentRequest);
  ```

  ```php PHP theme={null}
  $api = new Api($key_id, $secret);

  $api->payment->createRecurring(array('email'=>'<email>','contact'=>'<phone>','amount'=>100,'currency'=>'INR','order_id'=>'order_1Aa00000000002','customer_id'=>'cust_1Aa00000000001','token'=>'token_1Aa00000000001','recurring'=>true,'description'=>'Creating recurring payment for <name>'));
  ```

  ```javascript Node.js theme={null}
  var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_SECRET' })

  instance.payments.createRecurringPayment({
    "email": "<email>",
    "contact": "<phone>",
    "amount": 1000,
    "currency": "INR",
    "order_id": "order_1Aa00000000002",
    "customer_id": "cust_1Aa00000000001",
    "token": "token_1Aa00000000001",
    "recurring": true,
    "description": "Creating recurring payment for <name>",
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    }
  })
  ```

  ```python Python theme={null}
  client = razorpay.Client(auth=("YOUR_ID", "YOUR_SECRET"))

  client.payment.createRecurring({
      'email': '<email>',
      'contact': <phone>,
      'amount': 1000,
      'currency': 'INR',
      'order_id': "order_1Aa00000000002",
      'customer_id': "cust_1Aa00000000001",
      'token': 'token_1Aa00000000001',
      'recurring': True,
      'description': 'Creating recurring payment for <name>',
      'notes': {'note_key 1': 'Beam me up Scotty',
                'note_key 2': 'Tea. Earl Gray. Hot.'}
      })
  ```

  ```ruby Ruby theme={null}
  require "razorpay"
  Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

  para_attr = {
    "email": "<email>",
    "contact": "<phone>",
    "amount": 1000,
    "currency": "INR",
    "order_id": "order_1Aa00000000002",
    "customer_id": "cust_1Aa00000000001",
    "token": "token_1Aa00000000001",
    "recurring": true,
    "description": "Creating recurring payment for <name>",
    "notes": {
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot."
    }
  }
  Razorpay::Payment.create_recurring_payment(para_attr)
  ```

  ```go Go theme={null}
  import ( razorpay "github.com/razorpay/razorpay-go" )
  client := razorpay.NewClient("YOUR_KEY_ID", "YOUR_SECRET")

  data:= map[string]interface{}{
    "email": "<email>",
    "contact": "<phone>",
    "amount": 1000,
    "currency": "INR",
    "order_id": "order_1Aa00000000002",
    "customer_id": "cust_1Aa00000000001",
    "token": "token_1Aa00000000001",
    "recurring": true,
    "description": "Creating recurring payment for <name>",
    "notes": map[string]interface{}{
      "note_key 1": "Beam me up Scotty",
      "note_key 2": "Tea. Earl Gray. Hot.",
    },
  }
  body, err := Client.Payment.CreateRecurringPayment(data, nil)
  ```

  ```csharp .NET theme={null}
  RazorpayClient client = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  Dictionary<string, object> paymentRequest = new Dictionary<string, object>();
  paymentRequest.Add("email", "<email>");
  paymentRequest.Add("contact", "<phone>");
  paymentRequest.Add("amount", 1000);
  paymentRequest.Add("currency", "INR");
  paymentRequest.Add("order_id", "order_MZ35KPxZaqxfXq");
  paymentRequest.Add("customer_id", "cust_KUyah9o60OPhfj");
  paymentRequest.Add("token", "token_MZ37MsnhLNH4tN");
  paymentRequest.Add("recurring", true);
  paymentRequest.Add("description", "Creating recurring payment for <name>");
  Dictionary<string, object> notes = new Dictionary<string, object>();
  notes.Add("notes_key_1", "Tea, Earl Grey, Hot");
  notes.Add("notes_key_2", "Tea, Earl Grey… decaf.");
  paymentRequest.Add("notes", notes);

  Payment payment = client.Payment.CreateRecurringPayment(paymentRequest);
  ```
</CodeGroup>

<CodeGroup>
  ```json Success Response theme={null}
  {
    "razorpay_payment_id" : "pay_1Aa00000000001"
  }
  ```

  ```json Failure Response theme={null}
  {
     "error":{
        "code":"BAD_REQUEST_ERROR",
        "description":"Amount exceeds maximum amount allowed",
        "source":"business",
        "step":"payment_initiation",
        "reason":"input_validation_failed",
        "metadata":{
           
        }
     }
  }
  ```
</CodeGroup>

#### Request Parameters

`email ` *mandatory*
: `string` The customer's email address. For example, `gaurav.kumar@example.com`.

`contact ` *mandatory*
: `integer` The customer's phone number. For example, `9876543210`.

`currency` *mandatory*
: `string` 3-letter ISO currency code for the payment. Currently, only `INR` is allowed.

`amount` *mandatory*
: `integer` The amount you want to charge your customer. This should be the same as the order amount.

`order_id`*mandatory*
: `string` The unique identifier of the order created. For example, `order_1Aa00000000002`.

`customer_id` *mandatory*
: `string` The unique identifier of the customer you want to charge. For example, `cust_1Aa00000000002`.

`token` *mandatory*
: `string` The `token_id` generated when the customer successfully completes the authorisation payment. Different payment instruments for the same customer have different `token_id`.

`recurring` *mandatory*
: `boolean` Determines whether recurring payment is enabled or not.

* `true`: Recurring payment is enabled.
* `false`: Recurring payment is not enabled.

`description`*optional*
: `string` A user-entered description for the payment. For example, `Creating recurring payment for Gaurav Kumar`

`notes`*optional*
: `object` Key-value pair you can use to store additional information about the entity. Maximum of 15 key-value pairs, 256 characters each. For example, `"note_key": "Beam me up Scotty”`.
