PandaChat — API de Integração

Documentação técnica para parceiros (tracking de CRM). Duas formas: API de leitura e Webhook de saída.

Início rápido

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.

Conceito: o funil do PandaChat

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)NomeSignificado
1novo_leadNovo leadChamou no WhatsApp, ainda não qualificado
2em_atendimentoEm atendimentoIA/atendente conversando
3pediu_precoPediu preçoChegou na parte de valor/oferta
4parou_apos_precoParou após preçoRecebeu o valor e parou de responder
5interesse_altoInteresse altoPerguntou detalhes importantes
6dados_incompletosDados incompletosComeçou a passar dados, falta algo
7aguardando_confirmacaoAguardando confirmaçãoPassou os dados, não confirmou
8pedido_agendadoPedido agendadoPedido confirmado/agendado (conversão)

Para tracking de conversão, o estágio-chave costuma ser pedido_agendado.

Forma 1 — API de leitura

GET /partner-crm-api?resource=pipelines

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 }
    ]
  }]
}

GET /partner-crm-api?resource=stages

Só a definição dos 8 estágios (sem contagem). Útil pra montar a UI de configuração.

GET /partner-crm-api?resource=leads

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 }
  }]
}

Forma 2 — Webhook de saída (tempo real)

O PandaChat envia um POST para a URL que você configurar, toda vez que um lead entra num novo estágio. Sem polling.

Para ativar: envie ao PandaChat a URL do seu endpoint e (opcional) um secret para assinatura. Cada workspace tem sua config.

Evento: lead.stage_changed

POST  (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 }
}

Verificação de assinatura (se definir um secret)

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"];

Referência de campos

attribution — atribuição da Meta (nível do LEAD)

É 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.

CampoDescrição
ctwa_clidClick id do Click-to-WhatsApp (use no CAPI/atribuição)
meta_campaign_id · meta_adset_id · meta_ad_idIDs da campanha/conjunto/anúncio
source_url · ad_headline · ad_bodyO anúncio de origem
basisBase da atribuição (ctwa_clid | source_id | utm)

utms — UTMs clássicas

No PandaChat as UTMs clássicas (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.

Notas

PandaChat · Documentação de integração para parceiros · v1