Consultar a origem

Canal, campanha, página, cidade e cliques de anúncio de um paciente, pelo telefone ou e-mail.

Quando o paciente chama no atendimento, o seu sistema pode perguntar ao Clube do Lab de onde ele veio: o anúncio, a campanha, a página que ele estava vendo e a cidade. O atendente vê a origem antes mesmo de existir orçamento.

A mesma informação também volta sozinha na resposta de cada envio de orçamento, sem chamada extra.

Endpoint#

HTTP
POST /v1/integrations/attribution/lookup
JSON
{
  "phone": "+55 47 99999-0000",
  "email": "[email protected]",
  "contactExternalId": "pac_88",
  "at": "2026-10-07T13:00:00-03:00"
}
CampoObrigatórioRegra
phoneum dos trêsQualquer formato, com ou sem +55, máscara ou nono dígito.
emailum dos trêsE-mail do paciente.
contactExternalIdum dos trêsId do paciente no seu sistema (o mesmo dos orçamentos).
atnãoISO 8601 com fuso. Padrão: agora.

A consulta é POST, e não GET, para que telefone e e-mail não vão para a URL, que fica registrada em log de proxy.

Como escolhemos o lead#

A resposta é o último toque até at: o lead mais recente da pessoa criado até aquele momento (com 1 hora de folga), nos últimos 180 dias. É a mesma regra que liga um orçamento à origem, então consulta e orçamento sempre apontam para o mesmo lead.

Resposta#

JSON
{
  "found": true,
  "matchedBy": "phone",
  "attribution": {
    "leadId": "66f1c0ffee",
    "capturedAt": "2026-10-01T13:00:00.000Z",
    "channel": { "key": "meta-ads", "label": "Meta Ads", "paid": true },
    "sourceType": "form",
    "utm": {
      "source": "instagram",
      "medium": "cpc",
      "campaign": "checkup-outubro",
      "term": null,
      "content": null
    },
    "page": { "title": "Check-up completo", "path": "/check-up", "site": null },
    "city": "Joinville",
    "state": "SC",
    "click": { "gclid": "Cj0K…", "fbclid": "IwAR…", "fbc": "fb.1.1696…", "fbp": "fb.1.1696…" }
  }
}

Sem lead da pessoa: { "found": false }.

CampoO que é
matchedByComo achamos: phone, email, contact (orçamentos anteriores do mesmo paciente) ou created (lead criado pela própria integração).
capturedAtQuando o lead chegou ao Clube do Lab.
channelkey é o canal normalizado (meta-ads, meta, google-ads, google, organico, whatsapp, email, bio, direct, integracao, manual ou o domínio de origem). label é o nome para exibir. paid indica anúncio.
sourceTypeComo chegou: form (formulário), whatsapp (clique no WhatsApp) ou phone.
utmParâmetros da campanha. null quando ausentes.
pagePágina onde converteu: título, caminho e, quando a captura foi no site do laboratório, o domínio.
city, stateCidade e UF estimadas pelo acesso.
clickIdentificadores de clique de anúncio, só os presentes. Sem nenhum, o bloco não vem.

O que não sai: o texto que o paciente escreveu no formulário e dados técnicos internos. Nome, telefone e e-mail também não, porque quem consulta já tem.

Dados de clique#

click traz os identificadores do clique no anúncio (gclid do Google, fbclid, fbc e fbp da Meta), para o seu sistema exibir ou guardar junto do paciente.

Atenção

Não envie a venda para as plataformas de anúncio. O Clube do Lab já faz isso: quando o orçamento chega como ganho, a venda e o valor vão para o pixel do laboratório (Meta Conversions API, quando o laboratório ativa). Se o seu sistema também enviar, a mesma venda conta em dobro e a campanha otimiza errado.

Exemplos#

curl -X POST "https://api-dev.clubelab.com/v1/integrations/attribution/lookup" \
  -H "Authorization: Bearer $CLAB_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "phone": "47999990000" }'

Erros e limite#

HTTPQuando
400identifier_required (nenhum dos três campos), ou campo inválido (at_invalid, phone_too_long…).
401Chave ausente, inválida, revogada ou expirada.
429Mais de 120 consultas por minuto por integração. Esse limite é separado do envio de orçamentos. Espere o Retry-After e tente de novo.