Base URL: https://gxqylnwroumylzflborc.supabase.co/functions/v1
Autenticação: header x-api-key: SUA_CHAVE (uma chave por workspace — fornecida pelo PandaChat).
Formato: JSON. Toda resposta é escopada ao workspace dono da chave.
O PandaChat usa um funil fixo de 8 estágios (Kanban de atendimento). Todos os workspaces usam os mesmos estágios; o lead caminha por eles:
| # | id (slug) | Nome | Significado |
|---|---|---|---|
| 1 | novo_lead | Novo lead | Chamou no WhatsApp, ainda não qualificado |
| 2 | em_atendimento | Em atendimento | IA/atendente conversando |
| 3 | pediu_preco | Pediu preço | Chegou na parte de valor/oferta |
| 4 | parou_apos_preco | Parou após preço | Recebeu o valor e parou de responder |
| 5 | interesse_alto | Interesse alto | Perguntou detalhes importantes |
| 6 | dados_incompletos | Dados incompletos | Começou a passar dados, falta algo |
| 7 | aguardando_confirmacao | Aguardando confirmação | Passou os dados, não confirmou |
| 8 | pedido_agendado | Pedido agendado | Pedido confirmado/agendado (conversão) |
Para tracking de conversão, o estágio-chave costuma ser pedido_agendado.
Retorna o funil com os 8 estágios e a contagem de leads em cada um.
curl -s "https://gxqylnwroumylzflborc.supabase.co/functions/v1/partner-crm-api?resource=pipelines" \
-H "x-api-key: SUA_CHAVE"
{
"workspace_id": "uuid",
"pipelines": [{
"id": "default", "name": "Funil de Atendimento",
"stages": [
{ "id": "novo_lead", "name": "Novo lead", "order": 1, "color": "#3b82f6", "leads_count": 12 },
{ "id": "pedido_agendado", "name": "Pedido agendado", "order": 8, "color": "#22c55e", "leads_count": 3 }
]
}]
}
Só a definição dos 8 estágios (sem contagem). Útil pra montar a UI de configuração.
Lista os leads com o estágio atual + atribuição da Meta + UTMs (quando houver).
Filtros: stage=pedido_agendado · updated_since=2026-08-24T00:00:00Z (ideal p/ polling incremental) · limit=100 (máx 500) · offset=0
{
"workspace_id": "uuid", "count": 1, "limit": 50, "offset": 0,
"leads": [{
"id": "uuid", "phone": "5527999999999", "name": "Maria Silva",
"product_name": "Kit Beleza", "stage": "pedido_agendado", "stage_name": "Pedido agendado",
"deal_value": 149.9, "source": "whatsapp",
"created_at": "...", "updated_at": "...", "last_interaction_at": "...",
"attribution": {
"ctwa_clid": "ARAbc...", "meta_campaign_id": "1202...", "meta_adset_id": "1202...",
"meta_ad_id": "1202...", "source_url": "https://fb.me/...", "ad_headline": "Compre agora",
"ad_body": "...", "basis": "ctwa_clid"
},
"utms": { "utm_source": "facebook", "utm_medium": "cpc", "utm_campaign": "camp-x", "utm_content": "cria-1", "utm_term": null }
}]
}
O PandaChat envia um POST para a URL que você configurar, toda vez que um lead entra num novo estágio. Sem polling.
lead.stage_changedPOST (Content-Type: application/json)
{
"event": "lead.stage_changed",
"sent_at": "2026-08-24T01:10:05Z",
"workspace_id": "uuid",
"lead": {
"id": "uuid", "phone": "5527999999999", "name": "Maria Silva",
"product_name": "Kit Beleza", "stage": "pedido_agendado", "stage_name": "Pedido agendado",
"deal_value": 149.9, "source": "whatsapp",
"created_at": "...", "updated_at": "...", "last_interaction_at": "..."
},
"attribution": { "ctwa_clid": "ARAbc...", "meta_campaign_id": "1202...", "meta_adset_id": "1202...",
"meta_ad_id": "1202...", "source_url": "...", "ad_headline": "...", "ad_body": "...", "basis": "ctwa_clid" },
"utms": { "utm_source": "facebook", "utm_medium": "cpc", "utm_campaign": "...", "utm_content": "...", "utm_term": null }
}
(lead, estágio) é enviado uma vez. Trate por lead.id + stage.200 OK rápido; o PandaChat considera entregue com HTTP 2xx.O header x-panda-signature é o HMAC-SHA256 (hex) do corpo cru, com o secret combinado:
import crypto from "crypto";
const expected = crypto.createHmac("sha256", SEU_SECRET).update(rawBody).digest("hex");
const ok = expected === req.headers["x-panda-signature"];
É como o PandaChat sabe qual anúncio trouxe o lead (via Click-to-WhatsApp). Para Meta Ads é melhor que UTM, porque liga o anúncio direto à conversa.
| Campo | Descrição |
|---|---|
ctwa_clid | Click id do Click-to-WhatsApp (use no CAPI/atribuição) |
meta_campaign_id · meta_adset_id · meta_ad_id | IDs da campanha/conjunto/anúncio |
source_url · ad_headline · ad_body | O anúncio de origem |
basis | Base da atribuição (ctwa_clid | source_id | utm) |
utm_source/medium/campaign/content/term) são capturadas no checkout/venda, não no lead do WhatsApp. Então utms pode vir null para leads que ainda não compraram por checkout. Para rastrear Meta Ads de leads de WhatsApp, use o bloco attribution (ctwa_clid + IDs) — é o dado nativo e mais confiável.resource=leads&updated_since=... a cada 1–5 min — ou use o webhook e dispense o polling.