Documentação do Mercado Livre
Confira todas as informações necessárias sobre as APIs Mercado Livre.
Documentação do
Pharma - Medicamentos com Receita
Esta documentação cobre os endpoints disponíveis para a gestão de receitas médicas em pedidos Pharma do Mercado Livre.
Fluxo de validação de receitas em pedidos Pharma
O fluxo de validação de receitas segue três etapas:
- Identificar os pedidos de pharma a partir de notificações de pedidos.
- Verificar, mediante a API de items, se o item do pedido requer receita médica.
- Continuar com a validação das receitas por meio dos endpoints descritos nas próximas seções.
Identificar pedidos Pharma
Filtre os pedidos recebidos no tópico de orders por meio das notificações para identificar os pedidos do tipo Pharma.
Identificação atual
Um pedido é considerado Pharma quando possui static_tags com o valor "pharma".
Próxima atualização
Há uma migração em andamento: nos próximos meses deixaremos de utilizar static_tags = "pharma" e a identificação de pedidos Pharma passará a ser realizada apenas por meio de flow.pharma.
Comparação entre a estrutura atual e a nova:
| Estrutura atual | Nova estrutura |
|---|---|
|
|
Verificar se o item requer receita médica
Para cada pedido Pharma, consulte a API de items correspondente ao item do pedido. Dentro do array attributes do payload, busque o atributo com id "IS_ELIGIBLE_FOR_PRESCRIPTION". O item requer receita médica quando este atributo estiver presente com value_id igual a "242085" (value_name = "Sim").
Exemplo do atributo relevante no payload de /items:
"attributes": [
{
"id": "IS_ELIGIBLE_FOR_PRESCRIPTION",
"name": "É elegível para receita",
"value_id": "242085",
"value_name": "Sim",
"value_type": "boolean",
"attribute_group_id": "OTHERS",
"attribute_group_name": "Outros"
}
]
Validar a receita médica
Uma vez confirmado que o item requer receita, utilize os endpoints documentados nas seções seguintes para completar o fluxo de validação, começando pelo listado de receitas pendentes.
Sellers com filiais
A API suporta dois tipos de seller:
- Seller sem filiais → opera com uma única loja. O escopo da requisição é identificado apenas pelo seller_id.
- Seller com filiais → opera com múltiplas lojas, cada uma identificada por um store_id. O escopo é identificado pelo par (seller_id, store_id).
O campo store_id é opcional em todos os endpoints (list, accept, reject, download e bulk download). Sua presença ou ausência indica o conjunto de receitas que se deseja consultar ou gerenciar:
- Sem store_id → opera sobre receitas de sellers sem filiais.
- Com store_id → opera sobre receitas da filial indicada.
Os dois conjuntos estão isolados: não se misturam em um mesmo resultado e não podem ser acessados de forma cruzada.
Como obter o store_id
O store_id é obtido do response do endpoint /orders. Quando o pedido vem de um seller com múltiplas filiais, o response inclui o campo stock.store_id.
- Seller com filiais → response inclui stock.store_id. O escopo é identificado pelo par (seller_id, store_id).
- Seller com filiais (pedidos Turbo) → response sem store_id. O escopo é identificado apenas pelo seller_id.
Regras para accept, reject e download
| Cenário | store_id na requisição | Resultado |
|---|---|---|
| Seller sem filiais | omitido | 200 — operação permitida |
| Seller com filiais | omitido | 403 Forbidden |
| Seller com filiais, pedido Turbo | omitido (não disponível em /orders) | 200 — operação permitida |
| Seller com filiais, store_id correto | igual ao da filial | 200 — operação permitida |
| Seller com filiais, store_id diferente | diferente ao da filial | 403 Forbidden |
| Seller com filiais | omitido | 403 Forbidden |
Regras para o listado
- Com store_id → retorna apenas receitas da filial indicada.
- Sem store_id → retorna apenas receitas de sellers sem filiais.
Em nenhum cenário a resposta mistura os dois conjuntos. Enviar store_id para um seller sem filiais, ou omiti-lo para um seller com filiais, retorna 403 Forbidden.
Endpoints
Em todos os endpoints, o path param {flow} deve ser prescription.
1. Listar receitas pendentes
curl -L -X GET \
https://api.mercadolibre.com/v1/prescription/attachments \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer $ACCESS_TOKEN'
Lista as receitas pendentes de validação para o seller. Permite consultar quais pedidos têm receitas pendentes sem necessidade de conhecer os order_ids previamente.
Parâmetros de query
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
store_id |
string | Não | Identificador da filial. Obrigatório para sellers com múltiplas filiais. Quando omitido, retorna apenas receitas de pedidos sem filial. |
order_id |
string | Não | Filtra por um pedido específico |
status |
string | Não (default: WAITING_VALIDATION) | Filtra por status da receita. Ver tabela de valores permitidos. |
page |
integer | Não (default: 1) | |
per_page |
integer | Não (default: 20, máx: 100) | |
created_after |
string | Não | Filtra registros criados após a data indicada |
sort |
string | Não (default: created_at:asc) | Valores: created_at:asc, created_at:desc |
| Valores do parâmetro status | Descrição |
|---|---|
WAITING_VALIDATION |
Receita pendente de validação. |
ACCEPTED |
Receita aceita. |
REJECTED |
Receita rejeitada. O arquivo permanece disponível para download por até 7 dias após a rejeição. |
Exemplo de request:
curl -L -X GET \
https://api.mercadolibre.com/v1/prescription/attachments?store_id=12345678&page=1&per_page=20 \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer APP_USR-123467899999.....'
Response
| Status | Descrição | Resposta |
|---|---|---|
| 200 | Sucesso |
Uma lista vazia retorna 200 com |
| 200 | Sucesso — filtro REJECTED |
|
| 400 | Bad Request |
|
| 401 | Não autorizado. Token ausente ou inválido. |
|
| 429 | Rate limit excedido |
|
| 500 | Erro interno |
|
| Motivos de rejeição (rejection_reason) | Descrição |
|---|---|
seller_reject_file_expired |
Receita vencida |
seller_reject_file_invalid_product |
O medicamento não corresponde ao item do pedido |
seller_reject_file_quantity |
A quantidade não coincide com o pedido |
seller_reject_file_data |
Dados do médico inválidos |
seller_reject_file_already_used |
Receita já utilizada em outro pedido |
seller_reject_file_invalid |
O arquivo não é uma receita ou é ilegível |
2. Baixar receita
curl -L -X GET \
https://api.mercadolibre.com/v1/prescription/attachment/download \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer $ACCESS_TOKEN'
Faz o download de uma receita específica pelo seu attachment_id. Esta chamada registra o download do arquivo, que é um requisito prévio para aceitar ou rejeitar a receita.
Parâmetros de query
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
attachment_id |
string | Sim | Identificador da receita a baixar |
store_id |
string | Não | Identificador da filial. Obrigatório para sellers com múltiplas filiais. |
status |
string | Não (default: WAITING_VALIDATION) | Valores: WAITING_VALIDATION, ACCEPTED |
Exemplo de request:
curl -L -X GET \
https://api.mercadolibre.com/v1/prescription/attachment/download?attachment_id=MLB_112233466_0123ab3430000.pdf&store_id=12345 \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer APP_USR-123467899999.....'
Response
| Status | Descrição | Resposta |
|---|---|---|
| 200 | Sucesso | Retorna o conteúdo binário da receita (PDF). Habilita as operações de accept/reject para este attachment_id. |
| 400 | Bad Request |
|
| 401 | Não autorizado. Token ausente ou inválido. |
|
| 403 | Forbidden. O store_id não coincide com o do attachment. |
|
| 404 | Receita não encontrada |
|
| 410 | Attachment gone |
|
| 429 | Rate limit excedido |
|
| 500 | Erro interno |
|
3. Aceitar receita
curl -L -X POST \
https://api.mercadolibre.com/v1/prescription/attachment/accept \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer' \
--data '{
"attachment_id": "$ATTACHMENT_ID",
"store_id": "$STORE_ID"
}'
Aceita uma receita específica pelo seu attachment_id. Requer que a receita tenha sido baixada previamente e que seu status seja WAITING_VALIDATION.
Parâmetros do body
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
attachment_id |
string | Sim | Identificador da receita a aceitar |
store_id |
string | Não | Identificador da filial. Obrigatório para sellers com múltiplas filiais. Enviar store_id para um seller sem filiais retorna 403. |
Exemplo de request:
curl --location 'https://api.mercadolibre.com/v1/prescription/attachment/accept' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer APP_USR-123467899999.....' \
--data '{
"attachment_id": "MLB_112233466_0123ab3430000.pdf",
"store_id": "123456789"
}
'
Response
| Status | Descrição | Resposta |
|---|---|---|
| 200 | Sucesso |
|
| 400 | JSON inválido no body |
|
| 400 | Erro de validação |
|
| 401 | Não autorizado. Token ausente ou inválido. |
|
| 403 | Forbidden. O store_id não coincide. |
|
| 404 | Receita não encontrada |
|
| 422 | Receita não baixada previamente |
|
| 422 | Receita já aceita |
|
| 422 | Receita já rejeitada |
|
| 422 | Receita não está em estado WAITING_VALIDATION |
|
| 429 | Rate limit excedido |
|
| 500 | Erro interno |
|
4. Rejeitar receita
curl -L -X POST \
https://api.mercadolibre.com/v1/prescription/attachment/reject \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer' \
--data '{
"attachment_id": "$ATTACHMENT_ID",
"store_id": "$STORE_ID",
"reason": "$REASON"
}'
Rejeita uma receita. Requer que a receita tenha sido baixada previamente e que seja indicado um motivo de rejeição válido.
Parâmetros do body
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
attachment_id |
string | Sim | Identificador da receita a rejeitar |
reason |
string | Sim | Motivo de rejeição. Ver tabela de valores permitidos. |
store_id |
string | Não | Identificador da filial. Obrigatório para sellers com múltiplas filiais. Enviar store_id para um seller sem filiais retorna 403. |
| Valores do parâmetro reason | Descrição |
|---|---|
seller_reject_file_expired |
Receita vencida |
seller_reject_file_invalid_product |
O medicamento não corresponde ao item do pedido |
seller_reject_file_quantity |
A quantidade não coincide com o pedido |
seller_reject_file_data |
Dados do médico inválidos |
seller_reject_file_already_used |
Receita já utilizada em outro pedido |
seller_reject_file_invalid |
O arquivo não é uma receita ou é ilegível |
Exemplo de request:
curl -L -X POST \
https://api.mercadolibre.com/v1/prescription/attachment/reject \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer APP_USR-123467899999.....' \
--data '{
"attachment_id": "MLB_423423_4324324ad325.pdf",
"store_id": "123456789",
"reason": "seller_reject_file_expired"
}'
Response
| Status | Descrição | Resposta |
|---|---|---|
| 200 | Sucesso |
|
| 400 | Motivo de rejeição inválido |
|
| 400 | JSON inválido no body |
|
| 401 | Não autorizado. Token ausente ou inválido. |
|
| 403 | Forbidden. O store_id não coincide. |
|
| 404 | Receita não encontrada |
|
| 404 | Pedido não encontrado |
|
| 422 | Receita não baixada previamente |
|
| 422 | Receita já aceita |
|
| 422 | Receita já rejeitada |
|
| 422 | Receita não está em estado WAITING_VALIDATION |
|
| 422 | Saldo insuficiente do seller |
|
| 429 | Rate limit excedido |
|
| 500 | Erro interno |
|
5. Download massivo receitas
curl -L -X POST \
https://api.mercadolibre.com/v1/prescription/attachments/download \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer' \
--data '{
"attachment_ids": [
$ATTACHMENT_ID_1,
$ATTACHMENT_ID_2,
$ATTACHMENT_ID_3,
],
"store_id": "$STORE_ID"
}
'
Faz o download de múltiplas receitas em uma única chamada. Retorna um arquivo ZIP com todos os PDFs solicitados.
Parâmetros do body
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
attachment_ids |
array<string> (máx: 50) | Sim | Lista de identificadores de receitas a baixar |
store_id |
string | Não | Identificador da filial |
status |
string | Não (default: WAITING_VALIDATION) | Valores: WAITING_VALIDATION, ACCEPTED |
Exemplo de request:
curl -L -X POST \
https://api.mercadolibre.com/v1/prescription/attachments/download \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer APP_USR-123467899999.....' \
--data '{
"attachment_ids": [
"MLB_112233466_0123ab3430001.pdf",
"MLB_112233466_0123ab3430002.pdf",
"MLB_112233466_0123ab3430003.pdf"
],
"store_id": "123456789"
}
'
Response
| Status | Descrição | Resposta |
|---|---|---|
| 200 | Sucesso. Retorna um arquivo ZIP com todas as receitas solicitadas. |
|
| 207 | Sucesso parcial. O ZIP inclui as receitas disponíveis e um manifest.json com o detalhe das que não puderam ser baixadas. |
Conteúdo do manifest.json:
|
| 400 | Bad Request |
|
| 401 | Não autorizado. Token ausente ou inválido. |
|
| 410 | Attachment gone |
|
| 429 | Rate limit excedido |
|
| 500 | Erro interno |
|
| Motivos de erro no manifest.json | Descrição |
|---|---|
omitted |
O attachment foi excluído porque não pertence ao seller, o store_id não coincide, ou o status não corresponde ao filtro aplicado. |
fetch_error |
Erro ao recuperar o arquivo da receita. |
file_too_large |
O arquivo excede o tamanho máximo permitido por item. |
Erros
Todos os endpoints retornam um body JSON estruturado em respostas não-2xx. O campo error_code utiliza o formato ERROR_RX_INTEGRATOR_NNN.
Estrutura:
{
"code": "bad_request",
"message": "attachment_not_found",
"error_code": "ERROR_RX_INTEGRATOR_001",
"errors": [
{ "field": "attachment_id", "reason": "is required" }
]
}
- code — texto do status HTTP em snake_case (sempre presente)
- message — chave legível do erro (sempre presente)
- error_code — código catalogado (sempre presente em erros)
- errors[] — detalhe por campo (presente apenas em respostas ERROR_RX_INTEGRATOR_012)
4xx — Regras de negócio, autorização e input
| Código | error_code | HTTP | message | Causa |
|---|---|---|---|---|
| 001 | ERROR_RX_INTEGRATOR_001 |
404 | attachment_not_found |
O attachment_id não existe ou pertence a outro seller/filial. |
| 002 | ERROR_RX_INTEGRATOR_002 |
403 | attachment_store_mismatch |
O store_id da requisição não coincide com o do attachment. |
| 003 | ERROR_RX_INTEGRATOR_003 |
422 | attachment_not_downloaded |
Tentativa de aceitar ou rejeitar uma receita que não foi baixada previamente. |
| 004 | ERROR_RX_INTEGRATOR_004 |
422 | attachment_already_accepted |
O attachment já está em estado ACCEPTED. |
| 005 | ERROR_RX_INTEGRATOR_005 |
422 | attachment_already_rejected |
O attachment já está em estado REJECTED. |
| 006 | ERROR_RX_INTEGRATOR_006 |
422 | attachment_not_waiting_validation |
O attachment não está em estado WAITING_VALIDATION. |
| 007 | ERROR_RX_INTEGRATOR_007 |
400 | (dinâmico, inclui o limite) | Foram solicitados mais de 50 attachment_ids em um bulk download. |
| 008 | ERROR_RX_INTEGRATOR_008 |
400 | attachment archive exceeds maximum allowed size |
O arquivo ZIP gerado excede o tamanho máximo permitido. |
| 009 | ERROR_RX_INTEGRATOR_009 |
404 | order_not_found |
O pedido associado ao attachment não foi encontrado. |
| 010 | ERROR_RX_INTEGRATOR_010 |
400 | invalid_reject_reason |
O motivo de rejeição não é um dos valores permitidos. |
| 011 | ERROR_RX_INTEGRATOR_011 |
422 | insufficient_seller_balance |
O seller não tem saldo suficiente para completar a operação. |
| 012 | ERROR_RX_INTEGRATOR_012 |
400 | (join de mensagens de campo) | Um ou mais campos da requisição falharam na validação estrutural. O array errors[] detalha os campos afetados. |
| 013 | ERROR_RX_INTEGRATOR_013 |
400 | invalid request body |
O body da requisição não é um JSON válido. O array errors[] está ausente. |
| 014 | ERROR_RX_INTEGRATOR_014 |
403 | payment_refund_not_authorized |
O reembolso do pedido não pôde ser processado porque o pagamento do seller não está autorizado para esta operação. Tentar novamente não resolverá o problema. |
| 015 | ERROR_RX_INTEGRATOR_015 |
409 | order_conflict |
O pedido não pôde ser atualizado devido a uma modificação concorrente. Tente novamente após um breve intervalo. |
| 016 | ERROR_RX_INTEGRATOR_016 |
409 | order_already_locked |
O pedido está temporariamente bloqueado por outra operação em andamento. Tente novamente após um breve intervalo. |
| 019 | ERROR_RX_INTEGRATOR_019 |
410 | attachment_gone |
O attachment foi excluído permanentemente do banco de dados e não está mais disponível. |
5xx — Erros internos
| Código | error_code | HTTP | message | Causa |
|---|---|---|---|---|
| 900 | ERROR_RX_INTEGRATOR_900 |
500 | internal error | Erro ao recuperar o arquivo da receita. |
| 901 | ERROR_RX_INTEGRATOR_901 |
500 | internal error | Erro ao registrar o download do arquivo. |
| 902 | ERROR_RX_INTEGRATOR_902 |
500 | internal error | O attachment não tem um pedido associado. |
| 903 | ERROR_RX_INTEGRATOR_903 |
500 | internal error | Erro inesperado na consulta de dados. |
| 904 | ERROR_RX_INTEGRATOR_904 |
500 | internal error | Erro de configuração interna do serviço. |
| 905 | ERROR_RX_INTEGRATOR_905 |
500 | failed to list attachments | Erro ao processar o listado de receitas. |
| 906 | ERROR_RX_INTEGRATOR_906 |
500 | failed to build attachment archive | Erro ao gerar o arquivo comprimido no download em massa. |
| 907 | ERROR_RX_INTEGRATOR_907 |
500 | internal error | Erro interno ao processar o download. |
| 999 | ERROR_RX_INTEGRATOR_999 |
500 | internal error | Erro interno inesperado. |