Cookies — referência completa
Esta página lista todos os cookies que a plataforma escreve ou lê, com TTL, escopo, conteúdo e quem é responsável por cada um. É a página de referência mais consultada do time de marketing.
Categorias
Os cookies são agrupados em 4 categorias do banner LGPD (detalhes em Consent).
:::info A divulgação ao usuário é o array COOKIE_TABLE
A tabela que o usuário vê no painel "Personalizar" é gerada de COOKIE_TABLE em
app/utils/consent.ts — 18 entradas hoje. É essa a divulgação LGPD/GDPR de fato. A tabela
abaixo reproduz o array; se divergirem, o array vence e a divergência é problema de divulgação,
não de doc.
:::
| Categoria | Pode desligar? | Cookies divulgados no painel |
|---|---|---|
| Necessários | Não | cookies_consent, jwt_token, __cf_bm, _cfuvid |
| Performance | Sim | _ga, _ga_*, _gid, _clck, _clsk |
| Funcionalidade | Sim | cookie_app_mode, current_lang, topbar_closed |
| Outros / marketing | Sim | cookie_tracking, cookie_referrer, _fbp, ns-kwai-click-id, AMP_*, __smartico_ls_* |
:::warning Cookies que a plataforma escreve e o painel não divulga
<rmkCookie> / <rmkCookie>_aud (remarketing, ex: rmk7k/rmk7k_aud) e lastclick (Clever)
são escritos pela plataforma mas não constam no COOKIE_TABLE. No sentido inverso, AMP_*
(Amplitude) é divulgado sem que se tenha localizado integração Amplitude no front-web-base.
Os dois casos exigem decisão do responsável por LGPD e correção em código (o array), não aqui. :::
Cookies de tracking / atribuição
cookie_tracking
| Atributo | Valor |
|---|---|
| Tipo | JSON |
| TTL default | 30 dias (TRACKING_COOKIE_DEFAULT_MAX_AGE = 30 * 24 * 60 * 60) — configurável por brand via trackingCookieTtlHours |
Path | / |
SameSite | None em HTTPS, Lax em HTTP dev |
Secure | sim em HTTPS |
HttpOnly | não (client precisa ler pra montar payload) |
| Categoria LGPD | Outros / marketing |
| Quem escreve | Server (root loader) + client (TrackingCapture) |
Conteúdo:
{
"utm_source": "facebook",
"utm_campaign": "black-friday",
"utm_content": "banner-v3",
"utm_medium": "cpc",
"utm_oferta": "first-deposit-100pct",
"src": "fb_ads",
"app_source": "web",
"affiliation_code": "AFIL1",
"subid": "rt_subid_42",
"gclid": "Cj0KCQjw...",
"fbclid": "IwAR3...",
"media_source": "google",
"media_clid": "Cj0KCQjw..."
}
Cap de 20 chaves (proteção contra URL stuffing). Todos os clicked-IDs presentes são preservados; UTMs custom (utm_oferta, etc) são descartados primeiro quando atinge cap.
Cookies legacy paralelos: o front também escreve src, utm_source, utm_campaign, utm_content, utm_medium, app_source como cookies individuais (não JSON) pra compatibilidade com validadores de afiliados antigos e scripts legados. Mesmo TTL e SameSite.
Detalhes em UTMs.
cookie_referrer
| Atributo | Valor |
|---|---|
| Tipo | JSON |
| TTL | 30 dias |
Path | / |
SameSite | Lax |
HttpOnly | não |
| Categoria LGPD | Outros / marketing |
| Quem escreve | Client (TrackingCapture, primeira navegação) |
Conteúdo:
{
"referrer": "https://google.com/search?q=cassino+online",
"hostname": "google.com",
"cinfoId": "abc123",
"cinfoIdRef": "def456"
}
referrer/hostname: capturados dedocument.referrerna primeira navegação do tab. Não atualiza em SPA navs (não faria sentido — referrer interno).cinfoId/cinfoIdRef: ecoados dos response headersX-INFOS-ID/X-INFOS-REFque o BFF envia após login/register.
Lido pelo @cactus-agents/api-client em toda request pra preencher headers X-ORIGIN-REFERRER, X-ORIGIN-HOSTNAME, X-ORIGIN-CINFO-ID, X-ORIGIN-CINFO-ID-REF. Detalhes em Headers.
_ga (Google Analytics)
| Atributo | Valor |
|---|---|
| Tipo | string (formato GA4) |
| TTL | 2 anos (escrito pelo Google) |
Path | / |
SameSite | (definido pelo Google) |
| Categoria LGPD | Performance |
| Quem escreve | GA4 SDK (carregado via GTM) |
Conteúdo: GA1.1.1234567890.0987654321 (formato GA<version>.<part>.<client_id>.<creation_ts>).
O front lê o valor raw (sem split) e envia como ga_client_id nos payloads de signup e deposit. Importante: paridade legado é raw — split em client_id.timestamp (como uma iteração antiga fez) produz payload que o BFF não valida.
<rmkCookie> — remarketing (nome varia por brand)
O nome não é fixo: cada brand declara o seu em
overrides/<brand>/app/config/features/remarketing.ts. Nos exemplos abaixo usamos o do
7k-bet-br (rmk7k, domínio .7k.bet.br).
| Atributo | Valor |
|---|---|
| Tipo | JSON |
| TTL | 365 dias (sliding — renova a cada visita) |
Path | / |
Domain | cookieDomain da brand, ex. .7k.bet.br (cross-subdomain) |
SameSite | None em HTTPS |
Secure | sim |
HttpOnly | não (CAPI / pixel client-side leem) |
| Categoria LGPD | Outros / marketing (não consta no COOKIE_TABLE — ver aviso no topo) |
| Quem escreve | Server (root loader, primeira visita) + client (sliding refresh) |
| Brands ativas | todas as 13 do base, cada uma com cookieName próprio |
Conteúdo:
{
"id": "8f2c1a4b-3d3e-4b6c-9c1f-2d6c1f2d6c1f",
"ts": 1731000000000,
"src": "google"
}
id: UUID v4 first-party. Estável por 365 dias, renovado a cada visita.ts: timestamp de criação (epoch ms). Útil pra cohort analysis.src: snapshot doutm_sourceou referrer no momento da criação. Nunca sobrescrito.
Usado como external_id em CAPI / Enhanced Conversions / TikTok Events API. Detalhes em Remarketing.
Nome e domínio por brand:
| Brand | Cookie name | Cookie domain |
|---|---|---|
7k-bet-br | rmk7k | .7k.bet.br |
betpontobet-bet-br | rmkbpb | .betpontobet.bet.br |
casateste-com | rmkcasateste | .casateste.com |
cl-bet7k-com | rmkcl7k | .cl.bet7k.com |
donald-bet-br | rmkdnb | .donald.bet.br |
fi-7k-bet | rmkfi7k | .fi.7k.bet |
ng-7k-bet | rmkng7k | .ng.7k.bet |
pb-bet | rmkpb | .pb.bet |
ph-state77-com | rmkphst77 | .ph.state77.com |
pt-state77-com | rmkptst77 | .pt.state77.com |
rj-bet | rmkrj | .rj.bet |
state77-com | rmkst77 | .state77.com |
x2b-bet | rmkx2b | .x2b.bet |
Fonte viva:
grep -rn "cookieName\|cookieDomain" overrides/*/app/config/features/remarketing.ts.
:::warning Brand-neutral
Nunca usar cactus ou bluetec no cookie name (vaza plataforma white-label). Nomes com a
marca do cliente estão OK — o usuário final vê a brand mesmo. A regra é executada em runtime:
FORBIDDEN_PLATFORM_NAMES = /cactus|bluetec/i (app/utils/remarketing-id.ts) rejeita o nome e
desativa o flag.
:::
<rmkCookie>_aud — audience tags
Cookie irmão, sufixo _aud (ex: rmk7k → rmk7k_aud).
| Atributo | Valor |
|---|---|
| Tipo | JSON |
| TTL | 90 dias (sliding) |
| Demais atributos | iguais ao <rmkCookie> |
Conteúdo:
{
"tags": {
"viewed_casino": 1731000200000,
"viewed_sports": 1731000400000,
"clicked_register": 1731000600000,
"ftd_completed": 1731002000000
},
"updated": 1731002000000
}
Tags de funil são set-once (re-tagging não atualiza o timestamp, evita churn do cookie). Cap de
MAX_AUDIENCE_TAGS = 40; quando estoura, a eviction é puramente por idade — as tags de
timestamp mais antigo saem primeiro. Não existe prioridade canônica protegendo tags de funil
(é justamente por isso que persistir tag por jogo individual é anti-pattern: o volume expulsaria
ftd_completed).
Detalhes completos em Remarketing.
lastclick (Clever Advertising)
| Atributo | Valor |
|---|---|
| Tipo | string (raw) |
| TTL | 30 dias |
Path | / |
SameSite | None (obrigatório — Clever cross-site) |
Secure | sim |
HttpOnly | não |
| Categoria LGPD | Outros / marketing (não consta no COOKIE_TABLE — ver aviso no topo) |
| Quem escreve | Server (rota /clever) |
| Brands ativas | affiliateClever: true → 7k-bet-br, cl-bet7k-com, fi-7k-bet, ng-7k-bet |
Conteúdo: affiliate-id-clever-raw — string opaca (sem sanitização — Clever pode usar formato qualquer).
Detalhes em Affiliate.
Cookies de pixels (escritos por scripts third-party)
Esses cookies são escritos pelos próprios scripts de pixels (não pelo front). Listados aqui pra referência:
Meta (Facebook Pixel)
| Cookie | Conteúdo | TTL |
|---|---|---|
_fbp | Browser ID gerado pelo Pixel | 90 dias |
_fbc | Click ID (vem de fbclid na URL) | 7 dias após primeiro clique |
Categoria: outros / marketing. Lidos pelo Pixel pra reconciliar conversões.
TikTok
| Cookie | Conteúdo | TTL |
|---|---|---|
_ttp | TikTok Pixel ID | 13 meses |
Kwai
O cookie que aparece na divulgação LGPD é ns-kwai-click-id — é esse o nome que o
COOKIE_TABLE declara, não _kwaiq_*. Guarda o click ID do Kwai. Categoria: outros / marketing.
Microsoft Clarity
| Cookie | Conteúdo | Categoria |
|---|---|---|
_clck | Clarity user ID | Performance |
_clsk | Clarity session ID | Performance |
Ambos divulgados no painel, mesmo com nenhuma brand tendo clarityId configurado hoje.
Smartico
__smartico_ls_* — chaves backed em localStorage, divulgadas como categoria outros / marketing.
(Note o duplo underscore no prefixo; _smartico_* não é o nome divulgado.)
Google Analytics auxiliares
_gid (1 dia), _gat (1 minuto), _gcl_au (90 dias) — escritos pelo Google, categoria
performance. Desses, só _gid está no COOKIE_TABLE; _ga_* (por container GA4) também está.
Cookies de auth + segurança
jwt_token
| Atributo | Valor |
|---|---|
| Tipo | JWT (string opaca) |
| TTL | sessão (sliding) |
Path | / |
SameSite | Lax |
Secure | sim |
HttpOnly | sim |
| Categoria LGPD | Necessários |
| Quem escreve | BFF (após login bem-sucedido) |
HttpOnly = client não consegue ler — só o server lê via Cookie header. Nunca disponível no document.cookie.
cookies_consent
| Atributo | Valor |
|---|---|
| Tipo | JSON |
| TTL | 365 dias (CONSENT_COOKIE_MAX_AGE = 365 * 24 * 60 * 60) |
Path | / |
SameSite | Lax |
HttpOnly | não (banner client-side lê pra decidir se renderiza) |
| Nome legado migrado | cactusCookiesConsent — lido e deletado numa passada, nunca escrito (ver padrão de rename) |
| Categoria LGPD | Necessários (irônico — o cookie de consent é um cookie necessário) |
| Quem escreve | Banner (CookieConsentBanner) |
Conteúdo:
{
"necessary": true,
"performance": true,
"functionality": false,
"others": true,
"timestamp": 1731000000000
}
Detalhes em Consent LGPD.
__cf_bm, _cfuvid (Cloudflare)
Cookies escritos pela Cloudflare (proteção bot + visitor identifier). Necessários pra plataforma rodar. TTL ~30 minutos. Categoria: necessários.
Cookies de funcionalidade
Os três que o painel LGPD divulga na categoria Funcionalidade:
| Nome | Onde vive | Pra que serve |
|---|---|---|
cookie_app_mode | sessionStorage | Persiste o app mode detectado por ?app=true / ?is_twa=true através das navegações SPA. Ver App Mode |
current_lang | cookie | Idioma escolhido |
topbar_closed | cookie | Se o usuário fechou a topbar promocional |
Storage de PWA / app
Estes não são cookies tradicionais — vivem em sessionStorage, apesar do prefixo cookie_
herdado do legado:
cookie_appsflyer_id
AppsFlyer ID do device quando o user está em modo TWA. Ver App Mode.
cookie_advertising_id
Advertising ID do device (Google AAID), passado pelo bridge TWA. Modo app only.
cookie_app_version
Versão do APK ativo. É a fonte do gating por versão (postMessageMinVersion do AppsFlyer).
c_documentReferrer / c_documentReferrerLocal
Referrer da sessão atual (sessionStorage) e referrer first-touch histórico (localStorage).
Tabela-resumo
| Cookie | TTL | Categoria | HttpOnly | Pra que serve |
|---|---|---|---|---|
cookie_tracking | 30d (default; config por brand) | Marketing | Não | UTMs + clicked-IDs + affiliate |
cookie_referrer | 30d | Marketing | Não | Referrer first-touch + cinfo IDs |
_ga | 2 anos | Performance | Não | GA client ID |
<rmkCookie> (ex: rmk7k) | 365d sliding | Marketing | Não | Remarketing UUID first-party |
<rmkCookie>_aud | 90d sliding | Marketing | Não | Audience tags do funil |
lastclick | 30d | Marketing | Não | Clever Advertising affiliate |
_fbp | 90d | Marketing | Não | Facebook Pixel browser ID |
_fbc | 7d | Marketing | Não | Facebook Pixel click ID |
ns-kwai-click-id | (Kwai) | Marketing | Não | Click ID do Kwai |
_clck / _clsk | (Clarity) | Performance | Não | User / session ID do Clarity |
jwt_token | sessão | Necessários | Sim | Auth |
cookies_consent | 365d | Necessários | Não | Preferências LGPD |
current_lang | — | Funcionalidade | Não | Idioma |
topbar_closed | — | Funcionalidade | Não | Topbar dispensada |
__cf_bm | 30min | Necessários | Sim | Cloudflare bot mgmt |
_cfuvid | sessão | Necessários | Sim | Cloudflare visitor |
Como inspecionar
DevTools → Application → Cookies → selecione o domínio.
Filtrar por nome no campo de search da tabela. Pra inspecionar o JSON do cookie_tracking ou do cookie de remarketing, clica na linha e o painel inferior mostra "Cookie Value" com botão "Show URL-decoded" pra ver o JSON formatado.
Renomear cookie em produção — o padrão canônico
Renomear um cookie que já existe no browser de usuários reais exige migração one-shot na leitura. O único exemplo implementado na plataforma é o do consent, e vale como referência:
// app/utils/consent.ts
const LEGACY_CONSENT_COOKIE_NAMES = ["cactusCookiesConsent"] as const;
// dentro de getConsentPreferences():
if (!raw) {
for (const legacyName of LEGACY_CONSENT_COOKIE_NAMES) {
const legacy = getClientCookie(legacyName);
if (legacy) {
raw = legacy; // adota o valor
setClientCookie(legacyName, "", 0); // deleta o legado (best-effort)
break;
}
}
}
O detalhe que faz o padrão funcionar: o nome legado é lido e deletado, nunca escrito. Não
existe caminho no código que volte a criar cactusCookiesConsent. É o que permite satisfazer
simultaneamente duas coisas que parecem conflitantes:
- neutralidade de marca — o termo da plataforma não pode existir em cookie observável pelo cliente final; e
- continuidade — quem já decidiu sobre cookies não é perguntado de novo.
Ao renomear qualquer outro cookie, replique exatamente essa forma: constante com a lista de nomes legados, leitura com adoção, delete imediato, nenhuma escrita no nome antigo.
Anti-patterns
- Tornar
cookie_trackingHttpOnly. Quebra o submit de signup/deposit (client precisa ler). - Mudar
SameSitedolastclickpraLax. Quebra Clever cross-site. - Setar TTL absurdamente alto (
trackingCookieTtlHours: 99999). Marketing perde controle da janela de atribuição. - Renomear cookie em produção sem migração one-shot. Usuários existentes perdem o state e o cookie antigo fica órfão no browser. Use o padrão da seção acima.
- Escrever o cookie legado "só pra garantir". Anula a migração — o nome antigo volta a existir no browser. Ler-e-deletar, nunca escrever.
- Usar
cactusoubluetecem cookie name. Vaza plataforma white-label. O front rejeita em runtime (nomes de remarketing), mas não conte com isso — evite na config. - Assumir que o
COOKIE_TABLEcobre tudo que a plataforma escreve. Não cobre — ver o aviso no topo desta página.