Pular para o conteúdo principal
Um lead enviado num Formulário Instantâneo do Meta Lead Ads só é guardado pela Pilot Status quando a Página do Facebook do formulário está vinculada a um dos seus números de WhatsApp. Estes endpoints fazem pela API — e pelo servidor MCP — o que o painel faz com esses vínculos: listar e vincular Páginas, mover uma Página para outro número, desvinculá-la, buscar os leads de novo e configurar cada formulário. Os leads em si são lidos com GET /v1/leads.

Endpoints

pageLinkId é o id do vínculo (linked[].pageLinkId), não o id da Página do Facebook.

Antes de vincular: compartilhamento e posse

Não há etapa de login na Meta. Do lado da Meta, o anunciante:
  1. compartilha a Página com o portfólio empresarial da Pilot Status — o partnerBusinessId que GET /v1/lead-pages devolve — no Meta Business Manager;
  2. dá ao usuário do sistema da Pilot Status as tarefas da Página de que ele precisa. candidates[].missingTasks lista o que ainda falta: MODERATE, MANAGE_LEADS, ou PAGE_ACCESS quando a Página nem foi atribuída ao usuário do sistema. Lista vazia significa pronta; null significa que não foi possível consultar a Meta.
Uma Página só pode ser vinculada quando a empresa dona dela também é dona da WABA de um dos seus números oficiais (Meta Cloud API) — é assim que a Pilot Status sabe que a Página é sua. Sem nenhum número oficial, candidates vem vazio e eligibilityBlocker é NO_OFFICIAL_NUMBER. Os leads, depois, podem ir para qualquer número do workspace, oficial ou não.

Credenciais e permissões

  • Tokens OAuth/MCP precisam de integrations:manage (ADMIN ou OWNER do workspace) em todos os endpoints, leituras incluídas — ANALYST e AGENT são recusados com 403 PERMISSION_DENIED. Uma chave ps_ clássica não tem papel e passa pelo escopo.
  • Escopo: uma chave com escopo de número, ou uma credencial da conta inteira com o header x-whatsapp-number-id, vê e altera só os vínculos daquele número. Uma credencial da conta inteira sem o header vê o workspace todo e indica o número no corpo. Um vínculo num número fora do escopo da credencial responde 403 NUMBER_NOT_IN_GRANT.

GET /v1/lead-pages

subscribedAt: null significa que a Meta não está enviando os leads daquela Página, diga o que disser o resto do vínculo. subscriptionError traz o motivo: META_PERMISSION_MISSING, PAGE_ACCESS_MISSING, META_NOT_FOUND, META_UNAVAILABLE, META_NOT_CONFIRMED, META_ERROR, ou — quando a Página deixou de ser elegível — PAGE_NOT_SHARED, PAGE_BUSINESS_MISMATCH, NO_OFFICIAL_NUMBER. Corrija do lado da Meta e ressincronize o vínculo (abaixo).

POST /v1/lead-pages

  • pageId é o id numérico da Página do Facebook. whatsappNumberId só pode ficar de fora quando a credencial está vinculada a um número. Qualquer outro campo é recusado com 400 UNKNOWN_FIELDS.
  • A posse e as tarefas da Página são conferidas antes de gravar qualquer coisa: 409 PAGE_NOT_ELIGIBLE (com reason quando conhecido; sem ele quando outro workspace já vinculou a Página), 409 PAGE_MISSING_PERMISSION (com missingTasks), 409 PAGE_ALREADY_LINKED (com o pageLinkId existente).
  • Com sucesso (201 { "link": { … } }), a Pilot Status se inscreve nos leads da Página e começa a buscar os leads dos últimos 90 dias em segundo plano. Se a Meta recusar a inscrição, o vínculo é criado mesmo assim e subscriptionError diz o motivo.

PATCH /v1/lead-pages/{pageLinkId}

Move o vínculo para outro número do workspace. O corpo é { "whatsappNumberId": "…" }. Só os leads novos acompanham; os já captados ficam no número em que chegaram. Quando o número novo envia outro tipo de mensagem — número oficial envia templates, não oficial envia texto livre — ou fica em outra WABA, toda mensagem automática dos formulários do vínculo é desligada, e a resposta traz "autoSendDisabled": true. Revise os formulários antes de religar.

DELETE /v1/lead-pages/{pageLinkId}

Desvincular apaga todo lead captado pelo vínculo e exclui as configurações de formulário dele. Não dá para desfazer. A resposta, 200 { "unlinked": true, "pageLinkId": "…", "deletedLeads": 42 }, diz quantos leads foram apagados. Você pode vincular a Página de novo depois, mas os leads apagados não voltam — nem por ressincronização.
A Pilot Status também cancela a inscrição nos leads da Página na Meta. Se a Meta falhar, o desvínculo acontece mesmo assim e nenhum lead novo daquela Página é guardado.

POST /v1/lead-pages/{pageLinkId}/resync

Busca de novo os leads dos últimos 90 dias da Página — leads já guardados não se duplicam — e, quando o vínculo não está inscrito, tenta a inscrição de novo. Não recebe corpo e responde 202:
subscribedAt e subscriptionError só aparecem quando esta chamada tentou a inscrição de novo. A busca em si roda em segundo plano e pode levar minutos.
  • Uma ressincronização por vínculo a cada 10 minutos. Dentro dessa janela a resposta é 429 RESYNC_COOLDOWN com retryAfterSeconds. Se não for possível conferir a espera, a resposta é 503 RESYNC_UNAVAILABLE, nunca uma ressincronização sem limite.
  • A posse é conferida de novo. Uma Página que deixou de ser elegível é marcada no vínculo (subscriptionError) e responde 409 PAGE_NOT_ELIGIBLE com reason.

GET /v1/lead-pages/{pageLinkId}/forms

Os Formulários Instantâneos da Página, lidos ao vivo da Meta, cada um com as questions, as consentCheckboxes e a configuração guardada na Pilot Status (config, ou null quando nunca configurado). A resposta também traz numberIsOfficial e, para um número oficial, os templates aprovados que o número do vínculo pode enviar automaticamente (templates, cada um { id, name, variables }; vazio num número não oficial).
  • consentAvailable: false — as caixas do formulário não puderam ser lidas. A lista é desconhecida, não vazia.
  • formsTruncated: true — a Página tem mais formulários do que a Pilot Status leu.

PUT /v1/lead-pages/{pageLinkId}/forms/{formId}

Cria ou substitui a configuração de um formulário. Envie o objeto inteiro:
Com autoSendEnabled: true, a Pilot Status manda mensagem no WhatsApp para todo lead novo do formulário automaticamente, sem um humano. Uma configuração aceita por este endpoint vai ser executada.
As regras da mensagem só valem quando autoSendEnabled é true, então você pode salvar a caixa de consentimento e um rascunho antes. A resposta é 200 { "config": { … } }.

Erros

As recusas destes endpoints trazem { "error": "<English> | <Português>", "code": "…" }.