O webhook usa heartbeats para indicar presença. O iFood envia requests periódicas para verificar se sua integração está online e quais merchants estão ativos.Como funciona:
Webhook habilitado → heartbeats começam em até 30 segundos
iFood envia request KEEPALIVE
Você responde indicando quais merchants estão online
iFood atualiza status de presença
Saiba mais sobre o conceito de presença e como ele afeta a visibilidade de merchants.
Modos de operação
Por aplicativo (todos os merchants online)
Use quando não precisar controlar presença individualmente. Uma única resposta 202 Accepted marca todos os merchants com escopo order como online.Request do iFood:
Qualquer outro código → nenhum merchant fica online
Response body é ignorado
Resultado
Todos os merchants com escopo order aparecem como disponíveis na plataforma, desde que atendam aos outros critérios (horário de funcionamento, configurações, etc.).
Por merchant (controle individualizado)Use quando precisar controlar presença de cada merchant separadamente. O iFood envia lista de até 1000 merchants por request. Você responde com a lista dos que estão online.
Hearbeats incluem o header X-IFood-Signature como qualquer outro evento. Valide antes de processar. Veja aqui como validar assinatura.
Casos de uso
Caso 1: Sistema sempre online
Cenário: Seu sistema está sempre disponível e todos os merchants devem ficar online.Solução: Use o modo "por aplicativo" e sempre responda 202 Accepted.
Caso 2: Merchants com horários diferentes
Cenário: Alguns merchants fecham à noite, outros ficam 24h.Solução: Use o modo "por merchant" e filtre por horário de funcionamento antes de responder.
@app.route('/webhook', methods=['POST'])def webhook(): event = request.json if event['code'] == 'KEEPALIVE': if 'merchantIds' in event: # Modo por merchant online_merchants = [ m for m in event['merchantIds'] if is_open(m) # Verifica horário ] return jsonify({'merchantIds': online_merchants}), 202 else: # Modo por aplicativo return '', 202 # ... processar outros eventos
Caso 3: Sistema em manutenção
Cenário: Sistema offline por manutenção. Solução:
Modo por aplicativo: Responda 503 Service Unavailable → todos os merchants ficam offline
Modo por merchant: Responda 202 com lista vazia {"merchantIds": []}