Documentation
Une API HTTP par serveur, en JSON (ou texte pour les clients qui n'ont pas de parseur — dont le plugin Paper lui-même). Elle sert à demander des rapports et des rendus 3D, suivre leur avancement et gérer les liens de rapport partagés. Elle ne détaille jamais la façon dont un score est calculé — voir comment ça marche pour ça.
Une base d'URL par serveur (https://<votre-id>.tunnelvision.fr), un jeton Bearer par serveur. GET /report pour une liste de sessions à vérifier, POST /render pour la scène 3D interactive. Les deux passent en job asynchrone au-delà d'une certaine taille — on vous renvoie un identifiant à interroger plutôt qu'une réponse qui traînerait en longueur.
Chaque serveur reçoit un jeton d'API unique (affiché une seule fois à la création). Toutes les routes l'exigent, sauf GET /health (utilisé par le healthcheck Docker) et la lecture d'un lien de rapport partagé (GET /hosted/<token>, protégée par le token de partage lui-même, pas par le jeton d'API).
curl -H "Authorization: Bearer VOTRE_JETON" \
https://votre-id.tunnelvision.fr/health
Un jeton compromis n'ouvre que les données de votre serveur — chaque serveur vit dans son propre espace isolé (voir la page confidentialité). Vous pouvez le régénérer à tout moment ; l'ancien cesse de fonctionner immédiatement.
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /health | État du serveur : miroir présent, fenêtre de données disponible, jobs en cours. Pas d'authentification. |
| POST | /sync | Synchronise le miroir local depuis votre serveur Minecraft, sans lancer d'analyse. |
| GET | /report | Liste de sessions triées par score de suspicion, sur une fenêtre donnée. |
| GET | /report/jobs/{id} | Avancement / résultat d'un rapport parti en job asynchrone. |
| POST | /render | Lance une reconstruction 3D interactive sur une fenêtre (toujours asynchrone). |
| GET | /render/{id} | Avancement / fichiers produits par un rendu. |
| GET | /renders | Historique des rendus de ce serveur. |
| GET | /reports/{fichier} | Télécharge une page de rendu produite par /render. |
| GET | /hosted-reports | Rapports actuellement partagés par lien (encore valides). |
| POST | /hosted-reports/{id}/revoke | Coupe un lien de rapport partagé immédiatement. |
| POST | /hosted-reports/{id}/relink | Révoque l'ancien lien et en génère un nouveau. |
| GET | /jobs | Tous les jobs (rapports + rendus) de ce serveur. |
| GET | /audit | Journal d'audit : ce qui est entré, ce qui a été produit, quand, par qui. |
| GET | /live | Flux temps réel (Server-Sent Events) du même contenu que /report. |
GET /report accepte une fenêtre (start/end, ISO UTC), un minerai suivi (ore, ex. diamond), et quelques réglages de filtrage (gap_seconds, min_blocks, min_ore_blocks, ore_families) — les valeurs par défaut conviennent dans la grande majorité des cas.
curl -H "Authorization: Bearer VOTRE_JETON" \ "https://votre-id.tunnelvision.fr/report?ore=diamond&start=2026-07-01&end=2026-07-08"
Réponse (abrégée) :
{
"target": "diamond",
"sessions": [
{
"pseudo": "Steve",
"world": "world",
"session_id": "...",
"score": 82,
"verdict": "fortement suspect"
}
]
}
Une fenêtre modeste répond directement. Une fenêtre plus large (beaucoup de blocs à traiter) répond 202Parti en job asynchroneLa fenêtre est trop coûteuse pour répondre tout de suite — un identifiant de job est renvoyé, à interroger jusqu'à ce qu'il soit terminé.{"job_id": "a1b2c3d4e5f6", "status": "queued", "poll": "/report/jobs/a1b2c3d4e5f6"} avec un identifiant de job à interroger sur GET /report/jobs/{id} jusqu'à status=done — voir la section suivante. Ajoutez ?format=text pour une sortie en lignes clé=valeur plutôt qu'en JSON (c'est ce que lit le plugin, qui n'embarque pas de parseur JSON).
POST /render fonctionne sur le même principe pour la scène 3D interactive, toujours en job (un rendu prend, au minimum, plusieurs secondes) :
curl -X POST -H "Authorization: Bearer VOTRE_JETON" \ "https://votre-id.tunnelvision.fr/render?start=2026-07-01&end=2026-07-08&host=true" → {"job_id": "a1b2c3d4e5f6", "status": "queued", "poll": "/render/a1b2c3d4e5f6"} curl -H "Authorization: Bearer VOTRE_JETON" \ https://votre-id.tunnelvision.fr/render/a1b2c3d4e5f6
error)
Un job interrompu par un redémarrage (mise à jour, incident) passe en error explicite plutôt que de disparaître — son état survit sur disque. Avec host=true et si votre serveur est éligible à l'hébergement en ligne, la réponse contient aussi hosted_url : un lien non-devinable, à durée limitée, consultable sans jeton d'API par quiconque le reçoit (utile pour partager un cas avec d'autres modérateurs). Gérez ces liens via /hosted-reports (liste, révocation, régénération).
Avant de lancer le moindre calcul, l'API estime le coût mémoire de la fenêtre demandée (nombre de blocs concernés) et refuse par avance (422Fenêtre refusée avant tout calculLa RAM prédite pour cette fenêtre dépasse le budget du serveur.{"detail": "Fenetre trop couteuse : ~2.4M blocs, ~2.1 Go predits (budget 1.6 Go)."}) si elle dépasse le budget du serveur — plutôt que de risquer un plantage à mi-calcul. La réponse d'erreur inclut toujours une fenêtre suggérée qui, elle, passerait :
{
"detail": "Fenetre trop couteuse : ~2 400 000 blocs, ~2.1 Go de RAM predits (budget 1.6 Go). Reessayez avec une fenetre d'environ 12 jour(s)."
}
Autres bornes à connaître : 31 jours maximum par rendu (/render), un seul rapport lourd et un seul rendu à la fois par serveur (une deuxième demande simultanée reçoit 409Déjà en coursUn rapport ou un rendu du même type tourne déjà sur ce serveur — réessayez une fois terminé.{"detail": "Un rapport est deja en cours pour ce serveur."}), et une fenêtre ne peut pas remonter avant la période de rétention de votre serveur (90 jours glissants par défaut — 422Hors période de rétentionLa fenêtre demandée remonte avant le début des données disponibles sur ce serveur.{"detail": "Fenetre hors retention : donnees disponibles depuis 2026-05-20."} avec la date de coupure si vous la dépassez).
GET /health expose mirror_since / mirror_until : la fenêtre de données réellement disponible en ce moment sur votre serveur, à vérifier avant de construire une requête.
| Code | Signification |
|---|---|
| 400 | Paramètre invalide (minerai inconnu, fenêtre de rendu trop large, filtre malformé). |
| 401 | Jeton absent ou invalide. |
| 404 | Job ou rapport hébergé inconnu. |
| 409 | Un rapport ou un rendu du même type tourne déjà sur ce serveur — réessayez une fois terminé. |
| 410 | Lien de rapport partagé expiré, révoqué ou son fichier a été purgé. |
| 422 | Fenêtre refusée par le contrôle d'admission ou hors période de rétention (voir ci-dessus). |
| 502 | Synchronisation avec votre serveur Minecraft impossible (passerelle injoignable). |
Pendant la bêta, l'accès se demande via un court formulaire, traité à la main. Demander un accès — ou directement par Discord / e-mail.