Nous interrogeons trois plateformes de cam toutes les deux minutes. Cette page documente comment nous agrégeons les données, ce que nous stockons, ce que nous choisissons de ne pas tracker et comment citer ce que nous publions.
J’écris à la première personne parce que ce pipeline est un projet personnel, pas le produit d’un comité. Si une décision paraît étrange, il y a une raison et je l’explique. Qui trouve un bug dans le document ou dans les données, envoyer un mail à [email protected].
Stack
Nous trackons Chaturbate, Stripchat et Streamate. Une API par plateforme :
- Chaturbate, API d’affiliation qui retourne la liste entière des salles actives. Nous l’appelons à chaque cycle de polling.
- Stripchat, API bulk StripCash qui retourne les 400 salles top par appel. Pour les modèles hors top 400, nous faisons un lookup individuel via l’API directe Stripchat avec header User-Agent de navigateur.
- Streamate, endpoint XML SMLive, jusqu’à 500 modèles en direct par appel. Pour les modèles spécifiques nous utilisons l’endpoint de recherche par nom SMLive.
Les IPs OVH reçoivent 403 depuis l’edge de Chaturbate dans environ 4 % des cas. Nous traitons le 403 comme erreur retryable, gardons le snapshot précédent dans un transient de fallback (TTL 30 minutes) et le traînons jusqu’au prochain poll réussi. Le 403 du WAF Cloudflare suit la même règle.
Cycle de polling
- Toutes les 2 minutes, polling des 3 plateformes. Totaux et modèles top vont dans des transients à TTL de 180 secondes.
- Toutes les 10 minutes, nous écrivons une ligne persistante dans la table
wp_macksc_snapshots. Une ligne par fenêtre de 10 minutes. - Quotidien 02:15 UTC, les snapshots bruts de plus de 30 jours sont agrégés en moyennes horaires. Après agrégation, les lignes brutes sont supprimées.
- Hebdomadaire lundi 03:00 UTC, post automatique de statistiques hebdomadaires avec deltas semaine à semaine.
Les 2 minutes sont l’intervalle le plus court avant activation des rate limits. Les 10 minutes de persistance sont la limite avant que la table ne gonfle. Le rollup quotidien garde la latence des queries plate, même quand la table grossit.
Schéma du snapshot
Chaque ligne de wp_macksc_snapshots a les colonnes ci-dessous. Cette table est la documentation canonique, si le code s’en écarte, c’est le code qui se trompe.
| Colonne | Type | Contenu |
|---|---|---|
id |
BIGINT | Clé primaire, auto-increment |
snapshot_time |
DATETIME | Moment de capture (UTC), aligné sur la borne de 10 min |
cb_rooms |
INT | Salles en direct Chaturbate |
cb_viewers |
INT | Spectateurs concurrents Chaturbate (somme) |
sc_rooms |
INT | Salles en direct Stripchat |
sc_viewers |
INT | Spectateurs concurrents Stripchat (somme) |
total_rooms |
INT | Total CB+SC des salles |
total_viewers |
INT | Total CB+SC des spectateurs |
top_tags |
JSON | Top 20 tags par nombre de performers |
top_countries |
JSON | Top pays par nombre de salles |
gender_rooms |
JSON | Répartition salles par code de genre (f/m/c/s) |
gender_viewers |
JSON | Répartition spectateurs par code de genre |
created_at |
TIMESTAMP | Moment d’insertion de la ligne |
Les salles Streamate sont trackées dans un transient séparé et n’entrent pas dans sc_rooms ni cb_rooms. Les nombres de spectateurs Streamate ne sont pas publiés dans l’API SMLive, donc les lignes Streamate ne contribuent qu’au total des salles, pas au total des spectateurs.
Ce que nous ne trackons pas
Exclu du pipeline délibérément :
- Identité du spectateur. Nous ne voyons pas qui regarde. Les APIs retournent des agrégats par salle, pas d’IDs de session ni d’IPs.
- Paiements ou pourboires. Nous voyons qu’une salle a un token goal. Nous ne voyons pas qui a contribué ni combien.
- Contenu des privés. Quand une modèle passe en privé, l’API cache la salle. Nous perdons la visibilité et ne cherchons pas à la récupérer.
- Données personnelles identifiables des modèles. Nous enregistrons le username public sous lequel la modèle diffuse. Pas de nom civil, rien que la plateforme ne rend pas public.
- Logs de chat. Nous ne lisons, ne stockons ni n’indexons le contenu du chat.
Lacunes connues et avertissements
- La localisation dans Chaturbate est du texte libre. Nous la mappons vers des tags pays avec un dictionnaire de mots-clés. Les cas limites comme « south of Bogota » devraient mapper vers
comais peuvent passer à travers. - Le bulk top 400 de Stripchat coupe les diffuseurs mid-range. Les salles hors top 400 sont atteignables via lookup par modèle, ça coûte du temps de polling.
- Les spectateurs Streamate ne sont pas publics. L’API SMLive retourne un score de Relevance (0-1000), pas les spectateurs concurrents. Nous calculons une estimation synthétique pour l’affichage :
max(20, min(500, round(relevance * 0.5))). C’est un proxy de popularité, pas une affirmation sur les spectateurs réels. Les cartes de modèles Streamate reçoivent l’attribut DOMdata-estimated="true". Le badge social proof (« X regardent maintenant ») exclut les spectateurs synthétiques Streamate et ne compte que les réels de Chaturbate et Stripchat. - Un poll qui se déclenche pendant le rollup de 02:15 UTC (rare) peut buter sur un verrou de table. Si ça arrive, le poll est retardé et rattrape dans la fenêtre de 10 minutes suivante.
- Le cycle de 2 minutes dérive de quelques secondes par cycle parce que WP-Cron n’est pas un cron réel. Cette dérive n’affecte pas les chiffres publiés, elle signifie simplement que les snapshots ne sont pas parfaitement équidistants.
Où sont les chiffres
Qui a besoin d’un chiffre précis : pour les questions les plus fréquentes, nous avons des pages de réponse dédiées. Chaque page est actualisée à chaque requête et expose le chiffre en microdata, plus un schéma Dataset et FAQPage. Catalogue complet sur macksc.com/ask/.
Liens rapides :
- Tableau d’observation en direct, totaux en temps réel, part de marché, nuage de tags, distribution par pays.
- Endpoints JSON lisibles par machine, snapshots complets et agrégats historiques.
- REST API, namespace versionné, CORS activé.
- URLs /ask/ de réponse, 20 questions canoniques à chiffre unique.
- Référence statistiques de l’industrie cam, page toujours en direct où les chiffres sont actualisés en brut.
Téléchargement en masse via CSV
La table de snapshots est disponible sur macksc.com/data/v1/ comme 4 fichiers CSV normalisés. Chaque fichier commence par un bloc de commentaire de citation de 5 lignes (supprimable à l’import avec pandas via comment="#"). Fenêtre par défaut des 30 derniers jours, filtrable via ?since=YYYY-MM-DD&until=YYYY-MM-DD.
- timeseries.csv, une ligne par snapshot de 10 min, toutes colonnes à plat.
- countries.csv, distribution par pays normalisée depuis la colonne JSON top_countries.
- tags.csv, top 20 tags par snapshot avec colonne de rank.
- gender.csv, décomposition par genre des salles et spectateurs par snapshot.
Le manifeste JSON sur macksc.com/data/v1/ a les métadonnées lisibles par machine des 4 endpoints.
Comment citer
Quand vous citez un chiffre du tableau d’observation, indiquez l’URL d’origine et le timestamp de la page. Exemples :
- Totaux du tableau : MackSC Observatory. (2026). Live Cam Industry Statistics. Retrieved from https://macksc.com/stats/
- URL de réponse spécifique : citer l’URL de la question et le timestamp du rendu de la page.
- Données brutes : MackSC. (2026). Cam Industry Snapshot Dataset. Version 1.1. https://macksc.com/data/
Tout le contenu du site est publié sous CC BY 4.0. Libre d’utilisation avec mention de la source, pas besoin de mail.
Version de la méthodologie
Ce document est version 1.1, publié le 13/04/2026. Quand des modifications du pipeline impactent les chiffres publiés, nous incrémentons la version et inscrivons le changelog ci-dessous.
- 1.0 (11/04/2026), version initiale. Polling de 3 plateformes (Chaturbate, Stripchat, Streamate), cycle de 2 min, snapshot de 10 min, rollup quotidien 02:15 UTC, post statistiques hebdo lundi 03:00 UTC.
- 1.1 (13/04/2026), divulgation des spectateurs synthétiques Streamate. Cartes Streamate reçoivent l’attribut data-estimated. Badge social proof exclut les synthétiques Streamate.
Corrections, demandes de données, propositions de partenariat : [email protected]