Skip to main content

Visão Geral

O webhook de Agendamento é disparado pela Morada.ai sempre que uma visita ou reunião é criada ou atualizada para um deal. Inclui dados completos do agendamento, deal, contato e um resumo da conversa gerado por IA.

Payload

{
  "deal": {
    "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
    "status": "active",
    "stageCode": "visit_scheduled",
    "name": "Maria Oliveira - Residencial Parque Verde",
    "conversationId": "f1e2d3c4-5678-90ab-cdef-1234567890ab",
    "partnerId": "b2c3d4e5-6789-01ab-cdef-2345678901bc"
  },
  "person": {
    "id": "c3d4e5f6-7890-12ab-cdef-3456789012cd",
    "name": "Maria Oliveira",
    "email": "maria@email.com",
    "phone": "5521988888888"
  },
  "product": {
    "id": "d4e5f6a7-8901-23ab-cdef-4567890123de",
    "name": "Residencial Parque Verde"
  },
  "source": {
    "id": "e5f6a7b8-9012-34ab-cdef-5678901234ef",
    "code": "instagram",
    "name": "Instagram Ads"
  },
  "conversationReport": "A lead solicitou visita ao decorado no sábado. Tem interesse em unidades de 3 quartos no andar alto. Informou que trabalha na região e busca proximidade com metrô.",
  "appointmentDate": "17-05-2026 10:00",
  "appointment": {
    "id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
    "dealId": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
    "personId": "c3d4e5f6-7890-12ab-cdef-3456789012cd",
    "propertyId": "2b3c4d5e-6789-01ab-cdef-2345678901bc",
    "scheduledAt": "2026-05-17T13:00:00.000Z",
    "status": "scheduled"
  },
  "metadata": {
    "timestamp": "2026-05-13T18:30:00.000Z",
    "eventType": "appointment"
  }
}

Campos

deal

CampoTipoDescrição
deal.idstringID único do deal
deal.statusstringStatus atual: active, won, lost
deal.stageCodestringCódigo da etapa atual no funil
deal.namestringNome do deal
deal.conversationIdstring | nullID da conversa associada
deal.partnerIdstringID do parceiro

person

CampoTipoDescrição
person.idstringID único do contato
person.namestring | nullNome completo
person.emailstring | nullE-mail
person.phonestring | nullTelefone com DDI (ex: 5521988888888)

product

O campo product só é enviado quando o deal possui um produto/empreendimento associado.
CampoTipoDescrição
product.idstringID do produto/empreendimento
product.namestringNome do produto/empreendimento

source

CampoTipoDescrição
source.idstringID da origem
source.codestringCódigo da origem (ex: whatsapp, instagram, web)
source.namestringNome descritivo da origem

appointment

CampoTipoDescrição
appointment.idstringID único do agendamento
appointment.dealIdstringID do deal associado
appointment.personIdstringID do contato
appointment.propertyIdstring | nullID do imóvel/empreendimento da visita
appointment.scheduledAtstringData/hora agendada (ISO 8601, UTC)
appointment.statusstringStatus: scheduled, completed, cancelled, no_show

Outros campos

CampoTipoDescrição
conversationReportstring | nullResumo da conversa gerado por IA
appointmentDatestring | nullData formatada do agendamento: dd-MM-yyyy HH:mm (horário de Brasília)
metadata.timestampstringData/hora do envio do webhook (ISO 8601)
metadata.eventTypestringSempre "appointment"
O campo appointmentDate é a mesma data de appointment.scheduledAt, mas já convertida para o horário de Brasília e formatada para exibição. Use scheduledAt para cálculos e appointmentDate para exibição.

Exemplo de uso

app.post("/webhook/morada", (req, res) => {
  const { appointment, person, deal, appointmentDate } = req.body;

  console.log(`Agendamento ${appointment.status} para ${person.name}`);
  console.log(`Data: ${appointmentDate}`);
  console.log(`Imóvel: ${appointment.propertyId}`);

  // Criar evento no calendário, notificar corretor, etc.

  res.status(200).json({ received: true });
});

Resposta esperada

Retorne um status HTTP 200 para confirmar o recebimento:
{
  "received": true
}
Se o seu endpoint retornar um status diferente de 2xx ou não responder dentro do timeout, a Morada.ai poderá tentar reenviar o evento. Implemente idempotência para lidar com entregas duplicadas.