Pular para o conteúdo principal
Identificador do evento: messages. Chega em messaging[], identificado pela presença da chave message.
O sender.id é o IGSID do contato, usado para responder e para consultar o perfil.

Mensagens enviadas pela conta

Mensagens que saem da conta voltam no mesmo evento, com is_echo:
Isso inclui o que foi enviado pela API e também o que uma pessoa da equipe digitou no aplicativo do Instagram. No eco, o sender.id é a conta e o recipient.id é o contato, invertidos em relação a uma mensagem recebida.
Um eco não abre conversa nem reinicia a janela de 24 horas. Só mensagem da pessoa faz isso. Tratar eco como mensagem recebida duplica conversas.

Anexos

Mídia chega em attachments, sem texto:
O campo url significa coisas diferentes conforme o type. Em image, video e audio é o arquivo. Em share é o endereço da publicação compartilhada, não um arquivo para baixar.
As URLs de mídia são assinadas e expiram. Baixe o arquivo ao receber, se precisar guardá-lo.

Resposta a story

Resposta a um story chega como mensagem comum, com reply_to:

Resposta rápida

Clique em uma resposta rápida chega como mensagem, e não como postback:
Roteie pelo payload, não pelo text.

Mensagem sem texto

Um message.text vazio é válido e significa mensagem sem texto, não erro. Verifique attachments antes de descartar o evento.