REST API
The HTTP API's source of truth is a single OpenAPI document:
vidra-core/api/openapi.yaml— 228 paths.
There is no generated reference on this site yet. Publishing one from that spec is a tracked follow-up; until it exists, browse the spec itself rather than a second-hand copy that could disagree with it.
Browsing it
# Read it locally
git clone https://github.com/yegamble/vidra-core.git
$EDITOR vidra-core/api/openapi.yaml
# Or render it in any OpenAPI viewer, e.g.
npx @redocly/cli preview-docs vidra-core/api/openapi.yaml
Every path is under /api/v1 except the root-mounted probes (/healthz,
/readyz, /version, /schemaz). Root-mounted federation and
distribution surfaces — WebFinger, NodeInfo, actor documents and inboxes,
/feeds/videos.xml, /services/oembed, /sitemap.xml — are deliberately
outside this contract: they are protocol surfaces, not REST endpoints, and
they mount only when their feature is enabled. See
Federation.
Drift is guarded, in both directions
vidra-user regenerates its client from the spec with npm run codegen, and its
types are derived from that — never hand-edit the generated shapes.
contract-ci guards drift twice:
scripts/check-contract.mjsasserts every/api/path the frontend calls exists in the spec.- A codegen step fails if the generated client is stale.
In CI the spec is fetched from the public vidra-core repo; locally the sibling
../vidra-core checkout is used.
Changing the API
A breaking change spans two repos with no atomic commit, so stage it back-compat:
- Land the additive, back-compat change in
vidra-core— itsopenapiworkflow publishes the updated spec. - Update
vidra-userto the new shape. - Remove the old endpoint in a later
vidra-corechange.
The internal search contract
vidra-search has a separate contract at
vidra-search/api/openapi.yaml,
entirely under /internal/v1, HMAC-authenticated and consumed only by
vidra-core. It is never exposed to a browser and is staged back-compat the same
way.
No PeerTube compatibility
Vidra is a clean-room implementation with its own contract. PeerTube clients, embeds and plugins do not work against it, and no endpoint here mirrors PeerTube's shapes. Moving an existing instance is a data migration, not a client swap — see Migrate from PeerTube.