pub const OPENAPI: &str = "{\n \"openapi\": \"3.1.1\",\n \"info\": {\n \"title\": \"vcon-server\",\n \"version\": \"0.2.0\",\n \"description\": \"Stores vCons encrypted at rest and returns them to authorised readers. Every route needs a bearer key; errors are RFC 9457 problem documents.\",\n \"license\": {\n \"name\": \"MIT OR Apache-2.0\",\n \"identifier\": \"MIT OR Apache-2.0\"\n }\n },\n \"servers\": [\n {\n \"url\": \"https://vcon.example.com\",\n \"description\": \"Your server\"\n }\n ],\n \"externalDocs\": {\n \"url\": \"https://vcon-server.com/docs/http-api/\"\n },\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"paths\": {\n \"/vcons\": {\n \"post\": {\n \"operationId\": \"storeVcon\",\n \"summary\": \"Store a new vCon\",\n \"description\": \"Needs a key with the write scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The same bytes are already current\",\n \"headers\": {\n \"ETag\": {\n \"description\": \"The version id as a strong entity tag\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"201\": {\n \"description\": \"Stored\",\n \"headers\": {\n \"ETag\": {\n \"description\": \"The version id as a strong entity tag\",\n \"schema\": {\n \"type\": \"string\"\n }\n },\n \"Location\": {\n \"description\": \"/vcons/{uuid}\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"409\": {\n \"description\": \"Conflict: conflict, immutable, not-deleted, name-taken, holds-vcons or under-hold\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"415\": {\n \"description\": \"The media type is not taken: unsupported-media-type\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"422\": {\n \"description\": \"The body is refused: invalid-body, bad-scopes, path-uuid-mismatch or a format refusal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"requestBody\": {\n \"required\": true,\n \"description\": \"A vCon: unsigned JSON, signed (JWS) or encrypted (JWE), plain or gzipped\",\n \"content\": {\n \"application/vcon\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n },\n \"application/vcon+gzip\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n },\n \"application/json\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n }\n }\n }\n },\n \"get\": {\n \"operationId\": \"listVcons\",\n \"summary\": \"List the tenant\'s live vCons, newest stored first\",\n \"description\": \"Needs a key with the read scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"A page of vCons\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Listing\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/limit\"\n },\n {\n \"$ref\": \"#/components/parameters/cursor\"\n },\n {\n \"$ref\": \"#/components/parameters/since\"\n },\n {\n \"$ref\": \"#/components/parameters/until\"\n }\n ]\n }\n },\n \"/vcons/{uuid}\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/uuid\"\n }\n ],\n \"get\": {\n \"operationId\": \"readVcon\",\n \"summary\": \"Read the current version, as stored\",\n \"description\": \"Needs a key with the read scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The body as stored\",\n \"content\": {\n \"application/vcon\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n },\n \"application/vcon+gzip\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n }\n },\n \"headers\": {\n \"ETag\": {\n \"description\": \"The version id as a strong entity tag\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n },\n \"put\": {\n \"operationId\": \"replaceVcon\",\n \"summary\": \"Replace the current version named by If-Match\",\n \"description\": \"Needs a key with the write scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Replaced\",\n \"headers\": {\n \"ETag\": {\n \"description\": \"The version id as a strong entity tag\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"409\": {\n \"description\": \"Conflict: conflict, immutable, not-deleted, name-taken, holds-vcons or under-hold\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"412\": {\n \"description\": \"If-Match does not name the current version: precondition-failed\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"415\": {\n \"description\": \"The media type is not taken: unsupported-media-type\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"422\": {\n \"description\": \"The body is refused: invalid-body, bad-scopes, path-uuid-mismatch or a format refusal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"428\": {\n \"description\": \"If-Match is missing: precondition-required\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/ifMatch\"\n }\n ],\n \"requestBody\": {\n \"required\": true,\n \"description\": \"A vCon: unsigned JSON, signed (JWS) or encrypted (JWE), plain or gzipped\",\n \"content\": {\n \"application/vcon\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n },\n \"application/vcon+gzip\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n },\n \"application/json\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n }\n }\n }\n },\n \"delete\": {\n \"operationId\": \"deleteVcon\",\n \"summary\": \"Delete a vCon\",\n \"description\": \"Needs a key with the delete scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"Deleted, also when already deleted or purged\"\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/health\": {\n \"get\": {\n \"operationId\": \"health\",\n \"summary\": \"Whether the server answers\",\n \"description\": \"Needs any valid key.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Healthy\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Health\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/openapi.json\": {\n \"get\": {\n \"operationId\": \"openapi\",\n \"summary\": \"This description\",\n \"description\": \"Needs any valid key.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The OpenAPI description\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/key\": {\n \"get\": {\n \"operationId\": \"keyInfo\",\n \"summary\": \"What the calling key may do\",\n \"description\": \"Needs any valid key.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The key\'s id, tenant (null for an operator key) and scopes\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/KeyInfoSelf\"\n }\n }\n },\n \"headers\": {\n \"Cache-Control\": {\n \"description\": \"no-store\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/console\": {\n \"get\": {\n \"operationId\": \"consoleRedirect\",\n \"summary\": \"Sends the browser on to /console/\",\n \"security\": [],\n \"responses\": {\n \"308\": {\n \"description\": \"Location: /console/\",\n \"headers\": {\n \"Location\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n }\n },\n \"/console/\": {\n \"get\": {\n \"operationId\": \"consolePage\",\n \"summary\": \"The console\'s page; it asks for a key and holds it in page memory\",\n \"security\": [],\n \"responses\": {\n \"200\": {\n \"description\": \"The page\",\n \"content\": {\n \"text/html\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n }\n },\n \"/console/console.js\": {\n \"get\": {\n \"operationId\": \"consoleScript\",\n \"summary\": \"The console\'s script\",\n \"security\": [],\n \"responses\": {\n \"200\": {\n \"description\": \"The script\",\n \"content\": {\n \"text/javascript\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n }\n },\n \"/console/console.css\": {\n \"get\": {\n \"operationId\": \"consoleStyle\",\n \"summary\": \"The console\'s style sheet\",\n \"security\": [],\n \"responses\": {\n \"200\": {\n \"description\": \"The style sheet\",\n \"content\": {\n \"text/css\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n }\n },\n \"/console/{other}\": {\n \"parameters\": [\n {\n \"name\": \"other\",\n \"in\": \"path\",\n \"required\": true,\n \"description\": \"Any other path under /console/\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"get\": {\n \"operationId\": \"consoleNoneGet\",\n \"summary\": \"No such console file\",\n \"security\": [],\n \"responses\": {\n \"404\": {\n \"description\": \"No such file\"\n }\n }\n },\n \"put\": {\n \"operationId\": \"consoleNonePut\",\n \"summary\": \"No such console file\",\n \"security\": [],\n \"responses\": {\n \"404\": {\n \"description\": \"No such file\"\n }\n }\n },\n \"post\": {\n \"operationId\": \"consoleNonePost\",\n \"summary\": \"No such console file\",\n \"security\": [],\n \"responses\": {\n \"404\": {\n \"description\": \"No such file\"\n }\n }\n },\n \"delete\": {\n \"operationId\": \"consoleNoneDelete\",\n \"summary\": \"No such console file\",\n \"security\": [],\n \"responses\": {\n \"404\": {\n \"description\": \"No such file\"\n }\n }\n },\n \"patch\": {\n \"operationId\": \"consoleNonePatch\",\n \"summary\": \"No such console file\",\n \"security\": [],\n \"responses\": {\n \"404\": {\n \"description\": \"No such file\"\n }\n }\n }\n },\n \"/audit\": {\n \"get\": {\n \"operationId\": \"readTenantAudit\",\n \"summary\": \"A page of the key\'s tenant audit log\",\n \"description\": \"Needs a key with the audit scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Records as JSON lines, the lines audit export writes\",\n \"content\": {\n \"application/jsonl\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/after\"\n },\n {\n \"$ref\": \"#/components/parameters/auditLimit\"\n }\n ]\n }\n },\n \"/admin/audit\": {\n \"get\": {\n \"operationId\": \"readAdminAudit\",\n \"summary\": \"A page of the admin audit log\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Records as JSON lines, the lines audit export --admin writes\",\n \"content\": {\n \"application/jsonl\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/after\"\n },\n {\n \"$ref\": \"#/components/parameters/auditLimit\"\n }\n ]\n }\n },\n \"/legal/vcons/{uuid}\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/uuid\"\n }\n ],\n \"get\": {\n \"operationId\": \"legalRead\",\n \"summary\": \"The current version, or the latest kept one of a deleted uuid\",\n \"description\": \"Needs a key with the legal scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The body as stored\",\n \"content\": {\n \"application/vcon\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n },\n \"application/vcon+gzip\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n }\n },\n \"headers\": {\n \"ETag\": {\n \"description\": \"The version id as a strong entity tag\",\n \"schema\": {\n \"type\": \"string\"\n }\n },\n \"Vcon-State\": {\n \"description\": \"live or deleted\",\n \"schema\": {\n \"type\": \"string\",\n \"enum\": [\n \"live\",\n \"deleted\"\n ]\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/legal/vcons/{uuid}/versions\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/uuid\"\n }\n ],\n \"get\": {\n \"operationId\": \"legalVersions\",\n \"summary\": \"Every kept version, oldest first\",\n \"description\": \"Needs a key with the legal scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The kept versions\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/VersionInfo\"\n }\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/legal/vcons/{uuid}/versions/{version}\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/uuid\"\n },\n {\n \"$ref\": \"#/components/parameters/version\"\n }\n ],\n \"get\": {\n \"operationId\": \"legalVersion\",\n \"summary\": \"A kept version, as stored\",\n \"description\": \"Needs a key with the legal scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The body as stored\",\n \"content\": {\n \"application/vcon\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n },\n \"application/vcon+gzip\": {\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"binary\"\n }\n }\n },\n \"headers\": {\n \"ETag\": {\n \"description\": \"The version id as a strong entity tag\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/legal/vcons/{uuid}/restore\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/uuid\"\n }\n ],\n \"post\": {\n \"operationId\": \"legalRestore\",\n \"summary\": \"Make a deleted vCon live again\",\n \"description\": \"Needs a key with the legal scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Restored\",\n \"headers\": {\n \"ETag\": {\n \"description\": \"The version id as a strong entity tag\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"409\": {\n \"description\": \"Conflict: conflict, immutable, not-deleted, name-taken, holds-vcons or under-hold\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/legal/vcons/{uuid}/hold\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/uuid\"\n }\n ],\n \"put\": {\n \"operationId\": \"holdOn\",\n \"summary\": \"Put the uuid under a legal hold\",\n \"description\": \"Needs a key with the legal scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"Held\"\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n },\n \"delete\": {\n \"operationId\": \"holdOff\",\n \"summary\": \"Release the legal hold\",\n \"description\": \"Needs a key with the legal scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"Released\"\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"410\": {\n \"description\": \"Deleted or purged: gone\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/admin/tenants\": {\n \"post\": {\n \"operationId\": \"createTenant\",\n \"summary\": \"Make a tenant\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"201\": {\n \"description\": \"Made\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/TenantId\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"409\": {\n \"description\": \"Conflict: conflict, immutable, not-deleted, name-taken, holds-vcons or under-hold\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"422\": {\n \"description\": \"The body is refused: invalid-body, bad-scopes, path-uuid-mismatch or a format refusal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"requestBody\": {\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NewTenant\"\n }\n }\n }\n }\n },\n \"get\": {\n \"operationId\": \"listTenants\",\n \"summary\": \"Every tenant, by name\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The tenants\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Tenant\"\n }\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/admin/tenants/{id}\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/tenantId\"\n }\n ],\n \"patch\": {\n \"operationId\": \"setRetention\",\n \"summary\": \"Set a tenant\'s retention period\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Set\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/TenantRetention\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"422\": {\n \"description\": \"The body is refused: invalid-body, bad-scopes, path-uuid-mismatch or a format refusal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"requestBody\": {\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NewRetention\"\n }\n }\n }\n }\n },\n \"delete\": {\n \"operationId\": \"removeTenant\",\n \"summary\": \"Remove a tenant\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"Removed\"\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"409\": {\n \"description\": \"Conflict: conflict, immutable, not-deleted, name-taken, holds-vcons or under-hold\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/force\"\n }\n ]\n }\n },\n \"/admin/tenants/{id}/keys\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/tenantId\"\n }\n ],\n \"post\": {\n \"operationId\": \"createKey\",\n \"summary\": \"Make a key for the tenant; its token is shown this once\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"201\": {\n \"description\": \"Made\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NewKey\"\n }\n }\n },\n \"headers\": {\n \"Cache-Control\": {\n \"description\": \"no-store\",\n \"schema\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"422\": {\n \"description\": \"The body is refused: invalid-body, bad-scopes, path-uuid-mismatch or a format refusal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n },\n \"requestBody\": {\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NewKeyRequest\"\n }\n }\n }\n }\n },\n \"get\": {\n \"operationId\": \"listKeys\",\n \"summary\": \"The tenant\'s keys, oldest first; never a token\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"The keys\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/KeyInfo\"\n }\n }\n }\n }\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n },\n \"/admin/keys/{id}\": {\n \"parameters\": [\n {\n \"$ref\": \"#/components/parameters/keyId\"\n }\n ],\n \"delete\": {\n \"operationId\": \"revokeKey\",\n \"summary\": \"Revoke a key\",\n \"description\": \"Needs a key with the admin scope.\",\n \"security\": [\n {\n \"bearer\": []\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"Revoked, also when already revoked\"\n },\n \"400\": {\n \"description\": \"A bad request: bad-body, bad-path-uuid, bad-path-version or bad-query\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"401\": {\n \"description\": \"No valid bearer key: unauthorized\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"403\": {\n \"description\": \"The key does not allow this: forbidden\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"404\": {\n \"description\": \"Not found: not-found, unknown-tenant or unknown-key\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"408\": {\n \"description\": \"The body did not arrive in time: timeout\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"413\": {\n \"description\": \"The body is over the size limit: too-large\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"500\": {\n \"description\": \"The server failed or a version is damaged: damaged or internal\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n },\n \"503\": {\n \"description\": \"The service cannot answer now: unavailable, audit-failed, limit-reached or master-key-limit\",\n \"content\": {\n \"application/problem+json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Problem\"\n }\n }\n }\n }\n }\n }\n }\n },\n \"components\": {\n \"securitySchemes\": {\n \"bearer\": {\n \"type\": \"http\",\n \"scheme\": \"bearer\",\n \"description\": \"An API key token: vcs_<16 hex digits>_<43 base64url characters>\"\n }\n },\n \"parameters\": {\n \"uuid\": {\n \"name\": \"uuid\",\n \"in\": \"path\",\n \"required\": true,\n \"description\": \"The vCon\'s uuid, RFC 9562 text form\",\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"uuid\"\n }\n },\n \"version\": {\n \"name\": \"version\",\n \"in\": \"path\",\n \"required\": true,\n \"description\": \"A version id\",\n \"schema\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n }\n },\n \"tenantId\": {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"description\": \"A tenant id\",\n \"schema\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n }\n },\n \"keyId\": {\n \"name\": \"id\",\n \"in\": \"path\",\n \"required\": true,\n \"description\": \"A key id\",\n \"schema\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{16}$\"\n }\n },\n \"ifMatch\": {\n \"name\": \"If-Match\",\n \"in\": \"header\",\n \"required\": true,\n \"description\": \"The current version\'s ETag\",\n \"schema\": {\n \"type\": \"string\"\n }\n },\n \"limit\": {\n \"name\": \"limit\",\n \"in\": \"query\",\n \"required\": false,\n \"description\": \"vCons a page, 1 to 1000\",\n \"schema\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 1000,\n \"default\": 100\n }\n },\n \"cursor\": {\n \"name\": \"cursor\",\n \"in\": \"query\",\n \"required\": false,\n \"description\": \"The previous page\'s next, unchanged\",\n \"schema\": {\n \"type\": \"string\"\n }\n },\n \"since\": {\n \"name\": \"since\",\n \"in\": \"query\",\n \"required\": false,\n \"description\": \"First stored at or after, RFC 3339\",\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n },\n \"until\": {\n \"name\": \"until\",\n \"in\": \"query\",\n \"required\": false,\n \"description\": \"First stored before, RFC 3339\",\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n },\n \"after\": {\n \"name\": \"after\",\n \"in\": \"query\",\n \"required\": false,\n \"description\": \"The page starts after this seq\",\n \"schema\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 0\n }\n },\n \"auditLimit\": {\n \"name\": \"limit\",\n \"in\": \"query\",\n \"required\": false,\n \"description\": \"Records a page, 1 to 10000\",\n \"schema\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 10000,\n \"default\": 1000\n }\n },\n \"force\": {\n \"name\": \"force\",\n \"in\": \"query\",\n \"required\": false,\n \"description\": \"true also removes a tenant that holds vCons; no query overrides a legal hold\",\n \"schema\": {\n \"type\": \"boolean\",\n \"default\": false\n }\n }\n },\n \"schemas\": {\n \"Problem\": {\n \"type\": \"object\",\n \"description\": \"An RFC 9457 problem document\",\n \"required\": [\n \"type\",\n \"title\",\n \"status\"\n ],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"https://vcon-server.com/problems/ambiguous-form\",\n \"https://vcon-server.com/problems/audit-failed\",\n \"https://vcon-server.com/problems/bad-body\",\n \"https://vcon-server.com/problems/bad-critical\",\n \"https://vcon-server.com/problems/bad-gzip\",\n \"https://vcon-server.com/problems/bad-path-uuid\",\n \"https://vcon-server.com/problems/bad-path-version\",\n \"https://vcon-server.com/problems/bad-payload\",\n \"https://vcon-server.com/problems/bad-query\",\n \"https://vcon-server.com/problems/bad-scopes\",\n \"https://vcon-server.com/problems/bad-uuid\",\n \"https://vcon-server.com/problems/conflict\",\n \"https://vcon-server.com/problems/damaged\",\n \"https://vcon-server.com/problems/duplicate-member\",\n \"https://vcon-server.com/problems/forbidden\",\n \"https://vcon-server.com/problems/gone\",\n \"https://vcon-server.com/problems/holds-vcons\",\n \"https://vcon-server.com/problems/immutable\",\n \"https://vcon-server.com/problems/internal\",\n \"https://vcon-server.com/problems/invalid-body\",\n \"https://vcon-server.com/problems/limit-reached\",\n \"https://vcon-server.com/problems/master-key-limit\",\n \"https://vcon-server.com/problems/missing-created-at\",\n \"https://vcon-server.com/problems/missing-uuid\",\n \"https://vcon-server.com/problems/name-taken\",\n \"https://vcon-server.com/problems/no-form\",\n \"https://vcon-server.com/problems/not-a-vcon\",\n \"https://vcon-server.com/problems/not-deleted\",\n \"https://vcon-server.com/problems/not-found\",\n \"https://vcon-server.com/problems/not-json\",\n \"https://vcon-server.com/problems/path-uuid-mismatch\",\n \"https://vcon-server.com/problems/precondition-failed\",\n \"https://vcon-server.com/problems/precondition-required\",\n \"https://vcon-server.com/problems/timeout\",\n \"https://vcon-server.com/problems/too-deep\",\n \"https://vcon-server.com/problems/too-large\",\n \"https://vcon-server.com/problems/unauthorized\",\n \"https://vcon-server.com/problems/unavailable\",\n \"https://vcon-server.com/problems/under-hold\",\n \"https://vcon-server.com/problems/unknown-key\",\n \"https://vcon-server.com/problems/unknown-tenant\",\n \"https://vcon-server.com/problems/unsupported-extension\",\n \"https://vcon-server.com/problems/unsupported-media-type\",\n \"https://vcon-server.com/problems/uuid-mismatch\"\n ]\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"type\": \"integer\"\n }\n }\n },\n \"Listed\": {\n \"type\": \"object\",\n \"required\": [\n \"uuid\",\n \"version\",\n \"stored_at\",\n \"updated_at\"\n ],\n \"properties\": {\n \"uuid\": {\n \"type\": \"string\",\n \"format\": \"uuid\"\n },\n \"version\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n },\n \"stored_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"When the uuid was first stored\"\n },\n \"updated_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"When its current version was stored\"\n }\n }\n },\n \"Listing\": {\n \"type\": \"object\",\n \"required\": [\n \"vcons\",\n \"next\"\n ],\n \"properties\": {\n \"vcons\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/components/schemas/Listed\"\n }\n },\n \"next\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"description\": \"The next page\'s cursor; null on the last\"\n }\n }\n },\n \"VersionInfo\": {\n \"type\": \"object\",\n \"required\": [\n \"version\",\n \"stored_at\",\n \"hidden_at\",\n \"current\"\n ],\n \"properties\": {\n \"version\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n },\n \"stored_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"hidden_at\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"format\": \"date-time\"\n },\n \"current\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"Health\": {\n \"type\": \"object\",\n \"required\": [\n \"status\"\n ],\n \"properties\": {\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"ok\"\n ]\n }\n }\n },\n \"NewTenant\": {\n \"type\": \"object\",\n \"required\": [\n \"name\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 128\n },\n \"retention\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"description\": \"A period such as 7y, 18m or 90d; null or absent for the server default\"\n }\n }\n },\n \"TenantId\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n }\n }\n },\n \"Tenant\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"name\",\n \"retention\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"retention\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"NewRetention\": {\n \"type\": \"object\",\n \"required\": [\n \"retention\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"retention\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"TenantRetention\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"retention\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{32}$\"\n },\n \"retention\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n }\n }\n },\n \"NewKeyRequest\": {\n \"type\": \"object\",\n \"required\": [\n \"scopes\",\n \"label\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"scopes\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"uniqueItems\": true,\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"write\",\n \"read\",\n \"delete\",\n \"legal\",\n \"audit\"\n ]\n }\n },\n \"label\": {\n \"type\": \"string\"\n }\n }\n },\n \"KeyInfoSelf\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"tenant\",\n \"scopes\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"tenant\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"scopes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"NewKey\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"token\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"token\": {\n \"type\": \"string\"\n }\n }\n },\n \"KeyInfo\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"tenant\",\n \"scopes\",\n \"label\",\n \"created_at\",\n \"revoked_at\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"tenant\": {\n \"type\": [\n \"string\",\n \"null\"\n ]\n },\n \"scopes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"created_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"revoked_at\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"format\": \"date-time\"\n }\n }\n }\n }\n }\n}\n";Expand description
The OpenAPI description of every route, as GET /openapi.json serves
it and the website publishes it.