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âmetro | Padrão | Descrição |
|---|---|---|
channel | in_store | in_store ou delivery; escolhe o canal e os preços |
only_available | true | Remove itens inelegíveis, inclusive esgotados, e seções vazias |
category_id | — | Restringe a uma seção |
brand_id | — | Restringe às categorias da marca, dentro do restaurante autorizado |
search | — | Busca por nome e descrição, sem diferenciar acentos ou caixa |
scheduled_at | — | ISO 8601 com Z ou offset; exige channel=delivery |
include_complements | true | Inclui grupos e opções; omitir não altera preço ou disponibilidade |
include_fiscal_info | false | Inclui 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
| Objeto | Conteúdo |
|---|---|
pricing | Moeda, preços configurados por canal e preços resolvidos; regra de cobrança nos grupos |
availability | Flags de canal, horários, esgotamento, agendamento e resultado da avaliação |
presentation | URLs públicas de imagens, traduções, destaque, promoção e tag; ícone nas categorias |
sale | Venda por unit ou kg, flag unitária e participação na taxa de serviço |
identifiers | Códigos EAN e códigos por integração/PDV |
selection | Mínimo/máximo do grupo, escolha única, obrigatoriedade e limite por opção |
fiscal | Atributos 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:
| Canal | Prioridade de pricing.resolved.base |
|---|---|
in_store | in_store.promotional → in_store.regular |
delivery | delivery.promotional → delivery.regular → in_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:
| Modo | Acréscimo das escolhas |
|---|---|
included | Zero |
sum | Soma de preço × quantidade |
average | Média ponderada pelas quantidades |
highest | Maior 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:
| Valor | Significado |
|---|---|
null | Elegível neste contexto |
channel_disabled | Canal ou permissão de agendamento desabilitado |
outside_schedule | Fora dos dias/horários configurados |
sold_out | Produto esgotado |
parent_unavailable | Categoria, produto ou grupo superior indisponível |
required_choices_unavailable | Não é possível satisfazer um grupo obrigatório |
invalid_configuration | Preç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.