Enlaces de vinculación
Con Links de vinculación, los vendedores generan un link seguro y lo comparten con el comprador para que este vincule su tarjeta a un perfil de pagos automáticos, sin que el vendedor maneje datos sensibles de tarjeta en ningún momento. La captura y tokenización de los datos de la tarjeta es gestionada íntegramente por Mercado Pago.
Cuando el comprador abre el link de vinculación, recorre el siguiente flujo gestionado íntegramente por Mercado Pago:
- Introducción: el pagador ve una pantalla de bienvenida que le indica que registre su tarjeta para que el vendedor pueda realizar el cobro.
- Ingreso de datos de la tarjeta: el pagador completa el formulario seguro de Mercado Pago con el número de tarjeta, vencimiento, código de seguridad, nombre del titular y documento.
- Éxito: si el proceso se completa correctamente, el pagador ve una confirmación y el link pasa al estado
vinculated. - Error de tarjeta: si los datos son inválidos o la tarjeta es rechazada, el pagador puede corregirlos y reintentar. El link permanece en estado
created. - Link inactivo: si el link expiró, ya fue utilizado o fue cancelado, el pagador ve un mensaje de error indicando que el link no es válido.
customer_id y un profile_id ya creados. Consulta la documentación de Clientes y la documentación de Perfiles de Pago para completar estos pasos previos.Envía una solicitud a /v1/payment-method-enrollmentsPOST utilizando el APP_ACCESS_TOKENAccess Token de producción de la aplicación del integrador. Disponible en Tus integraciones > Credenciales de producción. de producción para generar el link que compartirás con el comprador.
Parámetros
| Parámetro | Tipo | Requerido | Descripción | Ejemplo |
profile_id | String | Sí | ID del perfil de pagos automáticos asociado al comprador. Solo acepta caracteres alfanuméricos. Solo puede existir un link activo por perfil. | 7036b192b541454fa9b9990660dfa1b5 |
expiration_time | String | No | Tiempo de validez del link en formato ISO 8601. Mínimo: P1D. Máximo: P90D. Valor por defecto: P7D. | P7D |
curl -X POST \
'https://api.mercadopago.com/v1/payment-method-enrollments' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'X-Idempotency-Key: 0d5020ed-1af6-469c-ae06-c3bec19954bb' \
-H 'Content-Type: application/json' \
-d '{
"profile_id": "7036b192b541454fa9b9990660dfa1b5",
"expiration_time": "P7D"
}'
Si la solicitud es exitosa, recibirás una respuesta 201 Created con el siguiente body:
json{ "id": "bea0ffb8-6c94-40a3-bc31-c2e7a0d46ed7", "profile_id": "7036b192b541454fa9b9990660dfa1b5", "enrollment_link": "https://mpago.la/1alzDGT", "state": "created", "expiration_time": "P7D", "expired_date": "2026-06-05T17:11:41.000-03:00", "created_date": "2026-05-29T17:11:41.000-03:00", "last_update_date": "2026-05-29T17:11:41.000-03:00" }
Guarda el valor de id para consultar el estado del link. El valor de enrollment_link es la URL que debes compartir con el comprador.
Errores posibles
| HTTP | Código | Causa |
| 400 | enrollment_link.profile_id_invalid_format | El profile_id contiene caracteres no alfanuméricos o está vacío. |
| 400 | enrollment_link.expiration_time_invalid_format | El expiration_time no cumple con el formato ISO 8601. Ejemplo correcto: P7D. |
| 400 | enrollment_link.expiration_time_out_of_range | La duración es menor a 1 día o mayor a 90 días. |
| 401 | enrollment_link.unauthorized | Access Token ausente o inválido. |
| 404 | enrollment_link.profile_not_found | El profile_id no existe en Automatic Payments. |
| 404 | enrollment_link.resource_not_found | El profile_id existe pero no pertenece al vendedor autenticado. |
| 409 | enrollment_link.conflict | Ya existe un link de vinculación activo para este profile_id. Cancela el anterior antes de crear uno nuevo. |
| 500 | enrollment_link.internal_error | Error interno. Reintenta la solicitud. |
Comparte el valor de enrollment_link con el comprador por el canal que prefieras: WhatsApp, email, SMS u otro. El comprador abre la URL en su navegador, completa el formulario de Mercado Pago con los datos de su tarjeta y la tarjeta queda vinculada al perfil. El vendedor no participa de este paso ni accede a los datos de la tarjeta.
expired_date de la respuesta a su creación, el estado pasará automáticamente a expired.En lugar de consultar el estado del link mediante llamados a la API, puedes recibir notificaciones en tiempo real. Cuando el comprador vincula su tarjeta exitosamente, Automatic Payments envía un webhook con el cambio de estado del perfil a READY.
Para configurar las notificaciones:
- Accede a Tus integraciones en el Panel del Desarrollador y selecciona tu aplicación.
- Accede a Webhooks y registra la URL HTTPS de tu endpoint receptor. El endpoint debe responder con
200en menos de 22 segundos. - Activa el evento Perfil de Pago (
payment_profile). - Copia la clave secreta generada para validar la firma
x-signaturede cada notificación entrante.
Cuando el comprador vincula su tarjeta exitosamente, recibirás un webhook con el siguiente payload:
json{ "id": "7036b192b541454fa9b9990660dfa1b5", "type": "payment_profile", "action": "payment_profile.updated", "version": 1, "live_mode": true, "data": { "status": "ready", "payment_methods": [{ "unique_id": "pm_001", "type": "credit_card", "status": "ready", "card_id": 9453094596 }] } }
El campo version es un contador incremental por perfil. Procesa siempre la notificación con mayor version y descarta las anteriores si llegan fuera de orden.
GET /v1/customers/{customerId}/payment-profiles/{id} después de recibir la notificación.Para conocer más sobre el formato de las notificaciones y cómo validar la firma, consulta nuestra documentación de Webhooks.
Envía una solicitud a /v1/payment-method-enrollments/{id}GET incluyendo el id del link en el path para verificar si el comprador completó la vinculación.
curl -X GET \
'https://api.mercadopago.com/v1/payment-method-enrollments/bea0ffb8-6c94-40a3-bc31-c2e7a0d46ed7' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
Si el comprador completó la vinculación, recibirás una respuesta 200 OK con el siguiente cuerpo:
json{ "id": "bea0ffb8-6c94-40a3-bc31-c2e7a0d46ed7", "profile_id": "7036b192b541454fa9b9990660dfa1b5", "enrollment_link": "https://mpago.la/1alzDGT", "state": "vinculated", "expiration_time": "P7D", "expired_date": "2026-06-05T17:11:41.000-03:00", "created_date": "2026-05-29T17:11:41.000-03:00", "last_update_date": "2026-05-29T18:02:14.000-03:00" }
Cuando state es vinculated, la tarjeta ya está registrada en el perfil y lista para usar en cobros automáticos.
Estados posibles del link
| Estado | Descripción |
created | Link generado y activo. El comprador aún no completó el formulario. |
vinculated | El comprador completó el proceso. La tarjeta está vinculada al perfil. |
cancelled | El vendedor canceló el link antes de que el comprador lo utilizara. |
expired | El link venció sin que el comprador completara el proceso. |
error | Ocurrió un error durante el proceso de vinculación. |
Los estados vinculated, cancelled, expired y error son terminales: una vez alcanzados, el link no puede transicionar a ningún otro estado.
Escenarios del GET
| Escenario | Estado del link | Resultado esperado |
| Link recién creado | created | 200 — state: created |
| Comprador completó el formulario | vinculated | 200 — state: vinculated |
| Link cancelado por el vendedor | cancelled | 200 — state: cancelled |
| Link vencido | expired | 200 — state: expired |
Errores posibles
| HTTP | Código | Causa |
| 400 | enrollment_link.bad_request | El id no tiene formato UUID válido. |
| 401 | enrollment_link.unauthorized | Access Token ausente o inválido. |
| 404 | enrollment_link.resource_not_found | El link no existe o no pertenece al vendedor autenticado. |
| 500 | enrollment_link.internal_error | Error interno. |
Envía una solicitud a /v1/payment-method-enrollments/{id}DELETE incluyendo el id del link en el path para desactivarlo antes de que el comprador lo use. Solo pueden cancelarse links en estado created.
curl -X DELETE \
'https://api.mercadopago.com/v1/payment-method-enrollments/bea0ffb8-6c94-40a3-bc31-c2e7a0d46ed7' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
Una respuesta 204 No Content confirma que el link fue cancelado. Verifica el resultado con un GET: state pasará a cancelled.
Errores posibles
| HTTP | Código | Causa |
| 401 | enrollment_link.unauthorized | Access Token ausente o inválido. |
| 404 | enrollment_link.resource_not_found | El link no existe o no pertenece al vendedor autenticado. |
| 409 | enrollment_link.invalid_state_transition | El link está en estado vinculated, expired o error y no puede cancelarse. |
| 500 | enrollment_link.internal_error | Error interno. |
Usa las credenciales de pruebaDisponibles en el Panel del Desarrollador, en Tus integraciones > Credenciales de prueba. de tu cuenta de Mercado Pago para validar el flujo sin procesar transacciones reales.
Requisitos previos
- Obtén tu
APP_ACCESS_TOKENde test en Tus integraciones > Credenciales de prueba. - Obtén tarjetas de prueba para simular escenarios de aprobación y rechazo en nuestra documentación de tarjetas de prueba.
- Crea un cliente de prueba con un email en formato
xxxx@testuser.com. - Crea un Perfil de Pago a partir del
customer_idde ese cliente de prueba.
Escenarios — POST /v1/payment-method-enrollments
| Escenario | Solicitud | Resultado esperado |
| Crear link con validez por defecto (7 días) | {"profile_id": "{PROFILE_ID}"} | 201 — state: created, enrollment_link comienza con https://mpago.la/ |
Crear link con expiration_time explícito | {"profile_id": "{PROFILE_ID}", "expiration_time": "P7D"} | 201 — expired_date equivale a 7 días desde ahora |
expiration_time mínimo válido | "expiration_time": "P1D" | 201 |
expiration_time máximo válido | "expiration_time": "P90D" | 201 |
profile_id con caracteres especiales | "profile_id": "abc!@#" | 400 — enrollment_link.profile_id_invalid_format |
profile_id vacío | "profile_id": "" | 400 — enrollment_link.profile_id_invalid_format |
| Formato ISO 8601 inválido | "expiration_time": "7D" | 400 — enrollment_link.expiration_time_invalid_format |
| Duración menor a 1 día | "expiration_time": "PT23H59M59S" | 400 — enrollment_link.expiration_time_out_of_range |
| Duración mayor a 90 días | "expiration_time": "P100D" | 400 — enrollment_link.expiration_time_out_of_range |
| Ya existe un link activo para el mismo perfil | Segundo POST con el mismo profile_id | 409 — enrollment_link.conflict |
profile_id inexistente en AP | profile_id no registrado | 404 — enrollment_link.profile_not_found |
profile_id de otro vendedor | profile_id perteneciente a otro vendedor | 404 — enrollment_link.resource_not_found |
| Sin autenticación | Sin header Authorization | 401 — enrollment_link.unauthorized |
Escenarios — GET /v1/payment-method-enrollments/{id}
| Escenario | Estado del link | Resultado esperado |
| Link recién creado | created | 200 — state: created |
| Comprador completó el formulario | vinculated | 200 — state: vinculated |
| Link cancelado por el vendedor | cancelled | 200 — state: cancelled |
| Link vencido | expired | 200 — state: expired |
| Error durante la vinculación | error | 200 — state: error |
| ID con formato inválido (no UUID) | — | 400 — enrollment_link.bad_request |
| Link no encontrado o de otro vendedor | — | 404 — enrollment_link.resource_not_found |
Escenarios — DELETE /v1/payment-method-enrollments/{id}
| Escenario | Estado del link | Resultado esperado |
| Cancelar link activo | created | 204 — GET posterior retorna state: cancelled |
| Cancelar link ya vinculado | vinculated | 409 — enrollment_link.invalid_state_transition |
| Cancelar link vencido | expired | 409 — enrollment_link.invalid_state_transition |
| Cancelar link con error | error | 409 — enrollment_link.invalid_state_transition |
| Link no encontrado | — | 404 — enrollment_link.resource_not_found |