API documentation
URL de base : https://api.xp-flightdeck.com/licenses-api/v1
Toujours envoyer Content-Type: application/json pour les requêtes POST.
GET /health
Description : Sonde de santé du service.
Auth : aucune
200
{ "ok": true }
curl -sS https://api.xp-flightdeck.com/licenses-api/v1/health
GET /public-key
Description : Renvoie la clé publique Ed25519 actuellement active (et son kid) utilisée pour signer les nouveaux jetons.
Auth : aucune
200
{ "kid": "a1b2c3d4", "ed25519_public_key_b64": "BASE64..." }
curl -sS https://api.xp-flightdeck.com/licenses-api/v1/public-key
GET /public-keys
Description : Renvoie toutes les clés de signature — actives et retirées — pour qu'un jeton reste vérifiable par son kid après une rotation.
Auth : aucune
200
[
{ "kid": "a1b2c3d4", "public_key_b64": "BASE64...", "active": true, "created_at": "2026-07-08T10:00:00Z", "retired_at": null },
{ "kid": "9f8e7d6c", "public_key_b64": "BASE64...", "active": false, "created_at": "2026-01-01T00:00:00Z", "retired_at": "2026-07-08T10:00:00Z" }
]
curl -sS https://api.xp-flightdeck.com/licenses-api/v1/public-keys
POST /activate
Description : Activer une licence sur un appareil, scopé à l'éditeur appelant. Limité en débit par (éditeur, email). Vérifie l'état, la propriété par email et le quota d'activations.
En-tête d’auth : X-Client-Token (celui de cet éditeur)
Champs obligatoires : email, license_key, device_hash, device_name
Corps
{
"email": "pilote@example.com",
"license_key": "ABCD-EF23-GH45",
"device_hash": "sha256-de-lappareil",
"device_name": "Mon PC"
}
{ "token": { "...": "voir Guides", "kid": "a1b2c3d4", "sig": "..." }, "mode": "full" }
400 licence non liée à cet email · 403 licence désactivée · 404 introuvable · 409 quota atteint · 429 trop de tentatives pour cet utilisateur, réessayer après RATE_LIMIT_WINDOW_SECONDScURL
curl -sS -X POST -H "X-Client-Token: $CLIENT_TOKEN" -H "Content-Type: application/json" https://api.xp-flightdeck.com/licenses-api/v1/activate -d '{"email":"pilote@example.com","license_key":"ABCD-EF23-GH45","device_hash":"<sha256>","device_name":"PC"}'
POST /deactivate
Description : Désactiver un appareil pour une licence afin de libérer un slot.
En-tête d’auth : X-Client-Token
Champs obligatoires : license_key_hash, device_hash
Corps
{ "license_key_hash": "<64-hex>", "device_hash": "sha256-de-lappareil" }
{ "message": "device deactivated", "updated": 1, "license_ref": "GH45" }
{ "message": "license disabled", "license_ref": "GH45", "updated": 0 }
404 licence introuvable · 422 format license_key_hash invalidecURL
curl -sS -X POST -H "X-Client-Token: $CLIENT_TOKEN" -H "Content-Type: application/json" https://api.xp-flightdeck.com/licenses-api/v1/deactivate -d '{"license_key_hash":"<64-hex>","device_hash":"<sha256>"}'
POST /admin/licenses
Description : Créer une licence pour un utilisateur. La clé en clair est renvoyée une seule fois.
En-tête d’auth : X-Admin-Token
Champs obligatoires : email, product, edition, max_activations
Champs optionnels : features (liste de chaînes)
Corps
{
"email": "pilote@example.com",
"product": "VotreProduit",
"edition": "Pro",
"max_activations": 3,
"features": ["featA", "featB"]
}
{
"license_key": "ABCD-EF23-GH45",
"max_activations": 3,
"created_at": "2025-09-01T10:00:00Z",
"product": "VotreProduit",
"edition": "Pro",
"features": ["featA","featB"]
}
curl -sS -X POST -H "X-Admin-Token: $ADMIN_TOKEN" -H "Content-Type: application/json" https://api.xp-flightdeck.com/licenses-api/v1/admin/licenses -d '{"email":"pilote@example.com","product":"VotreProduit","edition":"Pro","max_activations":3,"features":["featA","featB"]}'
GET /admin/licenses
Description : Lister les licences avec détails d’activation, scopé à l'éditeur appelant.
En-tête d’auth : X-Admin-Token (celui de cet éditeur)
Paramètres de requête (tous facultatifs) : email, product, edition, enabled, limit (défaut 50, max 200), offset (défaut 0)
200 — { items, total }
{
"items": [{
"license_key_hash": "e3b0c442...64hex",
"license_ref": "GH45",
"email": "pilote@example.com",
"product": "VotreProduit",
"edition": "Pro",
"enabled": true,
"active_devices_count": 1,
"max_activations": 3,
"created_at": "2025-09-01T10:00:00Z",
"activations": [
{ "device_hash":"<sha256>", "device_name":"Mon PC", "deactivated": false, "activated_at": "2025-09-01T10:10:00Z" }
]
}],
"total": 1
}
curl -sS -H "X-Admin-Token: $ADMIN_TOKEN" "https://api.xp-flightdeck.com/licenses-api/v1/admin/licenses?email=pilote@example.com&enabled=true&limit=50&offset=0"
POST /admin/licenses/enable
Description : Activer/désactiver une licence.
En-tête d’auth : X-Admin-Token
Champs obligatoires : license_key, enabled, email
Corps
{ "license_key": "ABCD-EF23-GH45", "enabled": true, "email": "pilote@example.com" }
{ "message": "license enabled", "enabled": true, "license_ref": "GH45" }
{ "message": "already enabled", "enabled": true, "license_ref": "GH45" }
curl -sS -X POST -H "X-Admin-Token: $ADMIN_TOKEN" -H "Content-Type: application/json" https://api.xp-flightdeck.com/licenses-api/v1/admin/licenses/enable -d '{"license_key":"ABCD-EF23-GH45","enabled":true,"email":"pilote@example.com"}'
POST /admin/deactivate-device
Description : Forcer la désactivation d’un appareil pour une licence (override admin).
En-tête d’auth : X-Admin-Token
Champs obligatoires : license_key, device_hash, email
Corps
{ "license_key": "ABCD-EF23-GH45", "device_hash": "<sha256>", "email": "pilote@example.com" }
{ "message": "device deactivated", "updated": 1, "license_ref": "GH45" }
curl -sS -X POST -H "X-Admin-Token: $ADMIN_TOKEN" -H "Content-Type: application/json" https://api.xp-flightdeck.com/licenses-api/v1/admin/deactivate-device -d '{"license_key":"ABCD-EF23-GH45","device_hash":"<sha256>","email":"pilote@example.com"}'
Endpoints plateforme (opérateur uniquement)
Ces routes ne sont pas destinées aux éditeurs — elles servent à l'opérateur de la plateforme pour créer et gérer les comptes éditeur, et faire tourner la clé de signature partagée. Toutes exigent X-Platform-Token.
POST /platform/publishers
Description : Crée un éditeur (tenant). Renvoie client_token et admin_token une seule fois — ils ne sont jamais récupérables ensuite, seul leur hash est conservé.
En-tête d’auth : X-Platform-Token
Champs obligatoires : name, slug (minuscules, alphanumérique + tirets, 2-50 caractères)
Corps
{ "name": "Votre Studio", "slug": "votre-studio" }
{
"id": 1,
"name": "Votre Studio",
"slug": "votre-studio",
"client_token": "affiché-une-fois...",
"admin_token": "affiché-une-fois...",
"created_at": "2026-07-08T10:00:00Z"
}
409 slug déjà utilisé · 422 slug/nom invalide
GET /platform/publishers
Description : Liste les éditeurs (ne renvoie jamais les tokens ni leur hash).
En-tête d’auth : X-Platform-Token
200
[{ "id": 1, "name": "Votre Studio", "slug": "votre-studio", "enabled": true, "created_at": "2026-07-08T10:00:00Z" }]
POST /platform/publishers/enable
Description : Active ou désactive un compte éditeur — un interrupteur qui bloque immédiatement tous ses appels client/admin.
En-tête d’auth : X-Platform-Token
Champs obligatoires : slug, enabled
Corps
{ "slug": "votre-studio", "enabled": false }
POST /platform/publishers/rotate-token
Description : Fait tourner le token client ou admin d'un éditeur. L'ancien token cesse de fonctionner immédiatement — l'éditeur doit mettre à jour tout ce qui l'embarque (build de l'app, outil back-office).
En-tête d’auth : X-Platform-Token
Champs obligatoires : slug, which ("client" ou "admin")
Corps
{ "slug": "votre-studio", "which": "client" }
{ "slug": "votre-studio", "which": "client", "token": "affiché-une-fois..." }
POST /platform/keys/rotate
Description : Fait tourner la clé de signature Ed25519 utilisée pour les jetons de tous les éditeurs. La clé retirée est conservée (pas supprimée) pour que les jetons déjà émis restent vérifiables via GET /public-keys jusqu'à leur expiration.
En-tête d’auth : X-Platform-Token
200
{ "kid": "b2c3d4e5", "public_key_b64": "BASE64...", "created_at": "2026-07-09T09:00:00Z" }