Documentation

L'API TunnelVision

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.

En bref

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.

1Authentification

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.

2Vue d'ensemble des endpoints

MéthodeCheminRôle
GET/healthÉtat du serveur : miroir présent, fenêtre de données disponible, jobs en cours. Pas d'authentification.
POST/syncSynchronise le miroir local depuis votre serveur Minecraft, sans lancer d'analyse.
GET/reportListe 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/renderLance une reconstruction 3D interactive sur une fenêtre (toujours asynchrone).
GET/render/{id}Avancement / fichiers produits par un rendu.
GET/rendersHistorique des rendus de ce serveur.
GET/reports/{fichier}Télécharge une page de rendu produite par /render.
GET/hosted-reportsRapports actuellement partagés par lien (encore valides).
POST/hosted-reports/{id}/revokeCoupe un lien de rapport partagé immédiatement.
POST/hosted-reports/{id}/relinkRévoque l'ancien lien et en génère un nouveau.
GET/jobsTous les jobs (rapports + rendus) de ce serveur.
GET/auditJournal d'audit : ce qui est entré, ce qui a été produit, quand, par qui.
GET/liveFlux temps réel (Server-Sent Events) du même contenu que /report.

3Demander un rapport

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).

4Rendus et jobs asynchrones

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
queued en attente running / rendering en cours done terminé error échoué (message explicite dans 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).

5Limites et contrôle d'admission

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).

i

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.

6Codes d'erreur courants

CodeSignification
400Paramètre invalide (minerai inconnu, fenêtre de rendu trop large, filtre malformé).
401Jeton absent ou invalide.
404Job ou rapport hébergé inconnu.
409Un rapport ou un rendu du même type tourne déjà sur ce serveur — réessayez une fois terminé.
410Lien de rapport partagé expiré, révoqué ou son fichier a été purgé.
422Fenêtre refusée par le contrôle d'admission ou hors période de rétention (voir ci-dessus).
502Synchronisation avec votre serveur Minecraft impossible (passerelle injoignable).

Obtenir un jeton

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.