---
updatedAt: 2026-10-14T10:14:43.000Z
agentTools:
  projectIndex: https://docs.dlocal.com/llms.txt
---

# Vietnam

Learn about the dLocal supported payment methods in Vietnam.

<HTMLBlock>{`
<style>
  
  .main {
    margin-left: auto;
    margin-right: auto;
    margin-bottom: 5px;
    display: grid;
    grid-template-columns: repeat(3, 1fr); /* Tres columnas */
    width: 740px; /* Ancho máximo de la caja */
}

.overview-card1 {
    position: relative; /* Asegúrate de que el contenedor sea relativo para posicionar el pseudoelemento */
    width: 100%;
    max-width: 233px;
    box-sizing: border-box;
    margin: 0;
}

.overview-card1::after {
    content: '';
    position: absolute;
    right: 0; /* Pega la línea al borde derecho */
    top: 30%; /* Ajusta la posición superior de la línea */
    height: 60%; /* Establece el alto de la línea al 60% */
    width: 1px; /* Grosor de la línea */
    background-color: #D2D8EC; /* Color de la línea */
}

  .overview-card2 {
    position: relative; /* Asegúrate de que el contenedor sea relativo para posicionar el pseudoelemento */
    width: 100%;
    max-width: 233px;
    box-sizing: border-box;
    margin: 0;
}
  
  .overview-card2::after {
    content: '';
    position: absolute;
    right: 0; /* Pega la línea al borde derecho */
    top: 30%; /* Ajusta la posición superior de la línea */
    height: 70%; /* Establece el alto de la línea al 60% */
    width: 1px; /* Grosor de la línea */
    background-color: #D2D8EC; /* Color de la línea */
}
  
.overview-card3 {
    position: relative; /* Asegúrate de que el contenedor sea relativo para posicionar el pseudoelemento */
    width: 100%;
    max-width: 233px;
    box-sizing: border-box;
    margin: 0;
}

.overview-card-upper-side1 {
    height: 105px;
    padding: 20px;
    background-color: transparent;
    text-align: left;
}

.overview-card-bottom-side {
    position: relative;
    width: 100%;
    height: 100%;
    padding: 30px;
    padding-right: 20px;
    background-color: transparent;
    border-radius: 16px;
}

.overview-card-title1 {
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 24px;
    font-weight: 700;
    line-height: 26.4px;
}

.overview-card-content1 {
    font-size: 14px;
    font-weight: 300;
    margin-top: 20px;
    line-height: 20px;
    margin-bottom: 40px!important;
}

.overview-icon1 {
    margin-bottom: -5px;
    margin-top: 20px;
}
  
.doc-link {
        position: relative;
        font-weight: 500;
        color: #21A35B !important;
        text-decoration: none;
        display: block;
    }
  

div:not(.markdown-body) .doc-link:hover {
            text-decoration: none;
            color: #1043FA !important;
            transform: translateX(0.2em);
        }

.overview-card-title1:hover {
    color: #2D59F5 !important;
    cursor:pointer;
    transform: none!important;
}

    div:not(.markdown-body) .doc-link_arrow {
        display: inline-block;
        height: 1em;
        width: auto;
        vertical-align: middle;
        margin-left: 0.2em;
        margin-top: -0.1em;
    }
  
     div:not(.markdown-body) .doc-link:hover .doc-link_arrow-color {
            fill: #1043FA !important;
        }
  
      [data-color-mode="dark"] .overview-icon1 img {
  filter: brightness(0) invert(1);
  transition: filter 0.3s ease;
}
  
/* Media Queries para dispositivos móviles */
@media (max-width: 768px) {
  .main {
    grid-template-columns: repeat(2, 1fr); /* Dos columnas en pantallas medianas */
  }
}

@media (max-width: 480px) {
  .main {
    grid-template-columns: 1fr; /* Una columna en pantallas pequeñas */
}
</style>
  
    <div class="main">

     
      <div class="overview-card1" onclick="parent.location='/docs/vietnam#market-specifications'">
     <div class="overview-card-bottom-side">
       <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>
           <h3 class="overview-card-title1">Market specifications</h3>
          <p class="overview-card-content1">

            Take a look of all the payment methods available.   
        </p>
          <a href="#country-reference" class="doc-link">Country reference</a>
          <a href="#cards-supported" class="doc-link">Cards supported</a>
          <a href="#alternative-payment-method-supported" class="doc-link">APM supported</a>
        </div>
      </div>
      
      
      <div
        class="overview-card2" onclick="parent.location='/docs/vietnam#cards'">
        <div class="overview-card-bottom-side">
                <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>
           <h3 class="overview-card-title1">Cards</h3><br>
          <p class="overview-card-content1">

           Find all the information about the card supported capabilities.   
          </p>
          <a href="#brands" class="doc-link">Brands</a>
          <a href="#capabilities" class="doc-link">Capabilities</a>
          <a href="#how-to-process-card-payments" class="doc-link">Process Card Payments</a>
        </div>
      </div>  
      
      
      <div class="overview-card3" onclick="parent.location='/docs/vietnam#alternative-payment-method'">
    <div class="overview-card-bottom-side">
              <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>
           <h3 class="overview-card-title1">Alternative Payments</h3>
          <p class="overview-card-content1">

             Learn how to integrate cash, bank transfer or wallet payment.  
        </p>
          <a href="#vtc-pay" class="doc-link">VTC Pay</a>
          <a href="#vn-pay" class="doc-link">VN Pay</a>
          <a href="#9pay" class="doc-link">9Pay</a>
          <a href="#baokim" class="doc-link">Baokim</a>
          <a href="#momo" class="doc-link">MoMo</a>
          <a href="#momo-recurring" class="doc-link">MoMo Recurring</a>
          <a href="#zalopay-one-shot-payments" class="doc-link">Zalopay One-Shot Payments</a>
          <a href="#zalopay-recurring" class="doc-link">Zalopay recurring</a>
        </div>
      </div> 
      
    </div>
`}</HTMLBlock>

***

# Market specifications

Do you want to know more information about Vietnam's market? Go to the [Accelerate Growth in Asia’s Leading eCommerce Hubs](https://dlocal.com/online-payment-processors-in-asia/) article.

## Country reference

| `country` code | `currency` code | `amount` decimals | `document` name | `document` format | `document` required? |
| :------------: | :-------------: | :---------------: | :-------------: | :---------------: | :------------------: |
|      `VN`      |      `VND`      |         2         |       VNID      |  9 or 13 digits ​ |          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/Visa_logo.png" width="40px"> |
| `CARD`              | `VD`     | Visa Debit       | `CARD`                | Debit Card    | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/Visa_logo.png" width="40px"> |
| `CARD`              | `MC`     | Mastercard       | `CARD`                | Credit Card ​ | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/master.png" width="40px">    |
| `CARD`              | `MD`     | Mastercard Debit | `CARD`                | Debit Card    | `DIRECT` `REDIRECT` | <img src="https://static.dlocal.com/images/providers/master.png" width="40px">    |
| `CARD`              | `NS`     | Napas            | `CARD`                | Debit Card ​  | `DIRECT` `REDIRECT` | <img src="https://pay.dlocal.com/views/2.0/images/payments/JC.png" 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                                                                       |
| :------------------ | :------------------------ | :-------------------- | :------------ | :----------------------- | :------------------------------------------------------------------------- |
| `VT`                | VTC Pay                   | `WALLET `             | Wallet        | `REDIRECT`               | <img src="https://static.dlocal.com/images/providers/VT.png" width="40px"> |
| `QR`                | VNPay                     | `WALLET `             | Wallet        | `DIRECT` `REDIRECT`      | <img src="https://static.dlocal.com/images/providers/QR.png" width="40px"> |
| `NP`                | 9Pay                      | `WALLET `             | Wallet        | `REDIRECT`               | <img src="https://static.dlocal.com/images/providers/NP.png" width="40px"> |
| `VB`                | Baokim                    | `BANK_TRANSFER`       | Bank Transfer | `REDIRECT`               | <img src="https://static.dlocal.com/images/providers/VB.png" width="40px"> |
| `VQ`                | MoMo                      | `TICKET`              | Wallet        | `REDIRECT`               | <img src="https://static.dlocal.com/images/providers/VQ.png" width="40px"> |
| `RV`                | MoMo Recurring            | `WALLET`              | Wallet        | `DIRECT` `REDIRECT`      | <img src="https://static.dlocal.com/images/providers/VQ.png" width="40px"> |
| `ZW`                | Zalopay One-Shot Payments | `WALLET`              | Wallet        | `REDIRECT`               | <img src="https://static.dlocal.com/images/providers/ZW.png" width="40px"> |
| `ZA`                | Zalopay Recurring         | `WALLET`              | Wallet        | `DIRECT`<br />`REDIRECT` | <img src="https://static.dlocal.com/images/providers/ZW.png" width="40px"> |

***

# Cards

## Brands

While various payment methods are used in Vietnam, cards represent the most popular way for Vietnamese online shoppers to pay for their products.

## Capabilities

|                               | Visa Credit                                 | Mastercard Credit                           | Napas                                       |
| :---------------------------- | :------------------------------------------ | :------------------------------------------ | :------------------------------------------ |
| **Minimum amount**            | 5000 VND                                    | 5000 VND                                    | 5000 VND                                    |
| **Refunds**                   | Yes                                         | Yes                                         | Yes                                         |
| **Recurring**                 | Yes                                         | Yes                                         | No                                          |
| **Chargeback option**         | Yes                                         | Yes                                         | Yes                                         |
| **Chargeback Dispute option** | Yes                                         | Yes                                         | Yes                                         |
| **Descriptor**                | 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

## VTC Pay

VTC Pay is a mobile wallet in Vietnam. It can be loaded via bank transfer from 34 participating local banks, or from four international card networks. It allows customers to pay bills, top up mobile phones or gaming accounts, and make money transfers.

### Capabilities

|                                    | VTC Pay    |
| :--------------------------------- | :--------- |
| **Min. amount**                    | 5000 VND   |
| **Max. expiration time supported** | 5 days     |
| **Notification delay**             | Immediate  |
| **Refunds**                        | Yes        |
| **Flow**                           | `REDIRECT` |

### UX Flow

<Image src="https://files.readme.io/73af67135b115f684510fc140eabd9df606d11eb5353b5e8a36f69d4418c0648-VTC_PAY.png" alt="The screenshots illustrate a generic VTC Pay redirect flow on a browser." align="center" caption="The screenshots illustrate a generic VTC Pay redirect flow on a browser." />

### Request parameters

| Property              | Type   | Description                                                                                                            | Mandatory? |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :--------- |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes        |
| `currency`            | String | `VND`<br /><br />Transaction currency.                                                                                 | Yes        |
| `country`             | String | `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes        |
| `payment_method_id`   | String | `VT` <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.document`      | String | Document 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": 7000,
    "currency": "VND",
    "country": "VN",
    "payment_method_id": "VT",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "janedoe@mymail.com",
        "document": "123456789",
        "address": {
            "country": "VN",
            "state": "Ha Nam",
            "city": "Phu Ly",
            "zip_code": "8858",
            "street": "Main St.",
            "number": "540"
        }
    },
    "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-b0e4ffab-153f-4650-b76c-b234c645b5c8",
    "amount": 7000,
    "currency": "VND",
    "payment_method_id": "VT",
    "payment_method_type": "BANK_TRANSFER",
    "payment_method_flow": "REDIRECT",
    "country": "VN",
    "created_date": "2023-01-27T21:53:51.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-018afbef-e6ff-4348-8bf0-7e57c6ba9a3d"
}
```

## VN Pay

VNPAY-QR is a payment solution that uses a QR Code scanning function integrated into 33 mobile banking applications, VNPAY wallet, and other 8 e-wallets. This would enable consumers to pay immediately, securely, and easily for their purchases.

### Capabilities

|                                    | VN Pay                     |
| :--------------------------------- | :------------------------- |
| **Min. amount**                    | 5000 VND                   |
| **Max. expiration time supported** | 15 minutes                 |
| **Notification delay**             | Immediate                  |
| **Refunds**                        | Yes                        |
| **Flow**                           | `DIRECT` <br /> `REDIRECT` |

### UX Flow

<Image src="https://files.readme.io/0149fcc69bb1ff5ec11f0fbba237e34f30dd707c2369c9bcc93ae79eafb80423-VN_Pay.png" alt="The screenshots illustrate a generic VN Pay redirect flow." align="center" caption="The screenshots illustrate a generic VN Pay redirect flow." />

### Request parameters

| Property              | Type   | Description                                                                                                            | Mandatory? |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :--------- |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes        |
| `currency`            | String | `VND`<br /><br />Transaction currency.                                                                                 | Yes        |
| `country`             | String | `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes        |
| `payment_method_id`   | String | `QR` <br /><br />ID of the selected payment method.                                                                    | Yes        |
| `payment_method_flow` | String | `DIRECT` or `REDIRECT`                                                                                                 | Yes        |
| `payer.name`          | String | Name of the payer.                                                                                                     | Yes        |
| `payer.email`         | String | Email of the payer.                                                                                                    | Yes        |
| `payer.document`      | String | Document 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": 7000,
    "currency": "VND",
    "country": "VN",
    "payment_method_id": "QR",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "janedoe@mymail.com",
        "document": "123456789",
        "address": {
            "country": "VN",
            "state": "Ha Nam",
            "city": "Phu Ly",
            "zip_code": "8858",
            "street": "Main St.",
            "number": "540"
        }
    },
    "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-d89b2dae-02b8-43c6-fg54-31728101cd59",
    "amount": 7000,
    "currency": "VND",
    "payment_method_id": "QR",
    "payment_method_type": "TICKET",
    "payment_method_flow": "REDIRECT",
    "country": "VN",
    "created_date": "2023-01-27T21:55:00.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/M-df6e9287-7a43-sd34-9e3f-00ff68991ec6"
}
```

### Direct

VN Pay can also be processed as a `DIRECT` payment method flow, returning the QR payload directly in the payment response instead of a redirect URL.

<Callout icon="ℹ️" theme="info">
  The QR value is returned in the method-specific field documented below. Do not assume that `ticket.qr_code`, `ticket.barcode`, or `ticket.number` has the same meaning across all QR payment methods.
</Callout>

```json Request Example
{
    "amount": 7000,
    "currency": "VND",
    "country": "VN",
    "payment_method_id": "QR",
    "payment_method_flow": "DIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "janedoe@mymail.com",
        "document": "123456789",
        "address": {
            "country": "VN",
            "state": "Ha Nam",
            "city": "Phu Ly",
            "zip_code": "8858",
            "street": "Main St.",
            "number": "540"
        }
    },
    "order_id": "QR-DIRECT-EXAMPLE",
    "description": "Tshirt",
    "notification_url": "https://merchant.example.com/notifications"
}
```
```json Response Example
{
    "id": "D-4-d89b2dae-02b8-43c6-fg54-31728101cd59",
    "amount": 7000,
    "currency": "VND",
    "payment_method_id": "QR",
    "payment_method_type": "TICKET",
    "payment_method_flow": "DIRECT",
    "country": "VN",
    "bank_transfer": {},
    "ticket": {
        "type": "CUSTOM",
        "expiration_date": "2023-01-27T22:10:00.000+0000",
        "id": "d89b2dae-02b8-43c6-fg54-31728101cd59",
        "barcode": "00020101021226370016A00000067701011201150107536000315080214KB0000016689500320API1675101655190221631690016A00000067701011301030040214KB0000016689500420API1675101655190221653034045802VN5907D Local6009Hanoi6304ABCD",
        "provider_name": "provider-example",
        "provider_logo": "https://static.dlocal.com/images/providers/QR.png",
        "image_url": "https://pay.dlocal.com/gmf-apm/payments/example",
        "amount": 7000,
        "currency": "VND",
        "banks": [
            {
                "bank_code": "EXB",
                "name": "Example Bank Mobile Banking",
                "logo_url": "https://static.dlocal.com/images/providers/example-bank.png",
                "android_deep_link": "examplebank://pay?qr=00020101021226370016A00000067701011201150107536000315080214KB0000016689500320API",
                "ios_deep_link": "examplebank-app://pay?qr=00020101021226370016A00000067701011201150107536000315080214KB0000016689500320API",
                "url": "https://provider-example.com/apps/example-bank"
            },
            {
                "bank_code": "VNB",
                "name": "Sample Wallet App",
                "logo_url": "https://static.dlocal.com/images/providers/sample-wallet.png",
                "android_deep_link": "samplewallet://pay?qr=00020101021226370016A00000067701011201150107536000315080214KB0000016689500320API",
                "ios_deep_link": "samplewallet-app://pay?qr=00020101021226370016A00000067701011201150107536000315080214KB0000016689500320API",
                "url": "https://provider-example.com/apps/sample-wallet"
            }
        ]
    },
    "created_date": "2023-01-27T21:55:00.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "QR-DIRECT-EXAMPLE",
    "notification_url": "https://merchant.example.com/notifications"
}
```

`ticket.banks[]` is an optional, method-specific array listing the banking and e-wallet apps that support scanning this QR code through a deep link instead of the camera-based scan flow. Each entry contains `bank_code`, `name`, `logo_url`, `android_deep_link`, `ios_deep_link`, and `url` (a fallback URL, such as an app-store or bank-app page, for when the deep link cannot be opened). Merchants may display the bank list to let the payer jump directly into their preferred app, or use the deep links when supported by their client. The QR payload itself remains available in `ticket.barcode` regardless of whether the bank list or deep links are used.

## 9Pay

With 9Pay customers can pay with Credit Card,  ATM Card, Bank Transfer, eWallet, and other methods.

### Capabilities

|                                    | 9Pay                                     |
| :--------------------------------- | :--------------------------------------- |
| **Min. amount**                    | 10000 VND                                |
| **Max. expiration time supported** | 15 minutes (Can be extended by provider) |
| **Notification delay**             | Immediate                                |
| **Refunds**                        | Yes                                      |
| **Flow**                           | `REDIRECT`                               |

### UX Flow

#### Wallet flow

<Image src="https://files.readme.io/bd5f1b92bd9f7ed871369f9a7863936581222260b374ae77e8c47394e9d46ab7-9Pay.png" alt="The screenshots illustrate a generic 9Pay redirect flow on a browser choosing 9Pay wallet to pay." align="center" caption="The screenshots illustrate a generic 9Pay redirect flow on a browser choosing 9Pay wallet to pay." />

#### Card flow

<Image src="https://files.readme.io/e2aa977533cd0f40348e8fa438ee15d48c8a09574cec23bbbb23499c19b5f9bf-9Pay_-_card.png" alt="The screenshots illustrate a generic 9Pay redirect flow on a browser choosing local debit card." align="center" caption="The screenshots illustrate a generic 9Pay redirect flow on a browser choosing local debit card." />

### Request parameters

| Property              | Type   | Description                                                                                                            | Mandatory? |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :--------- |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes        |
| `currency`            | String | `VND`<br /><br />Transaction currency.                                                                                 | Yes        |
| `country`             | String | `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes        |
| `payment_method_id`   | String | `NP` <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.document`      | String | Document 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": 7000,
    "currency": "VND",
    "country": "VN",
    "payment_method_id": "NP",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "janedoe@mymail.com",
        "document": "123456789",
        "address": {
            "country": "VN",
            "state": "Ha Nam",
            "city": "Phu Ly",
            "zip_code": "8858",
            "street": "Main St.",
            "number": "540"
        }
    },
    "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-557f33e1-a5fc-4f4e-rgtr-cc757ab266bd",
    "amount": 7000,
    "currency": "VND",
    "payment_method_id": "NP",
    "payment_method_type": "TICKET",
    "payment_method_flow": "REDIRECT",
    "country": "VN",
    "created_date": "2023-01-27T22:01:16.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-929dedd5-3ce7-4b01-34we-b612a31692b8"
}
```

## Baokim

With Baokim, customers have a wide range of payment options available, including ATM/NAPAS cards, credit cards, VietQR, mobile money, bank transfers, and ViettelPay wallet.

### Capabilities

|                                    | Baokim     |
| :--------------------------------- | :--------- |
| **Min. Amount.**                   | 5000 VND   |
| **Max. expiration time supported** | 30 minutes |
| **Notification delay**             | Immediate  |
| **Refunds**                        | Yes        |
| **Flow**                           | `REDIRECT` |

### UX Flow

<Image src="https://files.readme.io/0fafff2c9611533ac765d2ca4cc385de16603fbbfcd61199055d49ec43ce338f-Baokim_-_Bank_transfer.png" alt="The screenshots illustrate a generic Baokim redirect flow choosing Bank Transfer as a payment method. The specifics of the flow can change depending on the payment method selected to complete the transaction." align="center" caption="The screenshots illustrate a generic Baokim redirect flow choosing Bank Transfer as a payment method. The specifics of the flow can change depending on the payment method selected to complete the transaction." />

### Request parameters

| Property              | Type   | Description                                                                                                            | Mandatory? |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :--------- |
| `amount`              | Number | Amount to be charged.                                                                                                  | Yes        |
| `currency`            | String | `VND`<br /><br />Transaction currency.                                                                                 | Yes        |
| `country`             | String | `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes        |
| `payment_method_id`   | String | `VB` <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.document`      | String | Document 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": 7000,
    "currency": "VND",
    "country": "VN",
    "payment_method_id": "VB",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "janedoe@mymail.com",
        "document": "123456789",
        "address": {
            "country": "VN",
            "state": "Ha Nam",
            "city": "Phu Ly",
            "zip_code": "8858",
            "street": "Main St.",
            "number": "540"
        }
    },
    "order_id": "34545sds3483kqw0",
    "description": "Tshirt",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "http://merchantsite.com/success_page"
}
```
```json Response Example
{
    "id": "R-4-557f33e1-a5fc-4f4e-rgtr-cc757ab266bd",
    "amount": 7000,
    "currency": "VND",
    "payment_method_id": "NP",
    "payment_method_type": "TICKET",
    "payment_method_flow": "REDIRECT",
    "country": "VN",
    "created_date": "2023-01-27T22:01:16.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-929dedd5-3ce7-4b01-34we-b612a31692b8"
}

```

## MoMo

MoMo Wallet, both on a domestic and international scale, functions as a digital wallet and mobile payment solution hailing from Vietnam.

It empowers users to efficiently oversee their financial resources, execute seamless money transfers, partake in transactions, and conveniently settle payments for a wide array of goods and services. Its intuitive user interface ensures a user-friendly experience, fostering straightforward and secure management of both local and cross-border merchant payments.

### Capabilities

|                                    | MoMo       |
| :--------------------------------- | :--------- |
| **Min. Amount.**                   | 1000 VND   |
| **Max. expiration time supported** | 10 minutes |
| **Notification delay**             | Immediate  |
| **Refunds**                        | Yes        |
| **Flow**                           | `REDIRECT` |

### Request Parameters

| Property              | Type   | Description                                                                                                            | Mandatory? |
| :-------------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- | :--------- |
| `amount`              | Number | Amount to be charged                                                                                                   | Yes        |
| `currency`            | String | `VND`<br /><br />Transaction currency.                                                                                 | Yes        |
| `country`             | String | `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).      | Yes        |
| `payment_method_id`   | String | `VQ` <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.document`      | String | Document of the payer.                                                                                                 | Yes        |
| `payer.phone`         | String | Phone number 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": 7000,
     "currency": "VND",
     "country": "VN",
     "payment_method_id": "VQ",
     "payment_method_flow": "REDIRECT",
     "payer": {
         "name": "Jane Doe",
         "email": "janedoe@mymail.com",
         "document": "123456789",
         "phone": "0399999999",
         "address": {
             "country": "VN",
             "state": "Ha Nam",
             "city": "Phu Ly",
             "zip_code": "8858",
             "street": "Main St.",
             "number": "540"
         }
     },
     "order_id": "34545sds3483kqw0",
     "description": "Tshirt",
     "notification_url": "http://merchantsite.com/notification/new",
     "callback_url": "http://merchantsite.com/success_page"
 }
```
```json Response Example
 {
     "id": "R-4-7147efbb-6817-45cd-5te3-9e695ed57f53",
     "amount": 7000,
     "currency": "VND",
     "payment_method_id": "VQ",
     "payment_method_type": "TICKET",
     "payment_method_flow": "REDIRECT",
     "country": "VN",
     "created_date": "2023-08-17T14:00:18.000+0000",
     "status": "PENDING",
     "status_detail": "The payment is pending.",
     "status_code": "100",
     "order_id": "34545sds3483kqw0",
     "description": "Tshirt",
     "notification_url": "http://merchantsite.com/notification/new",
     "redirect_url": "https://payment.momo.vn/v2/gateway/pay?t=TU9NT0oxT0IyMDIyMTAwTGHt6yMTc0XzE5NTczNjFfN1I0&s=bf9d8e990e24b02c97255c0fa0d1500e8fe605968b5gf56yq641d1af6f0bdd60f"
 }
```

### Example ticket

<Image src="https://files.readme.io/24b9a7a0f297fd7692416a531ae57e5b5960185a5f63ded691c2fb8069aa57a0-APM_-_MoMo.png" alt="MoMo UI built with the information in the example above." align="center" caption="MoMo UI built with the information in the example above." />

<br />

## MoMo Recurring

MoMo Recurring is designed to support both on-demand and scheduled subscription payments.&#x20;

### Capabilities

|                                    | MoMo                                                  |
| :--------------------------------- | :---------------------------------------------------- |
| **Min. amount**                    | 1000 VND                                              |
| **Max. expiration time supported** | 15 minutes                                            |
| **Notification delay**             | Immediate                                             |
| **Refunds**                        | Yes. Full and partial.                                |
| **Flow**                           | Enrollment `REDIRECT`<br />Recurring payment `DIRECT` |

### UX Flow

<Image src="https://files.readme.io/1bbf7c05a515a8661e22027a68212def67eceb5aae9d05cff19dccfbfeb84b83-VN_-_RV_-_MoMo_Recurring_-_Enrollment_-_UX_Flow.png" alt="The screenshots represent a generic MoMo enrollment flow." align="center" caption="The screenshots illustrate a generic MoMo enrollment flow." />

### One-time user enrollment

<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>
        `VND`<br /><br />Transaction currency in [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217).
      </td>

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

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

      <td>
        String
      </td>

      <td>
        `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).
      </td>

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

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

      <td>
        String
      </td>

      <td>
        Possible options include:

        `ON_DEMAND`: For future recurring payments initiated by the customer or merchant on demand, rather than on a fixed schedule.<br />`MERCHANT_SUBSCRIPTION`: Merchant initiates recurring payments based on defined subscription settings (frequency, amount, dates).
      </td>

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

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

      <td>
        String
      </td>

      <td>
        `RV` <br /><br />ID of the selected payment method.
      </td>

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

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

      <td>
        String
      </td>

      <td>
        `REDIRECT`&#x20;
      </td>

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

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

      <td>
        String
      </td>

      <td>
        Name of the payer.
      </td>

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

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

      <td>
        String
      </td>

      <td>
        Email of the payer.
      </td>

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

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

      <td>
        String
      </td>

      <td>
        User's phone number.
      </td>

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

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

      <td>
        String
      </td>

      <td>
        Subscription start date (YYYY-MM-DD). Defaults to the current date if not provided.
      </td>

      <td>
        No<br />(_Only applies when type is&#x20;_`MERCHANT_SUBSCRIPTION`)
      </td>
    </tr>

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

      <td>
        String
      </td>

      <td>
        Subscription expiration date (YYYY-MM-DD). If not provided, the subscription does not expire.
      </td>

      <td>
        No<br />(_Only applies when type is&#x20;_`MERCHANT_SUBSCRIPTION`)
      </td>
    </tr>

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

      <td>
        String
      </td>

      <td>
        Charge frequency. Possible values depend on the payment method: `WEEKLY`, `MONTHLY`, `QUARTERLY`, `SEMI_ANNUAL`, `ANNUAL`.
      </td>

      <td>
        Yes<br />(_Only applies when type is&#x20;_`MERCHANT_SUBSCRIPTION`)
      </td>
    </tr>

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

      <td>
        String
      </td>

      <td>
        `FIXED` (same amount each period) or `VARIABLE` (amount varies per charge within defined limits).
      </td>

      <td>
        Yes<br />(_Only applies when type is&#x20;_`MERCHANT_SUBSCRIPTION`)
      </td>
    </tr>

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

      <td>
        Number
      </td>

      <td>
        Fixed charge amount in local currency. Required when type is `FIXED`. Length: 10,2.
      </td>

      <td>
        Yes<br />(_Only applies when type is&#x20;_`MERCHANT_SUBSCRIPTION` and amount.type is `FIXED`)
      </td>
    </tr>

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

      <td>
        Number
      </td>

      <td>
        Maximum allowed amount per charge. Required when type is `VARIABLE `. Length: 10,2.
      </td>

      <td>
        Yes<br />(_Only applies when type is&#x20;_`MERCHANT_SUBSCRIPTION` and amount.type is `VARIABLE`)
      </td>
    </tr>

    <tr>
      <td>
        `order_id`
      </td>

      <td>
        String
      </td>

      <td>
        ID of the capture given by the merchant in their system. Think of it as an external id of the capture.
      </td>

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

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

      <td>
        String
      </td>

      <td>
        Notifications will be sent in every change of status of an enrollment 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 enrollment 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": "VND",
  "country": "VN",
  "type": "ON_DEMAND",
  "description": "Monthly subscription",
  "payment_method_id": "RV",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "phone": "628432003239",
    "email": "janedoe@mymail.com"
  },
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback"
}
```
```json Synchronous Response Example
{ 
"id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b",
  "external_id": "3a39633d-e6fc-4bc2-96d1-51613b13858a",
  "description": "Monthly subscription",
  "status": "PENDING",
  "status_code": "100",
  "status_details": "The enrollment is pending.",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/N-ec90b256-c2b7-4cd4-af36-265499ae3ca9",
  "payment_method_id": "RV",
  "payment_method_flow": "REDIRECT",
  "payment_method_type": "WALLET"
}
```
```json Asynchronous Response Example
{
  "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b",
  "external_id": "fwbExmQQ7",
  "currency": "VND",
  "country": "VN",
  "type": "ON_DEMAND",
  "payment_method_id": "RV",
  "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": "http://merchantsite.com/notifications"
}
```

<br />

### Recurring payments

| Property              | Type   | Description                                          | Mandatory? |
| :-------------------- | :----- | :--------------------------------------------------- | :--------- |
| `payment_method_flow` | String | `DIRECT`                                             | Yes        |
| `enrollment.id`       | String | Enrollment id of the initial customer authorization. | Yes        |

### 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
{
  "external_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "amount": 15000,
  "currency": "VND",
  "country": "VN",
  "payment_method_id": "RV",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "phone": "628432003239",
    "email": "janedoe@mymail.com"
  },
  "enrollment": {
    "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b"
  },
  "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "notification_url": "http://www.merchantsite.com/notifications"
}
```
```json Synchronous response example
{
  "id": "D-4-x1kj5e7i-hh7ver365l35h6-bg7h5snqee44",
  "amount": 15000,
  "currency": "VND",
  "payment_method_id": "RV",
  "payment_method_type": "WALLET",
  "payment_method_flow": "DIRECT",
  "country": "VN",
  "created_date": "2025-12-05T10:50:26.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "notification_url": "http://www.merchantsite.com/notifications"
}
```
```json Asynchronous response example
{
  "id": "D-4-x1kj5e7i-hh7ver365l35h6-bg7h5snqee44",
  "amount": 15000,
  "status": "PAID",
  "status_detail": "The payment is paid",
  "status_code": "200",
  "currency": "VND",
  "country": "VN",
  "payment_method_id": "RV",
  "payment_method_flow": "DIRECT",
  "notification_url": "http://merchantsite.com/notifications",
  "created_date": "2025-12-05T10:51:20.000+0000"
}
```

<br />

### Enrollment with an initial payment

To create an enrollment with an initial payment use the same request as in a Recurring Payment including an `enrollment` object in the request body and changing the `payment_method_flow` to `REDIRECT`.

| Property                                   | Type   | Description                                                                                                                                                                                                                                                         | Mandatory?                                                                                        |
| :----------------------------------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------ |
| `enrollment.external_id`                   | String | An identifier used by the merchant to identify the enrollment in their system.                                                                                                                                                                                      | Yes                                                                                               |
| `enrollment.type`                          | String | `ON_DEMAND`: For future recurring payments initiated by the customer or merchant on demand, rather than on a fixed schedule.<br />`MERCHANT_SUBSCRIPTION`: Merchant initiates recurring payments based on defined subscription settings (frequency, amount, dates). | Yes                                                                                               |
| `enrollment.subscription.end_date`         | String | Subscription expiration date (YYYY-MM-DD). If not provided, the subscription does not expire.                                                                                                                                                                       | No<br />(*Only applies when type is&#x20;*`MERCHANT_SUBSCRIPTION`)                                |
| `enrollment.subscription.frequency`        | String | Charge frequency. Possible values depend on the payment method: `WEEKLY`, `MONTHLY`, `QUARTERLY`, `SEMI_ANNUAL`, `ANNUAL`.                                                                                                                                          | Yes<br />(*Only applies when type is&#x20;*`MERCHANT_SUBSCRIPTION`)                               |
| `enrollment.subscription.amount.type`      | String | `FIXED` (same amount each period) or `VARIABLE` (amount varies per charge within defined limits).                                                                                                                                                                   | Yes<br />(*Only applies when type is&#x20;*`MERCHANT_SUBSCRIPTION`)                               |
| `enrollment.subscription.amount.value`     | Number | Fixed charge amount in local currency. Required when type is `FIXED`. Length: 10,2.                                                                                                                                                                                 | Yes<br />(*Only applies when type is&#x20;*`MERCHANT_SUBSCRIPTION` and amount.type is `FIXED`)    |
| `enrollment.subscription.amount.max_value` | Number | Maximum allowed amount per charge. Required when type is `VARIABLE `. Length: 10,2.                                                                                                                                                                                 | Yes<br />(*Only applies when type is&#x20;*`MERCHANT_SUBSCRIPTION` and amount.type is `VARIABLE`) |
| `enrollment.notification_url`              | String | Notifications will be sent in every change of status of a enrollment to the `enrollment.notification_url` specified by the merchant.                                                                                                                                | Yes                                                                                               |
| `enrollment.callback_url`                  | String | The payer will be redirected to the merchant’s website after completing the enrollment via the `enrollment.callback_url`specified by the merchant                                                                                                                   | Yes                                                                                               |
| `payment_method_flow`                      | String | `REDIRECT`                                                                                                                                                                                                                                                          | Yes                                                                                               |

### 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
{
  "enrollment": {
    "external_id": "fwbExmQQ7",
    "type": "ON_DEMAND",
    "description": "Monthly subscription",
    "notification_url": "http://www.merchantsite.com/notifications",
    "callback_url": "http://merchantsite.com/enrollment_callback"
  },
  "external_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "amount": 15000,
  "currency": "VND",
  "country": "VN",
  "payment_method_id": "RV",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "phone": "628432003239",
    "email": "janedoe@mymail.com"
  },
  "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "notification_url": "http://www.merchantsite.com/notifications"
}
```
```json Synchronous response example
{
  "enrollment": {
     "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b",
     "external_id": "3a39633d-e6fc-4bc2-96d1-51613b13858a",
     "description": "Monthly subscription",
     "status": "PENDING",
     "status_code": "100",
     "status_details": "The enrollment is pending.",
     "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/N-ec90b256-c2b7-4cd4-af36-265"
  },
  "id": "D-4-x1kj5e7i-hh7ver365l35h6-bg7h5snqee44",
  "amount": 15000,
  "currency": "VND",
  "payment_method_id": "RV",
  "payment_method_type": "WALLET",
  "payment_method_flow": "DIRECT",
  "country": "VN",
  "created_date": "2025-12-05T10:50:26.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "notification_url": "http://www.merchantsite.com/notifications"
}
```
```json Asynchronous response example (enrollment)
{
  "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b",
  "external_id": "fwbExmQQ7",
  "currency": "VND",
  "country": "VN",
  "type": "ON_DEMAND",
  "payment_method_id": "RV",
  "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": "http://merchantsite.com/notifications"
}
```
```json Asynchronous response example (payment)
{
  "id": "D-4-x1kj5e7i-hh7ver365l35h6-bg7h5snqee44",
  "amount": 15000,
  "status": "PAID",
  "status_detail": "The payment is paid",
  "status_code": "200",
  "currency": "VND",
  "country": "VN",
  "payment_method_id": "RV",
  "payment_method_flow": "DIRECT",
  "notification_url": "http://merchantsite.com/notifications",
  "created_date": "2025-12-05T10:51:20.000+0000"
}
```

## Zalopay One-Shot Payments

Zalopay wallet is a mobile wallet in Vietnam. It is designed to support one-shot payments for both mobile experience (redirection to Zalopay app) and web experience (end user scanning a QR code in web interface).

### Capabilities

|                                    | Zalopay One-Shot Payments |
| :--------------------------------- | :------------------------ |
| **Min. amount**                    | 1000 VND                  |
| **Max. expiration time supported** | 15 minutes                |
| **Notification delay**             | Immediate                 |
| **Refunds**                        | Yes. Full and Partial     |
| **Flow**                           | `REDIRECT`                |

### UX Flow

<Image src="https://files.readme.io/7bac06124fb29787db581621618ce08aa9f51a0d368d5fc3c0a4b6df6ec25f18-Zalopay_One-Shot.png" alt="The screenshots illustrate a generic Zalopay redirect flow on a browser." align="center" />

### Request parameters

| Property              | Type   | Description                                                                                                                           | Mandatory? |
| :-------------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------------ | :--------- |
| `amount`              | Number | Amount to be charged.                                                                                                                 | Yes        |
| `currency`            | String | `VND`<br /><br />Transaction currency.                                                                                                | Yes        |
| `country`             | String | `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).                     | Yes        |
| `payment_method_id`   | String | `ZW` <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.                                                                                                                   | No         |
| `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.                | 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        |

### Examples

```json Request Example
{
    "amount": 1000,
    "currency": "VND",
    "country": "VN",
    "payment_method_id": "ZW",
    "payment_method_flow": "REDIRECT",
    "payer": {
      "name": "Nguyen Anh",
      "email": "nanh@example.com"
    },
    "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "http://merchantsite.com/callback"
}

```
```json Response Example
{
    "id": "R-4-x1kv1030-glf3om866147rf-ofmiqsp1eecg",
    "amount": 1000,
    "currency": "VND",
    "payment_method_id": "ZW",
    "payment_method_type": "BANK_TRANSFER",
    "payment_method_flow": "REDIRECT",
    "country": "VN",
    "created_date": "2026-06-02T12:18:44.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "notification_url": " http://merchantsite.com/notification/new",
    "redirect_url": "https://merchantsite.com/callback"
}

```
```json Asynchronous Response Example
{
  "id": "R-4-x1kv1030-glf3om866147rf-ofmiqsp1eecg",
  "amount": 1000,
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "currency": "VND",
  "country": "VN",
  "payment_method_id": "ZW",
  "payment_method_type": "BANK_TRANSFER",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Nguyen Anh",
    "user_reference": "",
    "email": "nanh@example.com"
  },
  "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "notification_url": "http://merchantsite.com/notifications/new",
  "callback_url": "http://merchantsite.com/callback",
  "created_date": "2026-06-02T12:19:00.000+0000",
  "extra_info": null
}

```

## Zalopay recurring

Zalopay Recurring is designed to support both on-demand and scheduled subscription payments. For scheduled subscriptions, the merchant must manage the subscription lifecycle on their side, as Zalopay does not support configuring fixed or variable subscription amounts, billing frequency or subscription start and end dates.

### Capabilities

|                                       | Zalopay recurring                                      |
| :------------------------------------ | :----------------------------------------------------- |
| **Min. amount**                       | 1000 VND                                               |
| **Notification delay**                | Immediate                                              |
| **Maximum expiration time supported** | 15 minutes                                             |
| **Refunds**                           | Yes. Full and partial.                                 |
| **Flow**                              | Enrollment `REDIRECT`<br />Recurring payments `DIRECT` |

### UX Flow

![](https://files.readme.io/dbb6a0f1db1de7762023641420ec5f5dd572ff4690a4a1d205453ef71729a408-image.png)

<br />

### One time user enrollment

This is the API request used to create the binding required to tokenize the Zalopay wallet and enable recurring payments.

#### Request parameters

| Property              | Type   | Description                                                                                                                         | Mandatory? |
| :-------------------- | :----- | :---------------------------------------------------------------------------------------------------------------------------------- | :--------- |
| `external_id`         | Number | An identifier used by the merchant to identify the enrollment in their system.                                                      | Yes        |
| `currency`            | String | `VND`<br /><br />Transaction currency.                                                                                              | Yes        |
| `country`             | String | `VN` <br /><br />Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes).                   | Yes        |
| `type`                | String | `ON_DEMAND`: For future recurring payments initiated by the customer or merchant on demand, rather than on a fixed schedule.        | Yes        |
| `description`         | String | Enrollment description.                                                                                                             | No         |
| `payment_method_id`   | String | `ZA` <br /><br />ID of the selected payment method.                                                                                 | Yes        |
| `payment_method_flow` | String | `REDIRECT`                                                                                                                          | Yes        |
| `payer.name`          | String | Name of the payer.                                                                                                                  | Yes        |
| `payer.phone`         | String | Phone number of the payer.                                                                                                          | Yes        |
| `payer.email`         | String | Email 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.              | 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        |

<br />

#### Sample request

[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": "VND",
  "country": "VN",
  "type": "ON_DEMAND",
  "description": "Ride Hailing",
  "payment_method_id": "ZA",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Nguyen Anh",
    "phone": "0901234567",
    "email": "nanh@example.com"
  },
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback"
}
```
```json Synchronous response example
{
  "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b",
  "external_id": "fwbExmQQ7",
  "description": "Ride Hailing",
  "status": "PENDING",
  "status_code": "100",
  "status_details": "The enrollment is pending.",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/N-ec90b256-c2b7-4cd4-af36-265499ae3ca9",
  "payment_method_id": "ZA",
  "payment_method_flow": "REDIRECT",
  "payment_method_type": "WALLET"
}
```
```json Asynchronous response example (webhook)
{
  "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b",
  "external_id": "fwbExmQQ7",
  "currency": "VND",
  "country": "VN",
  "type": "ON_DEMAND",
  "payment_method_id": "ZA",
  "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"
}
```

<br />

### Recurring payments

Once wallet tokenization is completed, the merchant must initiate a payment request for each charge. Payments are not executed automatically; instead, the merchant triggers each payment either on demand or according to a defined billing cycle, depending on the use case.

<br />

#### Request paramenters

| Property        | Type   | Description                                         | Mandatory? |
| :-------------- | :----- | :-------------------------------------------------- | :--------- |
| `enrollment_id` | String | Enrollment id of the initial customer authorization | Yes        |

<br />

#### Sample request

[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
{
  "external_id": "fwbExmQQ7",
  "amount": 250,
  "currency": "VND",
  "country": "VN",
  "payment_method_id": "ZA",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Nguyen Anh",
    "phone": "0901234567",
    "email": "nanh@example.com"
  },
  "enrollment": {
    "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b"
  },
  "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "notification_url": "http://www.merchantsite.com/notifications"
}
```
```json Synchronous response example
{
  "id": "D-4-x1kj5e7i-hh7ver365l35h6-bg7h5snqee44",
  "amount": 250,
  "currency": "VND",
  "payment_method_id": "ZA",
  "payment_method_type": "WALLET",
  "payment_method_flow": "DIRECT",
  "country": "VN",
  "created_date": "2025-12-05T10:50:26.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "1089e9de-0959-4ca7-bf0a-14da32d18451",
  "notification_url": "http://www.merchantsite.com/notifications"
}
```
```json Asynchronous response example (webhook)
{
  "id": "E-4-a6418560-42c0-44bb-9a6f-da77730bcb6b",
  "amount": 250,
  "status": "PAID",
  "status_detail": "The payment is paid",
  "status_code": "200",
  "currency": "VND",
  "country": "VN",
  "payment_method_id": "ZA",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Nguyen Anh",
    "phone": "0901234567",
    "email": "nanh@example.com"
  },
  "notification_url": "http://merchantsite.com/notifications",
  "created_date": "2024-09-10T20:37:20.000+0000"
}
```