Coletor do app (pageviews, etapas do funil e heartbeat)
POST/api/analytics/events
- Auth
- Pubblica
- X-CommunityId
X-CommunityIdInvia l’X-CommunityId della community in cui avviene l’operazione.
**Público**: visitante deslogado também envia. Com `Authorization`, os eventos levam o perfil; no primeiro lote logado de uma sessão, os eventos anônimos dessa mesma sessão (mesma aba) passam a ser desse perfil, marcados `wasAnonymous`.
Lote de 1 a 50 eventos de uma sessão (`sessionId` do `sessionStorage`, 8 a 64 caracteres `[A-Za-z0-9_-]`). `type`: `page_view`, `funnel_step` ou `heartbeat` (a cada 60 s com a aba visível; alimenta só o "online agora" e o "tempo real", não é gravado). `funnelStep` aceito do app: `catalog`, `product`, `checkout_identify`, `checkout_payment` (enviado e pago vêm dos pedidos). Nunca envie dado digitado.
O servidor guarda só a rota (sem query string; segmentos com cara de token ou e-mail são trocados), o host do `referrer`, as UTMs, device/navegador/sistema e o país (derivado do IP, que não é gravado). Robô ruim (UA vazio, `curl`, `python-requests`, headless) e o que passar de 120 eventos/min por sessão (600/min por IP) são descartados e só contados; buscadores e LLMs são contados pelo servidor do app. Responde **202** mesmo quando descarta (`dropped`). Aceita `text/plain` com o JSON no corpo (para `navigator.sendBeacon`, que não manda cabeçalho: aí a comunidade vai em `communityId` no corpo).
Header
| Nome | Tipo | Descrizione |
|---|---|---|
X-CommunityIdfacoltativo | string (uuid) | Comunidade. Sem o cabeçalho (sendBeacon), use `communityId` no corpo. |
Corpo della richiesta application/json
| Nome | Tipo | Descrizione |
|---|---|---|
communityIdfacoltativo | string (uuid) | Só quando não há o cabeçalho X-CommunityId. |
sessionIdobbligatorio | string | |
eventsobbligatorio | object[] | |
events[].typeobbligatorio | page_view | funnel_step | heartbeat | |
events[].pathobbligatorio | string | Rota canônica do app. |
events[].spaceIdfacoltativo | string (uuid) | |
events[].modulefacoltativo | string | |
events[].funnelStepfacoltativo | catalog | product | checkout_identify | checkout_payment | |
events[].productIdfacoltativo | string (uuid) | |
events[].planIdfacoltativo | string (uuid) | |
events[].referrerfacoltativo | string | URL de origem; só o host é guardado. |
events[].utmSourcefacoltativo | string | |
events[].utmMediumfacoltativo | string | |
events[].utmCampaignfacoltativo | string | |
events[].occurredAtfacoltativo | string (date-time) | Ajustado para no máximo 1 h no passado e nunca no futuro. |
Risposte
| Codice | Descrizione |
|---|---|
202 | Lote recebido. |
400 | Requisição inválida — falha de validação. |
404 | Recurso não encontrado. |
Esempio con curl
curl -X POST "https://api.memberfy.net/api/analytics/events" \
-H "X-CommunityId: $COMMUNITY_ID" \
-H "Content-Type: application/json" \
-d '{"sessionId":"k3v9q2m8x1p7z5r4","events":[{}]}'