PagoEfectivo ATM
With Mercado Pago's Checkout API, you can also offer payments with PagoEfectivo ATM for buyers in Peru. With this payment method, the buyer makes a deferred payment at ATMs and payment points of the PagoEfectivo network. The buyer receives a reference code (CIP) and a verification code to complete the payment at the terminal, within the expiration period defined by the integrator. The purchase is considered complete only after the payment is confirmed.
If you already have the development environment set up and want to offer PagoEfectivo ATM as a payment method, follow the steps below.
processing_mode parameter. For more information, visit the section Integration Model.To receive payments with PagoEfectivo ATM, add a form to the frontend that securely captures the payer's data.
If you already have a payment form, make sure to include PagoEfectivo ATM among the available options as shown below and continue to the Submit payment step.
| Payment method | payment_method_id |
| PagoEfectivo ATM | pagoefectivo_atm |
html<form id="form-checkout" action="/process_payment" method="post"> <div> <label for="payerFirstName">First name</label> <input id="form-checkout__payerFirstName" name="payerFirstName" type="text"> </div> <div> <label for="payerLastName">Last name</label> <input id="form-checkout__payerLastName" name="payerLastName" type="text"> </div> <div> <label for="email">E-mail</label> <input id="form-checkout__email" name="email" type="text"> </div> <div> <label for="identificationType">Document type</label> <select id="form-checkout__identificationType" name="identificationType"></select> </div> <div> <label for="identificationNumber">Document number</label> <input id="form-checkout__identificationNumber" name="identificationNumber" type="text"> </div> <div> <input type="hidden" name="transactionAmount" id="transactionAmount" value="200"> <button type="submit">Pay</button> </div> </form>
First name, last name, and identification data are optional for PagoEfectivo ATM. If you choose to collect identification data, retrieve the document types dynamically with MercadoPago.js already configured in the development environment.
javascript(async function getIdentificationTypes() { try { const identificationTypes = await mp.getIdentificationTypes(); const identificationTypeElement = document.getElementById("form-checkout__identificationType"); createSelectOptions(identificationTypeElement, identificationTypes); } catch (error) { return console.error("Error getting identificationTypes: ", error); } })(); function createSelectOptions(element, options, labelsAndKeys = { label: "name", value: "id" }) { const { label, value } = labelsAndKeys; element.options.length = 0; const fragment = document.createDocumentFragment(); options.forEach((option) => { const item = document.createElement("option"); item.value = option[value]; item.textContent = option[label]; fragment.appendChild(item); }); element.appendChild(fragment); }
Submit the payment by creating an order that contains the associated payment transaction.
To do this, send a request with your test Access TokenPrivate key for the application created in Mercado Pago, used in the backend. Access it at Your integrations > Integration data > Tests > Test credentials. The test Access Token starts with the `APP_USR` prefix. and the parameters listed below to the /v1/ordersPOST endpoint and run the request.
curlcurl --location --request POST 'https://api.mercadopago.com/v1/orders' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \ --header 'X-Idempotency-Key: {{SOME_UNIQUE_VALUE}}' \ --data-raw '{ "type": "online", "external_reference": "ext_ref_1234", "processing_mode": "automatic", "total_amount": "200.00", "description": "Product purchase MPE", "payer": { "email": "test_user_pe@testuser.com", "first_name": "John", "last_name": "Doe", "identification": { "type": "DNI", "number": "12345678" } }, "transactions": { "payments": [ { "amount": "200.00", "expiration_time": "P1D", "payment_method": { "id": "pagoefectivo_atm", "type": "atm" } } ] } }'
429 Too Many Requests error, wait the time indicated in the Retry-After response header before retrying. See Possible errors for more details.| Parameter | Type | Description | Required |
Authorization | Header | Refers to your private key, the test Access TokenPrivate key for the application created in Mercado Pago, used in the backend. Access it at Your integrations > Integration data > Tests > Test credentials. The test Access Token starts with the `APP_USR` prefix.. | Required |
X-Idempotency-Key | Header | Idempotency key. Ensures each request is processed only once. Use a unique value in the request header, such as a UUID V4 or a random string. | Required |
processing_mode | Body. String | Order processing mode: automatic to create and process automatically, or manual to process in a separate step. For more information, see Integration model. | Required |
total_amount | Body. String | Total transaction amount. | Required |
description | Body. String | Order description. Displayed on the payment receipt shown to the buyer at the ATM terminal. Minimum 1 and maximum 150 characters. | Required for pagoefectivo_atm |
payer.email | Body. String | Buyer's email address. | Required |
payer.first_name | Body. String | Buyer's first name. | Optional |
payer.last_name | Body. String | Buyer's last name. | Optional |
payer.identification.type | Body. String | Buyer's document type, retrieved dynamically with mp.getIdentificationTypes(). | Optional |
payer.identification.number | Body. String | Buyer's document number. | Optional |
transactions.payments.payment_method.id | Body. String | Payment method identifier. For this method, the value must be pagoefectivo_atm. | Required |
transactions.payments.payment_method.type | Body. String | Payment method type. For this method, the value must be atm. | Required |
transactions.payments.expiration_time | Body. String | Expiration period in ISO 8601 duration format. Although you can set it between 1 and 30 days after the payment is created, we recommend setting it between P1D and P3D to avoid conflicts between the expiration and the payment crediting, which can take up to 2 business hours after completion. If the payment is made after the established expiration date, the amount will be refunded to the payer's Mercado Pago account. | Optional |
The creation of the payment occurs asynchronously in the order. While it is being processed, the order is returned with a processing status and without information.
Once processing is complete, and since this is an offline payment method, the order transitions to action_required with the detail waiting_payment, indicating that the buyer still needs to complete the payment at the ATM terminal, as shown in the following response example. We recommend setting up Order topic notifications to receive updates on the status change, including the updated order data. Alternatively, you can choose to send a request to the /v1/orders/{id}GET endpoint to retrieve the updated status.
json{ "id": "ORDPE01EXAMPLEPE1234NCAKKBF68N64S", "type": "online", "processing_mode": "automatic", "external_reference": "ext_ref_1234", "description": "Product purchase MPE", "total_amount": "200.00", "total_paid_amount": "0.00", "country_code": "PER", "user_id": "1234567890", "status": "action_required", "status_detail": "waiting_payment", "capture_mode": "automatic_async", "currency": "PEN", "created_date": "2026-07-29T21:03:42.252Z", "last_updated_date": "2026-07-29T21:03:43.985Z", "integration_data": { "application_id": "1234567890123456" }, "transactions": { "payments": [ { "id": "PAYPE01EXAMPLEPE1234BSAR5ZWXX5YZG", "amount": "200.00", "expiration_time": "P1D", "date_of_expiration": "2026-07-30T03:59:59.999+00:00", "reference_id": "1234567890", "status": "action_required", "status_detail": "waiting_payment", "payment_method": { "id": "pagoefectivo_atm", "type": "atm", "ticket_url": "https://www.mercadopago.com.pe/payments/1234567890/ticket?caller_id=1234567890&payment_method_id=pagoefectivo_atm&payment_id=1234567890&payment_method_reference_id=1234567890&hash=00000000-0000-0000-0000-000000000000", "reference": "1234567890", "verification_code": "1234567890", "financial_institution": "PagoEfectivo" } } ] } }
After creating the order, display to the buyer the information needed to complete the payment at a PagoEfectivo ATM terminal. This data is available in the payment_method fields of the response.
| Field | Description |
ticket_url | URL with full payment instructions. Redirect or display this link to the buyer. |
verification_code | Verification code the buyer uses at the ATM terminal. |
reference | CIP reference number for the transaction. |
financial_institution | Payment network. Returns "PagoEfectivo". |
The buyer must use the verification_code and reference at the ATM terminal to complete the payment before the date_of_expiration deadline.
Once the buyer completes the payment, the order transitions to status: processed. If you have set up your notifications, you will be notified of this via webhook.
If you wish, you can cancel a payment created, as long as it is pending or in process; that is, with status=action_required.
Additionally, we recommend canceling payments that were not made by the established due date to avoid billing and reconciliation issues.
For more information, please consult the Refunds and cancellations section.