Primeira integração em 10 minutos
Do token ao pedido confirmado, passo a passo, com playground em cada operação e o cURL equivalente.
Em seis passos você vai autenticar, gerar um pedido na loja de teste, recebê-lo por polling, buscar o pedido completo, confirmar o evento e confirmar o pedido. Cada passo tem o playground da operação, que chama a API de verdade a partir desta página, e o cURL equivalente para rodar no terminal.
Antes de começar você precisa de uma loja de teste e de uma credencial com os escopos orders:read e orders:write.
Nos exemplos, exporte as variáveis uma vez:
export BASE_URL="https://api.meupedido.io/open-delivery"
export CLIENT_ID="mp_7f3a9c1e5b2d4a6f8e0c1b3d"
export CLIENT_SECRET="cole-aqui-o-segredo-mostrado-no-painel"Autorizar
Troque client_id e client_secret por um token de acesso. O token vale por 3600 segundos e vai no header Authorization: Bearer de todas as chamadas seguintes.
curl -X POST "$BASE_URL/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET"{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXJjaGFudF9pZCI6IjZkMmY0YzhhLTFiM2UtNGY1YS05YzdkLTJlOGIwYTFmM2M1ZCIsImNsaWVudF9pZCI6Im1wXzdmM2E5YzFlNWIyZDRhNmY4ZTBjMWIzZCIsInNjb3BlIjoib3JkZXJzOnJlYWQgb3JkZXJzOndyaXRlIn0.Q1w7Xy0Yt3cJ5w8NnZK2p9Vb4Ls6Hd1Ff0Rr8Mm3Aa0",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXJjaGFudF9pZCI6IjZkMmY0YzhhLTFiM2UtNGY1YS05YzdkLTJlOGIwYTFmM2M1ZCIsImNsaWVudF9pZCI6Im1wXzdmM2E5YzFlNWIyZDRhNmY4ZTBjMWIzZCIsInNjb3BlIjoib3JkZXJzOnJlYWQgb3JkZXJzOndyaXRlIn0.Q1w7Xy0Yt3cJ5w8NnZK2p9Vb4Ls6Hd1Ff0Rr8Mm3Aa0",
"token_type": "bearer",
"tokenType": "bearer",
"expires_in": 3600,
"expiresIn": 3600,
"scope": "orders:read orders:write"
}Guarde o valor de access_token:
export TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...."Fazer um pedido no cardápio da loja de teste
Abra o cardápio digital da loja de teste, monte um carrinho e finalize um pedido de entrega. Nada de API aqui: é o caminho que o cliente da loja percorre. Em segundos o MeuPedido cria o pedido e emite o evento CREATED no feed da sua credencial.
Anote o número do pedido que o cardápio mostra ao final (o displayId). Ele ajuda a reconhecer o pedido no próximo passo.
Consultar eventos (polling)
Peça os eventos pendentes. A resposta é um array, vazio quando não há nada, com até limit itens (padrão 100, máximo 200). O envelope traz o orderId e a orderURL, nunca o pedido.
curl "$BASE_URL/v1/events:polling?limit=100" \
-H "Authorization: Bearer $TOKEN"[
{
"eventId": "c0a8f1e2-3d4b-4c5a-9e6f-7a8b9c0d1e2f",
"eventType": "CREATED",
"orderId": "9b1e2d3c-4f5a-4b6c-8d7e-0f1a2b3c4d5e",
"orderURL": "https://api.meupedido.io/open-delivery/v1/orders/9b1e2d3c-4f5a-4b6c-8d7e-0f1a2b3c4d5e",
"createdAt": "2026-09-19T14:32:10Z"
}
]Se o array vier vazio, espere alguns segundos e consulte de novo. Enquanto você não confirmar o evento, ele continua aparecendo a cada consulta.
Buscar o pedido
Use o orderId (ou a orderURL) do evento para buscar o pedido completo. É esse payload que o seu sistema grava.
curl "$BASE_URL/v1/orders/9b1e2d3c-4f5a-4b6c-8d7e-0f1a2b3c4d5e" \
-H "Authorization: Bearer $TOKEN"{
"id": "9b1e2d3c-4f5a-4b6c-8d7e-0f1a2b3c4d5e",
"displayId": "1042",
"type": "DELIVERY",
"orderTiming": "INSTANT",
"createdAt": "2026-09-19T14:32:10Z",
"preparationStartDateTime": "2026-09-19T14:32:10Z",
"merchant": {
"id": "6d2f4c8a-1b3e-4f5a-9c7d-2e8b0a1f3c5d",
"name": "Loja de teste Acme"
},
"customer": {
"id": "a4b5c6d7-e8f9-4a0b-8c1d-2e3f4a5b6c7d",
"name": "Ana Souza",
"phone": { "number": "11999990000", "extension": null },
"documentNumber": null,
"email": null,
"ordersCountOnMerchant": null
},
"items": [
{
"id": "f1e2d3c4-b5a6-4978-8a9b-0c1d2e3f4a5b",
"index": null,
"name": "Pizza Margherita Grande",
"externalCode": "3c2b1a09-8f7e-4d6c-b5a4-9382716f5e4d",
"unit": null,
"ean": null,
"quantity": 1,
"specialInstructions": "Sem manjericão",
"unitPrice": { "value": 49.9, "currency": "BRL" },
"optionsPrice": { "value": 8, "currency": "BRL" },
"totalPrice": { "value": 57.9, "currency": "BRL" },
"options": [
{
"id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"index": null,
"name": "Borda recheada",
"externalCode": "b8a7c6d5-e4f3-4210-9876-543210fedcba",
"quantity": 1,
"unit": null,
"unitPrice": { "value": 8, "currency": "BRL" },
"price": { "value": 8, "currency": "BRL" },
"groupName": null
}
]
}
],
"otherFees": [
{
"name": "Taxa de entrega",
"type": "DELIVERY",
"receivedBy": "MERCHANT",
"price": { "value": 7, "currency": "BRL" }
}
],
"discounts": null,
"total": {
"items": { "value": 57.9, "currency": "BRL" },
"otherFees": { "value": 7, "currency": "BRL" },
"discount": { "value": 0, "currency": "BRL" },
"orderAmount": { "value": 64.9, "currency": "BRL" }
},
"payments": {
"prepaid": 0,
"pending": 64.9,
"methods": [
{
"value": 64.9,
"currency": "BRL",
"method": "CREDIT",
"methodInfo": "Cartão de crédito",
"type": "OFFLINE",
"changeFor": null,
"brand": null,
"transaction": null
}
]
},
"delivery": {
"deliveryDateTime": null,
"estimatedDeliveryDateTime": null,
"deliveredBy": "MERCHANT",
"deliveryAddress": {
"country": "BR",
"state": "SP",
"city": "São Paulo",
"district": "Pinheiros",
"street": "Rua dos Pinheiros",
"number": "1000",
"postalCode": "05422001",
"complement": "Apto 42",
"reference": null,
"formattedAddress": null,
"coordinates": { "latitude": -23.5656, "longitude": -46.6898 }
}
},
"takeout": null,
"schedule": null,
"extraInfo": "Interfone 42 | origem=SITE",
"test": true
}O exemplo é a saída real do serializador da API: prepaid, pending e methods[].value são números, o tamanho vem embutido em items[].name, e campos que a API ainda não preenche (index, unit, groupName, estimatedDeliveryDateTime, formattedAddress, ordersCountOnMerchant) chegam como null. Todos os campos e seus significados estão em Estrutura do pedido.
Confirmar o recebimento do evento (ack)
Depois de gravar o pedido, confirme o evento. Isso o retira do feed. A confirmação é obrigatória e é o que garante a entrega at-least-once: se o seu sistema cair entre o polling e a gravação, o evento volta na próxima consulta.
curl -X POST "$BASE_URL/v1/events/acknowledgment" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '[{ "id": "c0a8f1e2-3d4b-4c5a-9e6f-7a8b9c0d1e2f" }]'{ "acknowledged": 1 }Consulte o polling de novo: o array volta vazio.
Confirmar o pedido
Diga ao MeuPedido que a loja aceitou o pedido. O status passa a ACCEPTED, o lojista e o cliente veem a mudança, e um evento CONFIRMED entra no feed. O header Idempotency-Key é opcional, mas use-o desde o início: se a mesma chamada for repetida com a mesma chave, a API devolve a resposta gravada em vez de processar de novo.
curl -X POST "$BASE_URL/v1/orders/9b1e2d3c-4f5a-4b6c-8d7e-0f1a2b3c4d5e/confirm" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: 3f9c2a7e-confirm-1042"{ "status": "accepted", "situation": "ACCEPTED" }Repita a chamada: a resposta é a mesma. Repita sem o header: { "status": "already_applied", "situation": "ACCEPTED" }, porque o pedido já está nesse estado.
O que você acabou de fazer
Percorreu o ciclo mínimo de uma integração: token, polling, buscar, ack, ação. Uma integração de produção é esse mesmo ciclo em loop, com três cuidados a mais:
- Deduplicar por
eventId. O mesmo evento pode chegar mais de uma vez. Guarde os ids processados. - Renovar o token antes de expirar. Peça outro por volta dos 55 minutos, ou ao receber
401. - Avançar o pedido até o fim.
startPreparation,readyForPickup,dispatch,deliveredoupickedUp, conforme a operação acontece no seu lado.
Próximos passos
- Polling: o loop de produção, com intervalo, limite e dedupe.
- Ações e idempotência: todas as ações, o
Idempotency-Keye os erros409e422. - Entrada em produção: o checklist antes de ligar em uma loja real.