Pular para o conteúdo principal
Todos os envios usam o mesmo endpoint, e o que muda é o corpo da requisição:

Destinatário

O destinatário é identificado pelo IGSID, informado em recipient.id:
Esse valor chega no webhook em sender.id quando a pessoa manda mensagem. Ele é específico da sua conta: o mesmo perfil do Instagram tem IGSIDs diferentes em contas profissionais diferentes.
O IGSID também identifica a mesma pessoa quando ela comenta em uma publicação. O from.id do comentário é o mesmo valor do sender.id da conversa.

Janela de 24 horas

A empresa não pode iniciar conversas. Toda troca começa com uma ação da pessoa: uma mensagem, um comentário, uma resposta a story, uma menção ou um clique em anúncio. A partir da última mensagem recebida, você tem 24 horas para responder. Fora do prazo, a Meta recusa:
A janela conta a partir da última mensagem da pessoa, não da última da conversa. Responder não reabre o prazo.

Resposta do envio

Um envio aceito devolve o identificador da mensagem:
As ações de conversa, como marcar como lida e reagir, devolvem apenas o recipient_id, porque não criam mensagem.
A resposta 200 significa que a Meta aceitou, não que a mensagem foi entregue.

Eco das mensagens enviadas

Toda mensagem que sai da conta volta para o seu webhook com is_echo: true, inclusive as enviadas pelo aplicativo do Instagram por uma pessoa da equipe. Use esse evento para manter sua base igual à conversa real.

Erros comuns