{"openapi":"3.1.0","info":{"title":"Compte Perystyl","version":"1.0.0","description":"Catalogue public en centimes EUR HT par organisation. Les droits sont réservés aux services Perystyl ; aucune clé de service ne doit être fournie à un assistant."},"servers":[{"url":"https://account.perystyl.com"}],"paths":{"/api/v1/catalog":{"get":{"operationId":"getCatalog","summary":"Lire le catalogue et le registre des applications","security":[],"responses":{"200":{"description":"Catalogue issu du moteur de facturation. Quotas null signifie non définis, jamais illimités.","headers":{"ETag":{"schema":{"type":"string"}},"Cache-Control":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Catalog"}}}},"304":{"description":"Catalogue inchangé (If-None-Match)"}},"parameters":[{"name":"If-None-Match","in":"header","schema":{"type":"string"}}]}},"/api/v1/entitlements":{"get":{"operationId":"getEntitlements","summary":"Droits limités à l’application authentifiée (service interne)","description":"Fournir sub (identifiant OIDC stable) de préférence. email est conservé pour les consommateurs historiques ; il ne constitue pas une liaison d’identité. Seules les organisations possédant une entrée de droits pour ce produit sont renvoyées, y compris les droits désactivés. Réponses sans cache.","security":[{"serviceKey":[]}],"parameters":[{"name":"sub","in":"query","schema":{"type":"string","maxLength":256}},{"name":"email","in":"query","schema":{"type":"string","format":"email","maxLength":254}}],"responses":{"200":{"description":"Droits du produit, jamais ceux des autres applications","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entitlements"}}}},"400":{"description":"Identité absente ou invalide"},"401":{"description":"Clé absente, invalide ou application inconnue"},"429":{"description":"Budget de requêtes dépassé ; respecter Retry-After"},"503":{"description":"Service temporairement indisponible"}}}},"/api/v1/health":{"get":{"operationId":"getLiveness","security":[],"responses":{"200":{"description":"Processus vivant"}}}},"/api/v1/ready":{"get":{"operationId":"getReadiness","security":[],"responses":{"200":{"description":"Base accessible"},"503":{"description":"Base indisponible"}}}}},"components":{"securitySchemes":{"serviceKey":{"type":"http","scheme":"bearer","description":"Clé de service propre à une application, réservée au serveur."}},"schemas":{"Catalog":{"type":"object","required":["version","currency","tax","unit","products","discounts","conditions"],"properties":{"version":{"type":"integer"},"currency":{"const":"EUR"},"tax":{"const":"exclusive"},"unit":{"const":"organization"},"products":{"type":"array","items":{"type":"object","required":["slug","name","domain","color","loginUrl","mcpUrl","openapiUrl","offers"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"domain":{"type":"string"},"color":{"type":"string"},"loginUrl":{"type":"string","format":"uri"},"mcpUrl":{"type":"string","format":"uri"},"openapiUrl":{"type":"string","format":"uri"},"integrationStatus":{"const":"unverified"},"launcher":{"type":"boolean"},"tiers":{"type":"array","items":{"type":"string"}},"offers":{"type":"array","items":{"type":"object","required":["tier","label","month","year","quotas"],"properties":{"tier":{"type":"string"},"label":{"type":"string"},"month":{"type":"integer","minimum":0},"year":{"type":"integer","minimum":0},"quotas":{"type":"null"}}}}}}},"discounts":{"type":"array","items":{"type":"object","properties":{"paidProducts":{"type":"integer"},"percent":{"type":"number"}}}},"conditions":{"type":"object","properties":{"zeroPriceRequiresPaidProduct":{"const":true},"zeroPriceCountsForDiscount":{"const":false}}}}},"Entitlements":{"type":"object","required":["email","organizations"],"properties":{"email":{"type":"string","description":"Adresse normalisée du mode historique ; vide en mode sub."},"organizations":{"type":"array","items":{"type":"object","required":["id","name","slug","domain","role","products"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"domain":{"type":["string","null"]},"role":{"type":"string"},"products":{"type":"array","maxItems":1,"items":{"type":"object","properties":{"product":{"type":"string"},"tier":{"type":"string"},"status":{"enum":["active","disabled"]}}}}}}}}}}}}