Documentação
Gerenciar produtos
Crie, edite e controle a disponibilidade do cardápio por canal.
A Nova API V1.0 permite cadastrar e editar produtos do restaurante sem expor
exclusão. Com OAuth, as operações de escrita exigem products:write;
consultar um produto ou o catálogo exige products:read, e o menu usa menu:read. A sessão do
restaurante também é aceita, sem escopos de integração, e só pode alterar
produtos do restaurant_id assinado no token.
Para entender o efeito de cada alteração, consulte a Referência de campos do produto: preços por canal, promoções, esgotamento, venda por peso e padrões na criação.
Antes de começar
Use o access_token obtido pelo OAuth, não a chave tk_
diretamente. Nos exemplos, TAKEAT_API_URL é https://public-api.takeat.app,
sem /v1 no final. Substitua os IDs pelos registros do seu restaurante.
Se a credencial OAuth permite mais de um restaurante, acrescente
?restaurant_id=85 à URL de cada chamada, usando o ID autorizado desejado.
Com sessão de restaurante, o contexto vem do token; um restaurant_id
conflitante é rejeitado. O restaurante não é escolhido pelo corpo JSON.
| Objetivo | Rota | Escopo OAuth |
|---|---|---|
| Consultar categorias e produtos no formato legado | GET /v1/products | products:read |
| Consultar os campos atuais e a versão de um produto | GET /v1/products/{productId} | products:read |
| Criar um produto | POST /v1/products | products:write |
| Editar campos, inclusive esgotamento | PUT /v1/products/{productId} | products:write |
| Editar de 1 a 100 produtos atomicamente | PUT /v1/products/bulk | products:write |
| Alterar somente os canais de venda | PATCH /v1/products/{productId}/availability | products:write |
| Consultar o menu e o preço efetivo de um canal | GET /v1/menu | menu:read |
Teste também altera dados reais
tk_test_ identifica a credencial, mas não cria um banco sandbox. As chamadas
abaixo modificam o cardápio real do restaurante autorizado.
Criar um produto
O produto deve apontar para uma categoria não removida do mesmo restaurante. Uma categoria indisponível não é removida: ela pode receber produtos, mas continuará oculta no menu filtrado por disponibilidade.
curl -X POST "$TAKEAT_API_URL/v1/products" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Takeat Burger",
"product_category_id": 10,
"price": 28.00,
"delivery_price": 31.00,
"available": true,
"available_in_delivery": true
}'Obrigatórios: name, product_category_id e price. Quando não informadas,
as duas disponibilidades começam como true, sold_off, use_weight e
has_starting_price como false, e charge_service_tax como true.
Editar um produto
Consulte GET /v1/products/{productId} para obter os campos editáveis e o
updated_at atual. Produtos removidos ou de outro restaurante retornam 404.
PUT /v1/products/{productId} é parcial: envie somente os campos que devem
mudar. Campos ausentes permanecem intactos; preços promocionais e de delivery
aceitam null para remover o valor.
description também aceita null para limpar. Envie preços como números JSON
(por exemplo, 34.90), embora a consulta os retorne como strings ("34.90").
Não envie campos somente de leitura, como restaurant_id, created_at e
updated_at, no corpo de edição.
Na edição, price: 0 é permitido; valores negativos ou com mais de duas casas
decimais são rejeitados. A criação continua exigindo price positivo. Salão e
delivery são independentes: não altere os dois canais sem intenção explícita.
Opcionalmente envie expected_updated_at com o updated_at consultado. Se o
produto mudou desde a consulta, a API responde 409 product_update_conflict.
Consulte novamente e peça uma nova aprovação; não repita a escrita automaticamente.
curl -X PUT "$TAKEAT_API_URL/v1/products/42" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "Takeat Burger Duplo", "price": 34.90 }'Não existe DELETE /v1/products/{productId} nesta API.
Editar vários produtos
PUT /v1/products/bulk recebe um array diretamente no corpo, com 1 a 100
objetos. Cada objeto contém id e os campos parciais que devem mudar:
[
{ "id": 42, "price": 0, "expected_updated_at": "2026-08-26T14:00:00.000Z" },
{ "id": 43, "delivery_price": 0 }
]IDs repetidos são rejeitados com 400 duplicate_product_ids, mesmo quando
os objetos alteram campos diferentes. Um campo inválido, alteração vazia,
produto/categoria inexistente ou versão desatualizada impede todo o lote.
A operação é atômica e retorna um array de produtos na ordem recebida.
Para agentes de IA, mostre todos os valores atuais e propostos e aguarde a aprovação do operador antes da chamada. A API exige credenciais válidas, mas a aplicação integradora é responsável por obter essa aprovação humana.
Campos fiscais são enviados em fiscal_info como alterações parciais; null
limpa um campo. O identificador interno fiscal_group_id não é exposto nem editável.
As respostas incluem fiscal e o alias compatível fiscal_info;
veja a explicação de cada atributo fiscal.
Alterar disponibilidade
Use a rota focada quando a alteração for somente de canal:
curl -X PATCH "$TAKEAT_API_URL/v1/products/42/availability" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"available": false,
"available_in_delivery": true
}'| Campo | Canal |
|---|---|
available | Venda presencial, balcão e consumo no local |
available_in_delivery | Delivery e retirada pelo fluxo de delivery |
Os campos são independentes e ao menos um deles deve ser enviado. Depois da
alteração, GET /v1/menu?only_available=true passa a refletir o novo estado no
canal correspondente.
Para sinalizar falta temporária, envie { "sold_off": true } no PUT
individual ou em lote; sold_off não é aceito no PATCH /availability.
O menu exclui esgotados com only_available=true. Com false, retorna
availability.sold_out e o motivo em availability.resolved.reason.
Horários e escolhas obrigatórias também afetam a elegibilidade. Confira as
regras do menu.
Resposta
Criação, edição e disponibilidade retornam o produto atualizado. Valores monetários são strings com duas casas. Exemplo abreviado:
{
"id": 42,
"restaurant_id": 85,
"product_category_id": 10,
"name": "Takeat Burger Duplo",
"price": "34.90",
"delivery_price": "31.00",
"available": false,
"available_in_delivery": true,
"created_at": "2026-08-26T12:00:00.000Z",
"updated_at": "2026-08-26T14:00:00.000Z"
}O produto e a categoria são sempre verificados contra o restaurante resolvido
pela credencial. IDs de outro restaurante respondem 404, sem revelar que o
registro existe.
Erros comuns
HTTP / key | Como resolver |
|---|---|
400 por corpo inválido | Confira tipos, limite de duas casas decimais, campos aceitos e pelo menos uma alteração efetiva. |
400 product_changes_required | Envie um campo editável; apenas id, expected_updated_at ou um objeto fiscal vazio não bastam. |
400 duplicate_product_ids | Agrupe as mudanças de cada produto em um único objeto do lote. |
404 product_not_found | Confira o ID e o restaurante autorizado; o produto pode ter sido removido. |
404 product_category_not_found | Escolha uma categoria não removida do mesmo restaurante. |
409 product_update_conflict | Consulte os valores atuais e revise a proposta antes de reenviar. No lote, nenhum produto foi alterado. |
Se a escrita foi aceita, mas o produto não aparece ou o preço parece diferente, veja o guia de diagnóstico.
Consulte também Gerenciar complementos para editar opções, preços, fiscal e disponibilidade, individualmente ou em lote.