MeuPedido/developer

Loja e cardápio

GET merchant e GET menus: dados da loja, categorias, itens, grupos de opções e o grupo Tamanho.

A API expõe duas operações de leitura sobre a loja ligada à credencial: os dados cadastrais (GET /v1/merchant/{merchantId}) e o cardápio publicado (GET /v1/merchant/{merchantId}/menus). Ambas são somente leitura. O lojista continua editando loja e cardápio pelo painel do MeuPedido; o seu sistema lê o resultado.

OperaçãoEscopoRetorna
GET /v1/merchant/{merchantId}merchant:readUm objeto com os dados da loja
GET /v1/merchant/{merchantId}/menuscatalog:readUm array com um cardápio

O merchantId é o da credencial

Uma credencial pertence a uma única loja. O merchantId da URL precisa ser o id dessa loja; qualquer outro id devolve 404, mesmo que a loja exista. O id está no claim merchant_id do token de acesso e no bloco merchant.id de todo pedido devolvido pela API.

Várias lojas

Para integrar N lojas, o lojista de cada uma gera a própria credencial. Cada token só enxerga a loja que o emitiu. Veja Conceitos.

Buscar a loja

curl https://api.meupedido.io/open-delivery/v1/merchant/8f1c2b6e-4a3d-4c7e-9b21-6d0f3a5e8c47 \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Resposta 200:

{
  "id": "8f1c2b6e-4a3d-4c7e-9b21-6d0f3a5e8c47",
  "name": "Cantina da Vila",
  "description": "Massas artesanais e pizzas de fermentação natural.",
  "document": "12345678000190",
  "status": "AVAILABLE",
  "contactEmails": ["contato@cantinadavila.com.br"],
  "contactPhones": ["+5511912345678"],
  "address": {
    "country": "BR",
    "state": "SP",
    "city": "São Paulo",
    "district": "Vila Madalena",
    "street": "Rua Harmonia",
    "number": "512",
    "postalCode": "05435-000",
    "complement": null,
    "latitude": -23.5537,
    "longitude": -46.6883
  },
  "services": [
    { "serviceType": "DELIVERY", "status": "AVAILABLE", "menuId": "c9d4e2a1-7b3f-4f8e-a6d5-2e1b9c0f4a73" },
    { "serviceType": "TAKEOUT", "status": "AVAILABLE", "menuId": "c9d4e2a1-7b3f-4f8e-a6d5-2e1b9c0f4a73" }
  ],
  "createdAt": "2025-03-12T14:02:11Z",
  "lastUpdate": "2026-09-18T21:45:09Z"
}

Campos da loja

CampoTipoDescrição
idstringId da loja. É o mesmo merchantId da URL e do claim merchant_id do token.
namestringNome de exibição da loja.
descriptionstring ou nullDescrição livre, como aparece no cardápio digital.
documentstring ou nullCNPJ ou CPF da loja, só dígitos.
statusAVAILABLE ou UNAVAILABLESe a loja está aberta para receber pedidos neste momento.
contactEmailsstring[]E-mails de contato.
contactPhonesstring[]Telefones de contato.
addressobjetoEndereço com country, state, city, district, street, number, postalCode, complement, latitude e longitude.
servicesobjeto[]Modalidades de atendimento. Cada item traz serviceType (DELIVERY, TAKEOUT ou INDOOR), status e o menuId usado naquela modalidade.
createdAtdataCriação da loja, em UTC com sufixo Z.
lastUpdatedataÚltima alteração dos dados da loja, em UTC com sufixo Z.

Campos sem valor vêm como null, nunca são omitidos.

Buscar o cardápio

O cardápio é devolvido em um array, como pede o padrão Open Delivery. No MeuPedido cada loja tem um único cardápio, então o array sempre traz um elemento e o id dele é o menuId referenciado em services.

curl https://api.meupedido.io/open-delivery/v1/merchant/8f1c2b6e-4a3d-4c7e-9b21-6d0f3a5e8c47/menus \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Resposta 200, resumida a uma categoria, dois itens e dois grupos de opções:

[
  {
    "id": "c9d4e2a1-7b3f-4f8e-a6d5-2e1b9c0f4a73",
    "name": "Cardápio principal",
    "categories": [
      {
        "id": "5b7e1f3a-9c2d-4e6b-8a1f-0d3c7e9b2a54",
        "name": "Pizzas",
        "description": "Massa de fermentação natural, 35 cm ou 25 cm.",
        "index": 0,
        "status": "AVAILABLE",
        "itemOfferIds": [
          "a3f9c1d2-6e4b-4a8c-9f1d-7b2e5c0a8d36",
          "e7d2b4c9-1a5f-4c3e-b8a2-9f6d0e1c3b75"
        ]
      }
    ],
    "items": [
      {
        "id": "a3f9c1d2-6e4b-4a8c-9f1d-7b2e5c0a8d36",
        "name": "Pizza Margherita",
        "description": "Molho de tomate, mussarela de búfala e manjericão.",
        "externalCode": "PZ-001",
        "status": "AVAILABLE",
        "image": "https://cdn.meupedido.io/lojas/cantina-da-vila/pizza-margherita.jpg",
        "price": { "value": 0, "originalValue": 0, "currency": "BRL" },
        "optionGroupIds": [
          "a3f9c1d2-6e4b-4a8c-9f1d-7b2e5c0a8d36-variacoes",
          "2c8e4b1d-7f3a-4d9e-a5c6-1b0f8d3e7a92"
        ]
      },
      {
        "id": "e7d2b4c9-1a5f-4c3e-b8a2-9f6d0e1c3b75",
        "name": "Pizza Calabresa",
        "description": "Calabresa artesanal, cebola roxa e azeitonas.",
        "externalCode": "PZ-002",
        "status": "UNAVAILABLE",
        "image": null,
        "price": { "value": 62.9, "originalValue": 69.9, "currency": "BRL" },
        "optionGroupIds": ["2c8e4b1d-7f3a-4d9e-a5c6-1b0f8d3e7a92"]
      }
    ],
    "optionGroups": [
      {
        "id": "a3f9c1d2-6e4b-4a8c-9f1d-7b2e5c0a8d36-variacoes",
        "name": "Tamanho",
        "description": null,
        "index": 0,
        "status": "AVAILABLE",
        "minPermitted": 1,
        "maxPermitted": 1,
        "options": [
          {
            "id": "4d1a7c3e-8b5f-4e2a-9c6d-3f0b1e8a5d27",
            "name": "Grande (35 cm)",
            "externalCode": "PZ-001-G",
            "index": 0,
            "status": "AVAILABLE",
            "price": { "value": 69.9, "originalValue": 69.9, "currency": "BRL" }
          },
          {
            "id": "9e3b5d7f-2c1a-4f6e-8d4b-6a0c2f9e1b58",
            "name": "Média (25 cm)",
            "externalCode": "PZ-001-M",
            "index": 1,
            "status": "AVAILABLE",
            "price": { "value": 49.9, "originalValue": 49.9, "currency": "BRL" }
          }
        ]
      },
      {
        "id": "2c8e4b1d-7f3a-4d9e-a5c6-1b0f8d3e7a92",
        "name": "Adicionais",
        "description": "Escolha até 3.",
        "index": 1,
        "status": "AVAILABLE",
        "minPermitted": 0,
        "maxPermitted": 3,
        "options": [
          {
            "id": "7a2f9d4b-3e6c-4b1a-8f5d-0c9e2a7b4d63",
            "name": "Borda recheada",
            "externalCode": "AD-010",
            "index": 0,
            "status": "AVAILABLE",
            "price": { "value": 8, "originalValue": 8, "currency": "BRL" }
          }
        ]
      }
    ]
  }
]

Estrutura do cardápio

O cardápio é normalizado: categorias apontam para itens por id, itens apontam para grupos de opções por id. Nada é aninhado. Monte índices por id em memória antes de percorrer.

Cardápio

CampoTipoDescrição
idstringId do cardápio. Igual ao menuId em services da loja.
namestringNome do cardápio.
categoriesobjeto[]Categorias, na ordem de exibição.
itemsobjeto[]Todos os itens vendáveis do cardápio.
optionGroupsobjeto[]Todos os grupos de opções referenciados pelos itens.

Categoria

CampoTipoDescrição
idstringId da categoria.
namestringNome da categoria.
descriptionstring ou nullDescrição opcional.
indexnúmeroPosição na ordem de exibição, a partir de 0.
statusAVAILABLE ou UNAVAILABLEDisponibilidade da categoria inteira.
itemOfferIdsstring[]Ids dos itens que pertencem à categoria, na ordem de exibição.

Item

CampoTipoDescrição
idstringId do item. É o mesmo id que chega em items[].id de um pedido.
namestringNome do item.
descriptionstring ou nullDescrição.
externalCodestring ou nullCódigo do produto no sistema do lojista (PLU, SKU). Use para casar com o seu cadastro.
statusAVAILABLE ou UNAVAILABLEDisponibilidade do item.
imagestring ou nullURL da imagem.
priceobjetovalue (preço atual), originalValue (preço sem promoção) e currency (BRL).
optionGroupIdsstring[]Ids dos grupos de opções que o item oferece, na ordem de exibição.

Grupo de opções

CampoTipoDescrição
idstringId do grupo.
namestringNome do grupo, como "Tamanho" ou "Adicionais".
descriptionstring ou nullDescrição opcional.
indexnúmeroPosição na ordem de exibição.
statusAVAILABLE ou UNAVAILABLEDisponibilidade do grupo.
minPermittednúmeroQuantidade mínima de opções que o cliente precisa escolher. 1 ou mais torna o grupo obrigatório.
maxPermittednúmeroQuantidade máxima de opções.
optionsobjeto[]Opções do grupo, cada uma com id, name, externalCode, index, status e price.

Variações viram o grupo "Tamanho"

No MeuPedido um produto pode ter vários preços (por exemplo, pizza grande e média). O padrão Open Delivery não tem esse conceito no item, então a API converte cada produto com variações em:

  • um item, que representa o produto, e
  • um grupo de opções obrigatório (minPermitted: 1, maxPermitted: 1) chamado Tamanho, com id {productId}-variacoes, em que cada opção é uma variação com o próprio preço.

O preço que conta é o da variação escolhida. Em um pedido, a variação não aparece em options[]: o item chega com externalCode igual ao id do produto, name com o nome do produto já incluindo a variação (por exemplo, "Pizza Margherita Grande") e unitPrice com o preço da variação escolhida. O options[] do item traz apenas os complementos, e totalPrice já considera unitPrice mais optionsPrice. Não há um id de variação no pedido; para saber qual foi escolhida, compare o unitPrice com os preços das opções do grupo Tamanho no cardápio, ou use o name.

Não trate Tamanho como adicional

Um grupo cujo id termina em -variacoes representa o próprio produto, não um acréscimo. Se o seu PDV tem o conceito de variação ou grade, mapeie para ele no cardápio, e no pedido resolva a variação pelo preço unitário ou pelo nome do item.

Itens indisponíveis não somem

Quando o lojista pausa um item, ele continua no cardápio com status: "UNAVAILABLE". O mesmo vale para categorias, grupos e opções. Isso mantém os ids estáveis: um pedido antigo sempre aponta para um item que existe no cardápio. Filtre por status na hora de exibir; não use a ausência do item como sinal de nada.

Quando sincronizar

Não há evento de cardápio na API. Para manter uma cópia local, busque o cardápio em um intervalo que faça sentido para a sua operação e compare lastUpdate da loja para saber se algo mudou nos dados cadastrais. Cada chamada conta no limite de 600 requisições por minuto da credencial.

Próximos passos

Nesta página