Webhooks

Catálogo de eventos

O nome de cada evento é estável: ele não muda quando o sistema por dentro muda. Evento novo entra neste catálogo e chega aos endpoints que escolheram "todos".

O conteúdo das mensagens não vai no webhook: o evento diz o que aconteceu e em qual conversa, e o texto fica na Torqyn, porque é dado pessoal.

ping

Evento de teste

O botão "Enviar evento de teste" e POST /v1/webhook-endpoints/{id}/test. Todo endpoint recebe, escolhido ou não.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "ping",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "ping",
      "message": "Evento de teste: se chegou, o endereço e a assinatura estão certos."
    }
  }
}

contact.opted_out

Contato pediu para sair

A pessoa pediu para não receber mais mensagens (em qualquer canal). Pare de mandar mensagens de marketing para ela no seu sistema também.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "contact.opted_out",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "contact",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      },
      "channel": null
    }
  }
}

message.received

Mensagem recebida

O contato mandou uma mensagem. O corpo traz a conversa e o canal, não o texto: o conteúdo é dado pessoal e fica na Torqyn.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "message.received",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "message",
      "id": "7e1f3a5b-2c4d-4e6f-8a9b-0c1d2e3f4a5b",
      "direction": "inbound",
      "status": "received",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "channel": "whatsapp",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

message.sent

Mensagem enviada

Uma mensagem nossa (da IA ou do time) saiu para o canal.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "message.sent",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "message",
      "id": "3a5c7e9b-1d2f-4a6b-8c0d-2e4f6a8b0c1d",
      "direction": "outbound",
      "status": "sent",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "channel": "whatsapp",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

message.delivered

Mensagem entregue

O canal confirmou que a mensagem chegou ao aparelho da pessoa.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "message.delivered",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "message",
      "id": "3a5c7e9b-1d2f-4a6b-8c0d-2e4f6a8b0c1d",
      "direction": "outbound",
      "status": "delivered",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "channel": "whatsapp",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

message.read

Mensagem lida

A pessoa abriu a mensagem (quando o canal informa leitura).

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "message.read",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "message",
      "id": "3a5c7e9b-1d2f-4a6b-8c0d-2e4f6a8b0c1d",
      "direction": "outbound",
      "status": "read",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "channel": "whatsapp",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

message.failed

Mensagem não entregue

O canal recusou a mensagem. O motivo aparece no painel, na conversa.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "message.failed",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "message",
      "id": "3a5c7e9b-1d2f-4a6b-8c0d-2e4f6a8b0c1d",
      "direction": "outbound",
      "status": "failed",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "channel": "whatsapp",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

conversation.handed_off

Conversa passou para o time

A IA chamou alguém do time, ou alguém do time assumiu a conversa.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "conversation.handed_off",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "conversation",
      "id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "channel": "whatsapp",
      "handed_off_by": "ai",
      "case_id": "2c4e6a8b-1d3f-4a5b-8c7d-9e0f1a2b3c4d",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

appointment.created

Horário marcado

Um horário foi marcado, pela conversa, pela página ou pelo time.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "appointment.created",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "appointment",
      "case_id": "2c4e6a8b-1d3f-4a5b-8c7d-9e0f1a2b3c4d",
      "flow": "scheduling",
      "starts_at": "2026-10-03T18:00:00.000Z",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

payment.succeeded

Pagamento confirmado

O provedor de pagamento confirmou um pagamento na conta de recebimento do negócio.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "payment.succeeded",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "payment",
      "amount_cents": 15000,
      "currency": "BRL",
      "case_id": "2c4e6a8b-1d3f-4a5b-8c7d-9e0f1a2b3c4d",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

case.stage_changed

Caso mudou de etapa

O caso mudou de coluna no quadro, com a etapa de antes e a de agora.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "case.stage_changed",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "case",
      "id": "2c4e6a8b-1d3f-4a5b-8c7d-9e0f1a2b3c4d",
      "flow": "sales",
      "stage": "proposal_sent",
      "previous_stage": "engaged",
      "value_cents": 15000,
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

case.won

Caso ganho

O caso fechou com resultado bom (venda, comparecimento, atendimento resolvido), confirmado na origem ou marcado pelo time.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "case.won",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "case",
      "id": "2c4e6a8b-1d3f-4a5b-8c7d-9e0f1a2b3c4d",
      "flow": "sales",
      "stage": "won",
      "result": "won",
      "outcome": "sale_won",
      "value_cents": 15000,
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

case.lost

Caso perdido

O caso fechou sem o resultado (perdido, faltou, cancelado).

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "case.lost",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "case",
      "id": "2c4e6a8b-1d3f-4a5b-8c7d-9e0f1a2b3c4d",
      "flow": "sales",
      "stage": "lost",
      "result": "lost",
      "outcome": "sale_lost",
      "value_cents": 15000,
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

event.delivered

Evento entregue

Um evento que o seu sistema mandou (POST /v1/events) virou mensagem.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "event.delivered",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "event",
      "type": "consulta_amanha",
      "status": "delivered",
      "reason": null,
      "via": "template",
      "channel": "whatsapp",
      "conversation_id": "9b2f4c1e-7d3a-4e5f-8a6b-1c2d3e4f5a6b",
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}

event.failed

Evento não entregue

Um evento que o seu sistema mandou não virou mensagem, e o motivo vem no corpo.

{
  "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "type": "event.failed",
  "api_version": "2026-10-01",
  "created": "2026-10-01T12:00:00.000Z",
  "livemode": true,
  "account": "1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9",
  "data": {
    "object": {
      "object": "event",
      "type": "consulta_amanha",
      "status": "failed",
      "reason": "outside_window",
      "via": null,
      "channel": null,
      "conversation_id": null,
      "contact": {
        "id": "5b7c2d1e-8f3a-4b6c-9d2e-1f4a5b6c7d8e",
        "external_id": "fam-123"
      }
    }
  }
}