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 HTTPSignificationAction recommandée
200 / 201Succès
400Requête invalideVérifier les paramètres envoyés
401Non authentifiéRenouveler le token JWT
403Accès refuséVérifier les droits sur la ressource
404Ressource introuvableVérifier l'ID de la ressource
429Trop de requêtesRespecter le rate limit (300 req/5 min)
500Erreur serveurRé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ètreTypeDescription
emailrequisstringAdresse e-mail (unique)
passwordrequisstringMinimum 8 caractères
namerequisstringPrénom et nom

POST /api/auth/login

Connexion et obtention d'un token JWT.

ParamètreTypeDescription
emailrequisstring
passwordrequisstring

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ètreTypeDescription
nameoptionnelstringNouveau nom
phoneoptionnelstringNuméro de téléphone
current_passwordoptionnelstringRequis pour changer le mot de passe
new_passwordoptionnelstringNouveau 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.

QueryTypeDescription
pathrequisstringChemin 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.

QueryTypeDescription
statusoptionnelstringopen | in_progress | resolved | closed
categoryoptionnelstringtechnique | facturation | securite | general

POST /api/tickets

Crée un nouveau ticket.

ParamètreTypeDescription
subjectrequisstringSujet (max 200 car.)
messagerequisstringDescription (max 5000 car.)
categoryoptionnelstringDéfaut : general
server_idoptionnelstringUUID 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"