---
updatedAt: 2026-09-08T08:09:27.000Z
agentTools:
  projectIndex: https://docs.dlocal.com/llms.txt
---

# India

Learn about the dLocal supported payment methods in India.

[block:html]
{
  "html": "<style>\n  \n  .main {\n    margin-left: auto;\n    margin-right: auto;\n    margin-bottom: 5px;\n    display: grid;\n    grid-template-columns: repeat(3, 1fr); /* Tres columnas */\n    width: 740px; /* Ancho máximo de la caja */\n}\n\n.overview-card1 {\n    position: relative; /* Asegúrate de que el contenedor sea relativo para posicionar el pseudoelemento */\n    width: 100%;\n    max-width: 233px;\n    box-sizing: border-box;\n    margin: 0;\n}\n\n.overview-card1::after {\n    content: '';\n    position: absolute;\n    right: 0; /* Pega la línea al borde derecho */\n    top: 30%; /* Ajusta la posición superior de la línea */\n    height: 60%; /* Establece el alto de la línea al 60% */\n    width: 1px; /* Grosor de la línea */\n    background-color: #D2D8EC; /* Color de la línea */\n}\n\n  .overview-card2 {\n    position: relative; /* Asegúrate de que el contenedor sea relativo para posicionar el pseudoelemento */\n    width: 100%;\n    max-width: 233px;\n    box-sizing: border-box;\n    margin: 0;\n}\n  \n  .overview-card2::after {\n    content: '';\n    position: absolute;\n    right: 0; /* Pega la línea al borde derecho */\n    top: 30%; /* Ajusta la posición superior de la línea */\n    height: 70%; /* Establece el alto de la línea al 60% */\n    width: 1px; /* Grosor de la línea */\n    background-color: #D2D8EC; /* Color de la línea */\n}\n  \n.overview-card3 {\n    position: relative; /* Asegúrate de que el contenedor sea relativo para posicionar el pseudoelemento */\n    width: 100%;\n    max-width: 233px;\n    box-sizing: border-box;\n    margin: 0;\n}\n\n.overview-card-upper-side1 {\n    height: 105px;\n    padding: 20px;\n    background-color: transparent;\n    text-align: left;\n}\n\n.overview-card-bottom-side {\n    position: relative;\n    width: 100%;\n    height: 100%;\n    padding: 30px;\n    padding-right: 20px;\n    background-color: transparent;\n    border-radius: 16px;\n}\n\n.overview-card-title1 {\n    font-family: 'Plus Jakarta Sans', sans-serif;\n    font-size: 24px;\n    font-weight: 700;\n    line-height: 26.4px;\n}\n\n.overview-card-content1 {\n    font-size: 14px;\n    font-weight: 300;\n    margin-top: 20px;\n    line-height: 20px;\n    margin-bottom: 40px!important;\n}\n\n.overview-icon1 {\n    margin-bottom: -5px;\n    margin-top: 20px;\n}\n  \n.doc-link {\n        position: relative;\n        font-weight: 500;\n        color: #21A35B !important;\n        text-decoration: none;\n        display: block;\n    }\n  \n\ndiv:not(.markdown-body) .doc-link:hover {\n            text-decoration: none;\n            color: #1043FA !important;\n            transform: translateX(0.2em);\n        }\n\n.overview-card-title1:hover {\n    color: #2D59F5 !important;\n    cursor:pointer;\n    transform: none!important;\n}\n\n    div:not(.markdown-body) .doc-link_arrow {\n        display: inline-block;\n        height: 1em;\n        width: auto;\n        vertical-align: middle;\n        margin-left: 0.2em;\n        margin-top: -0.1em;\n    }\n  \n     div:not(.markdown-body) .doc-link:hover .doc-link_arrow-color {\n            fill: #1043FA !important;\n        }\n  \n  \n      [data-color-mode=\"dark\"] .overview-icon1 img {\n  filter: brightness(0) invert(1);\n  transition: filter 0.3s ease;\n}\n  \n/* Media Queries para dispositivos móviles */\n@media (max-width: 768px) {\n  .main {\n    grid-template-columns: repeat(2, 1fr); /* Dos columnas en pantallas medianas */\n  }\n}\n\n@media (max-width: 480px) {\n  .main {\n    grid-template-columns: 1fr; /* Una columna en pantallas pequeñas */\n}\n</style>\n  \n    <div class=\"main\">\n\n     <!-- Market specifications -->\n      <div class=\"overview-card1\" onclick=\"parent.location='/docs/india#market-specifications'\">\n     <div class=\"overview-card-bottom-side\">\n       <div class=\"overview-icon1\"><img width=\"48\" src=\"https://files.readme.io/922681fecfb238c94f7213fa9e0aa1675f1e190ec55beff2b6994169c77fdefc-adjust-circle.svg\"  alt=\"\" loading=\"lazy\"><div class=\"img_overlay img_color_rgba(0,0,0,.2)\"></div></div>\n           <h3 class=\"overview-card-title1\">Market specifications</h3>\n          <p class=\"overview-card-content1\">\n            Take a look of all the payment methods available.   \n        </p>\n          <a href=\"#country-reference\" class=\"doc-link\">Country reference</a>\n          <a href=\"#cards-supported\" class=\"doc-link\">Cards supported</a>\n          <a href=\"#alternative-payment-method-supported\" class=\"doc-link\">APM supported</a>\n        </div>\n      </div>\n      \n      <!-- Cards -->\n      <div\n        class=\"overview-card2\" onclick=\"parent.location='/docs/india#cards'\">\n        <div class=\"overview-card-bottom-side\">\n                  <div class=\"overview-icon1\"><img width=\"48\" src=\"https://files.readme.io/8d450ada4af3880f85f70c5daedebb0bec1b2b6d64479be929af48fdc8d66f40-credit-card.svg\"  alt=\"\" loading=\"lazy\"><div class=\"img_overlay img_color_rgba(0,0,0,.2)\"></div></div>\n           <h3 class=\"overview-card-title1\">Cards</h3><br>\n          <p class=\"overview-card-content1\">\n           Find all the information about the card supported capabilities.   \n          </p>\n          <a href=\"#brands\" class=\"doc-link\">Brands</a>\n          <a href=\"#capabilities\" class=\"doc-link\">Capabilities</a>\n          <a href=\"#how-to-process-card-payments\" class=\"doc-link\">Process Card Payments</a>\n        </div>\n      </div>  \n      \n      <!-- APM -->\n      <div class=\"overview-card3\" onclick=\"parent.location='/docs/india#alternative-payment-method'\">\n    <div class=\"overview-card-bottom-side\">\n             <div class=\"overview-icon1\"><img width=\"48\" src=\"https://files.readme.io/5a59519487455e7af361db8b67a2dee8d71627d4d6e1ed0a0bd805f5da861fcc-money-stack.svg\"  alt=\"\" loading=\"lazy\"><div class=\"img_overlay img_color_rgba(0,0,0,.2)\"></div></div>\n           <h3 class=\"overview-card-title1\">Alternative Payments</h3>\n          <p class=\"overview-card-content1\">\n             Learn how to integrate cash, bank transfer or wallet payment.  \n        </p>\n          <a href=\"#other-wallets\" class=\"doc-link\">Wallets</a>\n          <a href=\"#upi\" class=\"doc-link\">UPI</a>\n          <a href=\"#upi-direct\" class=\"doc-link\">UPI Direct</a>\n          <a href=\"#upi-recurring\" class=\"doc-link\">UPI (Recurring)</a>\n          <a href=\"#netbanking\" class=\"doc-link\">NetBanking</a>\n          <a href=\"#netbanking-recurring\" class=\"doc-link\">NetBanking Recurring</a>\n        </div>\n      </div> \n      \n    </div>"
}
[/block]

***

# Market specifications

Do you want to know more information about India's market? Go to the [India’s economy and eCommerce market](https://dlocal.com/online-payment-processors-in-asia/india-payment-methods-processors-ecommerce-market/) article.

## Country reference

| `country` code | `currency` code | `amount` decimals | `document` name |                            `document` format                            | `document` required? |
| :------------: | :-------------: | :---------------: | :-------------: | :---------------------------------------------------------------------: | :------------------: |
|      `IN`      |      `INR`      |         2         |       PAN       | 10 characters (5 letters, 4 numbers, 1 letter) </br>Full PAN validation |          Yes         |

## Cards supported

| `payment_method_id` | Brand ID | Name               | `payment_method_type` | Details                  | Allowed Flows       | Logo                                                                                |
| :------------------ | :------- | :----------------- | :-------------------- | :----------------------- | :------------------ | :---------------------------------------------------------------------------------- |
| `CARD`              | `VI`     | Visa               | `CARD`                | Credit Card ​            | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/checkout/VI.svg" width="40px"> |
| `CARD`              | `VD`     | Visa Debit ​       | `CARD`                | Debit Card ​             | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/checkout/VD.svg" width="40px"> |
| `CARD`              | `MC`     | Mastercard         | `CARD`                | Credit Card ​            | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/checkout/MC.svg" width="40px"> |
| `CARD`              | `MD`     | Mastercard Debit ​ | `CARD`                | Debit Card ​             | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/checkout/MD.svg" width="40px"> |
| `CARD`              | `AE`     | American Express   | `CARD`                | Credit Card ​            | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/checkout/AE.svg" width="40px"> |
| `CARD`              | `DC`     | Diners             | `CARD`                | Credit Card ​            | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/checkout/DC.svg" width="40px"> |
| `CARD`              | `RU`     | RuPay              | `CARD`                | Credit<br />Debit Card ​ | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/checkout/RU.svg" width="40px"> |

<Callout icon="ℹ️" theme="info">
  To offer all the card options that may be available in your integration, send the `payment_method_id` as `CARD`.
</Callout>

## Alternative Payment Method supported

| `payment_method_id` | Name                 | `payment_method_type` | Details       | Allowed Flows       | Logo                                                                             |
| :------------------ | :------------------- | :-------------------- | :------------ | :------------------ | :------------------------------------------------------------------------------- |
| `NB`                | NetBanking           | `BANK_TRANSFER`       | Bank Transfer | `REDIRECT`          | <img src="https://pay.dlocal.com/views/2.0/images/payments/NB.png" width="40px"> |
| `UI`                | UPI                  | `BANK_TRANSFER`       | Bank Transfer | `REDIRECT`          | <img src="https://pay.dlocal.com/views/2.0/images/payments/UI.png" width="40px"> |
| `UD`                | UPI Direct           | `BANK_TRANSFER`       | Bank Transfer | `DIRECT`            | <img src="https://pay.dlocal.com/views/2.0/images/payments/UI.png" width="40px"> |
| `IR`                | UPI Recurring        | `BANK_TRANSFER`       | Bank Transfer | `DIRECT` `REDIRECT` | <img src="https://pay.dlocal.com/views/2.0/images/payments/UI.png" width="40px"> |
| `NZ`                | NetBanking Recurring | `BANK_TRANSFER`       | Bank Transfer | `REDIRECT`          | <img src="https://pay.dlocal.com/views/2.0/images/payments/NB.png" width="40px"> |

***

# Cards

## Brands

Cards are highly relevant in India.<br />With Visa leading the race, Mastercard comes close second, but it’s the Local Schemes like RuPay which really are taking the market by storm.

## Capabilities

|                               | Visa Credit                                 | Visa Debit                                  | Mastercard Credit                           | Mastercard Debit                            | American Express                            | Diners                                      | RuPay                                       |
| :---------------------------- | :------------------------------------------ | :------------------------------------------ | :------------------------------------------ | :------------------------------------------ | :------------------------------------------ | :------------------------------------------ | :------------------------------------------ |
| **Minimum amount**            | 1 INR                                       | 1 INR                                       | 1 INR                                       | 1 INR                                       | 1 INR                                       | 1 INR                                       | 1 INR                                       |
| **Refunds**                   | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         |
| **Recurring**                 | Yes                                         | Yes                                         | Yes                                         | Yes                                         | No                                          | Yes                                         | No                                          |
| **Chargeback option**         | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         |
| **Chargeback Dispute option** | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         | Yes                                         |
| **Descriptor**                | Can be personalized, depending on provider. | Can be personalized, depending on provider. | Can be personalized, depending on provider. | Can be personalized, depending on provider. | Can be personalized, depending on provider. | Can be personalized, depending on provider. | Can be personalized, depending on provider. |

## How to process Card Payments?

Learn how to process payments with credit and debit cards with dLocal in our [Card Payments](https://docs.dlocal.com/docs/card-payments) section.

***

# Alternative Payment Method

## UPI

Unified Payment Interface (UPI) is an instantaneous real-time online payment system that allows instant funds transfer between accounts. It supports more than 207 local banks and has more than 100 million monthly active users in India.

With **UPI Redirect** merchants can rely on dLocal to collect relevant data, such as UPI ID.

### Capabilities

|                                    | UPI        |
| :--------------------------------- | :--------- |
| **Min. amount**                    | 1 INR      |
| **Max. expiration time supported** | 5 days     |
| **Notification delay**             | Immediate  |
| **Refunds**                        | Yes        |
| **Flow**                           | `REDIRECT` |

### UX Flow

<Image src="https://files.readme.io/f5616d13d3d1eb76416991d91771d5f83368a6f30c7a0bba6914e2a170f56a33-UPI_-_Redirect.png" alt="The screenshots illustrate a generic UPI direct flow." align="center" caption="The screenshots illustrate a generic UPI redirect flow." />

### Request parameters

| Property              | Type   | Description                                                                                                            | Mandatory?                                    |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes                                           |
| `currency`            | String | `INR`<br /><br />Transaction currency in [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217).                            | Yes                                           |
| `country`             | String | `IN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes                                           |
| `payment_method_id`   | String | `UI` <br /><br />ID of the selected payment method.                                                                    | Yes                                           |
| `payment_method_flow` | String | `REDIRECT`                                                                                                             | Yes                                           |
| `payer.name`          | String | Name of the payer.                                                                                                     | Yes                                           |
| `payer.email`         | String | Email of the payer.                                                                                                    | Yes                                           |
| `payer.phone`         | String | Phone number of the payer.                                                                                             | Yes                                           |
| `payer.document`      | String | Document of the payer.                                                                                                 | Yes                                           |
| `address.state`       | String | State of the payer.                                                                                                    | Yes (Only for cross-border PACB transactions) |
| `address.city`        | String | City of the payer.                                                                                                     | Yes (Only for cross-border PACB transactions) |
| `address.zip_code`    | String | ZIP Code of the payer. Must be exactly 6 numeric digits (e.g., 560032)                                                 | Yes (Only for cross-border PACB transactions) |
| `address.street`      | String | Street of the payer.                                                                                                   | Yes (Only for cross-border PACB transactions) |
| `address.number`      | String | Street number of the payer.                                                                                            | Yes (Only for cross-border PACB transactions) |
| `order_id`            | String | ID of the capture given by the merchant in their system. Think of it as an external ID of the capture.                 | No                                            |
| `notification_url`    | String | Notifications will be sent in every change of status of a payment to the `notification_url` specified by the merchant. | No                                            |

### Examples

```json Request Example
{
  "amount": 10,
  "currency": "INR",
  "country": "IN",
  "payment_method_id": "UI",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "janedoe@mymail.com",
    "document": "EHFGA5967A",
    "phone": "8826320796",
    "address": {
      "state": "Goa",
      "city": "Goa ",
      "street": "Maddo Vaddo",
      "number": "1207",
      "zip_code": "403516"
    }
  },
  "order_id": "345453483kqws0",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new",
  "callback_url": "http://merchantsite.com/success_page"
}
```
```json Response Example
{
    "id": "R-4-279612ac-1db2-4c8f-yhd3-abf8a7aa07ea",
    "amount": 10,
    "currency": "INR",
    "payment_method_id": "UI",
    "payment_method_type": "BANK_TRANSFER",
    "payment_method_flow": "REDIRECT",
    "country": "IN",
    "created_date": "2023-01-30T21:08:43.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "345453483kqws0",
    "description": "Tshirt",
    "notification_url": "http://merchant.com/notification/new",
    "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/M-08707fd9-3797-678o-85b9-daabab2741f1"
}
```

## UPI Direct

Unified Payment Interface (UPI) is an instantaneous real-time online payment system that allows instant funds transfer between accounts. It supports more than 207 local banks and has more than 100 million monthly active users in India.

With **UPI Direct** merchants can directly collect necessary data at their own checkouts.

### Capabilities

|                                    | UPI Direct |
| :--------------------------------- | :--------- |
| **Min. amount**                    | 1 INR      |
| **Max. expiration time supported** | 7 minutes  |
| **Notification delay**             | Immediate  |
| **Refunds**                        | Yes        |
| **Flow**                           | `DIRECT`   |

### UX Flow

<Image src="https://files.readme.io/2e6ce4bee63ce46fc36ef03a7f8c8527e8bb7c5bc3d879f18b343f1d5670863d-UPI_-_Direct.png" alt="The screenshots illustrate a generic OVO redirect flow." align="center" caption="The screenshots illustrate a generic UPI Direct flow." />

### Request Parameters

| Property              | Type   | Description                                                                                                            | Mandatory?                                    |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes                                           |
| `currency`            | String | `INR`<br /><br />Transaction currency in [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217).                            | Yes                                           |
| `country`             | String | `IN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes                                           |
| `payment_method_id`   | String | `UD` <br /><br />ID of the selected payment method.                                                                    | Yes                                           |
| `payment_method_flow` | String | `DIRECT`                                                                                                               | Yes                                           |
| `payer.name`          | String | Name of the payer.                                                                                                     | Yes                                           |
| `payer.email`         | String | Email of the payer.                                                                                                    | Yes                                           |
| `payer.phone`         | String | Phone number of the payer.                                                                                             | Yes                                           |
| `payer.document`      | String | Document of the payer.                                                                                                 | Yes                                           |
| `address.state`       | String | State of the payer.                                                                                                    | Yes (Only for cross-border PACB transactions) |
| `address.city`        | String | City of the payer.                                                                                                     | Yes (Only for cross-border PACB transactions) |
| `address.zip_code`    | String | ZIP Code of the payer. Must be exactly 6 numeric digits (e.g., 560032)                                                 | Yes (Only for cross-border PACB transactions) |
| `address.street`      | String | Street of the payer.                                                                                                   | Yes (Only for cross-border PACB transactions) |
| `address.number`      | String | Street number of the payer.                                                                                            | Yes (Only for cross-border PACB transactions) |
| `wallet.account_id`   | String | UPI ID of the payer.                                                                                                   | Yes                                           |
| `order_id`            | String | ID of the capture given by the merchant in their system. Think of it as an external ID of the capture.                 | No                                            |
| `notification_url`    | String | Notifications will be sent in every change of status of a payment to the `notification_url` specified by the merchant. | No                                            |

### Examples

```json Request Example
{
  "amount": 100,
  "currency": "INR",
  "country": "IN",
  "payment_method_id": "UD",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "janedoe@mymail.com",
    "document": "EHFGA5967A",
    "phone": "8826320796",
    "address": {
      "state": "Goa",
      "city": "Goa ",
      "street": "Maddo Vaddo",
      "number": "1207",
      "zip_code": "403516"
    }
  },
  "order_id": "345453483kqws0",
  "wallet": {
    "account_id": "jane8901@ybl"
  }
}
```
```json Response Example
{
    "id": "F-4-4386e956-2e66-42e0-09rt-16a4dac7ffe5",
    "amount": 100,
    "currency": "INR",
    "payment_method_id": "UD",
    "payment_method_type": "WALLET",
    "payment_method_flow": "DIRECT",
    "country": "IN",
    "created_date": "2023-03-29T15:58:54.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "345453483kqws0"
}
```

## UPI Recurring

Unified Payment Interface (UPI) is an instantaneous real-time online payment system that allows instant funds transfer between accounts. It supports more than 207 local banks and has more than 100 million monthly active users in India.

With **UPI Recurring** merchants can set up periodical payments.

### Capabilities

|                                    | UPI (Recurring)                                         |
| :--------------------------------- | :------------------------------------------------------ |
| **Minimum Amount**                 | 25 INR                                                  |
| **Max. expiration time supported** | 5 days                                                  |
| **Notification delay**             | Immediate                                               |
| **Refunds**                        | Yes. Full and Partial                                   |
| **Flow**                           | Enrollment: `REDIRECT`<br />Recurring Payment: `DIRECT` |

### UX Flow

<Image src="https://files.readme.io/1833f81948cb11242a7f92579e3c285ddaf90bf916ca6a6707d6b29068aa5e70-UPI_-_Recurring.png" alt="The screenshots illustrate a generic redirect UPI Recurring payment flow. The details of the flow can change according the payment method selected." align="center" caption="The screenshots illustrate a generic redirect UPI Recurring payment flow. The details of the flow can change according the payment method selected." />

### One-Time User Enrollment

This is the API request that is used to create the recurring payment mandate for UPI.

#### Enrollment Request Parameters

| Property                        | Type                | Description                                                                                                                                               | Mandatory?                                    |
| :------------------------------ | :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
| `external_id`                   | String              | An identifier used by the merchant to identify the enrollment in their system.                                                                            | Yes                                           |
| `currency`                      | String              | `INR` Transaction currency in [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217).                                                                          | Yes                                           |
| `country`                       | String              | `IN` Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).                                                     | Yes                                           |
| `type`                          | String              | `MERCHANT_SUBSCRIPTION`: For subscriptions with future recurring payments initiated by the merchant.                                                      | Yes                                           |
| `description`                   | String              | Enrollment description.                                                                                                                                   | No                                            |
| `payment_method_id`             | String              | `IR` ID of the selected payment method.                                                                                                                   | Yes                                           |
| `payment_method_flow`           | String              | `REDIRECT`                                                                                                                                                | Yes                                           |
| `payer.name`                    | String              | Name of the payer.                                                                                                                                        | Yes                                           |
| `payer.email`                   | String              | Email of the payer.                                                                                                                                       | Yes                                           |
| `payer.phone`                   | String              | Phone number of the payer without the country code prefix (+91).                                                                                          | Yes                                           |
| `payer.document`                | Number              | Document of the payer.                                                                                                                                    | Yes (Only for cross-border PACB transactions) |
| `address.state`                 | String              | State of the payer.                                                                                                                                       | Yes (Only for cross-border PACB transactions) |
| `address.city`                  | String              | City of the payer.                                                                                                                                        | Yes nly for cross-border PACB transactions)   |
| `address.zip_code`              | String              | ZIP Code of the payer. Must be exactly 6 numeric digits (e.g., 560032)                                                                                    | Yes (Only for cross-border PACB transactions) |
| `address.street`                | String              | Street of the payer.                                                                                                                                      | Yes (Only for cross-border PACB transactions) |
| `address.number`                | String              | Street number of the payer.                                                                                                                               | Yes (Only for cross-border PACB transactions) |
| `subscription.start_date`       | String (YYYY-MM-DD) | Subscription start date. The default is the current date.                                                                                                 | No                                            |
| `subscription.end_date`         | String (YYYY-MM-DD) | Subscription expiration date. If not provided, the subscription will not expire.                                                                          | No                                            |
| `subscription.frequency`        | String              | Possible values: `WEEKLY`, `MONTHLY`, `SEMI_ANNUAL`, `ANNUAL`.                                                                                            | Yes                                           |
| `subscription.amount.type`      | String              | Possible values depending on the subscription: <br />`FIXED`: For fixed amount subscription; <br />`VARIABLE`: For variable amount subscriptions.         | Yes                                           |
| `subscription.amount.value`     | Number (10,2)       | Fixed subscription amount in local currency. Required only for fixed amount subscriptions.                                                                | Conditional                                   |
| `subscription.amount.max_value` | Number (10,2)       | Maximum subscription amount in local currency that can be charged for the subsequent recurring payments. Required only for variable amount subscriptions. | Conditional                                   |
| `notification_url`              | String              | Notifications will be sent in every change of status of a payment to the `notification_url` specified by the merchant.                                    | Yes                                           |
| `callback_url`                  | String              | The payer will be redirected to the merchant's website after completing the payment via the `callback_url` specified by the merchant.                     | Yes                                           |

#### Enrollment Examples

[block:html]
{
  "html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>URL Selector with Opacity</title>\n  <style>\n    .url-container {\n      display: flex;\n      align-items: center;\n      border-radius: 16px;\n      background-color: #fff;\n      padding: 10px;\n      box-shadow: 0 0 0px 1px #F5F5F5;\n      box-sizing: border-box;\n      border-color: transparent;\n      margin-top: 20px;\n      margin-bottom: 20px;\n      gap: 10px;\n      width: 100%;\n    }\n    \n     [data-color-mode=\"dark\"] .url-container {\n      background-color: #F7F7F7;\n    }\n\n    .url-container .url-selector {\n      display: none;\n    }\n\n    .url-container label {\n      padding: 5px 5px;\n      border: 1px solid #ccc;\n      border-radius: 8px;\n      font-size: 11px;\n      color: #333;\n      background-color: #f9f9f9;\n      cursor: pointer;\n      transition: opacity 0.3s ease;\n    }\n\n    /* Reduce opacity for unselected labels */\n    #base-a:not(:checked) ~ label[for=\"base-a\"],\n    #sandbox-a:not(:checked) ~ label[for=\"sandbox-a\"] {\n      opacity: 0.5;\n    }\n\n    .url-container .pill-button {\n      border: none;\n      box-shadow: var(--box-shadow-pill);\n      background-color: #0171c2;\n      color: white;\n      padding: 5px 15px;\n      font-size: 14px;\n      border-radius: 25px;\n      text-transform: uppercase;\n      cursor: default; /* Cambia el cursor para indicar que no es clickeable */\n      text-shadow: 1px 1px 0 #0168b3, 0 1px 0 #0168b3, 1px 0 0 #0168b3;\n      margin-left: 5px;\n      white-space: nowrap !important;\n    }\n\n\n    .url-input {\n      display: none;\n      flex-grow: 1; /* Permitir que el input ocupe todo el espacio disponible */\n    }\n\n    #base-a:checked ~ .url-input[data-url=\"base-a\"],\n    #sandbox-a:checked ~ .url-input[data-url=\"sandbox-a\"] {\n     display: block;\n    }\n\n    .url-input input {\n      width: 100%;\n      border: none;\n      outline: none;\n      flex-grow: 1;\n      border-radius: 8px;\n      padding: 5px;\n      font-size: 12px;\n      color: #333;\n      user-select: all;\n    }\n\n    .url-input input:focus {\n      outline: 1px solid #F5F5F5;\n      border-radius: 16px;\n    }\n    \n\n/* Mobile-specific styles */\n@media screen and (max-width: 768px) {\n.url-container {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap; \n    width: 100%; \n    max-width: 100%; \n    box-sizing: border-box; \n}\n  \n.url-input input {\n    border: none;\n    outline: none;\n    border-radius: 8px;\n    padding: 5px;\n    font-size: 12px;\n    color: #333;\n    user-select: all;\n    width: 100%; /* Ocupa todo el ancho disponible */\n    max-width: 100%; /* No permite desbordarse */\n}\n}\n  </style>\n</head>\n<body>\n  <div class=\"url-container\">\n    <!-- Botón visual -->\n    <div class=\"pill-button\">Post</div>\n    \n    <!-- Radio inputs for URL options -->\n    <input id=\"base-a\" type=\"radio\" name=\"url\" class=\"url-selector\" checked>\n    <label for=\"base-a\">Production URL</label>\n    <input id=\"sandbox-a\" type=\"radio\" name=\"url\" class=\"url-selector\">\n    <label for=\"sandbox-a\">Sandbox URL</label>\n\n    <!-- URL Display (readonly inputs) -->\n    <div class=\"url-input\" data-url=\"base-a\">\n      <input type=\"text\" readonly value=\"https://api.dlocal.com/enrollments\">\n    </div>\n    <div class=\"url-input\" data-url=\"sandbox-a\">\n      <input type=\"text\" readonly value=\"https://sandbox.dlocal.com/enrollments\">\n    </div>\n  </div>\n</body>\n</html>\n"
}
[/block]

```json Request Example
{
  "external_id": "6iL5CLnQA",
  "currency": "INR",
  "country": "IN",
  "type": "MERCHANT_SUBSCRIPTION",
  "description": "Recurring Payment",
  "payment_method_id": "IR",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "phone": "9876543210",
    "name": "Jane Doe",
    "email": "janedoe@mymail.com"
  },
  "subscription": {
    "start_date": "2025-09-10",
    "end_date": "2025-10-10",
    "frequency": "MONTHLY",
    "amount": {
      "type": "FIXED",
      "value": 25
    }
  },
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback"
}
```
```json Response Example
{
  "id": "E-4-537a153f-0fb7-4517-80e7-3138ef1df663",
  "external_id": "6iL5CLnQA",
  "description": "Recurring Payment",
  "status": "PENDING",
  "status_code": "100",
  "status_details": "The enrollment is pending.",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/N-c7fc74c2-e247-4eda-9560-6711070cc96c",
  "payment_method_id": "IR",
  "payment_method_flow": "REDIRECT",
  "payment_method_type": "BANK_TRANSFER"
}
```
```json Asynchronous Response (Webhook)
{
  "id": "E-4-537a153f-0fb7-4517-80e7-3138ef1df663",
  "external_id": "6iL5CLnQA",
  "currency": "INR",
  "country": "IN",
  "type": "MERCHANT_SUBSCRIPTION",
  "payment_method_id": "IR",
  "payment_method_flow": "REDIRECT",
  "created_date": "2025-09-10T20:37:20.000+0000",
  "status": "ACTIVE",
  "status_detail": "The enrollment is active.",
  "status_code": "200",
  "notification_url": "https://merchant.com/enrollment_notifications"
}
```

### Recurring Payment

Once the subscription has been set up, a payment request must be sent within each period. Payments cannot be scheduled in advance; instead, the merchant must send the request on the day the payment is due.

#### Recurring Payment Request Parameters

| Property              | Type   | Description                                                                                                            | Mandatory? |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :--------- |
| `external_id`         | String | An identifier used by the merchant to identify the payment in their system.                                            | Yes        |
| `currency`            | String | `INR` Transaction currency in [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217).                                       | Yes        |
| `country`             | String | `IN` Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).                  | Yes        |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes        |
| `description`         | String | Payment description.                                                                                                   | No         |
| `payment_method_id`   | String | `IR` ID of the selected payment method.                                                                                | Yes        |
| `payment_method_flow` | String | `DIRECT`                                                                                                               | Yes        |
| `payer.name`          | String | Name of the payer.                                                                                                     | Yes        |
| `payer.email`         | String | Email of the payer.                                                                                                    | Yes        |
| `enrollment.id`       | String | Enrollment ID of the initial customer authorization.                                                                   | Yes        |
| `notification_url`    | String | Notifications will be sent in every change of status of a payment to the `notification_url` specified by the merchant. | Yes        |

#### Recurring Payment Examples

[block:html]
{
  "html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>URL Selector with Opacity</title>\n  <style>\n    .url-container {\n      display: flex;\n      align-items: center;\n      border-radius: 16px;\n      background-color: #fff;\n      padding: 10px;\n      box-shadow: 0 0 0px 1px #F5F5F5;\n      box-sizing: border-box;\n      border-color: transparent;\n      margin-top: 20px;\n      margin-bottom: 20px;\n      gap: 10px;\n      width: 100%;\n    }\n    \n         [data-color-mode=\"dark\"] .url-container {\n      background-color: #F7F7F7;\n    }\n\n    .url-container .url-selector {\n      display: none;\n    }\n\n    .url-container label {\n      padding: 5px 5px;\n      border: 1px solid #ccc;\n      border-radius: 8px;\n      font-size: 11px;\n      color: #333;\n      background-color: #f9f9f9;\n      cursor: pointer;\n      transition: opacity 0.3s ease;\n    }\n\n    /* Reduce opacity for unselected labels */\n    #base-a:not(:checked) ~ label[for=\"base-a\"],\n    #sandbox-a:not(:checked) ~ label[for=\"sandbox-a\"] {\n      opacity: 0.5;\n    }\n\n    .url-container .pill-button {\n      border: none;\n      box-shadow: var(--box-shadow-pill);\n      background-color: #0171c2;\n      color: white;\n      padding: 5px 15px;\n      font-size: 14px;\n      border-radius: 25px;\n      text-transform: uppercase;\n      cursor: default; /* Cambia el cursor para indicar que no es clickeable */\n      text-shadow: 1px 1px 0 #0168b3, 0 1px 0 #0168b3, 1px 0 0 #0168b3;\n      margin-left: 5px;\n      white-space: nowrap !important;\n    }\n\n\n    .url-input {\n      display: none;\n      flex-grow: 1; /* Permitir que el input ocupe todo el espacio disponible */\n    }\n\n    #base-a:checked ~ .url-input[data-url=\"base-a\"],\n    #sandbox-a:checked ~ .url-input[data-url=\"sandbox-a\"] {\n     display: block;\n    }\n\n    .url-input input {\n      width: 100%;\n      border: none;\n      outline: none;\n      flex-grow: 1;\n      border-radius: 8px;\n      padding: 5px;\n      font-size: 12px;\n      color: #333;\n      user-select: all;\n    }\n\n    .url-input input:focus {\n      outline: 1px solid #F5F5F5;\n      border-radius: 16px;\n    }\n    \n\n/* Mobile-specific styles */\n@media screen and (max-width: 768px) {\n.url-container {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap; \n    width: 100%; \n    max-width: 100%; \n    box-sizing: border-box; \n}\n  \n.url-input input {\n    border: none;\n    outline: none;\n    border-radius: 8px;\n    padding: 5px;\n    font-size: 12px;\n    color: #333;\n    user-select: all;\n    width: 100%; /* Ocupa todo el ancho disponible */\n    max-width: 100%; /* No permite desbordarse */\n}\n}\n  </style>\n</head>\n<body>\n  <div class=\"url-container\">\n    <!-- Botón visual -->\n    <div class=\"pill-button\">Post</div>\n    \n    <!-- Radio inputs for URL options -->\n    <input id=\"base-a\" type=\"radio\" name=\"url\" class=\"url-selector\" checked>\n    <label for=\"base-a\">Production URL</label>\n    <input id=\"sandbox-a\" type=\"radio\" name=\"url\" class=\"url-selector\">\n    <label for=\"sandbox-a\">Sandbox URL</label>\n\n    <!-- URL Display (readonly inputs) -->\n    <div class=\"url-input\" data-url=\"base-a\">\n      <input type=\"text\" readonly value=\"https://api.dlocal.com/payments\">\n    </div>\n    <div class=\"url-input\" data-url=\"sandbox-a\">\n      <input type=\"text\" readonly value=\"https://sandbox.dlocal.com/payments\">\n    </div>\n  </div>\n</body>\n</html>"
}
[/block]

```json Request Example
{
  "amount": 25,
  "external_id": "fwbExmQQ7",
  "currency": "INR",
  "country": "IN",
  "payment_method_id": "IR",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "janedoe@mymail.com"
  },
  "enrollment": {
    "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e"
  },
  "notification_url": "http://merchantsite.com/notifications"
}
```
```json Response Example
{
  "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e",
  "amount": 50,
  "currency": "INR",
  "payment_method_id": "IR",
  "payment_method_flow": "DIRECT",
  "country": "IN",
  "created_date": "2025-09-10T20:39:20.000+0000",
  "status": "PENDING",
  "status_details": "The payment is pending.",
  "status_code": "100",
  "notification_url": "http://merchantsite.com/notifications"
}
```
```json Asynchronous Response (Webhook)
{
  "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e",
  "amount": 50,
  "status": "PAID",
  "status_detail": "The payment is paid",
  "status_code": "200",
  "currency": "INR",
  "country": "IN",
  "payment_method_id": "IR",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "janedoe@mymail.com"
  },
  "notification_url": "http://merchantsite.com/notifications",
  "created_date": "2024-09-10T20:37:20.000+0000"
}
```

## NetBanking

NetBanking gives access to all banking services via an online platform. However, to avail of this provision, the customer must register for Internet banking at their respective bank.

In order to access the services offered by Internet banking, the user must first enter their registered customer ID and password as a login procedure.

NetBanking can be accessed either from the bank’s website or mobile application.

### Capabilities

|                                    | Netbanking |
| :--------------------------------- | :--------- |
| **Min. amount**                    | 1 INR      |
| **Max. expiration time supported** | 5 days     |
| **Notification delay**             | Immediate  |
| **Refunds**                        | Yes        |
| **Flow**                           | `REDIRECT` |

### UX Flow

<Image src="https://files.readme.io/433af72cf7eaf64b49a162751be80c6e34e9d539ebb2f02544db8467aacb5e4c-NetBanking.png" alt="The screenshots illustrate a generic Netbanking redirect flow.  
The specifics of the flow can change depending on the bank selected to complete the transaction." align="center" caption="The screenshots illustrate a generic NetBanking redirect flow\.The specifics of the flow can change depending on the bank selected to complete the transaction." />

### Request Parameters

| Property              | Type   | Description                                                                                                            | Mandatory?                                    |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes                                           |
| `currency`            | String | `INR`<br /><br />Transaction currency in [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217).                            | Yes                                           |
| `country`             | String | `IN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes                                           |
| `payment_method_id`   | String | `NB` <br /><br />ID of the selected payment method.                                                                    | Yes                                           |
| `payment_method_flow` | String | `REDIRECT`                                                                                                             | Yes                                           |
| `payer.name`          | String | Name of the payer.                                                                                                     | Yes                                           |
| `payer.email`         | String | Email of the payer.                                                                                                    | Yes                                           |
| `payer.phone`         | String | Phone number of the payer.                                                                                             | Yes                                           |
| `payer.document`      | String | Document of the payer.                                                                                                 | Yes                                           |
| `address.state`       | String | State of the payer.                                                                                                    | Yes (Only for cross-border PACB transactions) |
| `address.city`        | String | City of the payer.                                                                                                     | Yes (Only for cross-border PACB transactions) |
| `address.zip_code`    | String | ZIP Code of the payer. Must be exactly 6 numeric digits (e.g., 560032)                                                 | Yes (Only for cross-border PACB transactions) |
| `address.street`      | String | Street of the payer.                                                                                                   | Yes (Only for cross-border PACB transactions) |
| `address.number`      | String | Street number of the payer.                                                                                            | Yes (Only for cross-border PACB transactions) |
| `order_id`            | String | ID of the capture given by the merchant in their system. Think of it as an external ID of the capture.                 | No                                            |
| `notification_url`    | String | Notifications will be sent in every change of status of a payment to the `notification_url` specified by the merchant. | No                                            |

### Examples

```json Request Example
{
  "amount": 100,
  "currency": "INR",
  "country": "IN",
  "payment_method_id": "NB",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "janedoe@mymail.com",
    "document": "Avwpy0432g",
    "phone": "8826320796",
    "address": {
      "state": "Goa",
      "city": "Goa ",
      "street": "Maddo Vaddo",
      "number": "1207",
      "zip_code": "403516"
    }
  },
  "order_id": "345453483kqws0",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new",
  "callback_url": "http://merchantsite.comm/success_page"
}
```
```json Response Example
{
    "id": "R-4-e69f0179-aa31-463e-a721-d9ae2b8ef817",
    "amount": 100,
    "currency": "INR",
    "payment_method_id": "NB",
    "payment_method_type": "BANK_TRANSFER",
    "payment_method_flow": "REDIRECT",
    "country": "IN",
    "created_date": "2023-03-09T21:16:03.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "34545348fgdag3kqws0",
    "description": "Tshirt",
    "notification_url": "http://merchant.com/notification/new",
    "redirect_url": "https://pay.dlocal.com/gmf-apm/razorpay/M-5baba152-0172-49ca-b7d2-138ab014aaac"
}
```

## NetBanking Recurring

NetBanking Recurring is designed to support on-demand or scheduled payments with weekly, monthly, semi-annual (six-month), annual or on-demand frequency. It also allows setting whether the amount to be charged is fixed or variable, depending on the merchant’s specific case.

### Capabilities

|                                    | NetBanking Recurring                                                                                                                                                                                                                             |
| :--------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Min. amount**                    | 1 INR                                                                                                                                                                                                                                            |
| **Max. expiration time supported** | 10 minutes                                                                                                                                                                                                                                       |
| **Notification delay**             | T + 2                                                                                                                                                                                                                                            |
| **Refunds**                        | No                                                                                                                                                                                                                                               |
| **Flow**                           | Enrollment: `REDIRECT`                                                                                                                                                                                               Recurring Payment: `DIRECT` |

### UX Flow

<Image src="https://files.readme.io/4bfc1dc6a6065d7b4f9133dfb1cda73a78a1585e1a694d7430fe61bfff003143-NetBanking_Recurring_2.png" alt="NetBanking Recurring UX Flow" align="center" caption="NetBanking Recurring UX Flow" />

### One-Time User Enrollment

This is the API request that is used to create the recurring payment mandate for NetBanking.

### Request Parameters

<Table align={["left","left","left","left"]}>
  <thead>
    <tr>
      <th>
        Property
      </th>

      <th>
        Type
      </th>

      <th>
        Description
      </th>

      <th>
        Mandatory?
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        `external_id`
      </td>

      <td>
        String
      </td>

      <td>
        An identifier used by the merchant to identify the enrollment in their system.
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `currency`
      </td>

      <td>
        String
      </td>

      <td>
        INR

        Transaction currency in ISO 4217
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `country`
      </td>

      <td>
        String
      </td>

      <td>
        IN

        Transaction country in ISO 3166
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `type`
      </td>

      <td>
        String
      </td>

      <td>
        `MERCHANT_SUBSCRIPTION`: For subscriptions with future recurring payments initiated by the merchant.
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `description`
      </td>

      <td>
        String
      </td>

      <td>
        Enrollment description.
      </td>

      <td>
        No
      </td>
    </tr>

    <tr>
      <td>
        `payment_method_id`
      </td>

      <td>
        String
      </td>

      <td>
        NZ
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payment_method_flow`
      </td>

      <td>
        String
      </td>

      <td>
        REDIRECT
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payer.name`
      </td>

      <td>
        String
      </td>

      <td>
        Name of the payer
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payer.email`
      </td>

      <td>
        String
      </td>

      <td>
        Email of the payer
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payer.phone`
      </td>

      <td>
        String
      </td>

      <td>
        Phone number of the payer without the country code prefix (+91)
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payer.document`
      </td>

      <td>
        Number
      </td>

      <td>
        Document of the payer
      </td>

      <td>
        Yes — only for cross-border PACB transactions
      </td>
    </tr>

    <tr>
      <td>
        `address.state`
      </td>

      <td>
        String
      </td>

      <td>
        State of the payer
      </td>

      <td>
        Yes — only for cross-border PACB transactions
      </td>
    </tr>

    <tr>
      <td>
        `address.city`
      </td>

      <td>
        String
      </td>

      <td>
        City of the payer
      </td>

      <td>
        Yes — only for cross-border PACB transactions
      </td>
    </tr>

    <tr>
      <td>
        `address.zip_code`
      </td>

      <td>
        String
      </td>

      <td>
        ZIP Code of the payer. Must be exactly 6 numeric digits (e.g., 560032)
      </td>

      <td>
        Yes — only for cross-border PACB transactions
      </td>
    </tr>

    <tr>
      <td>
        `address.street`
      </td>

      <td>
        String
      </td>

      <td>
        Street of the payer
      </td>

      <td>
        Yes — only for cross-border PACB transactions
      </td>
    </tr>

    <tr>
      <td>
        `address.number`
      </td>

      <td>
        String
      </td>

      <td>
        Street number of the payer
      </td>

      <td>
        Yes — only for cross-border PACB transactions
      </td>
    </tr>

    <tr>
      <td>
        `subscription.start_date`
      </td>

      <td>
        String (YYYY-MM-DD)
      </td>

      <td>
        Subscription start date. The default is the current date. To be used only for subscriptions.
      </td>

      <td>
        No
      </td>
    </tr>

    <tr>
      <td>
        `subscription.end_date`
      </td>

      <td>
        String<br />(YYYY-MM-DD)
      </td>

      <td>
        Subscription expiration date. If not provided, the subscription will not expire. To be used only for subscriptions.
      </td>

      <td>
        No
      </td>
    </tr>

    <tr>
      <td>
        `subscription.frequency`
      </td>

      <td>
        String
      </td>

      <td>
        Possible values supported: , `MONTHLY`, `SEMI_ANNUAL` or `ANNUAL`.
      </td>

      <td>
        No
      </td>
    </tr>

    <tr>
      <td>
        `subscription.amount.type`
      </td>

      <td>
        String
      </td>

      <td>
        Possible values depending on the subscription: <br />`FIXED`: For fixed amount subscription; <br />`VARIABLE`: For variable amount subscriptions.
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `subscription.amount.value`
      </td>

      <td>
        Number (10,2)
      </td>

      <td>
        Fixed subscription amount in local currency. Required only for fixed amount subscriptions depending on the payment method.
      </td>

      <td>
        Conditional
      </td>
    </tr>

    <tr>
      <td>
        `subscription.amount.max_value`
      </td>

      <td>
        Number (10,2)
      </td>

      <td>
        Maximum subscription amount in local currency that can be charged for the subsequent recurring payments. Required only for variable amount subscriptions.
      </td>

      <td>
        Conditional
      </td>
    </tr>

    <tr>
      <td>
        `notification_url`
      </td>

      <td>
        String
      </td>

      <td>
        Notifications will be sent in every change of status of a payment to the notification_url specified by the merchant.
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `callback_url`
      </td>

      <td>
        String
      </td>

      <td>
        The payer will be redirected to the merchant’s website after completing the payment via the callback_url specified by the merchant
      </td>

      <td>
        Yes
      </td>
    </tr>
  </tbody>
</Table>

### Examples

[block:html]
{
  "html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>URL Selector with Opacity</title>\n  <style>\n    .url-container {\n      display: flex;\n      align-items: center;\n      border-radius: 16px;\n      background-color: #fff;\n      padding: 10px;\n      box-shadow: 0 0 0px 1px #F5F5F5;\n      box-sizing: border-box;\n      border-color: transparent;\n      margin-top: 20px;\n      margin-bottom: 20px;\n      gap: 10px;\n      width: 100%;\n    }\n    \n     [data-color-mode=\"dark\"] .url-container {\n      background-color: #F7F7F7;\n    }\n\n    .url-container .url-selector {\n      display: none;\n    }\n\n    .url-container label {\n      padding: 5px 5px;\n      border: 1px solid #ccc;\n      border-radius: 8px;\n      font-size: 11px;\n      color: #333;\n      background-color: #f9f9f9;\n      cursor: pointer;\n      transition: opacity 0.3s ease;\n    }\n\n    /* Reduce opacity for unselected labels */\n    #base-a:not(:checked) ~ label[for=\"base-a\"],\n    #sandbox-a:not(:checked) ~ label[for=\"sandbox-a\"] {\n      opacity: 0.5;\n    }\n\n    .url-container .pill-button {\n      border: none;\n      box-shadow: var(--box-shadow-pill);\n      background-color: #0171c2;\n      color: white;\n      padding: 5px 15px;\n      font-size: 14px;\n      border-radius: 25px;\n      text-transform: uppercase;\n      cursor: default; /* Cambia el cursor para indicar que no es clickeable */\n      text-shadow: 1px 1px 0 #0168b3, 0 1px 0 #0168b3, 1px 0 0 #0168b3;\n      margin-left: 5px;\n      white-space: nowrap !important;\n    }\n\n\n    .url-input {\n      display: none;\n      flex-grow: 1; /* Permitir que el input ocupe todo el espacio disponible */\n    }\n\n    #base-a:checked ~ .url-input[data-url=\"base-a\"],\n    #sandbox-a:checked ~ .url-input[data-url=\"sandbox-a\"] {\n     display: block;\n    }\n\n    .url-input input {\n      width: 100%;\n      border: none;\n      outline: none;\n      flex-grow: 1;\n      border-radius: 8px;\n      padding: 5px;\n      font-size: 12px;\n      color: #333;\n      user-select: all;\n    }\n\n    .url-input input:focus {\n      outline: 1px solid #F5F5F5;\n      border-radius: 16px;\n    }\n    \n\n/* Mobile-specific styles */\n@media screen and (max-width: 768px) {\n.url-container {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap; \n    width: 100%; \n    max-width: 100%; \n    box-sizing: border-box; \n}\n  \n.url-input input {\n    border: none;\n    outline: none;\n    border-radius: 8px;\n    padding: 5px;\n    font-size: 12px;\n    color: #333;\n    user-select: all;\n    width: 100%; /* Ocupa todo el ancho disponible */\n    max-width: 100%; /* No permite desbordarse */\n}\n}\n  </style>\n</head>\n<body>\n  <div class=\"url-container\">\n    <!-- Botón visual -->\n    <div class=\"pill-button\">Post</div>\n    \n    <!-- Radio inputs for URL options -->\n    <input id=\"base-a\" type=\"radio\" name=\"url\" class=\"url-selector\" checked>\n    <label for=\"base-a\">Production URL</label>\n    <input id=\"sandbox-a\" type=\"radio\" name=\"url\" class=\"url-selector\">\n    <label for=\"sandbox-a\">Sandbox URL</label>\n\n    <!-- URL Display (readonly inputs) -->\n    <div class=\"url-input\" data-url=\"base-a\">\n      <input type=\"text\" readonly value=\"https://api.dlocal.com/enrollments\">\n    </div>\n    <div class=\"url-input\" data-url=\"sandbox-a\">\n      <input type=\"text\" readonly value=\"https://sandbox.dlocal.com/enrollments\">\n    </div>\n  </div>\n</body>\n</html>\n"
}
[/block]

```json Request Example
{
  "external_id": "fwbExmQQ7",
  "currency": "INR",
  "country": "IN",
  "type": "MERCHANT_SUBSCRIPTION",
  "description": "NetBanking Recurring - Monthly",
  "payment_method_id": "NZ",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "phone": "9876543210",
    "name": "Jane Doe",
    "email": "janedoe@mymail.com"
  },
  "subscription": {
    "start_date": "2025-09-10",
    "end_date": "2025-10-10",
    "frequency": "MONTHLY",
    "amount": {
      "type": "FIXED",
      "value": 10
    }
  },
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback"
}
```
```json Response Example
{
  "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e",
  "external_id": "fwbExmQQ7",
  "status": "PENDING",
  "status_code": "100",
  "status_details": "The enrollment is pending.",
  "redirect_url": "http://gateway-manager-front.payments-dev.eu1/gmf-apm/payments/N-e56f409e-c4d6-4087-93cd-2df8df4c8409"
}
```
```json Asynchronous Response (Webhook)
{
  "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e",
  "external_id": "fwbExmQQ7",
  "currency": "INR",
  "country": "IN",
  "type": "MERCHANT_SUBSCRIPTION",
  "payment_method_id": "NZ",
  "payment_method_flow": "REDIRECT",
  "created_date": "2025-09-10T20:37:20.000+0000",
  "status": "ACTIVE",
  "status_detail": "The enrollment is active.",
  "status_code": "200",
  "notification_url": "https://merchant.com/enrollment_notifications"
}
```

### Recurring Payment (e-Nach Transaction)

Once the subscription has been set up, a payment request must be sent within each period. Payments cannot be scheduled in advance; instead, the merchant must send the request on the day the payment is due.

This flow is similar to a NetBanking one-time payment. The main difference is that it requires the `enrollment.id` to reference the initial customer authorization.

### Request Parameters

<Table align={["left","left","left","left"]}>
  <thead>
    <tr>
      <th>
        Property
      </th>

      <th>
        Type
      </th>

      <th>
        Description
      </th>

      <th>
        Mandatory?
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        `external_id`
      </td>

      <td>
        String
      </td>

      <td>
        An identifier used by the merchant to identify the enrollment in their system.
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `currency`
      </td>

      <td>
        String
      </td>

      <td>
        INR

        Transaction currency in ISO 4217
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `country`
      </td>

      <td>
        String
      </td>

      <td>
        IN

        Transaction country in ISO 3166
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `amount`
      </td>

      <td>
        Number
      </td>

      <td>
        Recurring payment amount
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `description`
      </td>

      <td>
        String
      </td>

      <td>
        Recurring payment description.
      </td>

      <td>
        No
      </td>
    </tr>

    <tr>
      <td>
        `payment_method_id`
      </td>

      <td>
        String
      </td>

      <td>
        NZ
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payment_method_flow`
      </td>

      <td>
        String
      </td>

      <td>
        DIRECT
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payer.name`
      </td>

      <td>
        String
      </td>

      <td>
        Name of the payer
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `payer.email`
      </td>

      <td>
        String
      </td>

      <td>
        Email of the payer
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `enrollment.id`
      </td>

      <td>
        String
      </td>

      <td>
        Enrollment id of the initial customer authorization
      </td>

      <td>
        Yes
      </td>
    </tr>

    <tr>
      <td>
        `notification_url`
      </td>

      <td>
        String
      </td>

      <td>
        Notifications will be sent in every change of status of a payment to the notification_url specified by the merchant.
      </td>

      <td>
        Yes
      </td>
    </tr>
  </tbody>
</Table>

### Examples

[block:html]
{
  "html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>URL Selector with Opacity</title>\n  <style>\n    .url-container {\n      display: flex;\n      align-items: center;\n      border-radius: 16px;\n      background-color: #fff;\n      padding: 10px;\n      box-shadow: 0 0 0px 1px #F5F5F5;\n      box-sizing: border-box;\n      border-color: transparent;\n      margin-top: 20px;\n      margin-bottom: 20px;\n      gap: 10px;\n      width: 100%;\n    }\n    \n         [data-color-mode=\"dark\"] .url-container {\n      background-color: #F7F7F7;\n    }\n\n    .url-container .url-selector {\n      display: none;\n    }\n\n    .url-container label {\n      padding: 5px 5px;\n      border: 1px solid #ccc;\n      border-radius: 8px;\n      font-size: 11px;\n      color: #333;\n      background-color: #f9f9f9;\n      cursor: pointer;\n      transition: opacity 0.3s ease;\n    }\n\n    /* Reduce opacity for unselected labels */\n    #base-a:not(:checked) ~ label[for=\"base-a\"],\n    #sandbox-a:not(:checked) ~ label[for=\"sandbox-a\"] {\n      opacity: 0.5;\n    }\n\n    .url-container .pill-button {\n      border: none;\n      box-shadow: var(--box-shadow-pill);\n      background-color: #0171c2;\n      color: white;\n      padding: 5px 15px;\n      font-size: 14px;\n      border-radius: 25px;\n      text-transform: uppercase;\n      cursor: default; /* Cambia el cursor para indicar que no es clickeable */\n      text-shadow: 1px 1px 0 #0168b3, 0 1px 0 #0168b3, 1px 0 0 #0168b3;\n      margin-left: 5px;\n      white-space: nowrap !important;\n    }\n\n\n    .url-input {\n      display: none;\n      flex-grow: 1; /* Permitir que el input ocupe todo el espacio disponible */\n    }\n\n    #base-a:checked ~ .url-input[data-url=\"base-a\"],\n    #sandbox-a:checked ~ .url-input[data-url=\"sandbox-a\"] {\n     display: block;\n    }\n\n    .url-input input {\n      width: 100%;\n      border: none;\n      outline: none;\n      flex-grow: 1;\n      border-radius: 8px;\n      padding: 5px;\n      font-size: 12px;\n      color: #333;\n      user-select: all;\n    }\n\n    .url-input input:focus {\n      outline: 1px solid #F5F5F5;\n      border-radius: 16px;\n    }\n    \n\n/* Mobile-specific styles */\n@media screen and (max-width: 768px) {\n.url-container {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap; \n    width: 100%; \n    max-width: 100%; \n    box-sizing: border-box; \n}\n  \n.url-input input {\n    border: none;\n    outline: none;\n    border-radius: 8px;\n    padding: 5px;\n    font-size: 12px;\n    color: #333;\n    user-select: all;\n    width: 100%; /* Ocupa todo el ancho disponible */\n    max-width: 100%; /* No permite desbordarse */\n}\n}\n  </style>\n</head>\n<body>\n  <div class=\"url-container\">\n    <!-- Botón visual -->\n    <div class=\"pill-button\">Post</div>\n    \n    <!-- Radio inputs for URL options -->\n    <input id=\"base-a\" type=\"radio\" name=\"url\" class=\"url-selector\" checked>\n    <label for=\"base-a\">Production URL</label>\n    <input id=\"sandbox-a\" type=\"radio\" name=\"url\" class=\"url-selector\">\n    <label for=\"sandbox-a\">Sandbox URL</label>\n\n    <!-- URL Display (readonly inputs) -->\n    <div class=\"url-input\" data-url=\"base-a\">\n      <input type=\"text\" readonly value=\"https://api.dlocal.com/payments\">\n    </div>\n    <div class=\"url-input\" data-url=\"sandbox-a\">\n      <input type=\"text\" readonly value=\"https://sandbox.dlocal.com/payments\">\n    </div>\n  </div>\n</body>\n</html>"
}
[/block]

```json Request Example
{
  "amount": 50,
  "external_id": "fwbExmQQ7",
  "currency": "INR",
  "country": "IN",
  "payment_method_id": "NZ",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "janedoe@mymail.com"
  },
  "enrollment": {
    "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e"
  },
  "notification_url": "http://merchantsite.com/notifications"
}
```
```json Response Example
{
  "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e",
  "amount": 50,
  "currency": "INR",
  "payment_method_id": "NZ",
  "payment_method_flow": "DIRECT",
  "country": "IN",
  "created_date": "2025-09-10T20:39:20.000+0000",
  "status": "PENDING",
  "status_details": "The payment is pending.",
  "status_code": "100",
  "notification_url": "http://merchantsite.com/notifications"
}
```
```json Asynchronous Response (Webhook)
{
  "id": "E-4-3a8bcc85-d86e-4c9a-bbc4-8393b5fb488e",
  "amount": 50,
  "status": "PAID",
  "status_detail": "The payment is paid",
  "status_code": "200",
  "currency": "INR",
  "country": "IN",
  "payment_method_id": "NZ",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "janedoe@mymail.com"
  },
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback",
  "created_date": "2024-09-10T20:37:20.000+0000"
}
```