Pingamos três plataformas de cam a cada dois minutos. Esta página documenta como agregamos os dados, o que salvamos, o que decidimos não rastrear e como citar o que publicamos.
Escrevo em primeira pessoa porque este pipeline é projeto pessoal, não produto de comitê. Se alguma decisão parece estranha, tem razão, e eu explico. Quem achar bug no documento ou nos dados, manda mail pra [email protected].
Stack
Rastreamos Chaturbate, Stripchat e Streamate. Uma API por plataforma:
- Chaturbate, API de afiliados que retorna a lista inteira de salas ativas. Chamamos a cada ciclo de polling.
- Stripchat, API bulk do StripCash que retorna as 400 salas top por call. Pra modelos fora do top 400, fazemos lookup individual via API direta do Stripchat com header User-Agent de browser.
- Streamate, endpoint XML SMLive, até 500 modelos ao vivo por call. Pra modelos específicos, usamos o endpoint SMLive de busca por nome.
Os IPs da OVH recebem 403 do edge do Chaturbate em cerca de 4% das vezes. Tratamos 403 como erro retryable, mantemos o snapshot anterior num transient de fallback (TTL 30 minutos) e arrastamos até o próximo poll bem-sucedido. 403 do Cloudflare WAF segue a mesma regra.
Ciclo de polling
- A cada 2 minutos, polling das 3 plataformas. Totais e modelos top vão pra transients com TTL de 180 segundos.
- A cada 10 minutos, escrevemos uma linha persistente na tabela
wp_macksc_snapshots. Uma linha por janela de 10 minutos. - Diário 02:15 UTC, snapshots brutos com mais de 30 dias são agregados em médias horárias. Depois da agregação, as linhas brutas são apagadas.
- Semanal segunda 03:00 UTC, post automático de estatísticas semanais com deltas semana a semana.
Os 2 minutos são o intervalo mais curto antes dos rate limits ativarem. Os 10 minutos de persistência são o limite pra tabela não inchar. O rollup diário mantém a latência de query plana mesmo com a tabela crescendo.
Schema de snapshot
Cada linha de wp_macksc_snapshots tem as colunas abaixo. Esta tabela é o documento canônico, se o código diverge dela, o código está errado.
| Coluna | Tipo | Conteúdo |
|---|---|---|
id |
BIGINT | Chave primária, auto-increment |
snapshot_time |
DATETIME | Momento de captura (UTC), alinhado à borda de 10 min |
cb_rooms |
INT | Salas ao vivo do Chaturbate |
cb_viewers |
INT | Espectadores concorrentes do Chaturbate (soma) |
sc_rooms |
INT | Salas ao vivo do Stripchat |
sc_viewers |
INT | Espectadores concorrentes do Stripchat (soma) |
total_rooms |
INT | Total CB+SC de salas |
total_viewers |
INT | Total CB+SC de espectadores |
top_tags |
JSON | Top 20 tags por quantidade de performer |
top_countries |
JSON | Top países por quantidade de salas |
gender_rooms |
JSON | Salas separadas por código de gênero (f/m/c/s) |
gender_viewers |
JSON | Espectadores separados por código de gênero |
created_at |
TIMESTAMP | Momento de inserção da linha |
As salas do Streamate ficam em um transient separado e não entram em sc_rooms ou cb_rooms. Os números de espectadores do Streamate não são públicos na API SMLive, então linhas do Streamate só contribuem pro total de salas, não pro total de espectadores.
O que não rastreamos
Deixado fora do pipeline de propósito:
- Identidade do espectador. Não vemos quem assiste. As APIs retornam agregados por sala, sem ID de sessão ou IP.
- Pagamentos ou gorjetas. Vemos que uma sala tem um token goal. Não vemos quem contribuiu ou quanto.
- Conteúdo de privadas. Quando um modelo entra em privada, a API esconde a sala. Perdemos visibilidade e não tentamos recuperar.
- Dados pessoais identificáveis do modelo. Registramos o username público que o modelo transmite. Nem nome civil, nem nada que a plataforma não divulga.
- Logs de chat. Não lemos, salvamos ou indexamos conteúdo de chat.
Lacunas conhecidas e avisos
- A localização no Chaturbate é texto livre. Mapeamos pra tags de país com dicionário de keywords. Casos tipo “south of Bogota” deveriam mapear pra
co, mas podem escapar. - O bulk top 400 do Stripchat corta transmissores médios. Salas fora do top 400 são alcançáveis via lookup por modelo, custa tempo de polling.
- Espectadores do Streamate não são públicos. A API SMLive retorna um score de Relevance (0-1000), não espectadores concorrentes. Calculamos estimativa sintética pra display:
max(20, min(500, round(relevance * 0.5))). É um proxy de popularidade, não afirmação de espectadores reais. Cards de modelo Streamate recebem o atributo DOMdata-estimated="true". O badge de social proof (“X assistindo agora”) exclui espectadores sintéticos do Streamate e conta só os reais do Chaturbate e Stripchat. - Um poll que dispara durante o rollup das 02:15 UTC (raro) pode bater em lock de tabela. Se acontece, o poll atrasa e recupera na próxima janela de 10 minutos.
- O ciclo de 2 minutos deriva alguns segundos por ciclo porque WP-Cron não é cron de verdade. Essa deriva não afeta os números publicados, só faz os snapshots não ficarem perfeitamente equidistantes.
Onde estão os números
Quem precisa de número específico: pras perguntas mais frequentes, temos páginas de resposta dedicadas. Cada página atualiza por request e expõe o número em microdata, plus Dataset e FAQPage schema. Catálogo completo em macksc.com/ask/.
Links rápidos:
- Painel de observação ao vivo, totais em tempo real, market share, nuvem de tags, distribuição por país.
- Endpoints JSON legíveis por máquina, snapshots completos e agregados históricos.
- REST API, namespace versionado, CORS habilitado.
- URLs /ask/ de resposta, 20 perguntas canônicas de número único.
- Referência de estatísticas da indústria cam, página sempre-ao-vivo onde os números atualizam no cru.
Download em massa via CSV
A tabela de snapshots está disponível em macksc.com/data/v1/ como 4 arquivos CSV normalizados. Cada arquivo começa com bloco de comentário de citação de 5 linhas (removível no import com pandas via comment="#"). Janela padrão dos últimos 30 dias, filtrável via ?since=YYYY-MM-DD&until=YYYY-MM-DD.
- timeseries.csv, uma linha por snapshot de 10 min, todas as colunas flat.
- countries.csv, distribuição por país normalizada da coluna JSON top_countries.
- tags.csv, top 20 tags por snapshot com coluna de rank.
- gender.csv, breakdown de gênero de salas e espectadores por snapshot.
O manifest JSON em macksc.com/data/v1/ tem metadados legíveis por máquina dos 4 endpoints.
Como citar
Ao citar um número do painel de observação, indique URL de origem e o timestamp da página. Exemplos:
- Totais do dashboard: MackSC Observatory. (2026). Live Cam Industry Statistics. Retrieved from https://macksc.com/stats/
- URL de resposta específica: cita a URL da pergunta e o timestamp do render.
- Dados brutos: MackSC. (2026). Cam Industry Snapshot Dataset. Version 1.1. https://macksc.com/data/
Todo o conteúdo do site é publicado sob CC BY 4.0. Livre de usar com menção da fonte, sem precisar mandar e-mail.
Versão da metodologia
Este documento é versão 1.1, publicada em 13/04/2026. Quando mudanças de pipeline afetam os números publicados, subimos a versão e registramos o changelog abaixo.
- 1.0 (11/04/2026), versão inicial. Polling de 3 plataformas (Chaturbate, Stripchat, Streamate), ciclo de 2 min, snapshot de 10 min, rollup diário 02:15 UTC, post semanal de estatísticas segunda 03:00 UTC.
- 1.1 (13/04/2026), divulgação de espectadores sintéticos do Streamate. Cards Streamate recebem atributo data-estimated. Badge de social proof exclui sintéticos do Streamate.
Correções, pedidos de dados, propostas de parceria: [email protected]