MeuPedido/developer
Primeiros passos

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:

Terminal
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.

POST
/oauth/token
Terminal
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"
200 OK
{
  "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:

Terminal
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.

GET
/v1/events:polling
Terminal
curl "$BASE_URL/v1/events:polling?limit=100" \
  -H "Authorization: Bearer $TOKEN"
200 OK
[
  {
    "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.

GET
/v1/orders/{orderId}
Terminal
curl "$BASE_URL/v1/orders/9b1e2d3c-4f5a-4b6c-8d7e-0f1a2b3c4d5e" \
  -H "Authorization: Bearer $TOKEN"
200 OK
{
  "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.

POST
/v1/events/acknowledgment
Terminal
curl -X POST "$BASE_URL/v1/events/acknowledgment" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '[{ "id": "c0a8f1e2-3d4b-4c5a-9e6f-7a8b9c0d1e2f" }]'
202 Accepted
{ "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.

POST
/v1/orders/{orderId}/confirm
Terminal
curl -X POST "$BASE_URL/v1/orders/9b1e2d3c-4f5a-4b6c-8d7e-0f1a2b3c4d5e/confirm" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: 3f9c2a7e-confirm-1042"
202 Accepted
{ "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:

  1. Deduplicar por eventId. O mesmo evento pode chegar mais de uma vez. Guarde os ids processados.
  2. Renovar o token antes de expirar. Peça outro por volta dos 55 minutos, ou ao receber 401.
  3. Avançar o pedido até o fim. startPreparation, readyForPickup, dispatch, delivered ou pickedUp, conforme a operação acontece no seu lado.

Próximos passos

Nesta página