---
updatedAt: 2026-03-03T17:17:53.000Z
agentTools:
  projectIndex: https://docs.dlocal.com/llms.txt
---

# Brazil / Food vouchers

Support food voucher payments for Brazil’s benefit card programs.

# Food vouchers acceptance in Brazil

Brazil has a well-established market for employee benefit cards linked to the PAT Program (Programa de Alimentação do Trabalhador). The program encourages companies to provide prepaid cards for food-related expenses, offering tax advantages and supporting employee well-being.

Acceptance of these cards is restricted by a merchant's business type, which is validated by their tax ID (CNPJ). dLocal's platform supports processing these cards for marketplaces, but each individual restaurant or supermarket must be onboarded through dLocal platform API.

# Onboarding a client

To enable a sub-merchant (restaurant, supermarket, etc.) to accept benefit cards, they must first be created on the dLocal platform via the Create a Client API. Each successful creation returns a unique dLocal client ID, which must be used for all subsequent payment processing for that sub-merchant.

## Create a client

This endpoint is used to create a new sub-merchant client on the dLocal platform.

<br />

[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    \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://marketplace-api.dlocal.com/v2/clients\">\n    </div>\n    <div class=\"url-input\" data-url=\"sandbox-a\">\n      <input type=\"text\" readonly value=\"https://marketplace-api.dlocal-sbox.com/v2/clients\">\n    </div>\n  </div>\n</body>\n</html>\n"
}
[/block]

### Request fields

[block:parameters]
{
  "data": {
    "h-0": "Field",
    "h-1": "Required",
    "h-2": "Type",
    "h-3": "Description",
    "0-0": "`tax_id`",
    "0-1": "Yes",
    "0-2": "String",
    "0-3": "The client's Brazilian tax number (CNPJ).",
    "1-0": "`external_reference`",
    "1-1": "Yes",
    "1-2": "String",
    "1-3": "A unique ID for the client from your internal system (Length ≤ 100).",
    "2-0": "`name`",
    "2-1": "Yes",
    "2-2": "String",
    "2-3": "The client's name (Length ≤ 100).",
    "3-0": "`country`",
    "3-1": "Yes",
    "3-2": "String",
    "3-3": "The client's country. Must be BR.",
    "4-0": "`set_up.payment_methods.payment_method_id`",
    "4-1": "Yes",
    "4-2": "String",
    "4-3": "The ID of the benefit card provider to enable. <br><br>Possible values: `LO`, `VR`, `UL`, `TI`.",
    "5-0": "`set_up.payment_methods.enabled`",
    "5-1": "Yes",
    "5-2": "Boolean",
    "5-3": "Set to true to enable the payment method.",
    "6-0": "`notification_url`",
    "6-1": "No",
    "6-2": "String",
    "6-3": "URL for dLocal to send client status and payment method status notifications."
  },
  "cols": 4,
  "rows": 7,
  "align": [
    null,
    null,
    null,
    null
  ]
}
[/block]

### Example request

```json Example request
{
  "tax_id": "27327331561",
  "external_reference": "rest12345",
  "name": "Restaurant Name",
  "country": "BR",
  "set_up": {
    "payment_methods": [
      {
        "payment_method_id": "VR",
        "enabled": true
      },
      {
        "payment_method_id": "LO",
        "enabled": true
      }
    ]
  },
  "notification_url": "http://merchantsite.com/notifications"
}
```

### Onboarding Status

The client and their payment methods will have statuses that change as the onboarding process progresses. Webhooks will be sent to the `notification_url` upon these changes.

#### Client statuses

* `CREATING` (300)
* `APPROVED` (200): When at least one provider is approved.
* `CANCELLED` (601, 602)

#### Payment method statuses

* `CREATING` (300)
* `PENDING` (103)
* `APPROVED` (200): The client is ready to process payments with this method.
* `REJECTED` (500)

#### Example client status notification:

```json Notification example
{
  "id": "CL-84e33f3f-e89b-4450-9098-242edb6a0fb7",
  "event_type": "CLIENT_STATUS_UPDATE",
  "payload": {
    "status": "APPROVED",
    "status_code": 200,
    "status_detail": "approved"
  }
}
```

## Processing payments

dLocal acts as a gateway, routing payment details and the sub-merchant's credentials to the corresponding benefit card company.

### Request parameters

The following parameters are used when submitting a payment request to the dLocal Payments API.

[block:parameters]
{
  "data": {
    "h-0": "Field",
    "h-1": "Required",
    "h-2": "Type",
    "h-3": "Description",
    "0-0": "`amount`",
    "0-1": "Yes",
    "0-2": "Number",
    "0-3": "Amount to be charged.",
    "1-0": "`currency`",
    "1-1": "Yes",
    "1-2": "String",
    "1-3": "Must be `BRL`.  <br><br>Transaction currency in [ISO 4217](http://en.wikipedia.org/wiki/ISO_4217) .",
    "2-0": "`country`",
    "2-1": "Yes",
    "2-2": "String",
    "2-3": "Must be `BR`.  <br><br>Transaction country in [ISO 3166](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) .",
    "3-0": "`payment_method_id`",
    "3-1": "Yes",
    "3-2": "String",
    "3-3": "The ID of the selected benefit card: `UL`, `LO`, `TI`, `VR`.",
    "4-0": "`payment_method_flow`",
    "4-1": "Yes",
    "4-2": "String",
    "4-3": "Must be `DIRECT`.",
    "5-0": "`payer.name`",
    "5-1": "Yes",
    "5-2": "String",
    "5-3": "Name of the payer (Length ≤ 200).",
    "6-0": "`submerchant.merchant_reference`",
    "6-1": "Yes",
    "6-2": "String",
    "6-3": "The `external_reference` provided during client creation.",
    "7-0": "`card.holder_name`",
    "7-1": "Yes",
    "7-2": "String",
    "7-3": "Cardholder's full name.",
    "8-0": "`card.expiration_month`",
    "8-1": "Yes",
    "8-2": "int32",
    "8-3": "Card's expiration month.",
    "9-0": "`card.expiration_year`",
    "9-1": "Yes",
    "9-2": "int32",
    "9-3": "Card's expiration year.",
    "10-0": "`card.number`",
    "10-1": "Yes",
    "10-2": "String",
    "10-3": "Card number without separators.",
    "11-0": "`card.cvv`",
    "11-1": "No",
    "11-2": "String",
    "11-3": "Card verification value (required for `VR`)."
  },
  "cols": 4,
  "rows": 12,
  "align": [
    null,
    null,
    null,
    null
  ]
}
[/block]

### Example request

```json
{
  "amount": 100.00,
  "currency": "BRL",
  "country": "BR",
  "payment_method_id": "VR",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "John Doe"
  },
  "submerchant": {
    "merchant_reference": "rest12345"
  },
  "card": {
    "holder_name": "John Doe",
    "expiration_month": 12,
    "expiration_year": 2025,
    "number": "1234567890123456",
    "cvv": "123"
  }
}
```