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.
Base URL
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
| Code HTTP | Signification | Action recommandée |
| 200 / 201 | Succès | — |
| 400 | Requête invalide | Vérifier les paramètres envoyés |
| 401 | Non authentifié | Renouveler le token JWT |
| 403 | Accès refusé | Vérifier les droits sur la ressource |
| 404 | Ressource introuvable | Vérifier l'ID de la ressource |
| 429 | Trop de requêtes | Respecter le rate limit (300 req/5 min) |
| 500 | Erreur serveur | Réessayer ou ouvrir un ticket |
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"