> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wegly.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Eventos de Webhooks

> Eventos que a API da Wegly pode disparar para webhooks configurados, com payloads e tipos enviados em cada disparo.

Esta página documenta os eventos de webhook de saída que a Wegly pode enviar para integrações externas.

Cada evento é entregue como uma requisição `POST` para a URL configurada na assinatura de webhook ativa. O endpoint de destino deve responder qualquer status HTTP `2xx` para confirmar o recebimento. Falhas de rede, timeout, respostas `408`, `409`, `425`, `429` e `5xx` admitem novas tentativas, respeitando `max_retries` da assinatura. Outros status fora de `2xx` encerram a entrega como falha. A quantidade configurada representa reenvios além da primeira tentativa; o intervalo entre tentativas cresce exponencialmente a partir de 3 segundos. O timeout de cada tentativa é de 30 segundos.

Responda com um corpo curto: uma resposta maior que 1 MB encerra a entrega como falha, mesmo com status `2xx`. Os eventos só são gerados enquanto o plano da empresa está válido; fora desse período, eles não são enfileirados nem reenviados depois.

## Formato da entrega

### Headers enviados

| Header | Tipo | Descrição |
| - | - | - |
| `content-type` | `application/json` | Tipo do corpo enviado. |
| `user-agent` | `wegly-webhooks/1.0` | Identificação do emissor dos webhooks da Wegly. |
| `x-wegly-event` | `WebhookEventKey` | Chave técnica do evento disparado. |
| `x-wegly-event-id` | `string` | Identificador estável do evento em entregas duráveis. Opcional; corresponde ao `event_id` do corpo e permanece igual nos reenvios. |
| `x-wegly-signature` | `string` | Assinatura HMAC SHA-256 do corpo JSON, gerada com o `secret` da assinatura. |

Os headers personalizados e a autenticação configurados na assinatura (Basic, Bearer ou chave de API) também são enviados. Em caso de nome repetido, prevalecem os headers da tabela acima.

### Envelope padrão

Todos os eventos usam o mesmo envelope. Entregas duráveis acrescentam `event_id`; consumidores devem aceitar também eventos sem esse campo:

```ts theme={null}
type ISODateString = string;
type UUID = string;

interface WeglyWebhookEnvelope<
  TEvent extends WebhookEventKey,
  TPayload,
> {
  event_id?: string; // Identificador opaco; não presuma formato UUID.
  event_key: TEvent;
  payload: TPayload;
}
```

Exemplo resumido de uma entrega sem identificador durável:

```json theme={null}
{
  "event_key": "lead.created",
  "payload": {
    "lead": {
      "id": "11111111-1111-4111-8111-111111111111",
      "code": 1024,
      "title": "Lead - Evento corporativo",
      "created_at": "2026-06-02T12:00:00.000Z"
    }
  }
}
```

<Note>
  Algumas ações podem disparar mais de um evento. Por exemplo: ao mover um lead de etapa, a Wegly pode enviar `lead.stage_changed` e também `lead.updated`, caso existam assinaturas ativas para ambos.
</Note>

### Reentregas e arquivos

Use `event_id`, quando presente, para reconhecer reentregas do mesmo evento no seu destino. O identificador mantém o evento lógico estável; URLs privadas de arquivos podem mudar entre tentativas. No fluxo durável, essas URLs são regeneradas imediatamente antes do envio com validade de 24 horas. Consuma os arquivos dentro desse prazo.

Entregas duráveis já registradas mantêm a URL e a configuração da assinatura capturadas na emissão; alterações posteriores na assinatura não modificam essas entregas.

Os snapshots representam os dados capturados para aquele evento. Uma nova tentativa durável mantém esse conteúdo, mesmo que o registro no CRM tenha mudado depois; somente as URLs temporárias são renovadas.

## Eventos disponíveis

O catálogo atual contém 33 eventos. Não há eventos `proposal.*` neste catálogo; para consultar propostas e seus cronogramas, use as [rotas de propostas](/documentacao-da-api/integracoes/propostas).

```ts theme={null}
type WebhookEventKey =
  | 'lead.created'
  | 'lead.updated'
  | 'lead.stage_changed'
  | 'lead.won'
  | 'lead.lost'
  | 'lead.tag_added'
  | 'lead.tag_removed'
  | 'lead.custom_field_updated'
  | 'lead.custom_field_removed'
  | 'lead.quality_updated'
  | 'deal.created'
  | 'deal.updated'
  | 'deal.stage_changed'
  | 'deal.won'
  | 'deal.lost'
  | 'deal.tag_added'
  | 'deal.tag_removed'
  | 'deal.custom_field_updated'
  | 'deal.custom_field_removed'
  | 'deal.quality_updated'
  | 'chat.message_sent'
  | 'chat.message_received'
  | 'delivery.created'
  | 'delivery.updated'
  | 'delivery.stage_changed'
  | 'delivery.completed'
  | 'task.completed'
  | 'contract.created'
  | 'contract.updated'
  | 'contract.canceled'
  | 'contract.renewed'
  | 'contract.completed'
  | 'satisfaction.public_submission_created';
```

## Leads

| Evento | Quando dispara | Payload enviado |
| - | - | - |
| `lead.created` | Quando um lead é criado pela API interna ou por integração externa. | `LeadCreatedPayload` |
| `lead.updated` | Quando dados do lead são alterados. | `LeadSnapshot` |
| `lead.stage_changed` | Quando um lead é movido para outra etapa do funil. | `LeadStageChangedPayload` |
| `lead.won` | Quando um lead é marcado como ganho. | `LeadWonPayload` |
| `lead.lost` | Quando um lead é marcado como perdido. | `LeadLostPayload` |
| `lead.tag_added` | Quando uma ou mais tags são adicionadas ao lead. | `LeadTagAddedPayload` |
| `lead.tag_removed` | Quando uma tag é removida do lead. | `LeadTagRemovedPayload` |
| `lead.custom_field_updated` | Quando um valor de campo personalizado do lead é criado ou atualizado. | `LeadCustomFieldUpdatedPayload` |
| `lead.custom_field_removed` | Quando um valor de campo personalizado do lead é removido. | `LeadCustomFieldRemovedPayload` |
| `lead.quality_updated` | Quando a qualificação do lead é criada ou alterada. | `LeadQualityUpdatedPayload` |

<Note>
  `lead.won`, `lead.lost`, `lead.tag_added` e `lead.tag_removed` são emitidos pelas ações dedicadas do CRM. Tags enviadas no corpo de criação ou de atualização, inclusive pela API externa, não geram eventos de tag: a alteração aparece no snapshot de `lead.created` ou `lead.updated`.
</Note>

```ts theme={null}
interface LeadSnapshot {
  id: UUID;
  code: number;
  title: string;
  status?: number; // Quando presente: 1=Aberto, 2=Ganho, 3=Perdido.
  value?: number | null;
  valuation?: OpportunityValuation;
  projection_context?: {
    indefinite_horizon_months: 6 | 12 | 18 | 24;
    display_mode: 'CURRENT' | 'PROJECTED_CONTRACT_TOTAL';
  };
  measurement_consent?: 'GRANTED' | 'DENIED' | 'UNSPECIFIED';
  qualification_metric?: 'quality_rating' | 'lead_score';
  score?: number | null;
  score_criteria_count?: number | null;
  score_updated_at?: ISODateString | null;
  icp?: Record<string, unknown> | null;
  icps?: Array<Record<string, unknown>>;
  visibility?: number;
  negotiation_mode?: 0 | 1 | null; // 0=Pedido, 1=Proposta.
  quality_rating?: number | null;
  quality_reason?: string | null;
  created_at: ISODateString;
  updated_at?: ISODateString;
  archived_at?: ISODateString | null;
  won_date?: ISODateString | null;
  lost_date?: ISODateString | null;
  lost_reason_description?: string | null;
  crm_loss_reason?: LossReasonSummary | null;
  crm_loss_reasons?: LossReasonSummary[];
  last_activity_at?: ISODateString | null;
  responsible?: UserSummary | null;
  created_by?: UserSummary | null;
  stage?: Record<string, unknown> | null;
  lead_source?: Record<string, unknown> | null;
  marketing_lead_source?: Record<string, unknown> | null;
  participants?: Array<Record<string, unknown>>;
  partners?: Array<Record<string, unknown>>;
  organization?: Record<string, unknown> | null;
  custom_fields?: Array<Record<string, unknown>>;
  tags?: TagSummary[];
  proposals?: Array<Record<string, unknown>>;
  deals?: Array<Record<string, unknown>>;
  followers?: FollowerSummary[];
  has_channel_chat?: boolean;
  channel_chats?: Array<Record<string, unknown>>;
  has_whatsapp_chat?: boolean;
  whatsapp_chats?: WhatsappChatSummary[];
  [key: string]: unknown;
}

interface LeadCreatedPayload {
  lead: LeadSnapshot;
  custom_fields_changed?: CustomFieldChange[];
  previous_quality?: number | null;
  previous_quality_reason?: string | null;
  new_quality?: number | null;
  new_quality_reason?: string | null;
}

interface LeadStageChangedPayload {
  previous_stage: StageSummary | null;
  current_stage: StageSummary | null;
  lead: LeadSnapshot;
}

interface LeadWonPayload {
  lead: LeadSnapshot;
  won_date: ISODateString;
  won_by: ActorSummary;
  deal: Record<string, unknown> | null;
}

interface LeadLostPayload {
  lead: LeadSnapshot;
  lost_date: ISODateString;
  lost_by: ActorSummary;
  loss_reason: LossReasonSummary | null;
  loss_reasons: LossReasonSummary[];
  loss_reason_description: string | null;
}

interface LeadTagAddedPayload {
  lead: LeadSnapshot;
  added_tags: TagSummary[];
}

interface LeadTagRemovedPayload {
  lead: LeadSnapshot;
  removed_tags: TagSummary[];
}

interface LeadCustomFieldUpdatedPayload {
  lead: LeadSnapshot;
  custom_fields_changed: CustomFieldChange[];
}

interface LeadCustomFieldRemovedPayload {
  lead: LeadSnapshot;
  removed_fields: RemovedCustomField[];
}

interface LeadQualityUpdatedPayload {
  lead: LeadSnapshot;
  previous_quality: number | null;
  previous_quality_reason: string | null;
  new_quality: number | null;
  new_quality_reason: string | null;
}
```

Os snapshots incluem consentimento de mensuração, qualificação por estrelas ou score, ICPs, parceiros e projeção de valor quando disponíveis. `crm_loss_reasons` contém os motivos de perda selecionados. Os motivos principais continuam disponíveis nos campos singulares por compatibilidade.

`channel_chats` reúne os resumos multicanal. Nos eventos de lead e oportunidade, `whatsapp_chats` contém o snapshot específico de chats WhatsApp abertos, com `chat_id` e `phone_number` aninhado; não use o formato do alias `whatsapp_chats` das rotas HTTP externas para interpretar esse campo do webhook.

## Oportunidades

| Evento | Quando dispara | Payload enviado |
| - | - | - |
| `deal.created` | Quando uma oportunidade é criada. | `DealCreatedPayload` |
| `deal.updated` | Quando dados da oportunidade são alterados. | `DealSnapshot` |
| `deal.stage_changed` | Quando uma oportunidade é movida para outra etapa do funil. | `DealStageChangedPayload` |
| `deal.won` | Quando uma oportunidade é marcada como ganha. | `DealWonPayload` |
| `deal.lost` | Quando uma oportunidade é marcada como perdida. | `DealLostPayload` |
| `deal.tag_added` | Quando uma ou mais tags são adicionadas à oportunidade. | `DealTagAddedPayload` |
| `deal.tag_removed` | Quando uma tag é removida da oportunidade. | `DealTagRemovedPayload` |
| `deal.custom_field_updated` | Quando um valor de campo personalizado da oportunidade é criado ou atualizado. | `DealCustomFieldUpdatedPayload` |
| `deal.custom_field_removed` | Quando um valor de campo personalizado da oportunidade é removido. | `DealCustomFieldRemovedPayload` |
| `deal.quality_updated` | Quando a qualificação da oportunidade é criada ou alterada. | `DealQualityUpdatedPayload` |

<Note>
  `deal.won`, `deal.lost`, `deal.tag_added` e `deal.tag_removed` são emitidos pelas ações dedicadas do CRM. Quando o `status` é alterado por `PUT /integrations/external/deals/{id}`, a Wegly emite apenas `deal.updated`, com o novo `status` no snapshot. Tags enviadas no corpo de criação ou de atualização, inclusive pela API externa, não geram eventos de tag: a alteração aparece no snapshot de `deal.created` ou `deal.updated`.
</Note>

```ts theme={null}
interface DealSnapshot {
  id: UUID;
  code: number;
  title: string;
  status: number; // 1=Aberta, 2=Ganha, 3=Perdida.
  value?: number | null;
  valuation?: OpportunityValuation;
  projection_context?: {
    indefinite_horizon_months: 6 | 12 | 18 | 24;
    display_mode: 'CURRENT' | 'PROJECTED_CONTRACT_TOTAL';
  };
  measurement_consent?: 'GRANTED' | 'DENIED' | 'UNSPECIFIED';
  qualification_metric?: 'quality_rating' | 'lead_score';
  score?: number | null;
  score_criteria_count?: number | null;
  score_updated_at?: ISODateString | null;
  icp?: Record<string, unknown> | null;
  icps?: Array<Record<string, unknown>>;
  visibility?: number;
  negotiation_mode?: 0 | 1 | null; // 0=Pedido, 1=Proposta.
  quality_rating?: number | null;
  quality_reason?: string | null;
  created_at: ISODateString;
  updated_at: ISODateString;
  archived_at?: ISODateString | null;
  won_date?: ISODateString | null;
  lost_date?: ISODateString | null;
  lost_reason_description?: string | null;
  crm_loss_reason?: LossReasonSummary | null;
  crm_loss_reasons?: LossReasonSummary[];
  last_activity_at?: ISODateString | null;
  responsible?: UserSummary | null;
  created_by?: UserSummary | null;
  stage?: Record<string, unknown> | null;
  deal_source?: Record<string, unknown> | null;
  marketing_lead_source?: Record<string, unknown> | null;
  participants?: Array<Record<string, unknown>>;
  partners?: Array<Record<string, unknown>>;
  organization?: Record<string, unknown> | null;
  custom_fields?: Array<Record<string, unknown>>;
  tags?: TagSummary[];
  proposals?: Array<Record<string, unknown>>;
  lead?: Record<string, unknown> | null;
  crm_gain_reason?: GainReasonSummary | null;
  crm_gain_reasons?: GainReasonSummary[];
  won_reason_description?: string | null;
  expected_close_date?: ISODateString | null;
  temperature?: number | null;
  followers?: FollowerSummary[];
  has_channel_chat?: boolean;
  channel_chats?: Array<Record<string, unknown>>;
  has_whatsapp_chat?: boolean;
  whatsapp_chats?: WhatsappChatSummary[];
  [key: string]: unknown;
}

interface DealCreatedPayload {
  deal: DealSnapshot;
  custom_fields_changed?: CustomFieldChange[];
}

interface DealStageChangedPayload {
  previous_stage: StageSummary | null;
  current_stage: StageSummary | null;
  deal: DealSnapshot;
}

interface DealWonPayload {
  deal: DealSnapshot;
  won_date: ISODateString;
  won_by: ActorSummary;
  customer_id: UUID | null;
  gain_reason: GainReasonSummary | null;
  gain_reasons: GainReasonSummary[];
  won_reason_description: string | null;
}

interface DealLostPayload {
  deal: DealSnapshot;
  lost_date: ISODateString;
  lost_by: ActorSummary;
  loss_reason: LossReasonSummary | null;
  loss_reasons: LossReasonSummary[];
  loss_reason_description: string | null;
}

interface DealTagAddedPayload {
  deal: DealSnapshot;
  added_tags: TagSummary[];
}

interface DealTagRemovedPayload {
  deal: DealSnapshot;
  removed_tags: TagSummary[];
}

interface DealCustomFieldUpdatedPayload {
  deal: DealSnapshot;
  custom_fields_changed: CustomFieldChange[];
}

interface DealCustomFieldRemovedPayload {
  deal: DealSnapshot;
  removed_fields: RemovedCustomField[];
}

interface DealQualityUpdatedPayload {
  deal: DealSnapshot;
  previous_quality: number | null;
  previous_quality_reason: string | null;
  new_quality: number | null;
  new_quality_reason: string | null;
}
```

## Chats

| Evento | Quando dispara | Payload enviado |
| - | - | - |
| `chat.message_sent` | Quando uma mensagem é enviada pela Wegly no chat. | `ChatMessageSentPayload` |
| `chat.message_received` | Quando uma mensagem sem mídia é processada pelo callback do WhatsApp. | `ChatMessageReceivedPayload` |

Mensagens recebidas com mídia (imagem, áudio, vídeo, documento ou figurinha) não geram `chat.message_received` no primeiro recebimento, pois o arquivo ainda está sendo baixado; consulte as [mensagens do chat](/documentacao-da-api/integracoes/chats) para obtê-las. Reações, edições e mensagens de histórico também não geram esse evento.

O evento enviado usa a mensagem formatada para o chat. O evento recebido usa os campos persistidos da mensagem, incluindo `chat_id` e `wamid`; ele não garante objetos relacionados como `media`, `call`, `agent` ou `reactions`. Use `origin`, `from_me` e `sent_via` para distinguir mensagem de contato e eco do dispositivo móvel.

Os arrays `associated_leads` e `associated_deals` são adicionados a partir da pessoa vinculada ao chat. Podem ficar vazios quando não há vínculos e podem ser omitidos se o enriquecimento falhar.

```ts theme={null}
interface ChatMessagePayload {
  id: UUID;
  type: string;
  origin: string;
  from_me: boolean;
  sent_via: 'CONTACT' | 'API' | 'MOBILE_DEVICE' | 'SYSTEM';
  status: string;
  error_code: number | null;
  error_message: string | null;
  body_text: string | null;
  transcription: string | null;
  content_payload: Record<string, unknown> | null;
  meta_timestamp: ISODateString;
  created_at: ISODateString;
  is_history: boolean;
  history_phase?: number | null;
  history_chunk_order?: number | null;
  history_progress?: number | null;
  is_media_placeholder: boolean;
  is_forwarded: boolean;
  whatsapp_ai_agent_id: UUID | null; // Agente de IA que enviou; null para pessoas e automações.
  associated_leads?: AssociatedCrmRecord[];
  associated_deals?: AssociatedCrmRecord[];
  [key: string]: unknown;
}

interface ChatMessageSentPayload extends ChatMessagePayload {
  reactions: Array<Record<string, unknown>>;
  agent: Record<string, unknown> | null;
  user: Record<string, unknown> | null;
  media: {
    id: UUID;
    mime_type: string;
    file_name: string | null;
    is_downloaded: boolean;
    url: string | null;
  } | null;
  call: {
    id: UUID;
    status: string;
    direction: string;
    started_at: ISODateString | null;
    ended_at: ISODateString | null;
    duration_ms: number | null;
    recording_processed: boolean;
    recording_available: boolean;
    has_recording: boolean;
  } | null;
}

interface ChatMessageReceivedPayload extends ChatMessagePayload {
  chat_id: UUID;
  agent_id: UUID | null;
  wamid: string;
  ref_wamid: string | null;
  call_id: UUID | null;
  deleted_at: ISODateString | null;
  business_reply_actor_user_id: UUID | null;
  business_reply_capture_status: string;
}

interface AssociatedCrmRecord {
  id: UUID;
  title: string;
  status: number;
}
```

## Entregas

| Evento | Quando dispara | Payload enviado |
| - | - | - |
| `delivery.created` | Quando uma entrega é criada. | `DeliveryCreatedPayload` |
| `delivery.updated` | Quando dados da entrega são alterados. | `DeliverySnapshot` |
| `delivery.stage_changed` | Quando uma entrega é movida para outra etapa do fluxo. | `DeliveryStageChangedPayload` |
| `delivery.completed` | Quando uma entrega é concluída. | `DeliveryCompletedPayload` |

```ts theme={null}
interface DeliverySnapshot {
  id: UUID;
  code: number;
  title: string;
  description: string | null;
  status: number;
  planned_start_date: ISODateString | null;
  planned_end_date: ISODateString | null;
  started_at: ISODateString | null;
  delivered_at: ISODateString | null;
  cancelled_at: ISODateString | null;
  cancellation_reason: string | null;
  created_at: ISODateString;
  updated_at: ISODateString;
  company_id: UUID;
  pipeline_id: UUID;
  stage_id: UUID;
  customer_id: UUID;
  deal_id: UUID | null;
  responsible_id: UUID | null;
  created_by: UUID | null;
  pipeline?: Record<string, unknown>;
  stage?: Record<string, unknown>;
  customer?: Record<string, unknown>;
  deal?: Record<string, unknown> | null;
  responsible?: UserSummary | null;
  created_by_user?: UserSummary | null;
  crm_delivery_participant?: Array<Record<string, unknown>>;
  crm_delivery_stage_deadline?: Array<Record<string, unknown>>;
  custom_fields?: Array<Record<string, unknown>>;
  pending_delivery_indicators?: Array<Record<string, unknown>>;
  has_pending_delivery_indicators?: boolean;
  has_overdue_delivery_indicators?: boolean;
  stage_durations?: Array<Record<string, unknown>>;
  crm_delivery_stage_assignment?: Array<Record<string, unknown>>;
  crm_delivery_deadline_change?: Array<Record<string, unknown>>;
  [key: string]: unknown;
}

interface DeliveryCreatedPayload {
  delivery: DeliverySnapshot;
}

interface DeliveryStageChangedPayload {
  previous_stage: StageSummary | null;
  current_stage: StageSummary | null;
  delivery: DeliverySnapshot;
}

interface DeliveryCompletedPayload {
  delivery: DeliverySnapshot;
  completed_at: ISODateString | null;
}
```

Os snapshots de entrega omitem os campos de projeção de chats (`channel_chats`, `whatsapp_chats` e suas flags), mesmo quando esses campos aparecem em consultas internas da entrega.

## Tarefas

| Evento | Quando dispara | Payload enviado |
| - | - | - |
| `task.completed` | Quando uma tarefa é concluída, inclusive em fluxos de criação ou atualização em lote que gerem tarefas concluídas. | `TaskCompletedPayload` |

```ts theme={null}
interface TaskCompletedPayload {
  task: TaskSnapshot;
  completed_at: ISODateString | null;
}

interface TaskSnapshot {
  id: UUID;
  title: string;
  description: string | null;
  is_personal: boolean;
  priority: number;
  start_date: ISODateString | null;
  end_date: ISODateString | null;
  has_time: boolean;
  completed_at: ISODateString;
  meeting_outcome: number | null;
  meeting_outcome_notes: string | null;
  created_at: ISODateString;
  updated_at: ISODateString;
  crm_task_type_id: UUID;
  crm_task_stage_id: UUID;
  crm_lead_id: UUID | null;
  crm_deal_id: UUID | null;
  crm_delivery_id: UUID | null;
  crm_person_id: UUID | null;
  crm_organization_id: UUID | null;
  responsible_id: UUID | null;
  created_by: UserSummary | null;
  completed_by: UserSummary | null;
  responsible: UserSummary | null;
  crm_task_type: Record<string, unknown>;
  crm_task_stage: Record<string, unknown>;
  crm_lead: Record<string, unknown> | null;
  crm_deal: Record<string, unknown> | null;
  crm_delivery: Record<string, unknown> | null;
  crm_person: Record<string, unknown> | null;
  crm_organization: Record<string, unknown> | null;
  mentions: Array<Record<string, unknown>>;
  reminders_minutes: number[];
  tags: TagSummary[];
  is_subtask: boolean;
  parent_task: {
    id: UUID;
    title: string;
    parent_task_id: UUID | null;
    hierarchy_level: number;
  } | null;
  calendar_lifecycle_status:
    | 'upcoming' | 'in_progress' | 'ended' | 'cancelled' | 'unknown' | null;
  meeting_attendees: Array<{
    email: string;
    name: string | null;
    response_status: string;
    response_updated_at: ISODateString | null;
    is_organizer: boolean;
    is_self: boolean;
  }>;
  meeting_link?: string;
  calendar_event_url?: string;
  meeting_participants?: string[];
  meeting_can_manage_participants: boolean;
  meeting_event: Record<string, unknown> | null;
  meeting_sync: Record<string, unknown> | null;
  meeting_recorder_sessions: Array<Record<string, unknown>>;
  is_recurring: boolean;
  recurrence: Record<string, unknown> | null;
  meeting_provider: string | null;
  provider: string | null;
  recordings: Array<Record<string, unknown>>;
  comments?: Array<Record<string, unknown>>;
  [key: string]: unknown;
}
```

O snapshot da tarefa inclui tags, hierarquia de subtarefas, recorrência e metadados de reunião. `meeting_event` descreve o compromisso e seus participantes; `meeting_sync` informa a sincronização com o calendário. Os links e gravações podem depender da disponibilidade do provedor no momento em que o evento foi capturado.

## Contratos

| Evento | Quando dispara | Payload enviado |
| - | - | - |
| `contract.created` | Quando um contrato é criado. | `ContractCreatedPayload` |
| `contract.updated` | Quando dados do contrato são alterados. | `ContractSnapshot` |
| `contract.canceled` | Quando um contrato é cancelado. | `ContractCanceledPayload` |
| `contract.renewed` | Quando um contrato é renovado e gera um novo contrato. | `ContractRenewedPayload` |
| `contract.completed` | Quando um contrato é concluído. | `ContractCompletedPayload` |

```ts theme={null}
interface ContractSnapshot {
  id: UUID;
  code: number;
  status: number; // 1=Ativo, 2=Cancelado, 3=Concluído.
  title: string;
  description: string | null;
  start_date: ISODateString;
  end_date: ISODateString | null;
  renewal_automatic: boolean;
  renewal_notice_days: number | null;
  cancelled_at: ISODateString | null;
  cancellation_reason: string | null;
  cancellation_details: string | null;
  loss_reason: Record<string, unknown> | null;
  completed_at: ISODateString | null;
  created_at: ISODateString;
  updated_at: ISODateString;
  customer: Record<string, unknown>;
  deal: Record<string, unknown> | null;
  deals: Array<Record<string, unknown>>;
  deal_links: Array<Record<string, unknown>>;
  responsible: UserSummary | null;
  created_by: UserSummary | null;
  totals: Record<string, unknown>;
  items: Array<Record<string, unknown>>;
  partners?: Array<Record<string, unknown>>;
  [key: string]: unknown;
}

interface ContractCreatedPayload {
  contract: ContractSnapshot;
}

interface ContractCanceledPayload {
  contract: ContractSnapshot;
  canceled_at: ISODateString | null;
  cancellation_reason: string | null;
}

interface ContractRenewedPayload {
  contract: ContractSnapshot;
  renewed_from_contract: {
    id: UUID;
    code: number;
  };
}

interface ContractCompletedPayload {
  contract: ContractSnapshot;
  completed_at: ISODateString | null;
}
```

## Satisfação

| Evento | Quando dispara | Payload enviado |
| - | - | - |
| `satisfaction.public_submission_created` | Quando um formulário de satisfação é respondido por link público. | `SatisfactionPublicSubmissionCreatedPayload` |

```ts theme={null}
interface SatisfactionPublicSubmissionCreatedPayload {
  submission: SatisfactionSubmissionSnapshot;
  link: {
    id: UUID;
    token: string;
    form_id: UUID;
    created_by: UUID | null;
    crm_person_id: UUID;
    crm_deal_id: UUID | null;
    crm_delivery_id: UUID | null;
  };
}

interface SatisfactionSubmissionSnapshot {
  id: UUID;
  form_id: UUID;
  company_id: UUID;
  crm_person_id: UUID;
  crm_deal_id: UUID | null;
  crm_delivery_id: UUID | null;
  submitted_by: UUID | null;
  average_score: number | null;
  created_at: ISODateString;
  responses: Array<Record<string, unknown>>;
  person: Record<string, unknown> | null;
  deal: Record<string, unknown> | null;
  delivery: Record<string, unknown> | null;
  user: UserSummary | null;
  post_submit?: Record<string, unknown> | null;
  [key: string]: unknown;
}
```

## Tipos compartilhados

```ts theme={null}
interface OpportunityValuation {
  mode: 'CURRENT' | 'PROJECTED_CONTRACT_TOTAL';
  source: string;
  current_value: number | null;
  projected_value: number | null;
  display_value: number | null;
  has_recurring_value: boolean;
  has_indefinite_recurring_value: boolean;
  has_rolling_projection: boolean;
  indefinite_horizon_months: 6 | 12 | 18 | 24;
  calculation_version: number | null;
}

interface FollowerSummary {
  role: { id: UUID; name: string | null } | null;
  user: UserSummary | null;
  notes: string | null;
}

interface UserSummary {
  id: UUID;
  name: string | null;
  avatar?: string | null;
}

interface ActorSummary {
  id: UUID;
  name: string | null;
}

interface StageSummary {
  id: UUID;
  name: string | null;
  pipeline: {
    id: UUID;
    name: string | null;
  } | null;
}

interface TagSummary {
  id: UUID;
  name: string | null;
  // Ausente em removed_tags; pode ser null em added_tags e nas tags de tarefas.
  color?: {
    background: string | null;
    foreground: string | null;
  } | null;
}

// Campos de múltipla seleção geram uma entrada por opção escolhida.
interface CustomFieldChange {
  custom_field_id?: UUID | null;
  value?: string | null;
  crm_custom_field_option_id?: UUID | null;
  field_name?: string | null;
  field_type?: number | null;
  [key: string]: unknown;
}

interface RemovedCustomField {
  id: UUID;
  name: string | null;
  type: number | null;
}

interface LossReasonSummary {
  id: UUID;
  name: string;
}

interface GainReasonSummary {
  id: UUID;
  name: string;
}

interface WhatsappChatSummary {
  chat_id: UUID;
  status: string;
  chat_type: string;
  wa_contact_id: string;
  remote_profile_name: string | null;
  last_customer_msg_at: ISODateString | null;
  session_expires_at: ISODateString | null;
  unread_count: number;
  priority: number;
  current_queue_id: UUID | null;
  created_at: ISODateString;
  updated_at: ISODateString;
  archived_at: ISODateString | null;
  phone_number: {
    id: UUID;
    phone_number_id: string;
    display_number: string;
    raw_number: string;
    verified_name: string | null;
    department_name: string;
  };
  person: { id: UUID; name: string };
  assigned_agent: WhatsappChatAgent | null;
  participants: Array<{ added_at: ISODateString; agent: WhatsappChatAgent }>;
}

interface WhatsappChatAgent {
  id: UUID;
  status: string;
  user: {
    id: UUID;
    name: string;
    email: string;
    avatar: string | null;
  };
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.