# Proposal ## Why The OpenAPI document (`GET /api/v1/docs/openapi.json`) lists every route, but it does not describe the API well enough to use it without reading the code: - No operation has an `operationId`. - Most parameters have no description. - Comma-separated lists are typed as bare strings. - Several error responses are missing or have no body schema. - Some responses are declared that the edition never answers. - There is no `servers`, `license` or tag list. The unknown-route `404` also names a path without its `/api` prefix. ## What Changes - **Document metadata:** - `info` gains a description of the API conventions (authentication, time ranges, pagination, errors, conditional requests, request IDs, versioning) and the license. - `servers` gains the public base path. - A `tags` list, with one description per tag, in a stable order. - **Operations:** - Every operation has a unique `operationId` and tags from that list. - Every parameter has a description. - Comma-separated list parameters are documented as arrays of their allowed values (`style: form`, `explode: false`). - Routes answered conditionally declare the `If-None-Match` request header next to their `ETag` and `304`. - The auth routes declare the refresh cookie they read (as a cookie security scheme) and the `Set-Cookie` header they send. - **Error responses:** - Every error response an operation can answer is declared with the `ApiError` schema. - `400` is declared only for operations that take input. - A response that only one edition answers appears only in that edition's document. This covers the automatic `PRO_FEATURE` `403`, which no listed route answers, and the `403` of PRO metrics on the CE analytics routes. - **Schemas:** the ingress summary's `byInputType` is a plain object with its three keys. It was a record that required keys it never defined. - **404 message:** the unknown-route `404` message names the full request path, `No API route for GET /api/v1/does-not-exist`. Scope excludes the following: - No route, parameter or response body changes. - The PRO routes are documented by the PRO workspace on top of the generic pieces this change adds, so CE needs no PRO-specific code, and the seams stay generic: an optional license for the document and the per-route fields. Edition: CE, and the generic pieces PRO builds on. Repository: `OpenVidu/openvidu` (dashboard) only. ## Capabilities ### New Capabilities None. ### Modified Capabilities - `api-conventions`: - The OpenAPI document gains requirements on its metadata, operations, parameters and error responses. - The unknown-route scenario fixes its message. ## Impact - Backend: - `src/api/openapi.ts` (generator). - `src/api/route-registry.ts` (`operationId`, tag declarations, per-response edition, refresh cookie field). - `src/api/query.ts` (shared parameter descriptions and the array form of `csvParam`). - Every `src/*/*-routes.ts` (operation IDs, tags, parameter descriptions, error responses). - `src/ingress/ingress-responses.ts`. - `src/http/errors.ts`. - `src/lifecycle/startup.ts` (base path, and an optional license from `DashboardOptions`). - Tests: unit tests of the generator and the registry, and an integration test that checks the invariants above on the document of the booted CE dashboard. - PRO: its own routes must supply `operationId`, declared tags and parameter descriptions. That is a compile-time requirement once it moves `ce.ref`. - CHANGELOG (`CHANGELOG.md`, 3.10.0, Added › Data), a new line: "API reference outside production: an OpenAPI 3.1 document at `/api/v1/docs/openapi.json` and a browsable page at `/api/v1/docs`, with operation IDs, described parameters and every error response."