Yape
Con el Checkout API de Mercado Pago, es posible ofrecer pagos con Yape. Con este medio de pago, el comprador genera un código OTP (One-time password) directamente en la aplicación Yape, que el integrador convierte en un token seguro para completar la transacción, sin redireccionamiento externo y sin necesidad de tarjeta física.
A diferencia de los medios de pago diferidos, el Yape se procesa de forma síncrona cuando la order se crea en modo automático, es decir, la respuesta a la creación de la order ya incluye el resultado final del pago, confirmando la transacción en tiempo real.
Si ya tienes el entorno de desarrollo configurado y quieres ofrecer Yape 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. En el caso de pagos con Yape, la elección del modo de procesamiento de la order se reflejará directamente en cómo proceder si es necesario cancelar el pago.
Para recibir pagos, es necesario agregar en el frontend un formulario que capture el número de celular y el OTP que el comprador genera en la aplicación Yape.
Si ya tienes un desarrollo que incluye un formulario de pago propio, asegúrate de incluir Yape entre las opciones de pago que deseas ofrecer, como se indica a continuación, y continúa con el paso Crear token Yape.
En caso de que aún no tengas un formulario de pago, agrega el modelo a continuación a tu proyecto e incluye el identificador de Yape como opción a ser ofrecida.
| Medio de pago | payment_method_id |
| Yape | yape |
html<form id="form-checkout" action="/process_payment" method="post"> <div> <label for="payerPhone">Número de celular</label> <input id="form-checkout__payerPhone" name="payerPhone" type="text" /> </div> <div> <label for="payerOTP">OTP</label> <input id="form-checkout__payerOTP" name="payerOTP" type="text" /> </div> <div> <button type="submit">Pagar con Yape</button> </div> </form>
El token Yape se crea a partir del número de celular y del código OTP (One-Time Password) informados en la solicitud, lo que aumenta la seguridad durante el flujo de pago. Una vez que el token es utilizado en una compra determinada, este es descartado, siendo necesaria la creación de uno nuevo para futuras compras.
Puedes crearlo con MercadoPago.js o mediante una llamada directa a la API.
Con MercadoPago.js ya agregado e inicializado según la sección Configurar ambiente de desarrollo, captura los datos del formulario y crea el token con el método mp.yape.
javascriptconst form = document.getElementById("form-checkout"); form.addEventListener("submit", async (event) => { event.preventDefault(); const otp = document.getElementById("form-checkout__payerOTP").value; const phoneNumber = document.getElementById("form-checkout__payerPhone").value; const yape = mp.yape({ otp, phoneNumber }); const yapeToken = await yape.create(); // Envía yapeToken.id a tu servidor para crear la order. });
En este flujo, MercadoPago.js genera el requestId automáticamente.
El envío del pago debe realizarse mediante la creación de 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.
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": "100.00", "payer": { "email": "test_user_pe@testuser.com", "entity_type": "individual", "identification": { "type": "DNI", "number": "12345678" }, "phone": { "area_code": "51", "number": "987654321" } }, "transactions": { "payments": [ { "amount": "100.00", "payment_method": { "id": "yape", "type": "debit_card", "token": "{{YOUR_YAPE_TOKEN}}" } } ] } }'
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.Consulta en la tabla a continuación las descripciones de los parámetros que son obligatorios en la solicitud y de aquellos que, aunque sean opcionales, tienen alguna particularidad importante de destacar.
| 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 y que es utilizada en el backend. Puedes acceder a ella a través de 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. Esta clave garantiza que cada solicitud sea procesada solo una vez, evitando duplicidades. 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. Los valores posibles son: - automatic: para crear y procesar la order en modo automático. - manual: para crear la order y procesarla posteriormente. Para más información, accede a la sección Modelo de integración. | Obligatorio |
total_amount | Body. String | Valor total de la transacción. Debe ser mayor que 0. El límite máximo por transacción puede ser de S/ 500, S/ 900 o S/ 2000, según el límite configurado en la aplicación Yape. | Obligatorio |
payer.email | Body. String | E-mail del comprador. | Obligatorio |
payer.identification.type | Body. String | Tipo de documento del comprador. Para Perú: DNI, entre otros. | Opcional |
payer.identification.number | Body. String | Número de identificación del comprador. | Opcional |
payer.phone.area_code | Body. String | Código de área del teléfono del comprador. Para Perú, utiliza 51. | Obligatorio |
payer.phone.number | Body. String | Número de teléfono del comprador asociado a Yape. | Obligatorio |
transactions.payments.payment_method.id | Body. String | Identificador del medio de pago. El valor deberá ser yape. | Obligatorio |
transactions.payments.payment_method.type | Body. String | Tipo del medio de pago. El valor deberá ser debit_card. | Obligatorio |
transactions.payments.payment_method.token | Body. String | Token Yape generado en el paso anterior y de uso único. Genera un nuevo token en cada intento de pago. | Obligatorio |
Al crear la order con éxito, recibirás una respuesta con status: processed y status_detail: accredited, indicando que el pago fue aprobado.
json{ "id": "ORDPE01EXAMPLEPE1234NCAKKBF68N64S", "type": "online", "processing_mode": "automatic", "external_reference": "ext_ref_1234", "total_amount": "100.00", "total_paid_amount": "100.00", "country_code": "PER", "user_id": "1234567890", "status": "processed", "status_detail": "accredited", "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", "reference_id": "1234567890", "amount": "100.00", "paid_amount": "100.00", "status": "processed", "status_detail": "accredited", "payment_method": { "id": "yape", "type": "debit_card" } } ] } }
Como el Yape se procesa de forma síncrona cuando la order se crea en modo automático, no hay redireccionamiento del comprador. Entre los parámetros devueltos, se destacan los indicados en la tabla a continuación.
| Parámetro | Tipo | Descripción |
transactions.payments.status | String | Devuelve el status de la transacción. En este caso, devolverá processed para indicar que el pago fue procesado, o failed en caso de haber sido rechazado. |
transactions.payments.status_detail | String | Detalle del status de la transacción. En este caso, el valor obtenido es accredited, indicando que el pago fue aprobado. |
transactions.payments.paid_amount | String | Valor efectivamente pagado en la transacción. |
Dependiendo del modo en que se cree la order (automático o manual), un pago con Yape puede procesarse de dos formas distintas y, en consecuencia, su cancelación también. Consulta a continuación cómo proceder en cada una de las situaciones:
- Modo automático: la order se crea en modo automático y el pago con Yape se procesa de forma síncrona (
status=processed). Con esto, la respuesta a la creación de la order ya traerá el resultado final del pago, no siendo posible cancelarlo cuando es aprobado (status_detail=accredited). En ese caso, será necesario realizar un proceso de reembolso a través de una solicitud al endpoint de /v1/orders/{order_id}/refundPOST. - Modo manual: la order se crea en modo manual y el procesamiento del pago requiere una etapa adicional (
status=action_required) en el endpoint de Procesar orderPOST. En ese caso, antes de procesar el pago será posible cancelarlo a través de una solicitud al endpoint de /v1/orders/{order_id}/cancelPOST.
Para obtener más información, consulta la sección Reembolsos y cancelaciones.