Como migrar da API de Pedidos presenciais para a API de Orders
A API de Orders unifica o processamento de pagamentos com Código QR no Mercado Pago, oferecendo endpoints padronizados, um modelo de status consolidado e novos recursos nativos que não existiam na API de Pedidos presenciais. Além disso, todas as novas funcionalidades do Mercado Pago serão desenvolvidas sobre a API de Orders.
A migração da API de Pedidos presenciais para a API de Orders envolve a atualização de endpoints e campos da requisição, a consolidação do modelo de notificações e o aproveitamento de novos recursos nativos que não existiam antes: endpoints dedicados de consulta por order_id, cancelamento e reembolso. A migração não implica mudanças no fluxo de negócio: o cliente continua escaneando o QR com o aplicativo do Mercado Pago e confirmando o pagamento.
Veja a seguir como realizar esta migração de forma completa.
Mapear as mudanças de endpoint
Antes de iniciar os passos de migração, consulte a tabela abaixo para ter uma visão geral de todas as mudanças de endpoint. Na API de Pedidos presenciais, cada operação utilizava uma URL com o identificador do usuário e da caixa no path. A API de Orders consolida essas operações em endpoints padronizados e introduz recursos que não existiam antes.
| Operação | API de Pedidos presenciais | API de Orders |
| Criar order | POST /mpmobile/instore/qr/{user_id}/{external_id}API | POST /v1/ordersAPI |
| Consultar order | Não existia endpoint dedicado | GET /v1/orders/{order_id}API |
| Cancelar order | DELETE /mpmobile/instore/qr/{user_id}/{external_id}API | POST /v1/orders/{order_id}/cancelAPI |
| Reembolsar order | Via API de Payments (sem endpoint dedicado na API de Pedidos presenciais) | POST /v1/orders/{order_id}/refundAPI |
Na API de Pedidos presenciais, existiam dois endpoints válidos para criação e cancelamento: /mpmobile/instore/qr/{user_id}/{external_id}, usando o identificador externo da caixa, e /mpmobile/instore/qr/{pos_id}, usando o identificador interno. Ambos migram para o mesmo endpoint na API de Orders: POST /v1/ordersAPI, onde a caixa é identificada pelo campo config.qr.external_pos_id no body.
Atualizar o modelo de status e notificações
Uma das mudanças mais significativas entre a API de Pedidos presenciais e a API de Orders é o modelo de status. Na API de Pedidos presenciais, o estado de uma transação era determinado pelo monitoramento de notificações de dois tópicos independentes: payments e merchant_orders com campos e valores distintos para cada um. A API de Orders unifica esse comportamento em um único campo status na order. Consulte o mapeamento completo abaixo.
Além disso, a API de Orders também introduz o campo status_detail, que permite identificar com maior detalhamento o estado da transação. Os valores possíveis são created, canceled, accredited, refunded e expired.
Na API de Pedidos presenciais, a merchant_order é criada no momento em que o pedido é gerado, portanto as notificações do tópico merchant_orders estão disponíveis desde o início do fluxo. O objeto payment, por outro lado, só é criado quando existe uma tentativa de pagamento, aprovado ou rejeitado. Quem monitorava apenas o tópico payments não recebia nenhuma notificação até que o usuário iniciasse o processo de pagamento. Na API de Orders, esse comportamento é unificado: o campo status da order reflete o estado completo desde a criação, sem necessidade de monitorar dois tópicos independentes.
Tópico payments (status) | Tópico merchant_orders (status / order_status) | API de Orders (status) | Observação |
| — | opened (sem pagamento ou com pagamento rejeitado) | created | Na API de Pedidos presenciais, opened indicava que o pedido ainda não tinha um pagamento aprovado. Na API de Orders, esse estado é explícito desde a criação. |
approved | closed + order_status: "paid" | processed | Ambos os tópicos convergiam no mesmo resultado: pagamento aprovado. Na API de Orders, o estado é autocontido. |
rejected | opened (a merchant_order não muda de estado e permanece aberta) | Sem equivalente | Na API de Pedidos presenciais, um pagamento rejeitado deixava a merchant_order em opened aguardando uma nova tentativa. Na API de Orders, pagamentos rejeitados não são expostos e o estado permanece em created até receber um pagamento aprovado. |
refunded | closed + order_status: "reverted" | refunded | Reembolso total. No tópico merchant_orders, identificável por order_status: "reverted". |
refunded (parcial, status_detail: "partially_refunded") | closed + pagamento com status_detail: "partially_refunded" | refunded | Reembolso parcial. Na API de Pedidos presenciais, era necessário inspecionar o status_detail do pagamento dentro da merchant_order. Na API de Orders, o estado é o mesmo do reembolso total, mas o status_detail indica partially_refunded. |
| — | — | canceled | Novo status sem equivalência na API de Pedidos presenciais. |
| — | — | expired | Novo status sem equivalência na API de Pedidos presenciais. |
Quanto às notificações, na API Legacy podiam ser configuradas pelo campo notification_url no body da requisição (modelo IPN) ou por webhooks com os tópicos payments e merchant_orders. Na API de Orders, o campo notification_url não existe e os tópicos payments e merchant_orders não são compatíveis. Configure as notificações em Suas integrações, selecionando o tópico "Order (Mercado Pago)" (orders) antes de subir em produção. Para mais informações, acesse a documentação de notificações.
Adaptar os headers
A API de Orders introduz duas mudanças obrigatórias de headers que afetam todos os endpoints. O Access Token deve ser enviado via header Authorization. O envio via query param não é permitido na API de Orders. Aplique as alterações a seguir antes de testar qualquer outro recurso.
O header X-Ttl-Store-Preference era utilizado na API de Pedidos presenciais para definir o tempo de validade do pedido em segundos. Na API de Orders, essa funcionalidade foi substituída pelo campo expiration_time no body da requisição, em formato ISO 8601, por exemplo PT5M para 5 minutos. O valor padrão é de 15 minutos e o valor enviado é sempre respeitado. Remova esse header de todas as requisições e migre o controle de validade para o campo expiration_time.
O header X-Idempotency-Key é obrigatório nas operações de criação, cancelamento e reembolso de orders. Ele garante que uma requisição repetida com a mesma chave retorne o resultado original sem processar a operação novamente. Envie um UUID v4 ou string aleatória única por requisição. Operações do tipo GET não requerem este header.
X-Idempotency-Key for reutilizada com um body diferente, a API retornará o erro idempotency_key_already_used. Gere uma nova chave para cada operação distinta.Migrar a criação de orders
Os endpoints de criação POST /mpmobile/instore/qr/{user_id}/{external_id}API e POST /mpmobile/instore/qr/{pos_id} migram para POST /v1/ordersAPI. Além da mudança de URL, a estrutura da requisição foi significativamente reorganizada: o identificador do usuário e da caixa deixam o path e passam para o body, novos campos obrigatórios foram introduzidos e a API de Orders oferece três modos de QR configuráveis via config.qr.mode. Siga os passos abaixo para adaptar a requisição, a resposta e o tratamento de erros.
curl
curl -X POST \ 'https://api.mercadopago.com/v1/orders' \ -H 'Content-Type: application/json' \ -H 'X-Idempotency-Key: {{IDEMPOTENCY_KEY}}' \ -H 'Authorization: Bearer {{ACCESS_TOKEN}}' \ -d '{ "type": "qr", "total_amount": "50", "external_reference": "ext_ref_1234", "config": { "qr": { "external_pos_id": "STORE001POS001", "mode": "static" } }, "transactions": { "payments": [ { "amount": "50" } ] }, "items": [ { "title": "Smartphone", "unit_price": "50", "quantity": 1, "unit_measure": "unit" } ] }'
Na API de Orders, a identidade do usuário é obtida diretamente do Access Token. O {user_id} deixa de ser parâmetro de path. A caixa passa a ser identificada pelo campo config.qr.external_pos_id no body. Os campos type, com valor "qr", e external_reference passam a ser obrigatórios. A tabela abaixo apresenta os campos que existiam em ambas as APIs e sofreram alterações na migração.
| API de Pedidos presenciais | API de Orders | Descrição | Alteração |
{user_id} (path param) | Não existe | Identificador do usuário de Mercado Pago. Na API de Pedidos presenciais, era enviado no path. Na API de Orders, a identidade é obtida diretamente do Access Token. | Deixa de ser parâmetro de path. |
{external_id} (path param) | config.qr.external_pos_id | Identificador externo da caixa, definido pelo integrador. Na API de Pedidos presenciais, era enviado no path. Na API de Orders, é enviado no body dentro de config.qr. | Deixa de ser parâmetro de path e passa para o body. |
external_reference | external_reference | Referência que pode sincronizar com o sistema de venda do integrador. Na API de Orders, é obrigatório, com no máximo 64 caracteres, apenas letras, números, - e _. Não pode conter dados PII. | Passa a ser obrigatório. |
notification_url | Não existe | URL para receber notificações de pagamento ou merchant_order. Na API de Orders, as notificações são configuradas como webhook na sua aplicação em Suas integrações, selecionando o tópico "Order (Mercado Pago)". Para mais informações, acesse a documentação de notificações. | Removido do body. |
sponsor_id | integration_data.sponsor.id | USER_ID da conta do Mercado Pago do sistema integrador. | Passa para o nó integration_data.sponsor. |
items[].id | items[].external_code | Identificador do item no sistema externo. | Renomeado para items[].external_code. |
items[].title | items[].title | Nome do item. Na API de Orders, máx. 150 caracteres. | Passa a ser obrigatório. |
items[].currency_id | Não existe | Identificador da moeda do item em formato ISO 4217. Na API de Orders, a moeda é determinada a partir da conta do vendedor. | Removido. |
items[].unit_price | items[].unit_price | Preço unitário do item. Na API de Pedidos presenciais, era number. Na API de Orders, é string decimal. Não aceita decimais (ex.: "15"). | Muda de number para string decimal e passa a ser obrigatório. |
items[].quantity | items[].quantity | Quantidade de itens. Na API de Pedidos presenciais, era number. Na API de Orders, é integer. | Muda de number para integer e passa a ser obrigatório. |
items[].description | description | Descrição do item ou motivo da order. Na API de Orders, a descrição passa a existir apenas no nível raiz da order, não dentro de items. Máx. 150 caracteres. Não deve conter dados PII. | Move do nível de item para o nível raiz da order. |
items[].picture_url | Não existe | URL da imagem do item. | Removido. Não tem equivalente na API de Orders. |
marketplace_fee | marketplace_fee | Valor da tarifa do marketplace. Na API de Pedidos presenciais, era number. Na API de Orders, é string decimal. Não aceita decimais (ex.: "15"). Exclusivo para integrações com OAuth. | Muda de number para string decimal. |
X-Ttl-Store-Preference (header) | expiration_time | Tempo de validade do pedido. Na API de Pedidos presenciais, era definido em segundos via header. Na API de Orders, é definido em formato ISO 8601 (ex.: PT5M para 5 minutos) no body. Mínimo: 30 segundos. Máximo: 3600 horas. Em todos os modos, o valor padrão é de 15 minutos e o valor enviado é sempre respeitado. | Muda de header em segundos para campo no body em formato ISO 8601. |
A API de Orders também introduz os seguintes campos sem equivalência na API de Pedidos presenciais.
| Campo | Descrição |
type | Tipo de order. Para pagamentos com QR, o único valor possível é "qr". Obrigatório. |
total_amount | Valor total da order. Representa a soma das transações. Não aceita decimais (ex.: "15"). |
config.qr.mode | Modo de QR. Valores: static (QR estático associado à caixa, equivalente ao comportamento da API de Pedidos presenciais), dynamic (QR único por transação, retornado em type_response.qr_data), hybrid (ambos os modos em paralelo). Valor padrão: static. |
transactions.payments[].amount | Valor do pagamento dentro do nó transactions. Não aceita decimais (ex.: "15"). Apenas 1 transação de pagamento por order. |
items[].unit_measure | Unidade de medida do item. Máx. 10 caracteres. Obrigatório. |
items[].external_categories[].id | Identificador de categoria do item no sistema externo. Habilita descontos por categoria. Não pode ser usado junto com discounts. |
discounts.payment_methods[].new_total_amount | Novo valor total da order quando um desconto é aplicado. Não aceita decimais (ex.: "15"). Não pode ser usado junto com items[].external_categories. |
discounts.payment_methods[].type | Meio de pagamento ao qual o desconto se aplica. Valores: debit_card, credit_card, account_money, prepaid_card. Até 4 meios podem ser definidos. |
integration_data.platform_id | Identificador da plataforma, atribuído pelo Mercado Pago. |
integration_data.integrator_id | Identificador do integrador, atribuído pelo Mercado Pago. Deve ter o prefixo dev_. |
A tabela abaixo apresenta os campos do response de criação que existiam em ambas as APIs e sofreram alterações na migração.
| API de Pedidos presenciais | API de Orders | Descrição | Alteração |
id | id | Identificador da order criada. Na API de Pedidos presenciais, o formato era {collector_id}-{uuid}. Na API de Orders, é um ID alfanumérico próprio (ex.: ORD00001111222233334444555566). | Formato do ID muda de {collector_id}-{uuid} para ID alfanumérico. |
collector_id | user_id | Identificador do vendedor. Na API de Pedidos presenciais, era integer. Na API de Orders, é string. | Renomeado de collector_id para user_id. Muda de integer para string. |
collector | Não existe | Dados do vendedor. | Removido. Os dados do vendedor não são retornados na order. |
total_amount | total_amount | Valor total da order. Na API de Pedidos presenciais, era number. Na API de Orders, é string decimal. | Muda de number para string decimal. |
amount | Não existe | Valor do pedido. Era sempre igual a total_amount. | Removido. Na API de Orders, o valor do pagamento está em transactions.payments[].amount. |
external_reference | external_reference | Referência externa da order. | Sem alteração. |
notification_url | Não existe | URL configurada para receber notificações. | Removido do response. Configure as notificações webhook na sua aplicação em Suas integrações. Para mais informações, acesse a documentação de notificações. |
expiration_date_to | Não existe | Data e hora de expiração do pedido em formato ISO 8601 absoluto. | Removido. Na API de Orders, a expiração é configurada como duração relativa em expiration_time. |
expires | Não existe | Indica se o pedido tem data de expiração. | Removido. Na API de Orders, a order sempre expira. |
marketplace_fee | marketplace_fee | Tarifa do marketplace. Na API de Pedidos presenciais, era number. Na API de Orders, é string decimal. | Muda de number para string decimal. |
sponsor_id | integration_data.sponsor.id | USER_ID do sistema integrador. Na API de Pedidos presenciais, era integer. Na API de Orders, é string. | Passa para integration_data.sponsor. Muda de integer para string. |
site_id | country_code | Identificador do site/país. Na API de Pedidos presenciais, o formato era em minúsculas (ex.: "mla"). Na API de Orders, é o código do país em maiúsculas (ex.: "AR"). | Renomeado de site_id para country_code. Formato muda de minúsculas para maiúsculas. |
items[].description | description | Descrição do item. | Move do nível de item para o nível raiz da order. |
items[].id | items[].external_code | Identificador do item no sistema externo. | Renomeado para items[].external_code. |
Na migração para a API de Orders, os seguintes campos foram removidos e não possuem equivalente direto.
| Campo | Observação |
operation_type | Removido. Não tem equivalente na API de Orders. |
payment_methods | Removido. Exclusões de meios de pagamento não são retornadas a nível de order. |
payment_methods.included_payment_types | Removido junto com o nó payment_methods. |
marketplace | Removido. Não tem equivalente na API de Orders. |
back_urls | Removido. Não tem equivalente na API de Orders. |
payer | Removido. Os dados do pagador não são retornados no response de criação. |
client_id | Removido. Redundante com user_id. |
processing_modes | Removido. Substituído pelo campo processing_mode (string) na API de Orders. |
internal_metadata | Removido. Campo de uso interno sem equivalente na API de Orders. |
items[].currency_id | Removido. A moeda é exposta a nível de order no campo currency. |
items[].picture_url | Removido. Não tem equivalente na API de Orders. |
A API de Orders também introduz os seguintes campos no response de criação.
| Campo | Descrição |
type | Tipo de order. Para QR: sempre qr. |
description | Descrição do produto ou serviço, motivo da order (em Legacy era items[].description). |
expiration_time | Tempo de expiração da order em formato ISO 8601. |
processing_mode | Modo de processamento. Para QR: sempre automatic. |
status | Estado atual da order. Ao criar: created. |
status_detail | Detalhe do estado atual da order. Os valores possíveis são created, canceled, accredited, refunded, expired. |
currency | Identificador da moeda. Valores: ARS, BRL, CLP, UYU. |
created_date | Data de criação da order. Formato yyyy-MM-ddTHH:mm:ss.sssZ. |
last_updated_date | Data da última atualização da order. Formato yyyy-MM-ddTHH:mm:ss.sssZ. |
config.qr.external_pos_id | Identificador externo da caixa associada à order. |
config.qr.mode | Modo de QR configurado. Valores: static, dynamic, hybrid. |
transactions.payments[].id | Identificador da transação de pagamento. |
transactions.payments[].amount | Valor do pagamento. |
transactions.payments[].status | Estado do pagamento. Ao criar: created. |
transactions.payments[].status_detail | Detalhe do estado do pagamento. Ao criar: ready_to_process. |
type_response.qr_data | Trama QR que deve ser convertida em código QR para que o pagamento possa ser efetuado. Presente apenas quando config.qr.mode é dynamic ou hybrid. |
integration_data.application_id | Identificador da aplicação do Mercado Pago. |
items[].title | Nome do item. |
items[].unit_price | Preço unitário do item. |
items[].quantity | Quantidade de itens. |
items[].unit_measure | Unidade de medida do item. |
items[].external_categories[].id | Identificador de categoria do item no sistema externo. |
discounts.payment_methods[].new_total_amount | Novo valor total da order quando um desconto é aplicado. |
discounts.payment_methods[].type | Meio de pagamento ao qual o desconto se aplica. |
A API de Orders consolida a maioria dos erros de validação específicos por campo nos códigos genéricos property_value e property_type, com o detalhe do campo no corpo da resposta. Além disso, as mensagens de resposta são mais descritivas, facilitando a identificação e resolução de problemas. Consulte as tabelas abaixo para mais detalhes.
Erros que desaparecem
Os seguintes erros existem na API de Pedidos presenciais mas não têm equivalência na API de Orders.
| HTTP | API de Pedidos presenciais | Observação |
400 | invalid_collector_id | Removido. A identidade é obtida diretamente do Access Token. |
Erros renomeados
Os seguintes erros foram renomeados na API de Orders.
| HTTP | API de Pedidos presenciais | API de Orders | Observação |
400 | invalid_sponsor_id | sponsor_id_not_valid | O campo migra para integration_data.sponsor.id. |
404 | pos_obtainment_error | pos_not_found | O external_pos_id deixa de ser parâmetro de path e passa para o body. |
Erros que mudam de comportamento
Os seguintes erros existem em ambas as APIs mas com comportamento diferente na API de Orders.
| HTTP | API de Pedidos presenciais | API de Orders | Observação |
400 | invalid_items | property_value | property_value consolida os erros de validação por campo. O campo com erro está indicado no detalhe da resposta. |
400 | json_syntax_error | property_type | Equivalente mais próximo. Na API de Pedidos presenciais, cobria também JSON malformado em geral. |
400 | invalid_access_token | unauthorized (HTTP 401) | Na API de Pedidos presenciais, era 400. Na API de Orders, é 401. |
Erros que permanecem iguais
O seguinte erro tem o mesmo comportamento em ambas as APIs.
| HTTP | Erro | Observação |
500 | Genérico | Erro interno. Verifique o retorno e repita a requisição. |
Erros introduzidos pela API de Orders
Os seguintes erros não têm equivalência na API de Pedidos presenciais.
| HTTP | Erro | Observação |
400 | empty_required_header | X-Idempotency-Key ausente. |
400 | unsupported_site | Tentativa de criar a order em um país não suportado. |
400 | unsupported_properties | Propriedade não suportada no body. O campo com erro está indicado no detalhe da resposta. |
400 | bad_request | Campos não suportados ou inválidos em geral. |
400 | marketplace_not_valid | O Access Token não foi obtido via OAuth e não é possível identificar um marketplace válido. |
404 | marketplace_fee_not_allowed | Não é permitido enviar marketplace_fee porque o marketplace não foi encontrado. |
409 | idempotency_key_already_used | O X-Idempotency-Key já foi utilizado com uma requisição distinta nas últimas 24 horas. |
Implementar a consulta de orders
O endpoint de consulta GET /v1/orders/{order_id}API é uma novidade exclusiva da API de Orders. A API de Pedidos presenciais não contava com um endpoint dedicado para consultar o estado de uma transação. Anteriormente, o estado era obtido exclusivamente via notificações de webhook dos tópicos payments e merchant_orders. A API de Orders permite consultar o estado completo da order a qualquer momento, incluindo status, pagamentos, reembolsos e dados do meio de pagamento.
curl
curl -X GET \ 'https://api.mercadopago.com/v1/orders/{{ORDER_ID}}' \ -H 'Authorization: Bearer {{ACCESS_TOKEN}}'
O response do GET inclui todos os campos do response de criação, além dos campos adicionais a seguir, disponíveis após o processamento do pagamento.
| Campo | Descrição |
integration_data.platform_id | Identificador da plataforma, atribuído pelo Mercado Pago. |
integration_data.integrator_id | Identificador do integrador, atribuído pelo Mercado Pago. |
integration_data.sponsor.id | USER_ID do sistema integrador. |
transactions.payments[].refunded_amount | Valor reembolsado. Presente apenas quando houve um reembolso. |
transactions.payments[].paid_amount | Valor total pago. Se o pagamento foi feito com desconto, reflete esse valor. |
transactions.payments[].status | Estado atual do pagamento. Valores: created, canceled, processed, refunded, expired. |
transactions.payments[].status_detail | Estado detalhado do pagamento. Valores: created, canceled_by_api, accredited, refunded, expired, in_review. |
transactions.payments[].reference_id | Identificador do pagamento associado à order. |
transactions.payments[].payment_method.type | Meio de pagamento selecionado na transação. |
transactions.payments[].payment_method.installments | Quantidade de parcelas selecionadas. |
transactions.payments[].payment_method.id | Identificador do meio de pagamento ou bandeira do cartão. |
transactions.payments[].discounts.type | Meio de pagamento com o qual o desconto foi aplicado. Presente apenas se um desconto foi aplicado. |
transactions.refunds[].id | Identificador da transação de reembolso. |
transactions.refunds[].transaction_id | Identificador do pagamento que está sendo reembolsado. |
transactions.refunds[].reference_id | Identificador que associa a transação ao seu reembolso. |
transactions.refunds[].amount | Valor devolvido no reembolso. |
transactions.refunds[].status | Estado do reembolso. Valores: processing, processed, failed. |
items[].title | Nome do item. |
items[].unit_price | Preço unitário do item. |
items[].quantity | Quantidade de itens. |
items[].unit_measure | Unidade de medida do item. |
items[].external_code | Código externo do item. |
items[].external_categories[].id | Identificador de categoria do item. |
discounts.payment_methods[].new_total_amount | Novo valor total quando um desconto é aplicado. |
discounts.payment_methods[].type | Meio de pagamento ao qual o desconto se aplica. |
Como este é um endpoint novo na API de Orders, não há equivalente na API de Pedidos presenciais. Os erros documentados abaixo são exclusivos da nova API.
| HTTP | Erro | Observação |
400 | invalid_path_param | O order_id enviado para a consulta da order tem formato inválido. Deve começar com o prefixo ORD seguido de 26 caracteres. |
401 | unauthorized | Access Token inválido ou expirado. |
404 | order_not_found | O order_id não corresponde a nenhuma order criada. |
500 | Genérico | Erro interno. Verifique o retorno e repita a requisição. |
Atualizar o cancelamento de orders
O endpoint de cancelamento muda completamente de estrutura: de DELETE /mpmobile/instore/qr/{user_id}/{external_id}API para POST /v1/orders/{order_id}/cancelAPI. O método HTTP muda de DELETE para POST, o {user_id} e o {external_id} saem do path, e o cancelamento passa a operar sobre o identificador único da order.
Na API de Pedidos presenciais, o cancelamento apagava a order ativa associada à caixa, uma operação sobre a caixa e não sobre a transação individual. Na API de Orders, o cancelamento opera diretamente sobre a order pelo order_id, sem depender da caixa no path. O response passou de vazio, código HTTP 204, para o objeto completo da order com status: "canceled", código HTTP 200.
O header necessário nesta operação é:
| Header | Obrigatoriedade | Descrição |
X-Idempotency-Key | Obrigatório | Chave única por requisição. |
O response retorna o objeto completo da order com status: "canceled". Na API de Pedidos presenciais, o cancelamento retornava HTTP 204 sem body. A tabela a seguir lista os campos retornados no response de cancelamento.
| Campo | Descrição |
id | Identificador da order cancelada, gerado pelo Mercado Pago. |
user_id | Identificador do usuário do Mercado Pago que criou a order. |
type | Tipo de order. Para QR: sempre qr. |
external_reference | Referência externa da order, atribuída no momento da criação. |
description | Descrição do produto ou serviço, motivo da order. |
expiration_time | Tempo de expiração da order em formato ISO 8601. |
processing_mode | Modo de processamento. Para QR: sempre automatic. |
total_amount | Valor total da order. |
country_code | Identificador do site/país da aplicação do Mercado Pago. |
marketplace_fee | Tarifa do marketplace. Exclusivo para integrações com OAuth. |
integration_data.application_id | Identificador da aplicação do Mercado Pago que criou a order. |
integration_data.platform_id | Identificador da plataforma, atribuído pelo Mercado Pago. |
integration_data.integrator_id | Identificador do integrador, atribuído pelo Mercado Pago. |
integration_data.sponsor.id | USER_ID do sistema integrador. |
status | Estado atual da order. Ao cancelar: canceled. |
status_detail | Detalhe do estado atual da order. Ao cancelar: canceled. |
currency | Identificador da moeda utilizada. Valores: ARS, BRL, CLP, UYU. |
created_date | Data de criação da order. Formato yyyy-MM-ddTHH:mm:ss.sssZ. |
last_updated_date | Data da última atualização da order. Formato yyyy-MM-ddTHH:mm:ss.sssZ. |
config.qr.external_pos_id | Identificador externo da caixa associada à order. |
config.qr.mode | Modo de QR configurado. Valores: static, dynamic, hybrid. |
transactions.payments[].id | Identificador da transação de pagamento, gerado pelo Mercado Pago. |
transactions.payments[].amount | Valor do pagamento. |
transactions.payments[].status | Estado do pagamento. Ao cancelar: canceled. |
transactions.payments[].status_detail | Detalhe do estado do pagamento. Ao cancelar: canceled_by_api. |
transactions.payments[].reference_id | Identificador do pagamento associado à order. |
items[].title | Nome do item. |
items[].unit_price | Preço unitário do item. |
items[].quantity | Quantidade de itens. |
items[].unit_measure | Unidade de medida do item. |
items[].external_code | Código externo do item (ex.: EAN). |
items[].external_categories[].id | Identificador de categoria do item no sistema externo. |
discounts.payment_methods[].new_total_amount | Novo valor total da order quando um desconto é aplicado. |
discounts.payment_methods[].type | Meio de pagamento ao qual o desconto se aplica. |
No cancelamento, os erros foram agrupados conforme o tipo de alteração. Consulte as tabelas abaixo para mais detalhes.
Erros que desaparecem
Os seguintes erros existem na API de Pedidos presenciais mas não têm equivalência na API de Orders.
| HTTP | API de Pedidos presenciais | Observação |
400 | invalid_collector_id | Removido na API de Orders. |
401 | unauthorized (authorization value not present) | Removido. Ocorria ao enviar {user_id} alfanumérico. A identidade é obtida diretamente do Access Token. |
403 | forbidden | Removido. Ocorria quando o {user_id} não pertencia ao dono do Access Token. |
Erros renomeados
Os seguintes erros foram renomeados na API de Orders.
| HTTP | API de Pedidos presenciais | API de Orders | Observação |
400 → 404 | pos_obtainment_by_external_id_error | order_not_found | Na API de Pedidos presenciais, era 400. Na API de Orders, é 404. O cancelamento passa a operar sobre o order_id. |
Erros que mudam de comportamento
Os seguintes erros existem em ambas as APIs mas com comportamento diferente na API de Orders.
| HTTP | API de Pedidos presenciais | API de Orders | Observação |
400 → 401 | invalid_access_token | unauthorized | Na API de Pedidos presenciais, era 400. Na API de Orders, é 401. |
Erros que permanecem iguais
O seguinte erro tem o mesmo comportamento em ambas as APIs.
| HTTP | Erro | Observação |
500 | Genérico | Erro interno. Verifique o retorno e repita a requisição. |
Erros introduzidos pela API de Orders
Os seguintes erros não têm equivalência na API de Pedidos presenciais.
| HTTP | Erro | Observação |
400 | empty_required_header | X-Idempotency-Key ausente. |
400 | invalid_path_param | O order_id tem formato inválido. Deve começar com ORD seguido de 26 caracteres. |
401 | unauthorized | Token inválido ou expirado. O equivalente na API de Pedidos presenciais era invalid_access_token com código 400. |
404 | order_not_found | O order_id não corresponde a nenhuma order criada. |
409 | idempotency_key_already_used | O X-Idempotency-Key já foi utilizado com uma requisição distinta. |
409 | order_already_canceled | A order já está cancelada. Orders só podem ser canceladas com status: created. |
409 | instore_order_locked_error | Não é possível cancelar uma order enquanto o pagamento está em andamento. |
Implementar reembolsos com o endpoint dedicado
A API de Orders introduz o endpoint dedicado POST /v1/orders/{order_id}/refundAPI para reembolsos, que não existia na API de Pedidos presenciais. Anteriormente, era necessário receber o webhook do pagamento, obter o payment_id e executar o reembolso pela API de Payments separadamente. Agora, o reembolso é realizado diretamente sobre a order.
Escolha entre reembolso total ou parcial de acordo com o valor a ser devolvido.
Para reembolsar o valor total da order, envie a requisição ao endpoint POST /v1/orders/{order_id}/refundAPI sem body.
curl
curl -X POST \ 'https://api.mercadopago.com/v1/orders/{{ORDER_ID}}/refund' \ -H 'Authorization: Bearer {{ACCESS_TOKEN}}' \ -H 'X-Idempotency-Key: {{IDEMPOTENCY_KEY}}'
Reembolsos são aceitos em até 360 dias a partir da data do pagamento.
O response do reembolso varia conforme o tipo de operação realizada.
| Campo | Tipo | Descrição |
id | string | Identificador da order reembolsada. |
status | string | refunded para reembolso total. processed para reembolso parcial (ainda há saldo disponível). |
status_detail | string | refunded para reembolso total. partially_refunded para reembolso parcial. |
transactions.refunds[].id | string | Identificador do reembolso, gerado pelo Mercado Pago. |
transactions.refunds[].transaction_id | string | Identificador da transação de pagamento que está sendo reembolsada. |
transactions.refunds[].amount | string | Valor do reembolso. Se o pagamento foi feito com desconto, reflete esse valor. |
transactions.refunds[].status | string | processing quando o reembolso total foi solicitado e está em processamento. processed quando o reembolso parcial foi concluído com sucesso. |
transactions.refunds[].reference_id | string | Identificador que associa o pagamento ao seu respectivo reembolso. |
Validar a migração
Após aplicar as alterações, verifique se a integração opera corretamente em todos os fluxos antes de ir a produção.
O header X-Ttl-Store-Preference foi removido e substituído pelo campo expiration_time no body da requisição.
O header X-Idempotency-Key deve estar presente em todas as operações de criação, cancelamento e reembolso.
Orders criadas com sucesso com o novo payload no endpoint POST /v1/ordersAPI e o campo id capturado do response.
Orders consultadas com sucesso pelo endpoint GET /v1/orders/{order_id}API.
Status de orders monitorados via webhook com o tópico "Order (Mercado Pago)" e os novos valores: created, processed, canceled, refunded e expired.
Orders canceladas com sucesso pelo endpoint POST /v1/orders/{order_id}/cancelAPI.
Reembolsos executados pelo endpoint dedicado POST /v1/orders/{order_id}/refundAPI.
Acesse a documentação para saber como testar a integração.