Skip to main content

OPENAPI

Constant OPENAPI 

Source
pub const OPENAPI: &str = "{\n  \"openapi\": \"3.1.1\",\n  \"info\": {\n    \"title\": \"vcon-server\",\n    \"version\": \"0.4.0\",\n    \"description\": \"Stores vCons encrypted at rest and returns them to authorized 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    \"/mcp\": {\n      \"post\": {\n        \"operationId\": \"mcp\",\n        \"summary\": \"The MCP server (Model Context Protocol, streamable HTTP)\",\n        \"description\": \"Takes one JSON-RPC message per request and answers it in one JSON body, with no session and no event stream; GET and DELETE answer 405. Needs any valid key; each tool needs the scope its area and hints give it. Every request is counted in the key\'s log as mcp. A request with an Origin header is refused.\",\n        \"security\": [\n          {\n            \"bearer\": []\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"type\": \"object\",\n                \"description\": \"One JSON-RPC 2.0 message\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The JSON-RPC answer; a refused tool call is a JSON-RPC error whose data is the problem document\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"type\": \"object\",\n                  \"description\": \"One JSON-RPC 2.0 answer\"\n                }\n              }\n            }\n          },\n          \"202\": {\n            \"description\": \"A notification, taken\"\n          },\n          \"400\": {\n            \"description\": \"Not one JSON-RPC message, or protocol headers that do not match it\"\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 request carries an Origin header\"\n          },\n          \"406\": {\n            \"description\": \"The Accept header does not take application/json and text/event-stream\"\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          \"415\": {\n            \"description\": \"The body is not application/json\"\n          },\n          \"500\": {\n            \"description\": \"The MCP server failed\"\n          },\n          \"503\": {\n            \"description\": \"The service cannot answer now: unavailable or audit-failed\",\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}/metadata\": {\n      \"parameters\": [\n        {\n          \"$ref\": \"#/components/parameters/tenantId\"\n        }\n      ],\n      \"put\": {\n        \"operationId\": \"setMetadata\",\n        \"summary\": \"Set which clear columns a tenant\'s Parquet exports carry\",\n        \"description\": \"Needs a key with the admin scope. `none` writes only the version id, the store time and the sealed body; `counts` adds the form, gzip, size, the vCon\'s times and its party and dialog counts; `full` adds the uuid, the subject and the parties, which are personal data.\",\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/TenantMetadata\"\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/NewMetadata\"\n              }\n            }\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/at-capacity\",\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-arguments\",\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/rate-limited\",\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/unknown-tool\",\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          \"metadata\"\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          \"metadata\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"none\",\n              \"counts\",\n              \"full\"\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      \"NewMetadata\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"metadata\"\n        ],\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"metadata\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"none\",\n              \"counts\",\n              \"full\"\n            ]\n          }\n        }\n      },\n      \"TenantMetadata\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"id\",\n          \"metadata\"\n        ],\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[0-9a-f]{32}$\"\n          },\n          \"metadata\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"none\",\n              \"counts\",\n              \"full\"\n            ]\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.