API EsoterHost
L'API REST EsoterHost vous permet d'interagir avec vos serveurs de jeux de manière programmatique : démarrer, arrêter, lire les logs, gérer les fichiers, créer des tickets.
https://esoterhost.com/api
L'accès à l'API est disponible pour tous les clients. Les opérations sur les serveurs nécessitent un token JWT obtenu via /api/auth/login.
Authentification
Toutes les routes protégées utilisent l'authentification par JWT Bearer Token. Incluez le token dans l'en-tête HTTP Authorization de chaque requête.
Authorization: Bearer <votre_token_jwt>
Le token est obtenu via POST /api/auth/login et expire selon la durée configurée. Conservez-le dans localStorage ou votre gestionnaire de secrets.
Obtenir un token
# Connexion curl -X POST https://esoterhost.com/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"you@example.com","password":"••••••••"}'
// Réponse { "token": "eyJhbGciOiJIUzI1NiIsInR5...", "user": { "id": "uuid", "name": "Jean D.", "email": "you@example.com", "role": "user" } }
Codes d'erreur
Toutes les erreurs retournent un objet { "error": "message lisible" }.
Rate limit : 300 requêtes par 5 minutes par adresse IP. Au-delà, une réponse 429 est retournée.
Health
GET /api/health
Vérification de l'état de l'API. Ne nécessite pas d'authentification.
// Réponse 200 { "status": "ok", "uptime": 3642, "timestamp": 1749431245000 }
Auth
POST /api/auth/register
Création d'un compte utilisateur.
| Paramètre | Type | Description |
|---|---|---|
| emailrequis | string | Adresse e-mail (unique) |
| passwordrequis | string | Minimum 8 caractères |
| namerequis | string | Prénom et nom |
POST /api/auth/login
Connexion et obtention d'un token JWT.
| Paramètre | Type | Description |
|---|---|---|
| emailrequis | string | — |
| passwordrequis | string | — |
GET /api/auth/me
Informations du compte connecté. Requiert authentification.
PATCH /api/auth/me
Mise à jour du profil (nom, téléphone, mot de passe). Requiert authentification.
| Paramètre | Type | Description |
|---|---|---|
| nameoptionnel | string | Nouveau nom |
| phoneoptionnel | string | Numéro de téléphone |
| current_passwordoptionnel | string | Requis pour changer le mot de passe |
| new_passwordoptionnel | string | Nouveau mot de passe (min 8 car.) |
Serveurs
GET /api/servers
Liste tous vos serveurs.
// Réponse 200 [ { "id": "uuid", "name": "Mon serveur MC", "game": "minecraft", "plan": "pro", "status": "running", "datacenter": "de-nbg1", "ip": "1.2.3.4", "port": 25565, "created_at": 1749000000000 } ]
GET /api/servers/:id
Détails d'un serveur spécifique.
POST /api/servers/:id/start
Démarre le serveur. Retourne { "ok": true }.
POST /api/servers/:id/stop
Arrête le serveur proprement (signal SIGTERM).
POST /api/servers/:id/restart
Redémarre le serveur.
POST /api/servers/:id/kill
Force l'arrêt immédiat du conteneur (SIGKILL). À utiliser en dernier recours.
GET /api/servers/:id/stats
Métriques temps réel (CPU, RAM, réseau).
// Réponse 200 { "cpu": 18.4, // pourcentage "memory": { "usage": 1503453184, "limit": 8589934592 }, "network": { "rx": 4096, "tx": 2048 } }
Fichiers
Gestion du système de fichiers de votre serveur. Toutes les routes requièrent l'authentification et une vérification de chemin sécurisée (protection traversal).
GET /api/servers/:id/files?path=/
Liste le contenu d'un répertoire.
| Query | Type | Description |
|---|---|---|
| pathrequis | string | Chemin absolu dans le conteneur (ex: /, /plugins) |
GET /api/servers/:id/files/content?path=/server.properties
Lit le contenu d'un fichier texte (max 512 Ko).
PUT /api/servers/:id/files/content?path=/server.properties
Écrit ou remplace le contenu d'un fichier. Corps de la requête : texte brut (Content-Type: text/plain).
POST /api/servers/:id/files/upload?path=/plugins
Upload un fichier. Corps : données brutes (Content-Type: application/octet-stream). Nom de fichier via le query param name.
POST /api/servers/:id/files/mkdir
Crée un répertoire. Corps JSON : { "path": "/nouveau-dossier" }.
DELETE /api/servers/:id/files?path=/fichier.txt
Supprime un fichier ou répertoire (récursif). Irréversible.
Tickets
GET /api/tickets
Liste vos tickets de support.
| Query | Type | Description |
|---|---|---|
| statusoptionnel | string | open | in_progress | resolved | closed |
| categoryoptionnel | string | technique | facturation | securite | general |
POST /api/tickets
Crée un nouveau ticket.
| Paramètre | Type | Description |
|---|---|---|
| subjectrequis | string | Sujet (max 200 car.) |
| messagerequis | string | Description (max 5000 car.) |
| categoryoptionnel | string | Défaut : general |
| server_idoptionnel | string | UUID du serveur concerné |
GET /api/tickets/:id
Détail d'un ticket avec ses messages.
POST /api/tickets/:id/messages
Ajoute un message à un ticket. Corps : { "message": "..." }.
PATCH /api/tickets/:id
Ferme ou rouvre un ticket. Corps : { "status": "closed" } ou { "status": "open" }.
Commandes
GET /api/orders
Historique de vos commandes et factures.
// Réponse 200 [ { "id": "uuid", "game": "minecraft", "plan": "basic", "amount": 6.90, "status": "completed", "created_at": 1749000000000 } ]
Démarrage rapide
JavaScript / Node.js
const BASE = 'https://esoterhost.com/api'; // 1. Connexion const loginRes = await fetch(`${BASE}/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: 'you@example.com', password: '••••••••' }) }); const { token } = await loginRes.json(); // 2. Lister les serveurs const servers = await fetch(`${BASE}/servers`, { headers: { 'Authorization': `Bearer ${token}` } }).then(r => r.json()); // 3. Redémarrer un serveur await fetch(`${BASE}/servers/${servers[0].id}/restart`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` } });
cURL
# Connexion TOKEN=$(curl -s -X POST https://esoterhost.com/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"you@example.com","password":"••••••••"}' \ | jq -r .token) # Liste des serveurs curl https://esoterhost.com/api/servers \ -H "Authorization: Bearer $TOKEN" # Démarrer un serveur curl -X POST https://esoterhost.com/api/servers/<server_id>/start \ -H "Authorization: Bearer $TOKEN"