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/leadse/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
/api/v1/trackum evento/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
/sites/sites{ name, url, platform, whatsapp_number } → retorna tracking_key uma vez/sites/:id/sites/:id{ name, url, platform, status: ACTIVE|PAUSED }/sites/:idLeads
/leads?status=&source=&site_id=&q=&created_after=&page=&per_page=/leadsdeduplica por e-mail/telefone (30 dias)/leads/:idinclui atividades/leads/:idstatus, value, lost_reason, dados/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
/forms?site_id=/forms{ site_id, name, external_id, page_url, type, provider }/forms/:idcampos, último teste e envios recentesEventos server-side
/events/events/batch{ events: [...] } — até 100Mesmo 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
/reports/overviewKPIs, comparação e série diária/reports/sourcescanais de aquisição/reports/pagespáginas que mais convertem/reports/funnelvisitantes → cliques → leads → oportunidades → fechadosParâ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.createdCada 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:
/wp-json/codexflow/v1/status/wp-json/codexflow/v1/forms/wp-json/codexflow/v1/test/wp-json/codexflow/v1/versionLimites e erros
| Plano | Requisições/min | API pública |
|---|---|---|
| Free | 60 | somente chaves test |
| Freelancer | 300 | somente chaves test |
| Agency | 1.000 | somente chaves test |
| Pro | 3.000 | chaves 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.