{"openapi":"3.1.0","info":{"title":"Perystyl Account","version":"1.1.0","description":"Public catalogue: EUR cents, excluding tax, per organization. Entitlements are reserved for trusted Perystyl application servers. Never give a service key to an assistant."},"servers":[{"url":"https://account.perystyl.com"}],"paths":{"/api/v1/catalog":{"get":{"operationId":"getCatalog","summary":"Read the public product registry and catalogue","security":[],"parameters":[{"name":"If-None-Match","in":"header","schema":{"type":"string"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["fr","en"]}},{"name":"Accept-Language","in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Derived from the billing engine. Null quotas mean undefined, never unlimited.","headers":{"ETag":{"schema":{"type":"string"}},"Cache-Control":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Catalog"}}}},"304":{"description":"Unchanged catalogue (If-None-Match), no response body"}}}},"/api/v1/entitlements":{"get":{"operationId":"getEntitlements","summary":"Read suite-wide entitlements for a verified account (trusted service)","description":"At least one of sub or email is required. Prefer the stable OIDC sub. When a non-empty sub is provided it takes precedence over email, and the response email is empty. Email lookup is for legacy consumers, not identity linking. Unknown or unverified accounts return an empty organizations array. All memberships are returned, even without explicit entitlements; each contains every registered product. Missing entitlements are free/disabled, which grants no free access. Keys identify a trusted service, not the requested user: any verified identity can currently be queried. Responses and errors are not cacheable.","security":[{"serviceKey":[]}],"parameters":[{"name":"sub","in":"query","schema":{"type":"string","maxLength":256},"description":"Trimmed stable OIDC subject; no whitespace or control characters."},{"name":"email","in":"query","schema":{"type":"string","format":"email","maxLength":254},"description":"Required only without sub; trimmed and lowercased. Ignored when sub is present."}],"responses":{"200":{"description":"Verified account memberships and the entire suite","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"private, no-store"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entitlements"}}}},"400":{"description":"Missing or invalid identity","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"private, no-store"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string","enum":["email_or_sub_required","invalid_identity"]}}}}}},"401":{"description":"Absent, invalid or unrecognized service key","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"private, no-store"},"WWW-Authenticate":{"schema":{"type":"string","const":"Bearer"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string","enum":["unauthorized"]}}}}}},"429":{"description":"Request budget exhausted","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"private, no-store"},"Retry-After":{"schema":{"type":"string","const":"60"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string","enum":["too_many_requests"]}}}}}},"503":{"description":"Service temporarily unavailable","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"private, no-store"},"Retry-After":{"schema":{"type":"string","const":"60"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string","enum":["temporarily_unavailable"]}}}}}}}}},"/api/v1/health":{"get":{"operationId":"getLiveness","security":[],"responses":{"200":{"description":"Process alive","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status"],"properties":{"status":{"const":"ok"}}}}}}}}},"/api/v1/ready":{"get":{"operationId":"getReadiness","security":[],"responses":{"200":{"description":"Database and required business schema accessible","headers":{"Cache-Control":{"schema":{"const":"no-store"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status"],"properties":{"status":{"const":"ready"}}}}}},"503":{"description":"Database or required business schema unavailable","headers":{"Cache-Control":{"schema":{"const":"no-store"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["status"],"properties":{"status":{"const":"unavailable"}}}}}}}}}},"components":{"securitySchemes":{"serviceKey":{"type":"http","scheme":"bearer","description":"Per-application service key, exclusively for trusted servers. It currently authorizes suite-wide lookup, not just that application's entitlements."}},"schemas":{"Catalog":{"type":"object","additionalProperties":false,"required":["version","currency","tax","unit","products","discounts","conditions"],"properties":{"version":{"const":1},"currency":{"const":"EUR"},"tax":{"const":"exclusive"},"unit":{"const":"organization"},"products":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["slug","name","role","description","url","site","domain","color","loginUrl","mcpUrl","openapiUrl","integrationStatus","launcher","tiers","offers"],"properties":{"slug":{"enum":["agora","sentinel","scribe","cards","syncs","uniflo"]},"name":{"type":"string"},"role":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"},"site":{"type":"string","format":"uri"},"domain":{"type":"string"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"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","additionalProperties":false,"required":["tier","label","month","year","quotas","information"],"properties":{"tier":{"enum":["solo","equipe","cabinet"]},"label":{"type":"string"},"month":{"type":"integer","minimum":0},"year":{"type":"integer","minimum":0},"quotas":{"type":"null"},"information":{"type":"object","additionalProperties":false,"required":["status","notice","freeAccess"],"properties":{"status":{"const":"pending_approval"},"notice":{"type":"string"},"freeAccess":{"type":"string"}}}}}}}}},"discounts":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["paidProducts","percent"],"properties":{"paidProducts":{"type":"integer"},"percent":{"type":"number"}}}},"conditions":{"type":"object","additionalProperties":false,"required":["zeroPriceRequiresPaidProduct","zeroPriceCountsForDiscount"],"properties":{"zeroPriceRequiresPaidProduct":{"const":true},"zeroPriceCountsForDiscount":{"const":false}}}}},"Entitlements":{"type":"object","additionalProperties":false,"required":["email","organizations"],"properties":{"email":{"type":"string","description":"Normalized address for legacy lookup; empty for sub lookup."},"organizations":{"type":"array","items":{"type":"object","additionalProperties":false,"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","minItems":6,"maxItems":6,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["product","tier","status"],"properties":{"product":{"enum":["agora","sentinel","scribe","cards","syncs","uniflo"]},"tier":{"type":"string"},"status":{"enum":["active","disabled"]}}}}}}}}}}}}