/unstable/leads/criar
Method: POST
Essa rota recebe um lead e dispara a notificação via whatsapp para o responsável
O lead é sempre entregue à conta dona do token usado na chamada. O slug do listingId precisa ser o dessa conta — se for de outra, a resposta é 403 e nada é criado. Para enviar leads a outra imobiliária ou corretor, use o token dela.
export interface Lead {
// formato [slug-do-corretor]#[base36Id-do-imóvel]
// null = lead sem imóvel (veja "Lead sem imóvel" abaixo)
listingId: string | null;
origin: LeadOrigin;
name: string | null;
phone: string | null;
whatsapp: string | null;
email: string | null;
message: string | null;
transactionType: TransactionType;
}
type LeadOrigin =
| "ZAP"
| "CHAVES_NA_MAO"
| "CASA_MINEIRA"
| "IMOVEL_WEB"
| "SP_IMOVEL"
| "INDICACAO"
| "SITE"
| "WHATSAPP"
| "PLACA"
| "GOOGLE"
| "META"
| "PARCERIA"
| "OUTROS";
type TransactionType = "SELL" | "RENT";export async function createLead(lead: Lead) {
const headers = new Headers();
headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
const response = await fetch(
`https://www.usenonstop.com/api/unstable/leads/criar`,
{
method: "POST",
headers,
body: JSON.stringify(lead),
},
);
if (response.ok) return (await response.json()) as string;
return null;
}Lead sem imóvel
Nem todo atendimento chega a um anúncio: o cliente pede para falar com uma pessoa, tira uma dúvida geral ou encerra a conversa antes de citar um imóvel. Para esses casos envie listingId: null.
- O campo continua obrigatório. Lead sem imóvel é
listingId: null, explícito. Corpo sem o campolistingIdsegue respondendo400. - Quem recebe é o dono do token, como em toda lead. Sem anúncio não há slug para conferir, só isso muda.
- O restante é igual à lead com imóvel: entra no CRM do responsável, dispara o aviso por WhatsApp e e-mail e o webhook
lead:create— que chega comproperty: null. transactionTypecontinua obrigatório. É ele que decide o funil do CRM em que o cliente entra:SELLno de compradores,RENTno de locatários.- Como não há anúncio para dar contexto ao corretor, aproveite o campo
messagepara resumir o atendimento.
{
"listingId": null,
"origin": "WHATSAPP",
"name": "Maria Souza",
"phone": null,
"whatsapp": "+5511999998888",
"email": null,
"message": "Pediu para falar com um corretor. Procura 3 dormitórios em Pinheiros, até R$ 2 milhões.",
"transactionType": "SELL"
}/unstable/leads/devolver
Method: POST
Rota da IA do atendimento por IA: devolve a lead que a IA recebeu, já atendida. Só aqui a lead chega ao corretor (CRM, WhatsApp e e-mail), sem criar outra lead e sem passar pelo rodízio de novo. Os webhooks de leads não recebem a lead de novo.
Use o token da API da imobiliária que ligou o serviço. Lead de outra imobiliária responde 404, como lead inexistente.
export interface ReturnedLead {
// o `lead.id` que chegou no envio para a IA
leadId: string;
// resumo do atendimento, até 4.000 caracteres. Vira a mensagem da lead,
// com o texto original do portal logo abaixo.
summary: string;
}| Resposta | Quando |
|---|---|
200 {"ok":true} | A lead foi entregue ao corretor. |
200 {"ok":true,"message":"lead já tinha sido entregue ao corretor"} | A devolução foi repetida, ou a lead já tinha ido para o corretor porque a entrega à IA falhou ou o serviço foi desligado. O resumo fica guardado e ninguém é avisado de novo. |
400 | Corpo inválido ou token inválido. |
404 | leadId desconhecido ou de outra imobiliária. |
Como a resposta repetida também é 200, dá para reenviar a devolução com segurança se a sua chamada cair no meio.
export async function returnLead(lead: ReturnedLead) {
const response = await fetch(
`https://www.usenonstop.com/api/unstable/leads/devolver`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${env.NONSTOP_TOKEN}`,
},
body: JSON.stringify(lead),
},
);
return response.ok;
}