A arquitetura é baseada em catálogos e eles podem ser utilizados em contextos diferentes. Hoje possuímos 2 contextos pré-definidos (Entrega, Pra Retirar), porém novos contextos podem ser criados, e os níveis dentro de cada modo são os mesmos para todos. Temos as categorias, os tipos de itens, grupos de complementos e complementos.
Visão micro
Para lojas que contratam mais de um serviço como Pra retirar, Cardápio Digital e/ou Sob Demanda, é possível gerir diferentes catálogos para cada tipo de operação. Isso permite ter preços, disponibilidades ou até mesmo categorias e itens diferentes.
Módulo exclusivo para produtos de prateleira (Mercados)
Módulo para unificar a gestão do cardápio de merchants com múltiplos catálogos
Categoria é a entidade em que a loja possui para organizar seus itens a fim de facilitar para o usuário encontrar o que deseja comprar. As categorias possuem status de venda como pausada e ativada.
Pausada Quando uma categoria está pausada, todos os itens contidos nessa categoria serão pausados automaticamente e ela não é mostrada para o consumidor final. Quando uma categoria possui todos os seus itens pausados separadamente, ela automaticamente é pausada.
Ativada Quando uma categoria é ativada, ela passa a ser mostrada ao consumidor final, porém os itens contidos possuem seus próprios status de venda. Quando uma categoria possui itens com status de vendas variados, ao ser pausada todos os itens passam a ser pausados também, e ao ser novamente ativada, os itens voltam aos seus estados originais (pausado ou ativado, como anteriormente).
Categoria de itens é uma categoria formada por itens genéricos que podem, ou não, possuir grupos de complementos e complementos
Categoria de pizza é uma categoria, no portal do parceiro, com um template contendo tamanhos, massas, bordas e sabores da pizza, assim, facilitando o cadastro. Para integrações, é necessário criar uma categoria com template PIZZA e associar a pizza previamente criada nessa categoria, passando os valores de seus sabores, bordas e massas.
Arquitetura da informação - categorias
Produto é a entidade de catálogo que carrega todas as informações gerais. Elas são: Nome, descrição, código externo, imagem, disponibilidade em turnos, tamanho, restrições alimentares e EAN (European Article Number), utilizado principalmente por mercados. O produto pode ser oferecido em um catálogo como um item principal ou complemento. E, para uma mesma loja, pode ser reutilizado até mesmo em diferentes catálogos.
Quantas pessoas servem O tamanho do produto é essencial para saber para que tamanho de fome ele é, por exemplo: Esse produto é ideal para 1, 2, 3 ou 4 pessoas? Existe o caso que esse tamanho não se aplica para o produto também, como por exemplo bebidas.
O grupo de complementos é a entidade utilizada para agrupar customizações de um produto, por exemplo: “Escolha sua bebida:”
Um grupo de complemento pode ser compartilhado por vários itens, desde que estejam contidos na mesma categoria.
Obrigatoriedade O grupo de complementos pode ser obrigatório, ou opcional.
Obrigatório Em casos de grupos de complementos obrigatórios, o usuário final deve selecionar pelo menos a quantidade mínima configurada de opções dentro do grupo para conseguir efetuar a compra. Complementos obrigatórios possuem quantidade mínima e máxima, sendo que a máxima é obrigatória ser um número maior que a mínima.
Opcional Em casos de grupo de complementos opcionais, o usuário consegue comprar o produto sem que nenhuma opção esteja relacionada. Complementos opcionais não possuem quantidade mínima mas possuem quantidade máxima.
Complementos são as opções de um Grupo de Complemento. Pode ser definido como: “Um produto relacionado a um grupo de complemento”. O complemento possui seu próprio status de venda, sendo possível pausar ou ativar quando necessário. É possível que um complemento seja R$ 0,00 independente se é obrigatório ou opcional.
O produto pode ser caracterizado com base em algumas restrições alimentares, como por exemplo:
As restrições alimentares são informações opcionais e o produto pode conter mais de uma opção selecionada.
Para produtos que são vendidos somente em alguns períodos da semana, é possível configurar sua disponibilidade em turnos. Por exemplo: A feijoada só é vendida às quartas-feiras das 10:00 às 16:00
Sempre disponível Quando um item está selecionado como sempre disponível, ele será visualizado sempre que a loja estiver aberto e o status de venda (Como item principal ou complemento) é ativado.
Disponível em dias e horários específicos Quando um item está selecionado como disponível em dias e horários específicos, o usuário pode selecionar em quais dias o item estará disponível, em quais horários e/ou criar turnos.
O item pode ser considerado a oferta de um produto.
Análogo ao complemento, o item é um produto relacionado à categoria.
Item Tags tem como propósito fornecer informações sobre características do Item, diferentemente de uma product tag, a Item tag pode ser transitiva, ou seja, um mesmo produto pode ser vendido gelado ou não.
Disponibilidade O item possui dois estados, ativado e pausado. Eles são configurados para definir se o item deve ou não aparecer à venda. Em caso de item pausado, mesmo se configurado uma disponibilidade por turnos, o item não aparecerá à venda.
Permite adicionar uma quantidade máxima que um determinado produto pode ser vendido. Caso um inventário seja criado para um produto com quantidade 10, apenas 10 itens que estejam relacionados a esse produto podem ser vendidos. Após 10 produtos poderem ser vendidos, o produto será marcado como 'Fora de Stock' e não poderá mais ser vendido.
O código externo, também conhecido como PDV, é a identificação que a loja pode adicionar nos seus itens para, no momento que receberem o pedido, conseguirem realizar algum tipo de integração, por exemplo, controle de estoque.
A venda de um produto está sempre relacionada ao seu preço. Esse preço pode variar dependendo de onde esse produto se encontra (Como item principal ou complemento), ou adicionando preços promocionais ao item.
Item
O preço do item se dá na oferta de um produto em uma categoria.
Preço por atacado
Feature Exclusiva Essa feature não está disponível para restaurantes atualmente. No caso de um parceiro que seja um restaurante tentar usar essa feature, um erro de permissão negada (403) será emitido. Caso tenha interesse em utilizar funções dessa API, entre em contato com o nosso time de atendimento.
Além do preço normal, também é possível atribuir preços customizados que dependem da quantidade comprada do item. Para utilizar a feature de preço por atacado price basta adicionar o campo abaixo ao body nas APIs de criação e edição de item.
"scale_prices": [
{
"min": 1,
"value": 9.99
},
{
"min": 10,
"value": 8.99
}
]
De acordo com o exemplo acima, o preço do item será R$ 9.99 se o cliente compre uma quantidade de até 9 deste item. Caso o cliente comprar mais de 9 o preço passará a ser R$ 8.99.
Complemento
O preço do complemento se dá na oferta de um produto em um grupo de complementos. Diferente do item, ele não possui a funcionalidade de preço promocional
Pizza é um produto que tem características pré definidas, sendo estas: Tamanhos, massas, bordas, sabores e disponibilidade em turnos. O produto de pizza pode ser associado apenas a uma categoria do tipo PIZZA. Através do portal, essa associação é automática, porém para integrações é necessário criar a Pizza, criar a Categoria e por fim associar os dois. A precificação de sabores, bordas e massas podem, através das APIs de integração, ser diferentes em diferentes catálogos (Entrega).
O tamanho da pizza é definida por alguns aspectos:
A massa é uma customização da pizza, exemplo: “Tradicional”, “Integral” e pode ter um preço adicional no custo da pizza, se configurado. O Tradicional hoje vem default para o usuário mas não é abordado na API.
A borda, assim como a massa, é uma customização da pizza, exemplo: “Borda de Catupiry” e pode ter um preço adicional no custo da pizza, se configurado. O Tradicional hoje vem default para o usuário mas não é abordado na API.
O sabor define quais tipos de pizza são vendidas. Os sabores possuem um preço para cada tamanho, por exemplo: Grande Calabresa - R$50,00 Pequena Calabresa - R$25,00
Em diferentes catálogos os sabores podem ter preços diferentes para cada tamanho
O primeiro passo nas APIs de catálogo é a listagem de catálogos, através da API GET /merchants/{merchantId}/catalogs. Atualmente possuímos os catálogos DEFAULT e INDOOR, indicando que esse catálogo é de Entrega
Requisição:
curl --location --request GET 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/catalogs' \
--header 'Authorization: Bearer TOKEN
Resposta
[
{
"catalogId": "10e0fbbe-7279-4ee3-9a2f-caf1f93f7b8e",
"context": ["DEFAULT"],
"status": "AVAILABLE",
"modifiedAt": 1597350642.71608
}
]
Com o id do catálogo em mãos, é possível listar todas as categorias e itens de um catálogo através da API GET /merchants/{merchantId}/catalogs/{catalogId}/categories.
Requisição:
curl --location --request GET 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/catalogs/10e0fbbe-7279-4ee3-9a2f-caf1f93f7b8e/categories?include_items=true \
--header 'Authorization: Bearer TOKEN
Resposta:
[]
Como ainda não adicionamos nada no nosso catálogo, ele voltará uma lista vazia! Seguindo os próximos passos você aprenderá como montar seu catálogo
Como explicado anteriormente, a categoria é um agrupador de itens. Então vamos criar nossa primeira categoria. Para isto, vamos utilizar a API POST /merchants/{merchantId}/catalogs/{catalogId}/categories.
Requisição
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/catalogs/10e0fbbe-7279-4ee3-9a2f-caf1f93f7b8e/categories' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Lanches",
"status": "AVAILABLE",
"template": "DEFAULT",
"sequence": 0
}'
Resposta:
{
"id": "4e6d3f79-f003-4992-8d4f-4c48d7ac5284",
"name": "Lanches",
"sequence": 0,
"status": "AVAILABLE",
"template": "DEFAULT"
}
O produto, como citado acima, carrega todas as informações principais dos itens ou complementos que vão à venda. Segue um exemplo de criação de produto, que pode ser realizada através da API POST /merchants/{merchantId}/products.
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/products' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "X-Burger",
"description": "Pão, carne e queijo",
"externalCode": "BG-1",
"image": "",
"shifts": [
{
"startTime": "00:00",
"endTime": "23:59",
"monday": true,
"tuesday": true,
"wednesday": true,
"thursday": true,
"friday": true,
"saturday": true,
"sunday": true
}
],
"serving": "SERVES_1",
"dietaryRestrictions": [
"ORGANIC"
],
"ean": ""
}'
Resposta:
{
"id": "ec16fb62-7bdd-43e4-940c-10b5a2845f13",
"name": "X-burger",
"description": "Pão, carne e queijo",
"externalCode": "BG-1",
"image": "",
"shifts": [
{
"startTime": [0, 0],
"endTime": [23, 59],
"monday": true,
"tuesday": true,
"wednesday": true,
"thursday": true,
"friday": true,
"saturday": true,
"sunday": true
}
],
"serving": "SERVES_1",
"dietaryRestrictions": ["ORGANIC"],
"ean": ""
}
Após a criação do produto, está na hora de você associá-lo a uma categoria e começar a vendê-lo! Para isso, utilizamos a API de criação de item POST /merchants/{merchantId}/categories/{categoryId}/products/{productId} e nela conseguimos decidir a qual valor esse item será vendido.
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/categories/4e6d3f79-f003-4992-8d4f-4c48d7ac5284/products/ec16fb62-7bdd-43e4-940c-10b5a2845f13' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"status": "AVAILABLE",
"price": {
"value": 20,
"originalValue": 30,
"scalePrices": [{
"minQuantity": 5,
"price": 10
}
]
},
"externalCode": "BG-1",
"sequence": 0
}'
Resposta:
{
"status": "AVAILABLE",
"price": {
"value": 20,
"originalValue": 30
},
"externalCode": "BG-1"
}
Esse endpoint retorna todos os itens que estão a venda no cardápio : GET /merchants/{merchantId}/catalogs/{groupId}/sellableItems O groupId é a informação retornada como parâmetro da resposta do endpoint GET /merchants/{merchantId}/catalogs
curl --location --request https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/catalogs/ffca0022-eb43-4205-9a1b-73a72f8e3f95/sellableItems --header 'Authorization: Bearer TOKEN
Resposta:
[
{
"itemId": "ec16fb62-7bdd-43e4-940c-10b5a2845f13",
"categoryId": "4e6d3f79-f003-4992-8d4f-4c48d7ac5284",
"itemEan": "",
"itemExternalCode": "BG-1",
"categoryName": "Lanches",
"categoryIndex": 0,
"itemName": "X-burger",
"itemDescription": "Pão, carne e queijo",
"itemAdditionalInformation": "",
"logosUrls": [],
"itemIndex": 0,
"itemPrice": {
"value": 20,
"originalValue": 30,
"scalePrices": {
"minQuantity": 5,
"price": 10
}
},
"itemMinSalePrice": 20,
"itemSchedules": [],
"itemPackaging": "string",
"itemQuantity": 0,
"itemUnit": "string",
"itemOptionGroups": [],
"itemSellingOption": {
"minimum": 0,
"incremental": 0,
"availableUnits": [
"g"
]
},
"itemGeneralTags": [],
"itemProductTags": [
{
"group": "PORTION_SIZE",
"tags": [
"SERVES_2"
]
}
]
}
]
Esse endpoint retorna todos os itens que não estão a venda no cardápio com o motivo da restrição: GET /merchants/{merchantId}/catalogs/{catalogId}/unsellableItems
curl --location --request https://merchant-api.ifood.com.br/catalog/v1.0/merchants/1cdfa2d0-6c89-4ca8-a544-3b39009fe03c/catalogs/1cdfa2d0-6c89-4ca8-a544-3b39009fe03c/unsellableItems --header 'Authorization: Bearer TOKEN
Resposta:
{
"categories": []
}
curl -X POST "https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/inventory"
-H "accept: application/json" -H "Content-Type: application/json"
-d "{\"productId\":\"ec16fb62-7bdd-43e4-940c-10b5a2845f13\",\"amount\":10,\"inStock\":true}"
curl -X GET "https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/inventory/ec16fb62-7bdd-43e4-940c-10b5a2845f13"
-H "accept: application/json""
curl -X POST "https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/inventory/batchDelete"
-H "accept: */*" -H "Content-Type: application/json"
-d "{\"productIds\":[\"ec16fb62-7bdd-43e4-940c-10b5a2845f13\"]}"
Você pode customizar seus produtos criando grupos de complementos, por exemplo, bebidas para seus lanches. Para isso, você precisará criar seu grupo, associá-lo ao seu produto e por fim associar produtos que você deseja ter como complementos neste grupo. Isso pode ser feito através da API POST /merchants/{merchantId}/optionGroups.
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/optionGroups' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Escolha sua bebida"
}'
Resposta:
{
"id": "daf9ba2c-dca9-43b1-b02a-0fc2c4b01967",
"name": "Escolha sua bebida"
}
Grupos de complementos com mínimo 1 são considerados obrigatórios, dessa forma, enquanto não houver uma opção para o usuário selecionar, os itens associados a esse grupo não aparecerão no app do iFood para serem vendidos
O filtro includeOptions
suporta no máximo 10.000 options. Caso o catálogo possua um número de options superior a esse limite a API pode retornar um erro (InternalServerError).
Análogo ao Item, é necessário criar um produto antes de associá-lo ao grupo de complementos. Então vamos começar por ele, através da API POST /merchants/{merchantId}/products:
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/products' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Coca-cola lata",
"description": "300 ml",
"externalCode": "LT-1",
"image": "",
"shifts": [
],
"serving": "NOT_APPLICABLE",
"dietaryRestrictions": [
],
"ean": ""
}'
Resposta:
{
"id": "5f3d5725-dea8-4c82-bdf6-5fb401c243f6",
"name": "Coca-Cola lata",
"description": "300 ml",
"externalCode": "LT-1",
"image": "",
"shifts": [
{
"startTime": [0, 0],
"endTime": [23, 59, 59],
"monday": true,
"tuesday": true,
"wednesday": true,
"thursday": true,
"friday": true,
"saturday": true,
"sunday": true
}
],
"serving": "NOT_APPLICABLE",
"dietaryRestrictions": [],
"ean": ""
}
Com o produto em mãos é hora de associá-lo ao grupo de complementos! Isto será feito através da API POST /merchants/{merchantId}/optionGroups/{optionGroupId}/products/{productId}:
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/optionGroups/daf9ba2c-dca9-43b1-b02a-0fc2c4b01967/products/5f3d5725-dea8-4c82-bdf6-5fb401c243f6/option' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{
"status": "AVAILABLE",
"price": {
"value": 5
},
"externalCode": "LT-1",
"sequence": 0
}'
Resposta:
{
"status": "AVAILABLE",
"price": {
"value": 5
},
"externalCode": "LT-1",
"sequence": 0
}
Com tudo cadastrado, vamos ver como ficou a listagem de categorias do seu catálogo? Como citado anteriormente, será utilizada a API GET /merchants/{merchantId}/catalogs/{catalogId}/categories
curl --location --request GET 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/catalogs/10e0fbbe-7279-4ee3-9a2f-caf1f93f7b8e/categories?includeItems=true \
--header 'Authorization: Bearer TOKEN
Resultado:
[
{
"id": "4e6d3f79-f003-4992-8d4f-4c48d7ac5284",
"name": "Lanches",
"status": "AVAILABLE",
"sequence": 0,
"template": "DEFAULT",
"items": [
{
"id": "a51939d2-e2d6-4bf5-8161-f957bc4ee895",
"name": "X-burger",
"description": "Pão, carne e queijo",
"externalCode": "BG-1",
"status": "AVAILABLE",
"sequence": 0,
"productId": "ec16fb62-7bdd-43e4-940c-10b5a2845f13",
"imagePath": "",
"price": {
"value": 20,
"originalValue": 30
},
"shifts": [
{
"startTime": "00:00",
"endTime": "23:59",
"monday": true,
"tuesday": true,
"wednesday": true,
"thursday": true,
"friday": true,
"saturday": true,
"sunday": true
}
],
"serving": "SERVES_1",
"dietaryRestrictions": ["ORGANIC"],
"optionGroups": [
{
"id": "daf9ba2c-dca9-43b1-b02a-0fc2c4b01967",
"name": "Escolha sua bebida",
"min": 0,
"max": 1,
"sequence": 0,
"status": "AVAILABLE",
"options": [
{
"id": "02740dbe-bfc0-4609-aabd-55316590638e",
"name": "Coca-Cola lata",
"description": "300 ml",
"externalCode": "LT-1",
"status": "AVAILABLE",
"sequence": 0,
"imagePath": "",
"price": {
"value": 5
}
}
]
}
]
}
]
}
]
É possível editar o preço em batch pelo productId ou pelo externalCode. O exemplo abaixo utiliza o externalCode, mas caso deseje utilizar o productId basta substituir o campo
"externalCode":"burguerX43"
por "productId":"058dd32f-3b26-41e9-aa39-30a64d3f2b81"
.
Requisição
curl --location --request PATCH 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/411347fb-adc5-456f-95be-03cf10a5b8b5/products/price' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '[{
"externalCode":"burguerX43",
"price": {
"value":25,
"originalValue":30
},
"resources":["ITEM", "OPTION"]
}]'
resources
deve ser igual a "resources":["ITEM"]
. O mesmo vale para a OPTIONS.Resposta
{
"batchId": "311afcf1-541a-41af-a9a5-4651d676731e",
"url": "/v1.0/merchants/411347fb-adc5-456f-95be-03cf10a5b8b5/batch/311afcf1-541a-41af-a9a54651d676731e"
}
Operações em batch podem ser feitas em situações como, por exemplo, atualização de muitos produtos. Para checar quais operações foram bem sucedidas ou não, e se todo o batch já foi processado, utilizamos a API de listagem de resultados das operações em batch GET /merchants/{merchantId}/batch/{batchId}
curl --location --request GET 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/6b487a27-c4fc-4f26-b05e-3967c2331882/batch/bca9a293-b121-4027-b3e3-bce675581fbd' \
--header 'Authorization: Bearer TOKEN'
Resultado:
{
"batchStatus": "COMPLETED",
"results": [
{
"resourceId": "fd1c993b-4882-44e7-8c21-aa7d637ccdf8",
"result": "SUCCESS"
},
{
"resourceId": "ec16fb62-7bdd-43e4-940c-10b5a2845f13",
"result": "SUCCESS"
}
]
}
A API permite utilizar as categorias com template PIZZA assim como é feito no portal do parceiro. Para isso, existem APIs específicas para realizar essa gestão. Abaixo será apresentado o passo a passo de como cadastrar sua primeira pizza na plataforma do iFood
Primeiro, criamos uma categoria de pizza através da API POST /merchants/{merchantId}/catalogs/{catalogId}/categories
Request:
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/ff4e9e03-588c-4c15-8d16-3225b795c1d0/catalogs/2b642cd5-8076-40d0-9b88-1da507f8a4b4/categories' \
--header 'Content-Type: application/json' \
--data-raw '{
"externalCode": "pz1",
"name": "Pizzas Salgadas",
"sequence": 0,
"status": "AVAILABLE",
"template": "PIZZA"
}'
Resposta:
{
"id": "175dbe63-4a63-46f9-ae5f-6f98bd79b67b",
"name": "Pizzas Salgadas",
"externalCode": "pz1",
"sequence": 0,
"status": "AVAILABLE",
"template": "PIZZA"
}
Uma categoria com template PIZZA sem uma pizza associada ainda não é suportada pelo portal do parceiro, por esse motivo, após criada, ela só aparecerá no momento em que possuir uma pizza associada à ela
Com a categoria criada, análogo ao produto e ao item, vamos criar um produto de pizza que irá conter todos seus tamanhos, massas, bordas e sabores. Isto será feito através de API POST /merchants/{merchantId}/pizzas
Request:
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/7f357e2c-599d-4023-8930-e39a778338d6/pizzas' \
--header 'Content-Type: application/json' \
--data-raw '{
"crusts": [
{
"name": "Massa Tradicional",
"sequence": 0,
"status": "AVAILABLE",
"externalCode": "M1"
}
],
"edges": [
{
"name": "Borda de Catupiry",
"sequence": 0,
"status": "AVAILABLE"
}
],
"shifts": [
{
"startTime": "00:00",
"endTime": "23:15",
"monday": true,
"tuesday": true,
"wednesday": true,
"thursday": true,
"friday": true,
"saturday": true,
"sunday": false
}
],
"sizes": [
{
"acceptedFractions": [
1
],
"name": "Grande",
"sequence": 0,
"slices": 8,
"status": "AVAILABLE",
"externalCode": "G1"
}
],
"toppings": [
{
"description": "Calabresa com queijo",
"externalCode": "C1",
"name": "Calabresa",
"sequence": 0,
"status": "AVAILABLE",
"dietaryRestrictions": [
"ORGANIC"
]
}
]
}'
Resposta:
{
"id": "ecb42fd8-a735-4ffa-90be-04e01e12e96f",
"toppings": [
{
"description": "Calabresa com queijo",
"name": "Calabresa",
"externalCode": "C1",
"id": "2ef286ec-e968-43cb-a450-df1183e60f46",
"sequence": 0,
"status": "AVAILABLE",
"dietaryRestrictions": ["ORGANIC"]
}
],
"crusts": [
{
"id": "0c3b2a90-463a-4892-be85-7c461da05248",
"sequence": 0,
"name": "Massa Tradicional",
"status": "AVAILABLE",
"ownerId": "7f357e2c-599d-4023-8930-e39a778338d6",
"externalCode": "M1"
}
],
"edges": [
{
"id": "d0bc788f-8bc1-4cbc-bcb0-95bdf532e8f2",
"name": "Borda de Catupiry",
"sequence": 0,
"status": "AVAILABLE"
}
],
"sizes": [
{
"id": "b08a8cbf-3bd0-44a6-8cec-ddb73b659f3c",
"acceptedFractions": [1],
"externalCode": "G1",
"name": "Grande",
"sequence": 0,
"slices": 8,
"status": "AVAILABLE"
}
],
"shifts": [
{
"startTime": "00:00:00 GMT-0300 (GMT-03:00)",
"endTime": "23:15:00 GMT-0300 (GMT-03:00)",
"monday": true,
"wednesday": true,
"tuesday": true,
"thursday": true,
"sunday": false,
"saturday": true,
"friday": true
}
]
}
Por fim, com a categoria e seu produto de pizza criados, é hora de associá-los. Nessa associação é necessário passar o preço de cada um dos componentes do produto da pizza para começar a vendê-los! Os tamanhos de pizza não possuem preço, porém você deve passar o preço para cada tamanho dentro do objeto de sabores. Para isso, será utilizada a API POST /merchants/{merchantId}/pizzas/{pizzaId}/categories/{categoryId}
curl --location --request POST 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/7f357e2c-599d-4023-8930-e39a778338d6/pizzas/ecb42fd8-a735-4ffa-90be-04e01e12e96f/categories/99fe1c07-5d4e-42d9-90f4-9d16931d0aec' \
--header 'Content-Type: application/json' \
--data-raw '{
"catalogId": "91720b2e-7dad-424e-9af6-996eb9dd49ad",
"crusts": [
{
"id": "0c3b2a90-463a-4892-be85-7c461da05248",
"price": {
"value": 0
}
}
],
"edges": [
{
"id": "d0bc788f-8bc1-4cbc-bcb0-95bdf532e8f2",
"price": {
"value": 5
}
}
],
"toppings": [
{
"id": "2ef286ec-e968-43cb-a450-df1183e60f46",
"prices": {
"b08a8cbf-3bd0-44a6-8cec-ddb73b659f3c": {
"value": 45
}
}
}
]
}'
Resposta
{
"id": "ecb42fd8-a735-4ffa-90be-04e01e12e96f",
"toppings": [
{
"description": "Calabresa com queijo",
"name": "Calabresa",
"externalCode": "C1",
"id": "2ef286ec-e968-43cb-a450-df1183e60f46",
"sequence": 0,
"status": "AVAILABLE",
"prices": {
"b08a8cbf-3bd0-44a6-8cec-ddb73b659f3c": {
"value": 45
}
},
"dietaryRestrictions": ["ORGANIC"]
}
],
"crusts": [
{
"id": "0c3b2a90-463a-4892-be85-7c461da05248",
"sequence": 0,
"name": "Massa Tradicional",
"status": "AVAILABLE",
"ownerId": "7f357e2c-599d-4023-8930-e39a778338d6",
"price": {
"id": "cc426276-f65c-4eff-8f4b-9ef39341e655",
"value": 0,
"promotionalFromPrice": 0,
"effectiveStart": 1600271268.573968,
"customizationOptionId": "0c3b2a90-463a-4892-be85-7c461da05248",
"type": "CUSTOMIZATION_OPTION"
},
"externalCode": "M1"
}
],
"edges": [
{
"id": "d0bc788f-8bc1-4cbc-bcb0-95bdf532e8f2",
"name": "Borda de Catupiry",
"sequence": 0,
"status": "AVAILABLE",
"price": {
"value": 5
}
}
],
"sizes": [
{
"id": "b08a8cbf-3bd0-44a6-8cec-ddb73b659f3c",
"acceptedFractions": [1],
"externalCode": "G1",
"name": "Grande",
"sequence": 0,
"slices": 8,
"status": "AVAILABLE"
}
],
"shifts": [
{
"startTime": "00:00:00 GMT-0300 (GMT-03:00)",
"endTime": "23:15:00 GMT-0300 (GMT-03:00)",
"monday": true,
"wednesday": true,
"tuesday": true,
"thursday": true,
"sunday": false,
"saturday": true,
"friday": true
}
]
}
Após criado, é possível editar um produto de pizza através da API PUT /merchants/{merchantId}/pizzas/{pizzaId}. Caso ele esteja associado em mais de um categoria ao mesmo tempo, essas alterações serão aplicadas em todos os locais onde aquele produto está associado.
Request:
curl --location --request PUT 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/ff4e9e03-588c-4c15-8d16-3225b795c1d0/pizzas/5b82a9d0-02e0-4bf2-98bc-6f27e06627ed' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": "5b82a9d0-02e0-4bf2-98bc-6f27e06627ed",
"toppings": [
{
"description": "Edited-string",
"name": "Edited-bbb-Toppin",
"externalCode": "Edited-string",
"id": "26819c3b-cacb-40c1-97ae-44ffa348c107",
"sequence": 0,
"status": "UNAVAILABLE",
"dietaryRestrictions": [
"VEGAN"
]
}
],
"crusts": [
{
"id": "fc8f873c-e0f7-4054-865b-0920b34cc31d",
"sequence": 2,
"name": "Edited-BBB-Crust",
"status": "AVAILABLE",
"ownerId": "ff4e9e03-588c-4c15-8d16-3225b795c1d0",
"externalCode": "666"
}
],
"edges": [
{
"id": "cac27696-168d-4fbb-9353-dbefbeca0b1b",
"name": "Edited-BBB-edge",
"sequence": 2,
"status": "AVAILABLE"
}
],
"sizes": [
{
"id": "b602db20-51ce-40a6-acd8-bb6516f4da08",
"acceptedFractions": [
1
],
"externalCode": "666",
"name": "Edited-AAA-Size",
"sequence": 0,
"slices": 8,
"status": "AVAILABLE"
}
],
"shifts": [
{
"startTime": "00:00:00",
"endTime": "23:15:00",
"monday": true,
"wednesday": true,
"tuesday": true,
"thursday": true,
"sunday": false,
"saturday": true,
"friday": true
}
]
}'
Resposta:
{
"id": "5b82a9d0-02e0-4bf2-98bc-6f27e06627ed",
"toppings": [
{
"description": "Edited-string",
"name": "Edited-bbb-Toppin",
"externalCode": "Edited-string",
"id": "26819c3b-cacb-40c1-97ae-44ffa348c107",
"sequence": 0,
"status": "UNAVAILABLE",
"dietaryRestrictions": ["VEGAN"]
}
],
"crusts": [
{
"id": "fc8f873c-e0f7-4054-865b-0920b34cc31d",
"sequence": 2,
"name": "Edited-BBB-Crust",
"status": "AVAILABLE",
"ownerId": "ff4e9e03-588c-4c15-8d16-3225b795c1d0",
"externalCode": "666"
}
],
"edges": [
{
"id": "cac27696-168d-4fbb-9353-dbefbeca0b1b",
"name": "Edited-BBB-edge",
"sequence": 2,
"status": "AVAILABLE"
}
],
"sizes": [
{
"id": "b602db20-51ce-40a6-acd8-bb6516f4da08",
"acceptedFractions": [1],
"externalCode": "666",
"name": "Edited-AAA-Size",
"sequence": 0,
"slices": 8,
"status": "AVAILABLE"
}
],
"shifts": [
{
"startTime": "00:00:00 GMT-0300 (GMT-03:00)",
"endTime": "23:15:00 GMT-0300 (GMT-03:00)",
"monday": true,
"wednesday": true,
"tuesday": true,
"thursday": true,
"sunday": false,
"saturday": true,
"friday": true
}
]
}
Requisição
curl --location --request PATCH 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/411347fb-adc5-456f-95be-03cf10a5b8b5/{merchantId}/pizzas/pricesByExternalCode' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
"crusts": [
{
"crustExternalCode": "crustPDV",
"price": {
"value": 20,
"originalValue": 30
}
}
],
"edges": [
{
"edgeExternalCode": "edgePDV",
"price": {
"value": 20,
"originalValue": 30
}
}
],
"toppings": [
{
"toppingExternalCode": "toppingPDV",
"sizeExternalCode": "sizePDV",
"price": {
"value": 20,
"originalValue": 30
}
}
]
}'
Resposta
{
"batchId": "e58cae69-f731-49ce-8578-df63357e7f0b",
"url": "/v1.0/merchants/411347fb-adc5-456f-95be-03cf10a5b8b5/batch/e58cae69-f731-49ce-8578-df63357e7f0b"
}
Caso você tenha vários produtos de pizza criados, exemplo, "Pizza salgada" e "Pizza doce", é possível você listá-las para conferir seus atributos através da API GET /merchants/{merchantId}/pizzas.
curl --location --request GET 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/ff4e9e03-588c-4c15-8d16-3225b795c1d0/pizzas'
Resposta:
[
{
"id": "5b82a9d0-02e0-4bf2-98bc-6f27e06627ed",
"toppings": [
{
"description": "Edited-string",
"name": "Edited-bbb-Toppin",
"externalCode": "Edited-string",
"id": "26819c3b-cacb-40c1-97ae-44ffa348c107",
"sequence": 0,
"status": "UNAVAILABLE",
"dietaryRestrictions": ["VEGAN"]
}
],
"crusts": [
{
"id": "fc8f873c-e0f7-4054-865b-0920b34cc31d",
"sequence": 2,
"name": "Edited-BBB-Crust",
"status": "AVAILABLE",
"ownerId": "ff4e9e03-588c-4c15-8d16-3225b795c1d0",
"externalCode": "666"
}
],
"edges": [
{
"id": "cac27696-168d-4fbb-9353-dbefbeca0b1b",
"name": "Edited-BBB-edge",
"sequence": 2,
"status": "AVAILABLE"
}
],
"sizes": [
{
"id": "b602db20-51ce-40a6-acd8-bb6516f4da08",
"acceptedFractions": [1],
"externalCode": "666",
"name": "Edited-AAA-Size",
"sequence": 0,
"slices": 8,
"status": "AVAILABLE"
}
],
"shifts": [
{
"startTime": "00:00:00 GMT-0300 (GMT-03:00)",
"endTime": "23:15:00 GMT-0300 (GMT-03:00)",
"monday": true,
"wednesday": true,
"tuesday": true,
"thursday": true,
"sunday": false,
"saturday": true,
"friday": true
}
]
}
]
Caso queira adicionar um sabor em uma pizza já existente são necessárias 2 requests.
1 - Editar o produto de pizza pelo endpoint PUT /merchants/{merchantId}/pizzas/{pizzaId}. Todas as entidades precisam estar presentes no payload com seus ids, exceto o novo sabor que será criado e ainda não possui, como no seguinte payload.
[
{
"id": "5b82a9d0-02e0-4bf2-98bc-6f27e06627ed",
"toppings": [
{
"description": "Edited-string",
"name": "Edited-bbb-Toppin",
"externalCode": "Edited-string",
"id": "26819c3b-cacb-40c1-97ae-44ffa348c107",
"sequence": 0,
"status": "UNAVAILABLE",
"dietaryRestrictions": ["VEGAN"]
},
{
"description": "string",
"name": "Novo Sabor",
"externalCode": "string",
"sequence": 0,
"status": "AVAILABLE",
"dietaryRestrictions": ["VEGAN"]
}
],
"crusts": [
{
"id": "fc8f873c-e0f7-4054-865b-0920b34cc31d",
"sequence": 2,
"name": "Edited-BBB-Crust",
"status": "AVAILABLE",
"ownerId": "ff4e9e03-588c-4c15-8d16-3225b795c1d0",
"externalCode": "666"
}
],
"edges": [
{
"id": "cac27696-168d-4fbb-9353-dbefbeca0b1b",
"name": "Edited-BBB-edge",
"sequence": 2,
"status": "AVAILABLE"
}
],
"sizes": [
{
"id": "b602db20-51ce-40a6-acd8-bb6516f4da08",
"acceptedFractions": [1],
"externalCode": "666",
"name": "Edited-AAA-Size",
"sequence": 0,
"slices": 8,
"status": "AVAILABLE"
}
],
"shifts": [
{
"startTime": "00:00:00 GMT-0300 (GMT-03:00)",
"endTime": "23:15:00 GMT-0300 (GMT-03:00)",
"monday": true,
"wednesday": true,
"tuesday": true,
"thursday": true,
"sunday": false,
"saturday": true,
"friday": true
}
]
}
]
2 - Atribuir o preço desse novo sabor para o tamanho existente, através da api [POST /merchants/{merchantId}/pizzas/prices]. Supondo que o id do novo sabor seja ba60a17c-5b46-415b-b1ee-61c49302de5c, o payload do request seria:
{
"catalogId": "91720b2e-7dad-424e-9af6-996eb9dd49ad",
"crusts": [],
"edges": [],
"toppings": [
{
"id": "ba60a17c-5b46-415b-b1ee-61c49302de5c",
"prices": {
"b602db20-51ce-40a6-acd8-bb6516f4da08": {
"value": 10,
"originalValue": 30
}
}
}
]
}
Você pode pausar e ativar componentes da pizza através da API PATCH /merchants/{merchantId}/pizzas/{pizzaId}:
Request:
curl --location --request PATCH 'https://merchant-api.ifood.com.br/catalog/v1.0/merchants/ff4e9e03-588c-4c15-8d16-3225b795c1d0/pizzas/5b82a9d0-02e0-4bf2-98bc-6f27e06627ed' \
--header 'Content-Type: text/plain' \
--data-raw '{
"status": "UNAVAILABLE",
"sizeIds": [
"b602db20-51ce-40a6-acd8-bb6516f4da08"
],
"crustIds": [
"fc8f873c-e0f7-4054-865b-0920b34cc31d"
],
"edgeIds": [
"cac27696-168d-4fbb-9353-dbefbeca0b1b"
],
"toppingIds": [
"26819c3b-cacb-40c1-97ae-44ffa348c107"
]
}'
Resposta
200 - OK