Skip to content
PandaPayLens

dLocal

Adapter 0.1.0, documentation reviewed 2026-10-25. Overall status: limited.

Capabilities

Error decodinglimited
API response parsingsupported
Webhook / notification parsinglimited
Timelinelimited
Event correlationsupported
Diagnostic ruleslimited

Supported input

FormatDescriptionStatus
dlocal.payins.paymentPayins API (X-Version 2.1) payment object (status, status_code, status_detail) from POST /payments, POST /secure_payments, GET /payments/{id}, capture and cancel responses, and the payment notificationsupported
dlocal.payins.refundRefund object (payment_id, order_refund_id, amount_refunded, status, status_code) from POST /refunds, GET /refunds/{id} and the refund notificationlimited
dlocal.payins.chargebackChargeback notification and object (payment_id, chargeback_date, reason_code, status, status_code)limited
dlocal.api_errorHTTP error envelope (code, message, param) shared by the Payins API and Payouts v3; the code tables differ per familylimited
dlocal.payouts_v3.payoutPayouts v3 (X-Version 3.0) payout object (status, status_code, status_detail, on_hold, last_updated) from GET /payouts/v3 and the payout notificationlimited
dlocal.payins.callbackBrowser callback_url POST (paymentId, status, date, signature); dLocal says not to use its status as final (recognized but not analyzed)unsupported
dlocal.payouts_v2.notificationLegacy Payouts v2 form-encoded notification (cashout_id, status_reason, control) without a status field (recognized but not analyzed)unsupported
dlocal.platforms.notificationdLocal for Platforms notification envelope (event_type, account_id, payload); out of first scope (recognized but not analyzed)unsupported

Notification delivery

  • Repeated deliveries are recognized by none documented (notifications carry no event id, delivery id or event type); dLocal documents that notifications can be delivered more than once.
  • Delivery order: not documented by the provider.
  • dLocal retries Payins notifications until it gets a 2xx (hourly, then every 12 hours for 4 days) and says the same Payouts v3 notification may arrive several times. Each notification is a full snapshot of the payment, refund, chargeback or payout object without an event id, so compare the object's id, status and status_code (and last_updated for payouts) with what you stored, make the handler idempotent, and retrieve the object from dLocal before acting on a snapshot that looks older.

Known limitations

  • Notifications carry no event id, delivery id or event type, so no delivery key is set and repeated deliveries are not reported as duplicates. Identical snapshots of one object are grouped by its id. The object kind (payment, refund, chargeback, payout) is inferred from its fields.
  • status_code is decoded only together with the object type: payment (statuses, pending sub-codes, 39 rejection codes), refund, chargeback and Payouts v3 (statuses and 21 rejection codes) each have their own table. A bare number is never decoded on its own.
  • An HTTP error body does not show whether it came from the Payins API (payments, refunds or saved cards) or from Payouts v3. A code listed by only one family or page is decoded with that meaning. Codes documented with different HTTP statuses (3001, 3003, 4001, 5009, 5010) are told apart when the HTTP status is supplied; the others with several documented meanings (for example 5007, 5008, 5011 to 5015, 5023, 5050) are shown with every meaning and lower confidence.
  • Payins objects carry created_date and approved_date but no status change time. approved_date is used for approved statuses and created_date otherwise, so two snapshots of one payment can share a time and keep input order. Delivery order is not documented and retries can deliver an older snapshot late. Payouts v3 use last_updated.
  • Cash vouchers, Pix and bank transfers stay PENDING until the payer pays; only the notification or a status query is final. An unpaid voucher ends as REJECTED 340.
  • A capture is a new payment with its own id and the authorization_id of the authorization; both ids link the events. Refunds and chargebacks link through payment_id. Merchant references (order_id, order_refund_id, original_order_id, external_id) are shown but never used to link events.
  • Chargeback reason codes depend on the card network, and the chargeback carries no card brand. Codes listed by several networks (for example Mexico and Elo 41, 74, 75, 80, 82, 85) are shown with every reading. chargeback_stage and processor_id values are not documented and are shown as supplied.
  • Refund rejections have no documented sub-codes, and status_code is an integer in some refund and chargeback examples and a string in others; both are accepted.
  • The raw network codes in the optional acquirer block (network_response_code) are not listed by dLocal and are shown as supplied. When a Mastercard merchant_advice_code is present, its retry advice takes precedence, as dLocal documents.
  • Payouts v3 amounts are not read: the documented field list names amount_details.debit without its structure. The payout flow diagrams are images only, and the Payouts v3 notification signature and retry count are not documented.
  • Not analyzed: the browser callback_url POST (dLocal says not to use its status as final), the legacy Payouts v2 form notification (no status field, status_reason values not documented) and dLocal for Platforms notifications are recognized only. Enrollment, dispute upload, account validation and sandbox tool responses are not recognized.
  • Signatures (Authorization V2-HMAC-SHA256, callback signature, Payouts v2 control, Payload-Signature, bearer tokens) are sensitive and never verified; a pasted notification is not treated as authentic. Only the presence of a signature header is shown.
  • Card data, payer and beneficiary names, local tax ids (CPF, CNPJ, CURP, RFC, DNI and others), bank accounts, Pix keys, 3D Secure values, ARNs, scheme references and notification URLs are never copied.
  • Category and retry guidance per code are PandaPayLens suggestions; dLocal's own advice (5052 retry later, the Mastercard merchant advice codes) is reflected. A request timeout (HTTP 504, code 5010) is shown as a conditional retry because the original outcome is unknown.

Examples

Provider documentation

PandaPayLens is not affiliated with dLocal. Pasted notifications are never treated as verified: PandaPayLens does not check webhook signatures.