Links de vinculação
Com Links de vinculação, os vendedores geram um link seguro e o compartilham com o comprador para que ele vincule o cartão a um perfil de pagamentos automáticos, sem que o vendedor manipule dados sensíveis do cartão em nenhum momento. A captura e a tokenização dos dados do cartão são gerenciadas integralmente pelo Mercado Pago.
Quando o comprador abre o link de vinculação, percorre o seguinte fluxo gerenciado integralmente pelo Mercado Pago:
- Introdução: o pagador vê uma tela de boas-vindas que o instrui a cadastrar o cartão para que o vendedor possa realizar a cobrança.
- Inserção dos dados do cartão: o pagador preenche o formulário seguro do Mercado Pago com o número do cartão, data de vencimento, código de segurança, nome do titular e documento.
- Sucesso: se o processo for concluído com êxito, o pagador vê uma confirmação e o link passa para o estado
vinculated. - Erro de cartão: se os dados forem inválidos ou o cartão for recusado, o pagador pode corrigi-los e tentar novamente. O link permanece no estado
created. - Link inativo: se o link expirou, já foi utilizado ou foi cancelado, o pagador vê uma mensagem de erro indicando que o link não é mais válido.
customer_id e um profile_id já criados. Consulte a documentação de Clientes e a documentação de Perfis de Pagamento para concluir essas etapas anteriores.Envie uma requisição para /v1/payment-method-enrollmentsPOST utilizando o APP_ACCESS_TOKENAccess Token de produção da aplicação do integrador. Disponível em Suas integrações > Credenciais de produção. de produção para gerar o link que você compartilhará com o comprador.
Parâmetros
| Parâmetro | Tipo | Obrigatório | Descrição | Exemplo |
profile_id | String | Sim | ID do perfil de pagamentos automáticos associado ao comprador. Aceita apenas caracteres alfanuméricos. Só pode existir um link ativo por perfil. | 7036b192b541454fa9b9990660dfa1b5 |
expiration_time | String | Não | Tempo de validade do link no formato ISO 8601. Mínimo: P1D. Máximo: P90D. Valor padrão: 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"
}'
Se a requisição for bem-sucedida, você receberá uma resposta 201 Created com o seguinte 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" }
Salve o valor de id para consultar o estado do link posteriormente. O valor de enrollment_link é a URL que você deve compartilhar com o comprador.
Erros possíveis
| HTTP | Código | Causa |
| 400 | enrollment_link.profile_id_invalid_format | O profile_id contém caracteres não alfanuméricos ou está vazio. |
| 400 | enrollment_link.expiration_time_invalid_format | O expiration_time não está no formato ISO 8601. Exemplo correto: P7D. |
| 400 | enrollment_link.expiration_time_out_of_range | A duração é inferior a 1 dia ou superior a 90 dias. |
| 401 | enrollment_link.unauthorized | Access Token ausente ou inválido. |
| 404 | enrollment_link.profile_not_found | O profile_id não existe em Automatic Payments. |
| 404 | enrollment_link.resource_not_found | O profile_id existe, mas não pertence ao vendedor autenticado. |
| 409 | enrollment_link.conflict | Já existe um link de vinculação ativo para este profile_id. Cancele o anterior antes de criar um novo link. |
| 500 | enrollment_link.internal_error | Erro interno. Tente novamente a requisição. |
Compartilhe o valor de enrollment_link com o comprador pelo canal que preferir: WhatsApp, e-mail, SMS ou outro. O comprador abre a URL no navegador, preenche o formulário do Mercado Pago com os dados do cartão e o cartão fica vinculado ao perfil. O vendedor não participa desta etapa nem acessa os dados do cartão.
expired_date da resposta à sua criação, o estado passará automaticamente para expired.Em vez de consultar o estado do link por chamadas à API, você pode receber notificações em tempo real. Quando o comprador vincula o cartão com sucesso, o Automatic Payments envia um webhook com a mudança de estado do perfil para READY.
Para configurar as notificações:
- Acesse Suas integrações no Painel do Desenvolvedor e selecione sua aplicação.
- Acesse Webhooks e registre a URL HTTPS do seu endpoint receptor. O endpoint deve responder com
200em menos de 22 segundos. - Ative o evento Perfil de Pagamento (
payment_profile). - Copie a chave secreta gerada para validar a assinatura
x-signaturede cada notificação recebida.
Quando o comprador vincula o cartão com sucesso, você receberá um webhook com o seguinte 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 }] } }
O campo version é um contador incremental por perfil. Processe sempre a notificação com maior version e descarte as anteriores caso cheguem fora de ordem.
GET /v1/customers/{customerId}/payment-profiles/{id} após receber a notificação.Para saber mais sobre o formato das notificações e como validar a assinatura, consulte a documentação de Webhooks.
Envie uma requisição para /v1/payment-method-enrollments/{id}GET incluindo o id do link no path para verificar se o comprador concluiu a vinculação.
curl -X GET \
'https://api.mercadopago.com/v1/payment-method-enrollments/bea0ffb8-6c94-40a3-bc31-c2e7a0d46ed7' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
Se o comprador concluiu a vinculação, você receberá uma resposta 200 OK com o seguinte corpo:
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" }
Quando state é vinculated, o cartão já está registrado no perfil e pronto para uso em cobranças automáticas.
Estados possíveis do link
| Estado | Descrição |
created | Link gerado e ativo. O comprador ainda não preencheu o formulário. |
vinculated | O comprador concluiu o processo. O cartão está vinculado ao perfil. |
cancelled | O vendedor cancelou o link antes de o comprador utilizá-lo. |
expired | O link venceu antes de o comprador concluir o processo. |
error | Ocorreu um erro durante o processo de vinculação. |
Os estados vinculated, cancelled, expired e error são terminais: uma vez atingidos, o link não pode transicionar para nenhum outro estado.
Cenários do GET
| Cenário | Estado do link | Resultado esperado |
| Link recém-criado | created | 200 — state: created |
| Comprador preencheu o formulário | vinculated | 200 — state: vinculated |
| Link cancelado pelo vendedor | cancelled | 200 — state: cancelled |
| Link vencido | expired | 200 — state: expired |
Erros possíveis
| HTTP | Código | Causa |
| 400 | enrollment_link.bad_request | O id não tem formato UUID válido. |
| 401 | enrollment_link.unauthorized | Access Token ausente ou inválido. |
| 404 | enrollment_link.resource_not_found | O link não existe ou não pertence ao vendedor autenticado. |
| 500 | enrollment_link.internal_error | Erro interno. |
Envie uma requisição para /v1/payment-method-enrollments/{id}DELETE incluindo o id do link no path para desativá-lo antes de o comprador utilizá-lo. Somente links no estado created podem ser cancelados.
curl -X DELETE \
'https://api.mercadopago.com/v1/payment-method-enrollments/bea0ffb8-6c94-40a3-bc31-c2e7a0d46ed7' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
Uma resposta 204 No Content confirma que o link foi cancelado. Verifique o resultado com um GET: state passará para cancelled.
Erros possíveis
| HTTP | Código | Causa |
| 401 | enrollment_link.unauthorized | Access Token ausente ou inválido. |
| 404 | enrollment_link.resource_not_found | O link não existe ou não pertence ao vendedor autenticado. |
| 409 | enrollment_link.invalid_state_transition | O link está no estado vinculated, expired ou error e não pode ser cancelado. |
| 500 | enrollment_link.internal_error | Erro interno. |
Use as credenciais de testeDisponíveis no Painel do Desenvolvedor, em Suas integrações > Credenciais de teste. da sua conta do Mercado Pago para validar o fluxo sem processar transações reais.
Pré-requisitos
- Obtenha seu
APP_ACCESS_TOKENde teste em Suas integrações > Credenciais de teste. - Obtenha cartões de teste para simular cenários de aprovação e rejeição na documentação de cartões de teste.
- Crie um cliente de teste com um e-mail no formato
xxxx@testuser.com. - Crie um Perfil de Pagamento a partir do
customer_iddesse cliente de teste.
Cenários — POST /v1/payment-method-enrollments
| Cenário | Requisição | Resultado esperado |
| Criar link com validade padrão (7 dias) | {"profile_id": "{PROFILE_ID}"} | 201 — state: created, enrollment_link começa com https://mpago.la/ |
Criar link com expiration_time explícito | {"profile_id": "{PROFILE_ID}", "expiration_time": "P7D"} | 201 — expired_date equivale a 7 dias a partir de agora |
expiration_time mínimo válido | "expiration_time": "P1D" | 201 |
expiration_time máximo válido | "expiration_time": "P90D" | 201 |
profile_id com caracteres especiais | "profile_id": "abc!@#" | 400 — enrollment_link.profile_id_invalid_format |
profile_id vazio | "profile_id": "" | 400 — enrollment_link.profile_id_invalid_format |
| Formato ISO 8601 inválido | "expiration_time": "7D" | 400 — enrollment_link.expiration_time_invalid_format |
| Duração inferior a 1 dia | "expiration_time": "PT23H59M59S" | 400 — enrollment_link.expiration_time_out_of_range |
| Duração superior a 90 dias | "expiration_time": "P100D" | 400 — enrollment_link.expiration_time_out_of_range |
| Já existe link ativo para o mesmo perfil | Segundo POST com o mesmo profile_id | 409 — enrollment_link.conflict |
profile_id inexistente em AP | profile_id não registrado | 404 — enrollment_link.profile_not_found |
profile_id de outro vendedor | profile_id pertencente a outro vendedor | 404 — enrollment_link.resource_not_found |
| Sem autenticação | Sem header Authorization | 401 — enrollment_link.unauthorized |
Cenários — GET /v1/payment-method-enrollments/{id}
| Cenário | Estado do link | Resultado esperado |
| Link recém-criado | created | 200 — state: created |
| Comprador preencheu o formulário | vinculated | 200 — state: vinculated |
| Link cancelado pelo vendedor | cancelled | 200 — state: cancelled |
| Link vencido | expired | 200 — state: expired |
| Erro durante o processo de vinculação | error | 200 — state: error |
| ID com formato inválido (não UUID) | — | 400 — enrollment_link.bad_request |
| Link não encontrado ou de outro vendedor | — | 404 — enrollment_link.resource_not_found |
Cenários — DELETE /v1/payment-method-enrollments/{id}
| Cenário | Estado do link | Resultado esperado |
| Cancelar link ativo | created | 204 — GET posterior retorna state: cancelled |
| Cancelar link já vinculado | vinculated | 409 — enrollment_link.invalid_state_transition |
| Cancelar link vencido | expired | 409 — enrollment_link.invalid_state_transition |
| Cancelar link com erro | error | 409 — enrollment_link.invalid_state_transition |
| Link não encontrado | — | 404 — enrollment_link.resource_not_found |