PagoEfectivo ATM
Con Checkout API de Mercado Pago, también puedes ofrecer pagos con PagoEfectivo ATM para compradores en Perú. Con este medio de pago, el comprador realiza un pago diferido en cajeros automáticos (ATM) y puntos de pago de la red PagoEfectivo. El comprador recibe un código de referencia (CIP) y un código de verificación para completar el pago en el terminal, dentro del plazo de vencimiento definido por el integrador. La compra se considera completada solo tras la confirmación del pago.
Si ya tienes el entorno de desarrollo configurado y quieres ofrecer PagoEfectivo ATM como medio de pago, sigue los pasos a continuación.
processing_mode. Para más información, accede a la sección Modelo de integración.Para recibir pagos con PagoEfectivo ATM, es necesario agregar al frontend un formulario que capture los datos del pagador de forma segura.
Si ya tienes un formulario de pago, asegúrate de incluir PagoEfectivo ATM entre las opciones disponibles como se indica a continuación y continúa con el paso Enviar pago.
| Medio de pago | payment_method_id |
| PagoEfectivo ATM | pagoefectivo_atm |
html<form id="form-checkout" action="/process_payment" method="post"> <div> <label for="payerFirstName">Nombre</label> <input id="form-checkout__payerFirstName" name="payerFirstName" type="text"> </div> <div> <label for="payerLastName">Apellido</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">Tipo de documento</label> <select id="form-checkout__identificationType" name="identificationType"></select> </div> <div> <label for="identificationNumber">Número del documento</label> <input id="form-checkout__identificationNumber" name="identificationNumber" type="text"> </div> <div> <input type="hidden" name="transactionAmount" id="transactionAmount" value="200"> <button type="submit">Pagar</button> </div> </form>
Los datos de nombre, apellido e identificación son opcionales para PagoEfectivo ATM. Si optas por recopilar la identificación, obtén los tipos de documento dinámicamente con MercadoPago.js ya configurado en el entorno de desarrollo.
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); }
El envío del pago se realiza creando una order que contenga la transacción de pago asociada.
Para eso, envía una solicitud con tu Access Token de pruebaClave privada de la aplicación creada en Mercado Pago, utilizada en el backend. Accede a ella en Tus integraciones > Datos de integración > Pruebas > Credenciales de prueba. El Access Token de prueba comienza con el prefijo `APP_USR`. y los parámetros indicados a continuación al endpoint /v1/ordersPOST y ejecuta la solicitud.
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": "Compra de producto MPE", "payer": { "email": "test_user_pe@testuser.com", "first_name": "Juan", "last_name": "Pérez", "identification": { "type": "DNI", "number": "12345678" } }, "transactions": { "payments": [ { "amount": "200.00", "expiration_time": "P1D", "payment_method": { "id": "pagoefectivo_atm", "type": "atm" } } ] } }'
429 Too Many Requests, espera el tiempo indicado en el header Retry-After de la respuesta antes de intentar nuevamente. Consulta Posibles errores para más detalles.| Parámetro | Tipo | Descripción | Obligatoriedad |
Authorization | Header | Hace referencia a tu clave privada, el Access Token de pruebaClave privada de la aplicación creada en Mercado Pago, utilizada en el backend. Accede a ella en Tus integraciones > Datos de integración > Pruebas > Credenciales de prueba. El Access Token de prueba comienza con el prefijo `APP_USR`.. | Obligatorio |
X-Idempotency-Key | Header | Clave de idempotencia. Garantiza que cada solicitud sea procesada solo una vez. Usa un valor exclusivo en el header de la solicitud, como un UUID V4 o una string aleatoria. | Obligatorio |
processing_mode | Body. String | Modo de procesamiento de la order: automatic para crear y procesar automáticamente, o manual para procesar en una etapa separada. Para más información, accede a Modelo de integración. | Obligatorio |
total_amount | Body. String | Monto total de la transacción. | Obligatorio |
description | Body. String | Descripción del pedido. Aparece en el comprobante de pago que se muestra al comprador en el terminal ATM. Mínimo 1 y máximo 150 caracteres. | Obligatorio para pagoefectivo_atm |
payer.email | Body. String | E-mail del comprador. | Obligatorio |
payer.first_name | Body. String | Nombre del comprador. | Opcional |
payer.last_name | Body. String | Apellido del comprador. | Opcional |
payer.identification.type | Body. String | Tipo de documento del comprador, obtenido dinámicamente con mp.getIdentificationTypes(). | Opcional |
payer.identification.number | Body. String | Número de documento del comprador. | Opcional |
transactions.payments.payment_method.id | Body. String | Identificador del medio de pago. En este caso, el valor debe ser pagoefectivo_atm. | Obligatorio |
transactions.payments.payment_method.type | Body. String | Tipo del medio de pago. En este caso, el valor debe ser atm. | Obligatorio |
transactions.payments.expiration_time | Body. String | Plazo de vencimiento en formato de duración ISO 8601. Si bien puedes configurarlo entre 1 y 30 días luego de la creación del pago, recomendamos definir entre P1D y P3D para evitar conflictos entre el vencimiento y la acreditación del pago, que puede demorar hasta 2 horas hábiles desde su realización. En caso de que el pago se efectúe luego de la fecha de vencimiento establecida, el valor será devuelto a la cuenta de Mercado Pago del pagador. | Opcional |
La creación del pago ocurre de forma asíncrona en la order. Mientras se procesa, la order se devuelve con el estado processing y sin información.
Una vez finalizado el procesamiento, y al tratarse de un medio de pago offline, la order pasa al estado action_required con el detalle waiting_payment, indicando que el comprador aún debe completar el pago en el terminal ATM, tal como se muestra en el siguiente ejemplo de respuesta. Te recomendamos configurar las notificaciones del tópico Order para recibir actualizaciones sobre el cambio de estado, incluyendo los datos actualizados de la order. Alternativamente, puedes optar por enviar una solicitud al endpoint /v1/orders/{id}GET para consultar el estado actualizado.
json{ "id": "ORDPE01EXAMPLEPE1234NCAKKBF68N64S", "type": "online", "processing_mode": "automatic", "external_reference": "ext_ref_1234", "description": "Compra de producto 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" } } ] } }
Tras crear la order, muestra al comprador la información necesaria para completar el pago en un terminal ATM de la red PagoEfectivo. Estos datos están disponibles en los campos payment_method de la respuesta.
| Campo | Descripción |
ticket_url | URL con las instrucciones completas de pago. Redirige o muestra este enlace al comprador. |
verification_code | Código de verificación que el comprador usa en el terminal ATM. |
reference | Número de referencia CIP de la transacción. |
financial_institution | Red de pago. Retorna "PagoEfectivo". |
El comprador debe utilizar el verification_code y el reference en el terminal ATM para completar el pago dentro del plazo de vencimiento definido en date_of_expiration.
Una vez que el comprador realice el pago, la order pasa a status: processed. Si configuraste tus notificaciones, esto te será notificado vía webhook.
Si lo deseas, puedes cancelar un pago creado, siempre y cuando se encuentre pendiente o en proceso; es decir, con status=action_required.
Adicionalmente, recomendamos cancelar los pagos que no fueron realizados dentro de la fecha de vencimiento establecida, para evitar problemas de facturación y conciliación.
Para obtener más información, consulta la sección Reembolsos y cancelaciones.