Visão geral

O CodexFlow coleta eventos dos seus sites (pelo Codex Pixel ou pelo plugin WordPress), transforma envios de formulário e conversas de WhatsApp em leads com origem e campanha, monitora a saúde dos sites e entrega tudo em painéis, relatórios, webhooks e uma API REST.

Base da API: https://flow.codexup.com.br/api/v1 · respostas em JSON (snake_case) no formato { data, meta }.

Autenticação

Gere uma chave em Configurações › API / Webhooks. A chave completa aparece uma única vez — armazenamos apenas o hash.

curl https://flow.codexup.com.br/api/v1/sites \
  -H "Authorization: Bearer sk_cf_live_xxxxxxxxxxxxxxxx"
  • sk_cf_live_… — produção (plano Pro).
  • sk_cf_test_… — acessa somente leads de teste em /leads e /leads/:id. Não lê nem altera leads reais e não acessa sites, formulários, eventos ou relatórios. Não dispara integrações.
  • A organização é sempre derivada da chave; nunca envie organization_id.

Codex Pixel

Script universal, assíncrono e com menos de 30 KB. Cole antes de </head>:

<script async defer src="https://flow.codexup.com.br/pixel.js" data-site-id="site_xxxxx"></script>

Eventos automáticos: page_view (inclusive SPAs), whatsapp_click, phone_click, email_click, form_view, form_start, form_submit, form_error e web_vitals (TTFB, FCP, LCP, CLS, INP). UTMs, gclid e fbclid são guardados como first-touch e last-touch. Nova sessão após 30 min de inatividade.

Um evento de submit do navegador registra apenas form_attempt. A conversão form_submit exige confirmação de sucesso: Contact Form 7 e Elementor são detectados pelos eventos de sucesso; formulários próprios devem chamar CodexFlow.formSuccess(formElement) após a resposta positiva do servidor. Nunca chame essa função antes da validação.

A recusa explícita de analytics interrompe a coleta mesmo sem exigir consentimento na configuração. Tags Google Ads e Meta só disparam com analytics: true e marketing: true. A revogação descarta eventos pendentes e remove a identidade local.

// Inicialização manual (React, Next.js, apps)
CodexFlow.init({ siteId: "site_xxxxx" });

// Evento personalizado
CodexFlow.track("custom_event", { value: 123 });

// Lead de um formulário próprio (sem <form>)
CodexFlow.track("lead_created", { name: "Ana", email: "ana@email.com", phone: "11999990000", service: "Orçamento" });

// Consentimento (LGPD) — com data-require-consent="true" o pixel só rastreia após isto
CodexFlow.consent({ analytics: true, marketing: false });

Atributos opcionais: data-require-consent="true", data-forms="false" (não capturar formulários), data-debug. Em elementos: data-cf-event="nome", data-cf-button="Rótulo", data-cf-form / data-cf-name em formulários.

A captura automática filtra campos sensíveis e ocultos. Em eventos personalizados, envie somente os campos necessários e autorizados.

Tracking API

POST/api/v1/trackum evento
POST/api/v1/track/batchaté 50 eventos (recomendado)

Usada pelo pixel (CORS liberado, origem validada pelo domínio do site). Aceita text/plain para funcionar com navigator.sendBeacon.

POST https://flow.codexup.com.br/api/v1/track
{
  "siteId": "site_x",
  "anonymousId": "visitor_x",
  "sessionId": "session_x",
  "event": "whatsapp_click",
  "url": "https://site.com/orcamento",
  "referrer": "https://google.com",
  "utm": { "source": "google", "medium": "cpc", "campaign": "orcamento" },
  "properties": { "button": "Header CTA" }
}

Limites: 100 req/min por visitante e 1.000 req/min por site.

Sites

GET/sites
POST/sites{ name, url, platform, whatsapp_number } → retorna tracking_key uma vez
GET/sites/:id
PATCH/sites/:id{ name, url, platform, status: ACTIVE|PAUSED }
DELETE/sites/:id

Leads

GET/leads?status=&source=&site_id=&q=&created_after=&page=&per_page=
POST/leadsdeduplica por e-mail/telefone (30 dias)
GET/leads/:idinclui atividades
PATCH/leads/:idstatus, value, lost_reason, dados
DELETE/leads/:idexclusão definitiva (LGPD)
curl -X POST https://flow.codexup.com.br/api/v1/leads \
  -H "Authorization: Bearer sk_cf_live_..." -H "Content-Type: application/json" \
  -d '{"name":"Ana Lima","phone":"11999990000","email":"ana@email.com","service_interest":"Orçamento","source":"google_ads","campaign":"black-friday"}'

Status: NEW, IN_PROGRESS, QUALIFIED, PROPOSAL_SENT, WON, LOST. Temperatura calculada pelo score (0–39 frio, 40–69 morno, 70–100 quente).

Formulários

GET/forms?site_id=
POST/forms{ site_id, name, external_id, page_url, type, provider }
GET/forms/:idcampos, último teste e envios recentes

Eventos server-side

POST/events
POST/events/batch{ events: [...] } — até 100

Mesmo formato da Tracking API, autenticado por chave. anonymousId e sessionId são opcionais. Útil para backends, checkouts e CRMs (ex.: evento purchase com { value }).

Relatórios

GET/reports/overviewKPIs, comparação e série diária
GET/reports/sourcescanais de aquisição
GET/reports/pagespáginas que mais convertem
GET/reports/funnelvisitantes → cliques → leads → oportunidades → fechados

Parâmetros: from e to (YYYY-MM-DD) ou period (7d, 30d, 90d, month…), site_id, source, campaign, device.

Webhooks

Configure em Configurações › API / Webhooks. Eventos disponíveis:

lead.createdlead.updatedlead.wonform.submittedform.failedsite.offlinesite.onlinealert.created

Cada entrega é um POST JSON com os cabeçalhos X-CodexFlow-Event, X-CodexFlow-Delivery e X-CodexFlow-Signature: t=…,v1=…. Retentativas automáticas em 1 min, 5 min, 30 min, 2 h e 6 h; após 3 falhas seguidas é criado um alerta.

// Node.js — validação da assinatura
import crypto from "node:crypto";

function isValid(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false; // anti-replay
  const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

Plugin WordPress (CodexFlow Connector)

Baixe em Sites › Instalação. Ao conectar, o plugin instala o pixel, detecta formulários e captura envios no servidor (Elementor, Contact Form 7, Gravity Forms, WPForms, Fluent Forms e Forminator).

O plugin expõe endpoints locais assinados com a chave do site (HMAC-SHA256 de timestamp.corpo, janela de 5 minutos), usados para verificar disponibilidade e configuração. O endpoint de teste não submete formulários e não confirma criação de lead ou entrega de e-mail:

POST/wp-json/codexflow/v1/status
POST/wp-json/codexflow/v1/forms
POST/wp-json/codexflow/v1/test
POST/wp-json/codexflow/v1/version

Limites e erros

PlanoRequisições/minAPI pública
Free60somente chaves test
Freelancer300somente chaves test
Agency1.000somente chaves test
Pro3.000chaves live e test

Cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset em todas as respostas. Erros seguem { error: { code, message } }: 401 UNAUTHORIZED, 402 PLAN_LIMIT, 403 FORBIDDEN, 404 NOT_FOUND, 422 VALIDATION_ERROR, 429 RATE_LIMITED.