Takeat
Versão da documentação
Cardápio

Documentação

Integrar o cardápio

Consuma preços, escolhas e disponibilidade resolvidos em um contrato semântico.

GET /v1/menu é o contrato para vitrines, agentes e integrações que precisam reproduzir o cardápio. Ele agrupa os dados por significado e resolve preços e elegibilidade no servidor. O envelope contém restaurant_id, restaurant_identity, channel, evaluation e categories; não inclui o cadastro completo do restaurante.

restaurant_identity contém apenas o nome público (name) e o avatar (image, com url e thumbnail_url). A imagem pode ser null; a identidade também será null se o cadastro não for encontrado. Não inclui e-mail, senha nem configurações privadas. Use esses dados para identificar o restaurante em interfaces e conversas.

Este é um contrato substituto, sem aliases dos antigos campos planos. /v1/products e suas operações de edição continuam com seu contrato próprio.

Requisição

curl "https://public-api.takeat.app/v1/menu?channel=delivery&only_available=true" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Com OAuth, exige menu:read. A sessão do restaurante também é aceita, limitada ao restaurante assinado no token. Integrações com vários restaurantes precisam de restaurant_id na query; a autorização continua sendo validada.

Filtros

ParâmetroPadrãoDescrição
channelin_storein_store ou delivery; escolhe o canal e os preços
only_availabletrueRemove itens inelegíveis, inclusive esgotados, e seções vazias
category_idRestringe a uma seção
brand_idRestringe às categorias da marca, dentro do restaurante autorizado
searchBusca por nome e descrição, sem diferenciar acentos ou caixa
scheduled_atISO 8601 com Z ou offset; exige channel=delivery
include_complementstrueInclui grupos e opções; omitir não altera preço ou disponibilidade
include_fiscal_infofalseInclui somente fiscal, sem alias fiscal_info

IDs de filtros precisam ser inteiros positivos; booleanos aceitam somente true e false. search aceita até 120 caracteres. Um filtro sem resultados retorna 200 com categories: [].

Objetos semânticos

ObjetoConteúdo
pricingMoeda, preços configurados por canal e preços resolvidos; regra de cobrança nos grupos
availabilityFlags de canal, horários, esgotamento, agendamento e resultado da avaliação
presentationURLs públicas de imagens, traduções, destaque, promoção e tag; ícone nas categorias
saleVenda por unit ou kg, flag unitária e participação na taxa de serviço
identifiersCódigos EAN e códigos por integração/PDV
selectionMínimo/máximo do grupo, escolha única, obrigatoriedade e limite por opção
fiscalAtributos fiscais públicos, somente com a opção habilitada

Os grupos continuam em complement_categories, com suas opções em complements. Nome, descrição, identificador e custom_order permanecem junto ao item. Categorias também informam preparation_time_minutes. Não são expostos custos/CMV, controles de relatório, caminhos de arquivos, IDs das associações, campos temporários da UI ou configurações privadas da loja.

Preços

Trecho ilustrativo de um produto com base promocional de R$ 20,00 e R$ 3,00 de escolhas obrigatórias (os demais objetos foram omitidos):

{
  "id": 42,
  "name": "Takeat Burger",
  "pricing": {
    "currency": "BRL",
    "in_store": { "regular": "24.00", "promotional": null },
    "delivery": { "regular": "25.00", "promotional": "20.00" },
    "resolved": {
      "channel": "delivery",
      "base": "20.00",
      "minimum": "23.00",
      "minimum_without_promotion": "28.00"
    },
    "has_starting_price": true,
    "is_combo": false
  },
  "availability": {
    "channels": { "in_store": true, "delivery": true, "self_service": false },
    "scheduled_orders": false,
    "sold_out": false,
    "schedule": {
      "enabled": false,
      "weekdays": [
        "sunday",
        "monday",
        "tuesday",
        "wednesday",
        "thursday",
        "friday",
        "saturday"
      ],
      "start_time": null,
      "end_time": null,
      "time_zone": "America/Sao_Paulo"
    },
    "resolved": { "available": true, "reason": null }
  }
}

Todos os valores monetários são strings com duas casas decimais. Os objetos de canal preservam os preços configurados, inclusive null. A resolução usa o primeiro valor não nulo:

CanalPrioridade de pricing.resolved.base
in_storein_store.promotionalin_store.regular
deliverydelivery.promotionaldelivery.regularin_store.regular

Zero é válido; não use testes de truthiness para escolher um preço. A promoção presencial não é herdada pelo delivery.

  • base: preço do canal sem escolhas.
  • minimum: base mais a seleção obrigatória mais barata que respeita os limites.
  • minimum_without_promotion: as mesmas escolhas, com a base regular do canal.
  • Se o produto estiver indisponível, os dois mínimos são null; a base e os preços configurados continuam disponíveis para inspeção.
  • has_starting_price é uma preferência de apresentação, não uma condição para calcular escolhas.

Os valores correspondem a uma unidade de precificação (sale.unit): uma unidade ou um quilo. O menu não recebe peso nem quantidade do pedido e não calcula porções, frete ou taxa de serviço. Não multiplique adicionais por peso sem aplicar a regra de pedidos correspondente.

Grupos de escolha e combos

selection.minimum normaliza o mínimo: ausência na origem significa 1 em grupos obrigatórios e 0 em opcionais; zero explícito continua zero. selection.maximum respeita o limite do grupo e é no máximo 1 quando single_choice=true. Cada opção também tem selection.max_quantity.

Um grupo opcional pode ser ignorado; ao selecionar opções, seu mínimo continua sendo a regra da seleção. O cálculo do mínimo do produto não inclui grupos opcionais. Uma opção indisponível ou com limite zero não satisfaz uma seleção obrigatória.

Use pricing.mode como regra canônica:

ModoAcréscimo das escolhas
includedZero
sumSoma de preço × quantidade
averageMédia ponderada pelas quantidades
highestMaior preço unitário escolhido

highest prevalece sobre average. Grupos não adicionais são incluídos, exceto grupos obrigatórios de combos, que compõem seu preço. O produto mantém sua base configurada e as opções mantêm seus preços completos: não há preços combo_* nem opções convertidas em diferenças de preço. Não some o mínimo do grupo novamente sobre pricing.resolved.minimum.

Disponibilidade e horários

evaluation.at informa o instante avaliado; evaluation.mode é immediate ou scheduled. O fuso é informado em evaluation.time_zone e em cada schedule. O serviço usa MENU_TIME_ZONE (padrão America/Sao_Paulo); não é um fuso deduzido do navegador nem uma configuração por restaurante.

Sem scheduled_at, avalia agora. Com o parâmetro, avalia o instante informado e a permissão scheduled_orders do produto, independente do delivery imediato. Categorias, grupos e opções continuam exigindo seu canal de delivery habilitado. O indicador atual de esgotamento também continua valendo; não se prevê reposição.

Horários são locais, com início inclusivo e fim exclusivo. Intervalos que cruzam a meia-noite pertencem ao dia de início. Início igual ao fim significa dia inteiro; dois horários nulos significam restrição apenas por dia. Horário parcial ou máscara de dias inválida torna o item inelegível. Datas históricas usadas para armazenar os horários não alteram o horário de hoje.

availability.resolved.reason explica o primeiro impedimento:

ValorSignificado
nullElegível neste contexto
channel_disabledCanal ou permissão de agendamento desabilitado
outside_scheduleFora dos dias/horários configurados
sold_outProduto esgotado
parent_unavailableCategoria, produto ou grupo superior indisponível
required_choices_unavailableNão é possível satisfazer um grupo obrigatório
invalid_configurationPreço/limites inválidos ou grupo sem opções utilizáveis

Com only_available=false, itens indisponíveis e seções vazias permanecem inspecionáveis. Com true, são removidos. Um grupo obrigatório indisponível bloqueia o produto; não é simplesmente ocultado para liberar a compra. Grupos opcionais indisponíveis não bloqueiam o produto.

Registros removidos, categorias de embalagem e espelhos internos do iFood são sempre excluídos. A ordem segue o editor, com desempates estáveis; o custom_order de grupos vem do vínculo com o produto.

Elegibilidade do catálogo não é autorização de checkout. A rota não valida abertura da loja, área de entrega, capacidade de horários, estoque futuro, pagamento ou o pedido escolhido. Esses dados não são embutidos no menu.

Consulte a referência completa, os atributos fiscais e Gerenciar produtos para as operações de escrita.

Consulte também Gerenciar complementos para editar opções, preços, fiscal e disponibilidade, individualmente ou em lote.

On this page