Aller au contenu

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
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
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
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"
}
200
{ "token": { "...": "voir Guides", "kid": "a1b2c3d4", "sig": "..." }, "mode": "full" }
Erreurs : 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_SECONDS
cURL
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" }
200
{ "message": "device deactivated", "updated": 1, "license_ref": "GH45" }
Si la licence est désactivée :
{ "message": "license disabled", "license_ref": "GH45", "updated": 0 }
Erreurs : 404 licence introuvable · 422 format license_key_hash invalide
cURL
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"]
}
201/200
{
  "license_key": "ABCD-EF23-GH45",
  "max_activations": 3,
  "created_at": "2025-09-01T10:00:00Z",
  "product": "VotreProduit",
  "edition": "Pro",
  "features": ["featA","featB"]
}
cURL
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
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" }
200
{ "message": "license enabled", "enabled": true, "license_ref": "GH45" }
Déjà dans l’état souhaité :
{ "message": "already enabled", "enabled": true, "license_ref": "GH45" }
cURL
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" }
200
{ "message": "device deactivated", "updated": 1, "license_ref": "GH45" }
cURL
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" }
200
{
  "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"
}
Erreurs : 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" }
200
{ "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" }