Buscar na documentação
ctrl+4K
Módulos
Authentication
Merchant
Catalog
Order
Events
Logistics
Shipping
Review
Financial
Soluções

Promotion

O módulo de Promotions está restrito a integrações existentes. Novos parceiros devem usar o módulo Item para mecânicas de promoções simples. Saiba mais aqui
O módulo Promotion permite criar e gerenciar promoções de produtos em sua loja, oferecendo diferentes mecânicas de desconto para atrair e engajar clientes.Principais funcionalidades:
  • Criar promoções com desconto percentual
  • Configurar combos "Leve X Pague Y"
  • Aplicar desconto progressivo por unidade
  • Agendar período de vigência das promoções
  • Consultar status e detalhes das promoções ativas
Módulo exclusivoEste módulo é de uso exclusivo de parceiros que operam com mercado e não está disponível para todos os desenvolvedores. Caso tenha interesse em utilizar funções dessa API, entre em contato com o time de atendimento.
Outros tipos de promoçãoAs promoções do tipo DE-POR e ATACAREJO devem ser configuradas pelo módulo Item.

Criação de promoções

Use POST /merchants/{merchantId}/promotions para criar promoções.Descrição: Este endpoint cria novas promoções para uma loja.
Comportamento do endpointEste endpoint adiciona promoções à loja. As promoções ficam ativas até a data final. Novas requisições somam às promoções existentes. Para substituir a lista atual, use ?reset=true. Veja Atualização de promoções.
curl -X POST "https://merchant-api.ifood.com.br/promotion/v1.0/merchants/{{merchantId}}/promotions" \
  -H "Authorization: Bearer {{token}}" \
  -H "Content-Type: application/json" \
  -d '{
    "aggregationTag": "123456",
    "promotions": [
      {
        "promotionName": "Promoção teste",
        "channels": ["IFOOD-APP"],
        "items": [
          {
            "ean": "3213434343",
            "discountValue": 20.0,
            "initialDate": "2024-10-23",
            "finalDate": "2024-10-30",
            "promotionType": "PERCENTAGE"
          }
        ]
      }
    ]
  }'
Aplica desconto percentual no preço do item.Exemplo: Item de R$ 10,00 com 10% de desconto = R$ 9,00
{
  "aggregationTag": "123456",
  "promotions": [
    {
      "promotionName": "Promoção teste",
      "channels": ["IFOOD-APP"],
      "items": [
        {
          "ean": "3213434343",
          "discountValue": 20.0,
          "initialDate": "2024-10-23",
          "finalDate": "2024-10-30",
          "promotionType": "PERCENTAGE"
        }
      ]
    }
  ]
}
Aplica desconto em combo de itens.Exemplo: Item de R$ 10,00 em combo "Leve 3 Pague 2" = R$ 20,00 total (R$ 6,66 cada)
{
  "aggregationTag": "123456",
  "promotions": [
    {
      "promotionName": "Promoção teste do tipo LXPY",
      "channels": ["IFOOD-APP"],
      "items": [
        {
          "ean": "3213434343",
          "discountValue": null,
          "initialDate": "2024-10-23",
          "finalDate": "2024-10-30",
          "promotionType": "LXPY",
          "progressiveDiscount": {
            "quantityToBuy": 3,
            "quantityToPay": 2
          }
        }
      ]
    }
  ]
}
Aplica desconto percentual a cada X unidades.Exemplo: Item de R$ 10,00 com 50% na 2ª unidade = R$ 15,00 total (2 unidades)
{
  "aggregationTag": "123456",
  "promotions": [
    {
      "promotionName": "Promoção teste - 50% na 3ª unidade",
      "channels": ["IFOOD-APP"],
      "items": [
        {
          "ean": "3213434343",
          "discountValue": 50.0,
          "initialDate": "2024-10-23",
          "finalDate": "2024-10-30",
          "promotionType": "PERCENTAGE_PER_X_UNITS",
          "progressiveDiscount": {
            "quantityToBuy": 3
          }
        }
      ]
    }
  ]
}
CampoTipoObrigatórioDescrição
aggregationTagStringNãoIdentificador customizado da requisição
promotions[].promotionNameStringNãoNome da promoção
promotions[].channelsArraySimCanais de venda (ex: IFOOD-APP)
promotions[].items[].eanStringSimCódigo EAN do produto
promotions[].items[].discountValueDoubleCondicionalValor do desconto em %
promotions[].items[].initialDateDateSimData de início (formato: YYYY-MM-DD)
promotions[].items[].finalDateDateSimData de término (formato: YYYY-MM-DD)
promotions[].items[].promotionTypeStringSimTipo: PERCENTAGE, LXPY ou PERCENTAGE_PER_X_UNITS
progressiveDiscount.quantityToBuyIntegerCondicionalQuantidade a comprar (LXPY e PERCENTAGE_PER_X_UNITS)
progressiveDiscount.quantityToPayIntegerCondicionalQuantidade a pagar (apenas LXPY)
TipoCampos obrigatórios
PERCENTAGEdiscountValue
LXPYquantityToBuy, quantityToPay
PERCENTAGE_PER_X_UNITSdiscountValue, quantityToBuy
Limite de descontoDescontos máximos permitidos: 70% do preço de catálogo. Itens com desconto superior serão rejeitados.Exemplo não permitido: "Leve 10 Pague 2" = 80% de desconto
Campos retornados:
  • aggregationId (string): ID único para rastreamento da requisição de criação de promoções
  • message (string): Mensagem de confirmação
{
  "aggregationId": "abc123",
  "message": "We have successfully received your request to create promotions"
}
Processamento assíncronoO status 202 indica que a requisição foi recebida, mas não que as promoções foram criadas. Use o aggregationId para consultar o status real via GET.Recomendação: Valide o status no endpoint GET e confira no App do iFood antes de considerar a promoção ativa.
HTTP 400/422 - Erro de processamento
{
  "type": "Business Exception",
  "title": "Business Exception",
  "status": 400,
  "detail": "Detail error",
  "instance": "07228dab-644c-4bec-b8a3-073397a839a0"
}
HTTP 412 - Erro de validação
{
  "type": "Invalid Argument",
  "title": "Invalid Request Body",
  "status": 412,
  "detail": "Detail error",
  "instance": "07228dab-644c-4bec-b8a3-073397a839a0"
}

Atualização de promoções

Para substituir todas as promoções ativas da loja, use o parâmetro ?reset=true:
POST /merchants/{merchantId}/promotions?reset=true
Comportamento do reset:
  • Cria novos itens promocionais
  • Mantém itens idênticos aos já existentes
  • Desativa itens não incluídos no novo payload
Recomendações:
  • Use com moderação (diariamente fora do horário comercial)
  • Execute apenas quando houver alterações
  • Limite: máximo 10.000 itens promocionais por payload

Consulta de promoções

Use GET /merchants/{merchantId}/promotions/{aggregationId}/items para consultar status das promoções.Descrição: Retorna detalhes dos itens de promoção com suporte a filtros e paginação.Importante: O processamento é assíncrono. Consultas imediatas após o POST podem retornar lista vazia.
curl -X GET "https://merchant-api.ifood.com.br/promotion/v1.0/merchants/{{merchantId}}/promotions/{{aggregationId}}/items?offset=0&limit=10&status=ACTIVE" \
  -H "Authorization: Bearer {{token}}" \
  -H "Content-Type: application/json"
ParâmetroTipoDescrição
eanStringCódigo EAN do produto
promotionNameStringNome da promoção
promotionTypeStringTipo da promoção
statusStringStatus atual (veja tabela abaixo)
offsetIntegerPosição inicial da listagem
limitIntegerItens por página (máximo: 1000)
StatusDescrição
PROCESSINGRecebido e em validação
SCHEDULEDValidado, aguardando data de início
ACTIVEValidado e em operação
DUPLICATEItem promocional duplicado (já enviado anteriormente)
FINISHINGRemoção solicitada, aguardando efetivação
FINISHEDRemovido com sucesso
ERRORErro detectado (veja campo error para detalhes)
Status ACTIVE não garante visibilidadeUma promoção ACTIVE está cadastrada no sistema, mas pode não aparecer no App para todos os usuários devido a:
  • Outras promoções ativas para o mesmo item
  • Regras de priorização (mostra o melhor desconto)
  • Promoções do iFood, indústria ou inseridas via Portal do Parceiro
Campos retornados:
  • promotions (array): Lista de itens de promoção
    • promotionItemId (string, UUID): Identificador único do item de promoção
    • ean (string): Código EAN do produto
    • status (string): Status atual (PROCESSING, ACTIVE, FINISHED, SCHEDULED, FINISHING, ERROR)
    • initialDate (string, date): Data de início da promoção
    • finalDate (string, date): Data de término da promoção
    • promotionType (string): Tipo da promoção (PERCENTAGE, LXPY, PERCENTAGE_PER_X_UNITS)
    • discountValue (string): Valor do desconto (em %)
    • promotionName (string): Nome da promoção
    • progressiveDiscount (object, opcional): Desconto progressivo
      • quantityToBuy (number): Quantidade a comprar
      • quantityToPay (number): Quantidade a pagar
    • error (string, opcional): Detalhamento do erro (retornado apenas quando status = ERROR)
  • pagination (object): Informações de paginação
    • nextOffset (integer): Valor do próximo offset
    • currentOffset (integer): Valor do offset atual
{
  "promotions": [
    {
      "promotionItemId": "005f5ea0-1ff4-4c9b-9f48-76d94bfe4694",
      "ean": "3213434343",
      "status": "ACTIVE",
      "initialDate": "2024-10-10",
      "finalDate": "2024-10-11",
      "promotionType": "LXPY",
      "promotionName": "Promoção teste do tipo LXPY",
      "progressiveDiscount": {
        "quantityToBuy": 3,
        "quantityToPay": 2
      }
    }
  ],
  "pagination": {
    "nextOffset": 99,
    "currentOffset": 0
  }
}
CódigoDetalhamento
DATE_INVALIDVerifique formato das datas (YYYY-MM-DD) e se finalDate > initialDate
PROMOTION_TYPE_INVALIDValores válidos: PERCENTAGE, LXPY, PERCENTAGE_PER_X_UNITS
DISCOUNT_INVALIDVerifique campos obrigatórios para cada tipo e limite de 70% de desconto
ITEM_NOT_FOUNDEAN incorreto ou produto inativo/sem estoque
INTERNAL_ERROREntre em contato com o suporte iFood

Promoções em pedidos

Promoções aplicadas aparecem no GET /orders/{id}/virtual-bag:Como identificar promoções da sua loja:
  1. Benefícios em benefit.benefits
  2. Filtre por target = ITEM
  3. Filtre por sponsorships com 1 elemento onde liability = PARTNER ou CHAIN
Calcular valor com desconto:
  1. Obtenha targetId do benefício
  2. Correlacione com bag.items[].uniqueId
  3. Subtraia sponsorships.amount.value de prices.grossValue.value

Próximos passos

Verifique os critérios para realizar sua homologação
Esta página foi útil?
Avalie sua experiência no novo Developer portal: