Colombia

Learn about the dLocal supported payment methods in Colombia.

Market specifications

Take a look of all the payment methods available.

Country reference Cards supported APM supported

Cards


Find all the information about the card supported capabilities.

Capabilities Process Card Payments

Alternative Payments

Learn how to integrate cash, bank transfer or wallet payment.

Efecty PSE Bancolombia Nequi Push (One-shot & Recurring) Nequi Mixed (Push + QR) Nequi QR Mercado Pago Bre-B Addi

Market specifications

Do you want to know more information about Colombia's market? Go to the Colombia's economy and eCommerce market article.

Country reference

country codecurrency codeamount decimalsdocument namedocument formatdocument required?
COCOP0CC o NITBetween 6 to 11 digitsYes

Cards supported

payment_method_idBrand IDNamepayment_method_typeDetailsAllowed FlowsLogo
CARDVIVisaCARDCredit Card ​DIRECT REDIRECT
CARDVDVisa Debit ​CARDDebit Card ​DIRECT REDIRECT
CARDMCMastercardCARDCredit Card ​DIRECT REDIRECT
CARDMDMastercard Debit ​CARDDebit Card ​DIRECT REDIRECT
CARDAEAmerican ExpressCARDCredit Card ​DIRECT REDIRECT
CARDDCDinersCARDCredit Card ​DIRECT REDIRECT
CARDCZCodensaCARDCredit Card ​DIRECT REDIRECT
ℹ️

To offer all the card options that may be available in your integration, send the payment_method_id as CARD.

Alternative Payment Method supported

payment_method_idNamepayment_method_typeDetailsAllowed FlowsLogo
EYEfectyTICKETCash Payment ​DIRECT REDIRECT
PCPSEBANK_TRANSFERBank Transfer OfflineREDIRECT
BNBancolombiaTICKETCash PaymentREDIRECT
QPNequi PushWALLETWallet — one-shot & tokenizedREDIRECT DIRECTNequi Push logo
MQNequi Mixed (Push + QR)WALLETWallet — one-shotREDIRECTNequi Mixed logo
QRNequi QRQRQR paymentsDIRECT REDIRECT
MPMercado PagoBANK_TRANSFERWallet ​DIRECT REDIRECT
EVBre-B QRQRQR paymentsDIRECT REDIRECT
ℹ️

Nequi payment method codes

dLocal offers three distinct Nequi payment methods in Colombia. They are not interchangeable:

  • QP — Nequi Push: supports both one-shot payments and tokenized recurring/subscription payments. One-shot uses an empty wallet object; recurring uses enrollment + recurring DIRECT charges.
  • MQ — Nequi Mixed (Push + QR): one-shot only. Does not support tokenization or recurring payments.
  • QR — Nequi QR: one-shot QR scan only. Does not support tokenization or recurring payments. Note: in Ecuador, QR routes to DeUna, not Nequi — always include country: "CO" when integrating Nequi QR.

Cards

Capabilities

Visa CreditVisa DebitMastercard CreditMastercard DebitAmerican ExpressDinersCodensa
Minimum amount169 COP169 COP169 COP169 COP100 COP100 COP100 COP
RefundsYesYesYesYesYesYesYes
RecurringYesYesYesYesYesYesYes
Chargeback optionYesYesYesYesYesYesYes
Chargeback Dispute optionYesYesYesYesYesYesYes
DescriptorCan be personalized, depending on the provider.Can be personalized, depending on the provider.Can be personalized, depending on the provider.Can be personalized, depending on the provider.Can be personalized, depending on the provider.Can be personalized, depending on the provider.Can be personalized, depending on the provider.

How to process Card Payments?

Learn how to process payments with credit and debit cards with dLocal in our Card Payments section.


Alternative Payment Method

Efecty

It was created with the aim of facilitating payments in the country. The Efecty voucher is now widely used in Colombia to pay utility bills and online purchases, in cash.

Capabilities

Efecty
Min. amount1000 COP
Max. expiration time supported5 days
Notification delayImmediate
RefundsYes
FlowDIRECT REDIRECT

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP Transaction currency.Yes
countryStringCO Transaction country in ISO 3166.Yes
payment_method_idStringEY ID of the selected payment method.Yes
payment_method_flowStringDIRECT or REDIRECTYes
payer.nameStringName of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.documentStringDocument of the payer.Yes
order_idStringID of the capture given by the merchant in their system. Think of it as an external ID of the capture.No
notification_urlStringNotifications will be sent in every change of status of a payment to the notification_url specified by the merchant.No

Examples

Request example

Response example

{
    "amount": 15000,
    "currency": "COP",
    "country": "CO",
    "payment_method_id": "EY",
    "payment_method_flow": "DIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "[email protected]",
        "document": "12345678",
        "address": {
            "country": "CO",
            "state": "Antioquia",
            "city": "Medellin",
            "zip_code": "8858",
            "street": "Av. Principal",
            "number": "5940"
        }
    },
    "order_id": "34545sk3483kqw0",
    "description": "Tshirt",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "http://merchantsite.com/success_page"
}
{
    "id": "D-4-1c9e6c0f-a97f-4fc1-9a65-9a8bf3da3a88",
    "amount": 15000,
    "currency": "COP",
    "payment_method_id": "EY",
    "payment_method_type": "TICKET",
    "payment_method_flow": "DIRECT",
    "country": "CO",
    "bank_transfer": {},
    "ticket": {
        "type": "CUSTOM",
        "format": "Code 128",
        "number": "1011462900",
        "expiration_date": "2022-09-21T02:59:00.000+0000",
        "barcode": "41577099989921778020001014972898390020230119",
        "company_name": "Dlocal",
        "company_id": "111571",
        "provider_name": "efecty",
        "provider_logo": "https://static.dlocal.com/images/providers/efecty.png",
        "image_url": "https://pay.dlocal.com/gmf-apm/payments/M-8a443398-99f8-47d4-83cd-c8e5562aeffc",
        "amount": 15000,
        "currency": "COP"
    },
    "created_date": "2022-09-16T17:26:46.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "34545sk3483kqw0",
    "notification_url": "http://merchantsite.com/notification/new"
}

Example ticket

Efecty UI built with the information in the example above.

Efecty UI built with the information in the example above.

User Interface Tips UI

If you are using this payment method through a DIRECT integration, follow the tips below in order to make it easier for your customers to complete payments, boosting your conversion rates.

ElementTip
Ticket NumberIt is the number that payers must dictate to the cashiers in order to complete payment. Name it "Referencia" and separate it this way so it is easier to read: 3 digits - 3 digits - 4 digits.
Currency and AmountShould be relevant elements in the ticket. Users need to have that information very clearly.
Currency Symbol$
ConvenioThis identifies the payment beneficiary and although it is not usually necessary for payment, sometimes it helps cashiers to find the payment on their system.
BarcodeSome cashiers prefer to scan the barcode rather than asking for Reference and "Convenio". Helping cashiers is a way to improve conversion rates.
Expiration dateDisplay this element clearly and visible enough. In Colombia, the date format is DD/MM/YYYY.
Accreditation delayLet users know that their payment will be credited immediately. This brings confidence and a sense of security that helps conversion rates.
Payment instructionsAlthough most users are familiarized with Efecty, it is a good practice to help those who are not. The image above is an example of instructions, but if needed, our team will be happy to help you with more personalized instructions.
Store locatorLink it to google.com/maps/search/efecty/.
Save buttonIt helps users to have their tickets always on their phones, making it needless to take notes or keep the browser open.
Print buttonIt is useful for some users who need to have their tickets printed.

PSE

Pagos Seguros Online (PSE) is a platform enabling consumers to make a direct ACH payment for e-commerce purchases, enabled by the local clearinghouse, ACH Colombia.

Capabilities

PSE
Min. amount1600 COP
Max. expiration time supported7 days
Notification delayImmediate
RefundsYes
FlowREDIRECT

UX Flow

For the payment to proceed, the user needs to select their bank. You can display the bank selector page either through dLocal or within your own integration

Bank selector page rendered by dLocal

The screenshots illustrate a generic PSE redirect flow.

The screenshots illustrate a generic PSE redirect flow.

Bank selector page rendered by merchant

To create your own bank selector page, first call the Search payment methods endpoint for Colombia:

Endpoint: GET https://api.dlocal.com/payments-methods?country=CO

API reference: Search payment methods

In the response, locate the Payment Method Object where id = "IO". This object contains the list of available PSE banks and their corresponding bank_id values. Use this list to render your bank selector page in your own UI.

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP Transaction currency.Yes
countryStringCO Transaction country in ISO 3166.Yes
payment_method_idStringPC ID of the selected payment method.Yes
payment_method_flowStringREDIRECTYes
payment_method_details.bank_idStringID of the bank selected by the customer. This value is used to redirect the customer to their respective bank page.Yes, for the bank selector page rendered by the merchant.
payer.nameStringName of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.documentStringDocument of the payer.Yes
order_idStringID of the capture given by the merchant in their system. Think of it as an external ID of the capture.No
notification_urlStringNotifications will be sent in every change of status of a payment to the notification_url specified by the merchant.No

Examples

Request example

Response example

Request example with bank ID

Response example with bank ID

{
  "amount": 1600,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "PC",
  "payment_method_flow": "REDIRECT",
  "payer": {
      "name": "Jane Doe",
      "email": "[email protected]",
      "document": "12345678",
      "address": {
          "country": "CO",
          "state": "Antioquia",
          "city": "Medellin",
          "zip_code": "8858",
          "street": "Av. Principal",
          "number": "5940"
        }
    },
  "order_id": "34545sk3483kqw0",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new",
  "callback_url": "http://merchantsite.com/success_page"
}
{
  "id": "R-4-3692f395-8bb4-4691-9254-97da09bc7dbc",
  "amount": 1600,
  "currency": "COP",
  "payment_method_id": "PC",
  "payment_method_type": "BANK_TRANSFER",
  "payment_method_flow": "REDIRECT",
  "country": "CO",
  "created_date": "2023-01-17T17:29:02.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "34545sk3483kqw0",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-continue/M-06dc6503-cb17-4e2e-980c-ce91f02c3e97"
}
{
  "amount": 1600,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "PC",
  "payment_method_flow": "REDIRECT",
  "payment_method_details": {
      "bank_id": "1051"
    },
  "payer": {
      "name": "Jane Doe",
      "email": "[email protected]",
      "document": "12345678",
      "address": {
          "country": "CO",
          "state": "Antioquia",
          "city": "Medellin",
          "zip_code": "8858",
          "street": "Av. Principal",
          "number": "5940"
        }
    },
  "order_id": "JXBP5KqC",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new",
  "callback_url": "http://merchantsite.com/success_page"
}
{
  "id": "R-4-x1kapb7h-nsd996g8d91sn1-6vt6qob3sjss",
  "amount": 1600,
  "currency": "COP",
  "payment_method_id": "PC",
  "payment_method_type": "BANK_TRANSFER",
  "payment_method_flow": "REDIRECT",
  "country": "CO",
  "created_date": "2025-08-25T18:35:29.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "JXBP5KqC",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/N-d81b3a8a-ca6b-4b2d-84d7-333780fe6a6b"
}

Bancolombia

Bancolombia is one of the biggest banks in the country, with thousands of collection points throughout the country where the user can pay their bills using cash.

Capabilities

Bancolombia
Min. amount100 COP
Max. expiration time supported5 days
Notification delayImmediate
RefundsYes
FlowREDIRECT

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP Transaction currency.Yes
countryStringCO Transaction country in ISO 3166.Yes
payment_method_idStringBN ID of the selected payment method.Yes
payment_method_flowStringREDIRECTYes
payer.nameStringName of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.documentStringDocument of the payer.Yes
order_idStringID of the capture given by the merchant in their system. Think of it as an external ID of the capture.No
notification_urlStringNotifications will be sent in every change of status of a payment to the notification_url specified by the merchant.No

Examples

Request example

Response example

{
    "amount": 1000,
    "currency": "COP",
    "country": "CO",
    "payment_method_id": "BN",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "[email protected]",
        "document": "12345678",
        "address": {
            "country": "CO",
            "state": "Antioquia",
            "city": "Medellin",
            "zip_code": "8858",
            "street": "Av. Principal",
            "number": "5940"
        }
    },
    "order_id": "34545sk3483kqw0",
    "description": "Tshirt",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "http://merchantsite.com/success_page"
}
{
    "id": "R-4-9f359a37-621c-423b-b552-6d464fe890dd",
    "amount": 1000,
    "currency": "COP",
    "payment_method_id": "BN",
    "payment_method_type": "BANK_TRANSFER",
    "payment_method_flow": "REDIRECT",
    "country": "CO",
    "created_date": "2023-06-22T17:51:17.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "34545sk3483kqw0",
    "description": "Tshirt",
    "notification_url": "http://merchantsite.com/notification/new",
    "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/M-d58deef7-df79-4b94-96d1-e664b4652881"
}

Example ticket

Bancolombia UI built with the information in the example above.

Bancolombia UI built with the information in the example above.

Nequi Push (QP)

ℹ️

Nequi product family

QP supports both one-shot payments and tokenized recurring payments / subscriptions. The two flows use different request shapes — see below. If you need a QR-based one-shot experience instead, use MQ (Nequi Mixed — Push + QR) or QR (Nequi QR scan).

Nequi is a widely used payment method in Colombia that enables people to send and receive money through their mobile phones. QP uses a push notification sent to the user's Nequi app — the user approves or rejects directly in the app, with no browser redirect involved.

How it works

QP uses a push notification flow — no redirect URL is returned, for both one-shot and recurring flows:

  1. The merchant creates a payment with payment_method_id: "QP" and payment_method_flow: "REDIRECT".
  2. dLocal sends a push notification to the user's Nequi app using payer.phone.
  3. The user approves or rejects in the Nequi app. No browser redirect occurs.
  4. dLocal confirms the result via webhook to notification_url.
ℹ️

No redirect URL, anywhere in QP

None of the QP flows — one-shot, enrollment, or recurring — return a redirect_url. Display a "waiting for approval" state in your UI while the push notification is pending. The user has approximately 15 minutes to respond before the request expires.

Capabilities

Nequi Push (QP) — One-shotNequi Push (QP) — Recurring
Min. amount100 COP100 COP
Max. expiration time supported15 minutes (push approval window)15 minutes (enrollment push approval window)
Notification delayImmediateImmediate
RefundsYesYes
TokenizationNoYes
FlowREDIRECT (single payment, no token created)REDIRECT (enrollment) → DIRECT (recurring charge)
Recurring charge responseN/ASynchronous PAID
payment_method_idQPQP

UX Flow

Push notification

The screenshots illustrate a generic Nequi push notification redirect flow.

The screenshots illustrate a generic Nequi push notification flow.

Automatic debit (recurring)

The screenshots illustrate a generic Nequi automatic debit redirect flow.

The screenshots illustrate a generic Nequi automatic debit (recurring charge) flow.


QP — One-shot

A single payment with no token or enrollment created. The request includes an empty wallet object ("wallet": {}) to distinguish it from the legacy tokenized save flow.

ℹ️

Empty wallet object

Send "wallet": {} to indicate a one-shot payment. This distinguishes the request from the legacy wallet.save: true tokenization flow — there is no separate payment_method_id for QP one-shot.

curl -X POST \
   -H 'X-Date: {X-Date}' \
   -H 'X-Login: {X-Login}' \
   -H 'X-Trans-Key: {X-Trans-Key}' \
   -H 'Content-Type: application/json' \
   -H 'X-Version: 2.1' \
   -H 'Authorization: V2-HMAC-SHA256, Signature: {Signature}' \
   -d '{body}'
   https://api.dlocal.com/payments

{
  "amount": 15000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "QP",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "wallet": {},
  "order_id": "ord-co-qp-oneshot-001",
  "notification_url": "http://merchantsite.com/notifications"
}
{
  "id": "R-4-4f8a2b1c-9d3e-4567-890a-bcdef1234567",
  "amount": 15000,
  "currency": "COP",
  "payment_method_id": "QP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "country": "CO",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "ord-co-qp-oneshot-001",
  "notification_url": "http://merchantsite.com/notifications"
}
{
  "id": "R-4-4f8a2b1c-9d3e-4567-890a-bcdef1234567",
  "amount": 15000,
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "QP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "order_id": "ord-co-qp-oneshot-001",
  "notification_url": "http://merchantsite.com/notifications",
  "created_date": "2025-06-01T10:00:00.000+0000"
}
ℹ️

No redirect URL

See No redirect URL, anywhere in QP above — the same applies to this one-shot request.


QP — Recurring

Enrollment — Enrollment API (New)

Do not start new integrations on the legacy wallet token model

New integrations must use the Enrollment API flows documented below. The legacy wallet.save / wallet.token model is supported for existing merchants only. See Nequi Push — Legacy if you are maintaining an existing legacy integration.

The Enrollment API for QP supports two patterns:

PatternWhen to use
Enrollment only (POST /enrollments)Establish the user's authorization without an initial charge.
Payment + Enrollment in the same request (POST /payments with enrollment object)Charge the user and establish the authorization simultaneously.

Once the enrollment is ACTIVE, all subsequent charges are made via POST /payments using enrollment.id inside an enrollment object, with payment_method_flow: "DIRECT". Recurring charges return synchronous PAID — no webhook is needed to confirm final status.

Pattern 1 — Enrollment only
curl -X POST \
   -H 'X-Date: {X-Date}' \
   -H 'X-Login: {X-Login}' \
   -H 'X-Trans-Key: {X-Trans-Key}' \
   -H 'Content-Type: application/json' \
   -H 'X-Version: 2.1' \
   -H 'Authorization: V2-HMAC-SHA256, Signature: {Signature}' \
   -d '{body}'
   https://api.dlocal.com/enrollments

{
  "currency": "COP",
  "country": "CO",
  "type": "ON_DEMAND",
  "payment_method_id": "QP",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "external_id": "sub-co-jane-001",
  "description": "Nequi subscription enrollment",
  "notification_url": "http://merchantsite.com/notifications"
}
{
  "id": "E-4-7a2b1c3d-4e5f-6789-abcd-ef0123456789",
  "external_id": "sub-co-jane-001",
  "currency": "COP",
  "country": "CO",
  "type": "ON_DEMAND",
  "payment_method_id": "QP",
  "payment_method_flow": "REDIRECT",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "PENDING",
  "status_detail": "The enrollment is pending.",
  "status_code": "100",
  "notification_url": "http://merchantsite.com/notifications"
}
{
  "id": "E-4-7a2b1c3d-4e5f-6789-abcd-ef0123456789",
  "external_id": "sub-co-jane-001",
  "currency": "COP",
  "country": "CO",
  "type": "ON_DEMAND",
  "payment_method_id": "QP",
  "payment_method_flow": "REDIRECT",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "ACTIVE",
  "status_detail": "The enrollment is active.",
  "status_code": "200",
  "notification_url": "http://merchantsite.com/notifications"
}
ℹ️

No redirect URL

See No redirect URL, anywhere in QP above — the same applies to this enrollment request.

📘

Enrollment ID

Persist the id value when the webhook reaches ACTIVE status. This is your enrollment ID for all future recurring charges.

To check enrollment status at any time, use the Get enrollment endpoint.

To cancel an enrollment, use the Cancel an enrollment endpoint.

Enrollment status codes:

statusstatus_codeDescription
PENDING100Enrollment created. Push notification sent to user's Nequi app.
ACTIVE200User approved. Enrollment ID is ready for recurring charges.
CANCELLED400The enrollment was cancelled.
REJECTED300The user rejected or did not respond to the push notification.
Pattern 2 — Payment + Enrollment in the same request
curl -X POST \
   -H 'X-Date: {X-Date}' \
   -H 'X-Login: {X-Login}' \
   -H 'X-Trans-Key: {X-Trans-Key}' \
   -H 'Content-Type: application/json' \
   -H 'X-Version: 2.1' \
   -H 'Authorization: V2-HMAC-SHA256, Signature: {Signature}' \
   -d '{body}'
   https://api.dlocal.com/payments

{
  "amount": 15000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "QP",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "enrollment": {
    "external_id": "sub-co-jane-001",
    "type": "ON_DEMAND",
    "description": "Nequi subscription enrollment",
    "notification_url": "http://merchantsite.com/enrollment_notifications"
  },
  "order_id": "ord-co-jane-001",
  "notification_url": "http://merchantsite.com/payments",
  "callback_url": "http://merchantsite.com/callback"
}
{
  "id": "R-4-9f359a37-621c-6yt5-b552-6d464fe890dd",
  "amount": 15000,
  "currency": "COP",
  "payment_method_id": "QP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "country": "CO",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "ord-co-jane-001",
  "notification_url": "http://merchantsite.com/payments",
  "enrollment": {
    "id": "E-4-7a2b1c3d-4e5f-6789-abcd-ef0123456789",
    "external_id": "sub-co-jane-001",
    "created_date": "2025-06-01T10:00:00.000+0000",
    "status": "PENDING",
    "status_detail": "The enrollment is pending.",
    "status_code": "100"
  }
}
{
  "id": "E-4-7a2b1c3d-4e5f-6789-abcd-ef0123456789",
  "external_id": "sub-co-jane-001",
  "currency": "COP",
  "country": "CO",
  "type": "ON_DEMAND",
  "payment_method_id": "QP",
  "payment_method_flow": "REDIRECT",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "ACTIVE",
  "status_detail": "The enrollment is active.",
  "status_code": "200",
  "notification_url": "http://merchantsite.com/enrollment_notifications"
}
{
  "id": "R-4-9f359a37-621c-6yt5-b552-6d464fe890dd",
  "amount": 15000,
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "QP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "enrollment": {
    "id": "E-4-7a2b1c3d-4e5f-6789-abcd-ef0123456789",
    "external_id": "sub-co-jane-001"
  },
  "order_id": "ord-co-jane-001",
  "notification_url": "http://merchantsite.com/payments",
  "created_date": "2025-06-01T10:00:00.000+0000"
}
📘

Single request, dual outcome

This request produces two independent asynchronous notifications — one for the enrollment (sent to enrollment.notification_url) and one for the payment (sent to notification_url). They may arrive in any order. Persist enrollment.id only after the enrollment notification reaches ACTIVE. Grant entitlement only after the payment notification reaches PAID.

Recurring charges

Once the enrollment is ACTIVE, charge the user by passing enrollment.id inside an enrollment object. No push notification is sent to the user. The synchronous response is the final status — no webhook is needed.

curl -X POST \
   -H 'X-Date: {X-Date}' \
   -H 'X-Login: {X-Login}' \
   -H 'X-Trans-Key: {X-Trans-Key}' \
   -H 'Content-Type: application/json' \
   -H 'X-Version: 2.1' \
   -H 'Authorization: V2-HMAC-SHA256, Signature: {Signature}' \
   -d '{body}'
   https://api.dlocal.com/payments

{
  "amount": 15000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "QP",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "enrollment": {
    "id": "E-4-7a2b1c3d-4e5f-6789-abcd-ef0123456789"
  },
  "order_id": "ord-co-jane-jul-2025",
  "notification_url": "http://merchantsite.com/notifications"
}
{
  "id": "D-4-b2c8d5e1-3f7a-4c9b-a123-7d8e9f0a1b2c",
  "amount": 15000,
  "currency": "COP",
  "payment_method_id": "QP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "DIRECT",
  "country": "CO",
  "created_date": "2025-07-01T10:00:00.000+0000",
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "order_id": "ord-co-jane-jul-2025",
  "notification_url": "http://merchantsite.com/notifications"
}
📘

Synchronous PAID for recurring charges

Unlike enrollment (which is async), QP recurring DIRECT charges return the final PAID or REJECTED status synchronously. You do not need to wait for a webhook before granting entitlement.

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP. Transaction currency.Yes
countryStringCO. Transaction country in ISO 3166.Yes
payment_method_idStringQP. ID of the selected payment method.Yes
payment_method_flowStringREDIRECT (enrollment) or DIRECT (recurring charge).Yes
payer.nameStringName of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.documentStringDocument of the payer.Yes
payer.phoneStringNequi-registered phone number. Must be 10 digits and start with 3 (e.g., 3400100083).Yes — mandatory for QP
order_idStringID given by the merchant in their system.No
notification_urlStringdLocal sends notifications for every status change to this URL.Yes
enrollment.idStringEnrollment ID from a previous active enrollment, passed as enrollment.id inside an enrollment object. For recurring charges.Yes, for recurring charges

POST /enrollments fields (Pattern 1):

PropertyTypeDescriptionMandatory?
typeStringMust be ON_DEMAND for QP.Yes
external_idStringYour internal identifier for the enrollment. Appears in enrollment webhooks.Yes
notification_urlStringURL where dLocal sends enrollment status notifications.Yes

enrollment object fields on POST /payments (Pattern 2):

PropertyTypeDescriptionMandatory?
enrollmentObjectInclude in POST /payments for Pattern 2 (payment + enrollment simultaneously).Yes, for Pattern 2
enrollment.external_idStringYour internal identifier for the enrollment. Appears in all enrollment webhooks.Yes
enrollment.typeStringMust be ON_DEMAND for QP.Yes
enrollment.notification_urlStringURL where dLocal sends enrollment status notifications.Yes

Token lifecycle and cancellation

One token per user per merchant. Each user has one active enrollment at a time with a given merchant. If a user re-enrolls, the new enrollment replaces the previous one. Any charge against the old enrollment returns status_code 328.

Merchant cancellation. Call the Cancel an enrollment endpoint to cancel an active enrollment programmatically.

User cancellation — no webhook. Users can cancel their Nequi subscription directly from the Nequi app. dLocal does not receive a proactive cancellation notification from Nequi. Your integration discovers the cancellation when the next DIRECT charge attempt returns status_code 328. Stop all future charges against that enrollment and trigger a new enrollment flow.

Rejection codes:

status_codeDescriptionRetriable?
300Payment rejected by the user or push notification expiredNo — trigger new enrollment or retry with user consent
302Insufficient funds in Nequi walletNo — user must top up
328Invalid enrollment — cancelled or replaced by a new oneNo — stop using this enrollment. Trigger re-enrollment.

Nequi Push — Legacy

Legacy integration

The wallet.save / wallet.token flow below is supported for existing merchants only. New integrations must use the Enrollment API described above.

Legacy request parameters
PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP Transaction currency.Yes
countryStringCO Transaction country in ISO 3166.Yes
payment_method_idStringQP ID of the selected payment method.Yes
payment_method_flowStringDIRECT (For tokenized payments) or REDIRECTYes
payer.nameStringName of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.documentStringDocument of the payer.Yes
payer.phoneStringPhone number of the user (Nequi-registered phone number).Yes
wallet.saveBooleanSet to true to receive a wallet.token in the asynchronous webhook response. This token can be used for future tokenized payments. Default false.No
wallet.captureBooleanWhether to immediately capture the payment. When false, the payment issues an authorization that must be captured later via a separate API call. Default true.Yes, for Subscriptions
wallet.verifyBooleanSet to true to only enroll/verify the wallet without creating a payment (amount must be 0). Used to obtain a token for future recurring charges. Default false.Yes, for Subscriptions
wallet.usernameStringUsername of the payer's wallet account.No
wallet.emailStringEmail of the payer's wallet account.No
device.typeStringIndicates the type of device/environment the payment is initiated from. Possible values: WEB or MOBILE_APP.No (Recommended)
wallet.tokenStringToken received from a previous successful payment where wallet.save was true. Use this to charge the wallet directly without redirect. Required when payment_method_flow = DIRECT.No
order_idStringID of the capture given by the merchant in their system. Think of it as an external ID of the capture.No
notification_urlStringNotifications will be sent in every change of status of a payment to the notification_url specified by the merchant.No
Legacy enrollment (one-shot with token save)
{
    "amount": 1000,
    "currency": "COP",
    "country": "CO",
    "payment_method_id": "QP",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "[email protected]",
        "document": "12345678",
        "phone": "3400100083",
        "address": {
            "country": "CO",
            "state": "Antioquia",
            "city": "Medellin",
            "zip_code": "8858",
            "street": "Av. Principal",
            "number": "5940"
        }
    },
    "wallet": {
        "save": true,
        "username": "jane_doe",
        "email": "[email protected]"
    },
    "device": {
        "type": "MOBILE_APP"
    },
    "order_id": "34545sk3483kqw0",
    "description": "Tshirt",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "http://merchantsite.com/success_page"
}
{
    "id": "R-4-9f359a37-621c-6yt5-b552-6d464fe890dd",
    "amount": 1000,
    "currency": "COP",
    "payment_method_id": "QP",
    "payment_method_type": "WALLET",
    "payment_method_flow": "REDIRECT",
    "country": "CO",
    "created_date": "2023-01-17T17:51:17.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "34545sk3483kqw0",
    "description": "Tshirt",
    "notification_url": "http://merchantsite.com/notification/new"
}
{
    "id": "R-4-9f359a37-621c-6yt5-b552-6d464fe890dd",
    "amount": 1000,
    "status": "PAID",
    "status_detail": "The payment was paid.",
    "status_code": "200",
    "currency": "COP",
    "country": "CO",
    "payment_method_id": "QP",
    "payment_method_type": "WALLET",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Jane Doe",
        "user_reference": "",
        "email": "[email protected]",
        "phone": "3400100083",
        "document": "12345678"
    },
    "wallet": {
        "token": "<WALLET_TOKEN>"
    },
    "order_id": "34545sk3483kqw0",
    "description": "Tshirt",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "http://merchantsite.com/success_page",
    "created_date": "2023-01-17T17:51:17.000+0000"
}
Legacy recurring charge
{
    "amount": 2500,
    "currency": "COP",
    "country": "CO",
    "payment_method_id": "QP",
    "payment_method_flow": "DIRECT",
    "payer": {
        "name": "Jane Doe",
        "email": "[email protected]",
        "document": "12345678",
        "phone": "3400100083"
    },
    "wallet": {
        "token": "<WALLET_TOKEN>"
    },
    "order_id": "67890xyz",
    "description": "Monthly subscription",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "http://merchantsite.com/success_page"
}
{
    "id": "D-4-b2c8d5e1-3f7a-4c9b-a123-7d8e9f0a1b2c",
    "amount": 2500,
    "currency": "COP",
    "payment_method_id": "QP",
    "payment_method_type": "WALLET",
    "payment_method_flow": "DIRECT",
    "country": "CO",
    "created_date": "2023-02-15T10:30:00.000+0000",
    "status": "PAID",
    "status_detail": "The payment was paid.",
    "status_code": "200",
    "order_id": "67890xyz",
    "description": "Monthly subscription",
    "notification_url": "http://merchantsite.com/notification/new"
}

Nequi Mixed — Push + QR (MQ)

ℹ️

This is a one-shot payment method only. MQ does not support tokenization or recurring payments. For recurring Nequi payments, use QP.

Nequi Mixed (MQ) is a one-shot wallet payment method in Colombia that presents the user with two simultaneous payment options: a push notification to their Nequi app and a QR code displayed in a redirect page. The user can complete the payment through either option — whichever they complete first finalizes the transaction.

This dual-channel approach is best suited for checkout environments where users may be on desktop (QR scan) or mobile (push notification), without knowing which in advance.

How it works

  1. The merchant creates a payment with payment_method_id: "MQ" and payment_method_flow: "REDIRECT".
  2. dLocal returns a redirect_url.
  3. The merchant redirects the user to redirect_url. The page displays a QR code. Simultaneously, dLocal sends a push notification to the user's Nequi app via payer.phone.
  4. First option to complete wins:
    • If the user approves via push notification, the QR code is automatically invalidated.
    • If the user scans and pays via QR, the push notification is cancelled.
  5. dLocal sends a webhook to notification_url with the final PAID status. See extra_info.approving_payment_method_id below for how to identify which channel completed the payment.
⚠️

Duplicate completion handling

In rare cases where both legs complete simultaneously, dLocal automatically refunds the duplicate. No merchant action is required for the duplicate refund, but merchants with extra IPN info enabled should track extra_info.approving_payment_method_id in the webhook for reconciliation.

Capabilities

Nequi Mixed — Push + QR (MQ)
Min. amount100 COP
Max. expiration time supportedConfigurable (shared by both options)
Notification delayImmediate
RefundsYes
Tokenization / RecurringNo — one-shot only
FlowREDIRECT
payment_method_idMQ

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP. Transaction currency.Yes
countryStringCO. Transaction country in ISO 3166.Yes
payment_method_idStringMQ. ID of the selected payment method.Yes
payment_method_flowStringREDIRECT.Yes
payer.nameStringName of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.documentStringDocument of the payer.Yes
payer.phoneStringNequi-registered phone number. Must be 10 digits and start with 3. Required for the push notification option.Yes
order_idStringID given by the merchant in their system.No
notification_urlStringdLocal sends notifications for every status change to this URL.Yes
callback_urlStringURL where the user is returned after completing or cancelling the payment in the redirect page.No

Examples

{
  "amount": 15000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "MQ",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "order_id": "ord-co-mq-001",
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback"
}
{
  "id": "R-4-a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "amount": 15000,
  "currency": "COP",
  "payment_method_id": "MQ",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "country": "CO",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "ord-co-mq-001",
  "notification_url": "http://merchantsite.com/notifications",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/M-a1b2c3d4-..."
}
{
  "id": "R-4-a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "amount": 15000,
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "MQ",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678",
    "phone": "3400100083"
  },
  "extra_info": {
    "approving_payment_method_id": "QR"
  },
  "order_id": "ord-co-mq-001",
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback",
  "created_date": "2025-06-01T10:00:00.000+0000"
}
📘

extra_info.approving_payment_method_id

Identify which channel completed the payment via extra_info.approving_payment_method_id in the webhook:

  • QR — the user scanned and paid via QR code.
  • QP — the user approved via push notification.

This field is only present if extra IPN info is enabled on your account. Contact your dLocal account team to enable it. Without it, the webhook will not include extra_info, and you cannot distinguish which leg completed the payment from the notification alone.

Capture this field for reconciliation and refund routing.

Expiration and cancellation

Expiration: Both the push notification and QR code share the same configurable expiration timer. If neither option is completed before expiry, both expire simultaneously and the payment moves to REJECTED.

Merchant cancellation: If the merchant cancels an MQ payment, dLocal cancels both the push and QR options simultaneously.

No tokenization: MQ does not generate a wallet.token or enrollment ID. Each MQ payment is independent.


Nequi QR

Nequi QR is a payment method in Colombia that allows you to make transactions by scanning a QR code with the Nequi app. It is fast, secure, and does not require cash or cards.

🚧

Country context for QR

In Colombia, payment_method_id: "QR" routes to Nequi QR. In Ecuador, the same code routes to DeUna — not Nequi. Always include country: "CO" in your request when integrating Nequi QR to avoid routing to the wrong provider.

Capabilities

Nequi QR
Min. amount1 COP
Max. expiration time supported45 minutes
Notification delayImmediate
RefundsYes
Tokenization / RecurringNo — one-shot only
FlowDIRECT REDIRECT

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP Transaction currency.Yes
countryStringCO Transaction country in ISO 3166.Yes
payment_method_idStringQR ID of the selected payment method.Yes
payment_method_flowStringDIRECT or REDIRECTYes
payer.nameStringName of the payer.No
payer.emailStringEmail of the payer.No
payer.documentStringDocument of the payer.Yes
order_idStringID of the capture given by the merchant in their system.No
notification_urlStringNotifications will be sent in every change of status of a payment to the notification_url specified by the merchant.Yes

Examples

Request example

Response example

Asynchronous notification

{
  "amount": 60,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "QR",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "phone": "123456789",
    "address": {
      "country": "CO",
      "state": "Antioquia",
      "city": "Medellin",
      "zip_code": "8858",
      "street": "Av. Principal",
      "number": "5940"
    },
    "document": "123456789"
  },
  "callback_url": "http://merchantsite.com/success_page",
  "order_id": "123456789",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new"
}
{
    "id": "D-4-c15a67cb-9eec-4ded-9ce1-559ec5f09816",
    "amount": 60,
    "currency": "COP",
    "payment_method_id": "QR",
    "payment_method_type": "TICKET",
    "payment_method_flow": "DIRECT",
    "country": "CO",
    "bank_transfer": {},
    "ticket": {
        "type": "CUSTOM",
        "expiration_date": "2024-12-16T04:59:59.000+0000",
        "image_url": "https://pay.dlocal.com/gmf-apm/payments/M-5ae6c703-ed66-4610-a142-caa0a3f41123",
        "qr_code": "bancadigital-C001-27837-10000000025"
    },
    "created_date": "2024-12-10T14:19:40.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "90096c2e-4cf1-4431-bda6-9776a7453da9",
    "notification_url": "http://merchantsite.com/notification/new"
}
{
  "id": "D-4-c15a67cb-9eec-4ded-9ce1-559ec5f09816",
  "amount": 60,
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "QR",
  "payment_method_type": "TICKET",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "phone": "123456789",
    "document": "123456789"
  },
  "order_id": "90096c2e-4cf1-4431-bda6-9776a7453da9",
  "description": "Tshirt",
  "notification_url": "http://merchantsite.com/notification/new",
  "callback_url": "http://merchantsite.com/success_page",
  "created_date": "2024-12-10T14:19:40.000+0000"
}

Example ticket

Nequi QR UI built with the information in the example above.

Nequi QR UI built with the information in the example above.

Mercado Pago

dLocal offers two Mercado Pago products in Co:

  • MY — Mercado Pago Checkout Pro: one-shot payments only. The user completes payment through a Mercado Pago-hosted redirect. No enrollment or tokenization.
  • MP — Mercado Pago Wallet Connect: recurring and tokenized payments. The user authorizes the merchant once via a redirect enrollment, and all subsequent charges are made directly using the enrollment ID.
ℹ️

Wallet Connect activation

Mercado Pago Wallet Connect (MP) requires activation per merchant per country. Contact your dLocal account team before integrating the recurring flow.


Mercado Pago Checkout Pro (MY)

Mercado Pago Checkout Pro is a one-shot wallet payment. The user is redirected to Mercado Pago to complete the payment. No token or enrollment is created.

Capabilities

Mercado Pago Checkout Pro (MY)
Min. amount100 COP
Max. expiration time supported5 minutes (authentication)
Notification delayImmediate
RefundsYes
FlowREDIRECT

UX Flow

The screenshots illustrate a Mercado Pago one-shot payment redirect flow. The specifics of the flow may vary depending on the payment method selected to complete the payment.

The screenshots illustrate a Mercado Pago one-shot payment redirect flow. The specifics of the flow may vary depending on the payment method selected to complete the payment.

How to process Mercado Pago Checkout Pro payments?

Learn how to process one-shot wallet payments with dLocal in our Wallet payments section.


Mercado Pago Wallet Connect (MP)

Mercado Pago Wallet Connect is the recurring and tokenized wallet product. The user authorizes the merchant once through a redirect enrollment. All subsequent charges use the enrollment ID directly — no redirect or re-authentication required.

Capabilities

Mercado Pago Wallet Connect (MP)
Min. amount100 COP
Max. expiration time supported5 minutes (authentication)
Notification delayImmediate
RefundsYes
Enrollment flowREDIRECT
Recurring charge flowDIRECT — synchronous PAID

UX Flow

The screenshots illustrate a Mercado Pago tokenized wallet redirect flow.

The screenshots illustrate a Mercado Pago tokenized wallet redirect flow.

How it works

The Enrollment API for MP supports two patterns:

PatternWhen to use
Enrollment only (POST /enrollments)Establish the user's authorization without an initial charge.
Payment + Enrollment in the same request (POST /payments with enrollment object)Charge the user and establish the authorization simultaneously.

Once the enrollment is ACTIVE, all subsequent charges are made via POST /payments using enrollment.id inside an enrollment object, with payment_method_flow: "DIRECT". Recurring DIRECT charges return a synchronous PAID response — no webhook is needed to confirm final status.

ℹ️

Enrollment type for Mercado Pago

Always send "type": "ON_DEMAND" for MP. This is the only valid enrollment type for Mercado Pago Wallet Connect.


Pattern 1 — Enrollment only

Use POST /enrollments to establish the user's authorization without an initial charge.

{
  "external_id": "enroll-co-001",
  "type": "ON_DEMAND",
  "country": "CO",
  "currency": "COP",
  "payment_method_id": "MP",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678"
  },
  "notification_url": "https://merchantsite.com/enrollment_notifications",
  "callback_url": "https://merchantsite.com/enrollment_callback"
}
{
  "id": "E-4-32e1218f-b6ec-3f21-13d5-50v12ere2ca4",
  "external_id": "enroll-co-001",
  "country": "CO",
  "currency": "COP",
  "type": "ON_DEMAND",
  "payment_method_id": "MP",
  "payment_method_flow": "REDIRECT",
  "payment_method_type": "WALLET",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "PENDING",
  "status_detail": "The enrollment is pending.",
  "status_code": "100",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/M-a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "notification_url": "https://merchantsite.com/enrollment_notifications"
}
{
  "id": "E-4-32e1218f-b6ec-3f21-13d5-50v12ere2ca4",
  "external_id": "enroll-co-001",
  "country": "CO",
  "currency": "COP",
  "type": "ON_DEMAND",
  "payment_method_id": "MP",
  "payment_method_flow": "REDIRECT",
  "payment_method_type": "WALLET",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "ACTIVE",
  "status_detail": "The enrollment is active.",
  "status_code": "200",
  "notification_url": "https://merchantsite.com/enrollment_notifications"
}
📘

Enrollment ID

Persist the id value (e.g., E-4-32e1218f-...) when the webhook reaches ACTIVE status. Pass it as enrollment.id inside an enrollment object on all future recurring charge requests.

To check enrollment status at any time, use the Get enrollment endpoint.

To cancel an enrollment, use the Cancel an enrollment endpoint.

Enrollment status codes:

statusstatus_codeDescription
PENDING100Enrollment created. User must complete authorization via the redirect URL.
ACTIVE200User approved. Enrollment ID is ready for recurring charges.
CANCELLED400The enrollment was cancelled.
REJECTED300The user did not complete or declined the authorization.

Pattern 2 — Payment + Enrollment in the same request

Include an enrollment object in POST /payments to create the first charge and enrollment simultaneously.

{
  "amount": 15000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "MP",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678"
  },
  "enrollment": {
    "external_id": "enroll-co-001",
    "type": "ON_DEMAND",
    "notification_url": "https://merchantsite.com/enrollment_notifications",
    "callback_url": "https://merchantsite.com/enrollment_callback"
  },
  "order_id": "ord-co-001",
  "notification_url": "https://merchantsite.com/payments",
  "callback_url": "https://merchantsite.com/payment_callback"
}
{
  "id": "F-4-9a8b7c6d-5e4f-3a2b-1c0d-ef1234567890",
  "amount": 15000,
  "currency": "COP",
  "payment_method_id": "MP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "country": "CO",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "ord-co-001",
  "notification_url": "https://merchantsite.com/payments",
  "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/M-b2c3d4e5-...",
  "enrollment": {
    "id": "E-4-32e1218f-b6ec-3f21-13d5-50v12ere2ca4",
    "external_id": "enroll-co-001",
    "created_date": "2025-06-01T10:00:00.000+0000",
    "status": "PENDING",
    "status_detail": "The enrollment is pending.",
    "status_code": "100"
  }
}
{
  "id": "E-4-32e1218f-b6ec-3f21-13d5-50v12ere2ca4",
  "external_id": "enroll-co-001",
  "country": "CO",
  "currency": "COP",
  "type": "ON_DEMAND",
  "payment_method_id": "MP",
  "payment_method_flow": "REDIRECT",
  "payment_method_type": "WALLET",
  "created_date": "2025-06-01T10:00:00.000+0000",
  "status": "ACTIVE",
  "status_detail": "The enrollment is active.",
  "status_code": "200",
  "notification_url": "https://merchantsite.com/enrollment_notifications"
}
{
  "id": "F-4-9a8b7c6d-5e4f-3a2b-1c0d-ef1234567890",
  "amount": 15000,
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "MP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "REDIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678"
  },
  "enrollment": {
    "id": "E-4-32e1218f-b6ec-3f21-13d5-50v12ere2ca4",
    "external_id": "enroll-co-001"
  },
  "order_id": "ord-co-001",
  "notification_url": "https://merchantsite.com/payments",
  "created_date": "2025-06-01T10:00:00.000+0000"
}
📘

Single request, dual outcome

This request produces two independent asynchronous notifications — one for the enrollment (sent to enrollment.notification_url) and one for the payment (sent to notification_url). They may arrive in any order. Persist enrollment.id only after the enrollment notification reaches ACTIVE. Grant entitlement only after the payment notification reaches PAID.


Recurring charges

Once the enrollment is ACTIVE, charge the user by passing enrollment.id inside an enrollment object. The synchronous response is the final status — no webhook is needed.

{
  "amount": 15000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "MP",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "document": "12345678"
  },
  "enrollment": {
    "id": "E-4-32e1218f-b6ec-3f21-13d5-50v12ere2ca4"
  },
  "order_id": "ord-co-recurring-001",
  "notification_url": "https://merchantsite.com/payments"
}
{
  "id": "F-4-b2c8d5e1-3f7a-4c9b-a123-7d8e9f0a1b2c",
  "amount": 15000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "MP",
  "payment_method_type": "WALLET",
  "payment_method_flow": "DIRECT",
  "created_date": "2025-07-01T10:00:00.000+0000",
  "status": "PAID",
  "status_detail": "The payment was paid.",
  "status_code": "200",
  "order_id": "ord-co-recurring-001",
  "notification_url": "https://merchantsite.com/payments"
}
📘

Synchronous PAID for recurring charges

MP recurring DIRECT charges return the final PAID or REJECTED status synchronously. You do not need to wait for a webhook before granting entitlement.

ℹ️

result_info

The recurring charge response may include a result_info object with user_id and sub_payment_method fields for reconciliation purposes. This field requires enablement — contact your dLocal account team to activate it.


Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP. Transaction currency.Yes
countryStringCO. Transaction country.Yes
payment_method_idStringMP. ID of the selected payment method.Yes
payment_method_flowStringREDIRECT (enrollment) or DIRECT (recurring charge).Yes
payer.nameStringName of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.documentStringDocument of the payer.Yes
enrollment.idStringEnrollment ID from a previous active enrollment, passed as enrollment.id inside an enrollment object.Yes, for recurring charges
enrollmentObjectInclude in POST /payments for Pattern 2 (payment + enrollment simultaneously).Yes, for Pattern 2
enrollment.external_idStringYour internal identifier for the enrollment.Yes
enrollment.typeStringMust be ON_DEMAND for MP.Yes
enrollment.notification_urlStringURL where dLocal sends enrollment status notifications.Yes
enrollment.callback_urlStringURL where the user lands after completing the enrollment redirect.No
wallet.deviceIdStringDevice fingerprint for anti-fraud. Recommended for all MP integrations. See Device ID for the web script and mobile SDK fingerprint structure.Recommended
order_idStringID given by the merchant in their system.No
notification_urlStringdLocal sends notifications for every status change to this URL.Yes
callback_urlStringURL where the user lands after completing the enrollment redirect.No

Cancellation and invalid enrollment

Mercado Pago Wallet Connect supports cancellation from both sides:

User-initiated cancellation: The user can cancel their authorization directly from the Mercado Pago app. When this happens, Mercado Pago sends a cancellation notification to dLocal, which expires the saved authorization internally and sends a cancel-wallet IPN to the merchant with status: "CANCELLED". Treat this webhook as the signal to stop any scheduled charges against that enrollment.

Merchant-initiated cancellation: The merchant can cancel an active enrollment at any time using the Cancel an enrollment endpoint.

In both cases, treat a cancelled enrollment as a terminal state. The user must complete a new enrollment flow before any future recurring charges can be processed.


Bre-B

Bre-B is a payment method in Colombia that enables transactions by scanning a QR code or copying paste a Key (account alias) using any bank's mobile app or digital wallet. The keys are dynamic per transaction and the payment gets refunded to the payer if the amount does not match the original transaction.

It is a secure, real-time payment system developed by Colombia's central bank.

Capabilities

Bre-B QR/Key
Min. amount1 COP
Notification delayImmediate
RefundsYes, by payment links.
FlowDIRECT REDIRECT
Expiration time10 minutes

Overall flow

UX Flow

The screenshots illustrate a generic Bre-B flow.

The screenshots illustrate a generic Bre-B flow.

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP Transaction currency.Yes
countryStringCO Transaction country in ISO 3166.Yes
payment_method_idStringEV ID of the selected payment method.Yes
payment_method_flowStringDIRECT or REDIRECTYes
payer.nameStringName of the payer.No
payer.emailStringEmail of the payer.No
payer.phoneStringPhone of the payer.No
payer.documentNumberDocument of the payer.Yes
order_idNumberID of the capture given by the merchant in their system.No
notification_urlStringNotifications will be sent in every change of status of a payment to the notification_url specified by the merchant.Yes

Examples

Request example

Response example

Example asynchronous webhook

{
  "amount": 1000,
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "EV",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "phone": "3832696773",
    "document": "1234567"
  },
  "order_id": "5346523564",
  "notification_url": "http://merchantsite.com/notifications",
  "callback_url": "http://merchantsite.com/callback"
}
{
  "id": "D-4-c15a67cb-9eec-4ded-9ce1-559ec5f09816",
  "amount": 1000,
  "currency": "COP",
  "payment_method_id": "EV",
  "payment_method_type": "TICKET",
  "payment_method_flow": "DIRECT",
  "country": "CO",
  "ticket": {
    "type": "CUSTOM",
    "number": "@TESTKEY01",
    "expiration_date": "2026-12-10T14:29:49.000+0000",
    "image_url": "https://pay.dlocal.com/gmf-apm/payments/M-5ae6c703-ed66-4610-a142-caa0a3f41123",
    "qr_code": "0002010102125303170540410005802CO59046009BOGOTA_DC9021C001-73813-1000691825"
  },
  "created_date": "2026-12-10T14:19:40.000+0000",
  "status": "PENDING",
  "status_detail": "The payment is pending.",
  "status_code": "100",
  "order_id": "5346523564",
  "notification_url": "http://merchantsite.com/notification/new"
}
{
  "id": "D-4-c15a67cb-9eec-4ded-9ce1-559ec5f09816",
  "amount": 1000,
  "status": "PAID",
  "status_detail": "The payment was paid",
  "status_code": "200",
  "currency": "COP",
  "country": "CO",
  "payment_method_id": "EV",
  "payment_method_type": "TICKET",
  "payment_method_flow": "DIRECT",
  "payer": {
    "name": "Jane Doe",
    "email": "[email protected]",
    "phone": "3832696773",
    "document": "1234567"
  },
  "order_id": "5346523564",
  "notification_url": "http://merchantsite.com/notification/new",
  "callback_url": "http://merchantsite.com/callback",
  "created_date": "2026-12-10T14:19:40.000+0000"
}

Addi

Addi is Colombia's leading Buy Now Pay Later (BNPL) method. Customers pay in installments (2 to 6 months) without a credit card. Addi evaluates credit in real time during checkout. The merchant receives funds upfront — Addi assumes the credit risk. No card chargebacks; refunds via standard dLocal Refunds API.

Capabilities

Addi
Min. amount50,000 COP
Max. amount5,000,000 COP (configurable)
Notification delayImmediate (24h callback retry)
RefundsYes, Partial and Multiple Partial.
FlowREDIRECT
Expiration time30 minutes

UX Flow

This screenshot illustrate a generic flow from an existing user

This screenshot illustrate a generic flow from an existing user

Installment plans

Addi offers flexible installment options that the customer selects during checkout. The available plans depend on the customer's credit profile as evaluated by Addi in real time.

PlanPlan Monthly Payment
1-3 months0% (some shoppers might bear interests)
3 to 24 monthsInterest-bearing

Request parameters

PropertyTypeDescriptionMandatory?
amountNumberAmount to be charged.Yes
currencyStringCOP Transaction currency.Yes
countryStringCO Transaction country in ISO 3166.Yes
payment_method_idStringAD ID of the selected payment method.Yes
payment_method_flowStringREDIRECTYes
payer.nameStringName of the payer.Yes
payer.last_nameStringSurname of the payer.Yes
payer.emailStringEmail of the payer.Yes
payer.phoneStringPhone of the payer. including country code +57Yes
payer.documentStringPayer's Cédula de Ciudadanía number.Yes
payer.document_typeStringCC (Cédula de Ciudadanía).Yes
payer.address.countryStringCO Country of the payer.No
payer.address.cityStringCity of the payer.No
payer.address.streetStringStreet of the payer.No
order_idNumberID of the capture given by the merchant in their system.Yes
notification_urlStringNotifications will be sent in every change of status of a payment to the notification_url specified by the merchant.Yes
callback_urlStringURL to redirect the customer after completing or canceling the payment.Yes
descriptionStringDescription of the items purchased.No
payer.user_referenceStringURL to redirect the customer after completing or canceling the payment.No
payer.device_idStringUser's unique device identifier.No

Examples

Request Example

Synchronous response

Asynchronous response

{
    "amount": 255000,
    "currency": "COP",
    "country": "CO",
    "payment_method_id": "AD",
    "payment_method_flow": "REDIRECT",
    "payer": {
        "name": "Marcela Griselda",
        "last_name": "Lopez Lopez",
        "email": "[email protected]",
        "phone": "+573211236584",
        "document": "555061079",
        "document_type": "CC",
        "address": {
            "country": "CO",
            "city": "Bogotá D.C",
            "street": "cr 48 156 25 25"
        }
    },
    "order_id": "<merchant_order_uid>",
    "notification_url": "http://merchantsite.com/notification/new",
    "callback_url": "https://merchantsite.com/callback"
}
{
    "id": "R-4-70b68e57-ab12-42e7-af95-e0833358d62f",
    "amount": 255000,
    "currency": "COP",
    "payment_method_id": "AD",
    "payment_method_type": "TICKET",
    "payment_method_flow": "REDIRECT",
    "country": "CO",
    "created_date": "2026-03-04T14:09:53.000+0000",
    "status": "PENDING",
    "status_detail": "The payment is pending.",
    "status_code": "100",
    "order_id": "<merchant_order_uid>",
    "redirect_url": "https://pay.dlocal.com/gmf-apm/payments-redirect/M-f7c634d9-3d05-4658-abee-4d29305e4d85"
}
{
    "id": "R-4-70b68e57-ab12-42e7-af95-e0833358d62f",
    "amount": 255000,
    "currency": "COP",
    "payment_method_id": "AD",
    "payment_method_type": "TICKET",
    "payment_method_flow": "REDIRECT",
    "country": "CO",
    "created_date": "2026-03-04T14:09:53.000+0000",
    "status": "PAID",
    "status_detail": "The payment was paid.",
    "status_code": "200",
    "order_id": "<merchant_order_uid>"
}


Did this page help you?