openvibers/openvibe.contracts Commits
Contracts 0.150.0: Host's engine ids retired (Space serves space.*); OpenVibe.Video is live (#106)
Changes
@@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,the notes were in the tag and commit messages (`git tag -n1`).++## 0.150.0 — 2026-10-12++++- OpenVibe.Host removed its copy of the static hosting engine (Host#84); OpenVibe.Space serves it as `space.*` (0.149.0).++ The five engine capabilities (`host.site.manage`, `host.deploy.create`, `host.domain.manage`, `host.site.config`,++ `host.resource.read`) are retired with no routes, and the fourteen engine schemas (project, site, deploy, domain,++ site-config, their request/result pairs and the `host.deploy.activated` payload) are retired but stay loadable, each++ deprecated in favour of its `space.*` twin until 1.0.0. The host manifest keeps `host.catalog.manage`,++ `host.index_document.*` and `host.release.published`; Host answers the old routes with 410 `host.moved_to_space`.++- OpenVibe.Video's first slice is live on openvibe.video (MediaHub#28): the product text and the media-hub manifest say what++ it serves (watch pages for Live's recordings and clips, AI chapters and captions) and what is not built. `video.*` stays++ planned.++## 0.149.0 — 2026-10-12- The static hosting engine moved from OpenVibe.Host to OpenVibe.Space (plan T20 step 2), so its contracts are now@@@ -112,6 +112,104 @@"since": "0.113.0","removeAfter": "1.0.0","reason": "the developer portal (manifests, releases, trust, playgrounds) moves from OpenVibe.Codes to OpenVibe.Services (owner 2026-10-08; Codes becomes the open coding-agent harness); retired at once, kept loadable for historical events and compatibility"++ },++ {++ "id": "host.deploy-create-request",++ "replacement": "space.deploy-create-request@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.deploy-create-result",++ "replacement": "space.deploy-create-result@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.deploy",++ "replacement": "space.deploy@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.domain-manage-request",++ "replacement": "space.domain-manage-request@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.domain-manage-result",++ "replacement": "space.domain-manage-result@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.domain",++ "replacement": "space.domain@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.project",++ "replacement": "space.project@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.site-manage-request",++ "replacement": "space.site-manage-request@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.site-manage-result",++ "replacement": "space.site-manage-result@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.site",++ "replacement": "space.site@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.site-config",++ "replacement": "space.site-config@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.site-config-request",++ "replacement": "space.site-config-request@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.site-config-result",++ "replacement": "space.site-config-result@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"++ },++ {++ "id": "host.deploy.activated",++ "replacement": "space.deploy.activated@1",++ "since": "0.150.0",++ "removeAfter": "1.0.0",++ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"}]}@@@ -5468,7 +5468,7 @@"schema": "host/deploy-create-request.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.deploy-create-result",@@@ -5477,7 +5477,7 @@"schema": "host/deploy-create-result.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.deploy",@@@ -5486,7 +5486,7 @@"schema": "host/deploy.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.domain-manage-request",@@@ -5495,7 +5495,7 @@"schema": "host/domain-manage-request.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.domain-manage-result",@@@ -5504,7 +5504,7 @@"schema": "host/domain-manage-result.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.domain",@@@ -5513,7 +5513,7 @@"schema": "host/domain.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.project",@@@ -5522,7 +5522,7 @@"schema": "host/project.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.site-manage-request",@@@ -5531,7 +5531,7 @@"schema": "host/site-manage-request.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.site-config",@@@ -5540,7 +5540,7 @@"schema": "host/site-config.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.site-config-request",@@@ -5549,7 +5549,7 @@"schema": "host/site-config-request.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.site-config-result",@@@ -5558,7 +5558,7 @@"schema": "host/site-config-result.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.deploy.activated",@@@ -5567,7 +5567,7 @@"schema": "events/payloads/host.deploy.activated.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active",++ "status": "retired","adr": "ADR-004"},{@@@ -5587,7 +5587,7 @@"schema": "host/site-manage-result.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "host.catalog-manage-request",@@@ -5614,7 +5614,7 @@"schema": "host/site.v1.json","visibility": "first-party","compatibility": "backward",-- "status": "active"++ "status": "retired"},{"id": "network.node",@@@ -61896,7 +61896,7 @@"host.deploy-create-request": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/deploy-create-request.v1.json",@@@ -61945,7 +61945,7 @@"host.deploy-create-result": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/deploy-create-result.v1.json",@@@ -62121,7 +62121,7 @@"host.deploy": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/deploy.v1.json",@@@ -62293,7 +62293,7 @@"host.domain-manage-request": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/domain-manage-request.v1.json",@@@ -62323,7 +62323,7 @@"host.domain-manage-result": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/domain-manage-result.v1.json",@@@ -62372,7 +62372,7 @@"host.domain": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/domain.v1.json",@@@ -62508,7 +62508,7 @@"host.project": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/project.v1.json",@@@ -62672,7 +62672,7 @@"host.site-manage-request": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/site-manage-request.v1.json",@@@ -62828,7 +62828,7 @@"host.site-config": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/site-config.v1.json",@@@ -62895,7 +62895,7 @@"host.site-config-request": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/site-config-request.v1.json",@@@ -62946,7 +62946,7 @@"host.site-config-result": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/site-config-result.v1.json",@@@ -62967,7 +62967,7 @@"host.deploy.activated": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/events/payloads/host.deploy.activated.v1.json",@@@ -63107,7 +63107,7 @@"host.site-manage-result": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/site-manage-result.v1.json",@@@ -63705,7 +63705,7 @@"host.site": {"version": "1.0.0","owner": "host",-- "status": "active",++ "status": "retired","schema": {"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/host/site.v1.json",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -381,4251 +381,378 @@}}}-- },-- "/api/v1/deploys/{id}": {-- "delete": {-- "operationId": "delete_api_v1_deploys_id",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "get": {-- "operationId": "get_api_v1_deploys_id",-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",-- "tags": [-- "host.deploy"-- ],-- "x-openvibe-capabilities": [-- "host.deploy.create"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-deploy",-- "security": [-- {-- "openvibeToken": [-- "host.deploy.create"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.deploy-create-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/deploys/{id}/activate": {-- "post": {-- "operationId": "post_api_v1_deploys_id_activate",-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",-- "tags": [-- "host.deploy"-- ],-- "x-openvibe-capabilities": [-- "host.deploy.create"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-deploy",-- "security": [-- {-- "openvibeToken": [-- "host.deploy.create"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/deploys/{id}/log": {-- "get": {-- "operationId": "get_api_v1_deploys_id_log",-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",-- "tags": [-- "host.deploy"-- ],-- "x-openvibe-capabilities": [-- "host.deploy.create"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-deploy",-- "security": [-- {-- "openvibeToken": [-- "host.deploy.create"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.deploy-create-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/domains/{id}": {-- "delete": {-- "operationId": "delete_api_v1_domains_id",-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",-- "tags": [-- "host.domain"-- ],-- "x-openvibe-capabilities": [-- "host.domain.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.domain.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.domain-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.domain-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/domains/{id}/verify": {-- "post": {-- "operationId": "post_api_v1_domains_id_verify",-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",-- "tags": [-- "host.domain"-- ],-- "x-openvibe-capabilities": [-- "host.domain.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.domain.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.domain-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.domain-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/projects": {-- "get": {-- "operationId": "get_api_v1_projects",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "post": {-- "operationId": "post_api_v1_projects",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- }-- }-- }-- },-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/projects/{id}": {-- "delete": {-- "operationId": "delete_api_v1_projects_id",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "get": {-- "operationId": "get_api_v1_projects_id",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/projects/{id}/members/{principal}": {-- "delete": {-- "operationId": "delete_api_v1_projects_id_members_principal",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- },-- {-- "name": "principal",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "put": {-- "operationId": "put_api_v1_projects_id_members_principal",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- },-- {-- "name": "principal",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/projects/{id}/quota": {-- "get": {-- "operationId": "get_api_v1_projects_id_quota",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "put": {-- "operationId": "put_api_v1_projects_id_quota",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/projects/{id}/sites": {-- "get": {-- "operationId": "get_api_v1_projects_id_sites",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "post": {-- "operationId": "post_api_v1_projects_id_sites",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/projects/{id}/takedown": {-- "delete": {-- "operationId": "delete_api_v1_projects_id_takedown",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "post": {-- "operationId": "post_api_v1_projects_id_takedown",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/resources": {-- "get": {-- "operationId": "get_api_v1_resources",-- "summary": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ov",-- "description": "**host.resource.read** (first-party): Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",-- "tags": [-- "host.resource"-- ],-- "x-openvibe-capabilities": [-- "host.resource.read"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "standard",-- "security": [-- {-- "openvibeToken": [-- "host.resource.read"-- ]-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/common.resource-list-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/resources/{ovrn}": {-- "get": {-- "operationId": "get_api_v1_resources_ovrn",-- "summary": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ov",-- "description": "**host.resource.read** (first-party): Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",-- "tags": [-- "host.resource"-- ],-- "x-openvibe-capabilities": [-- "host.resource.read"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "standard",-- "security": [-- {-- "openvibeToken": [-- "host.resource.read"-- ]-- }-- ],-- "parameters": [-- {-- "name": "ovrn",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/common.resource-list-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}": {-- "delete": {-- "operationId": "delete_api_v1_sites_id",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "get": {-- "operationId": "get_api_v1_sites_id",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}/config": {-- "delete": {-- "operationId": "delete_api_v1_sites_id_config",-- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",-- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.config"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.config"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-config-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- },-- {-- "name": "headers",-- "in": "query",-- "required": false,-- "schema": {-- "type": "object",-- "additionalProperties": {-- "type": "string"-- }-- }-- },-- {-- "name": "redirects",-- "in": "query",-- "required": false,-- "schema": {-- "type": "array",-- "items": {-- "type": "object",-- "additionalProperties": false,-- "required": [-- "from",-- "to"-- ],-- "properties": {-- "from": {-- "type": "string"-- },-- "to": {-- "type": "string"-- },-- "status": {-- "enum": [-- 301,-- 302,-- 307,-- 308-- ]-- }-- }-- }-- }-- },-- {-- "name": "spa",-- "in": "query",-- "required": false,-- "schema": {-- "type": "boolean"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-config-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "get": {-- "operationId": "get_api_v1_sites_id_config",-- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",-- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.config"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.config"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-config-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- },-- {-- "name": "headers",-- "in": "query",-- "required": false,-- "schema": {-- "type": "object",-- "additionalProperties": {-- "type": "string"-- }-- }-- },-- {-- "name": "redirects",-- "in": "query",-- "required": false,-- "schema": {-- "type": "array",-- "items": {-- "type": "object",-- "additionalProperties": false,-- "required": [-- "from",-- "to"-- ],-- "properties": {-- "from": {-- "type": "string"-- },-- "to": {-- "type": "string"-- },-- "status": {-- "enum": [-- 301,-- 302,-- 307,-- 308-- ]-- }-- }-- }-- }-- },-- {-- "name": "spa",-- "in": "query",-- "required": false,-- "schema": {-- "type": "boolean"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-config-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "put": {-- "operationId": "put_api_v1_sites_id_config",-- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",-- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.config"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.config"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-config-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-config-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}/deploys": {-- "get": {-- "operationId": "get_api_v1_sites_id_deploys",-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",-- "tags": [-- "host.deploy"-- ],-- "x-openvibe-capabilities": [-- "host.deploy.create"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-deploy",-- "security": [-- {-- "openvibeToken": [-- "host.deploy.create"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.deploy-create-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "post": {-- "operationId": "post_api_v1_sites_id_deploys",-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",-- "tags": [-- "host.deploy"-- ],-- "x-openvibe-capabilities": [-- "host.deploy.create"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-deploy",-- "security": [-- {-- "openvibeToken": [-- "host.deploy.create"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}/domains": {-- "get": {-- "operationId": "get_api_v1_sites_id_domains",-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",-- "tags": [-- "host.domain"-- ],-- "x-openvibe-capabilities": [-- "host.domain.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.domain.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.domain-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.domain-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "post": {-- "operationId": "post_api_v1_sites_id_domains",-- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",-- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",-- "tags": [-- "host.domain"-- ],-- "x-openvibe-capabilities": [-- "host.domain.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.domain.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.domain-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.domain-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}/rollback": {-- "post": {-- "operationId": "post_api_v1_sites_id_rollback",-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",-- "tags": [-- "host.deploy"-- ],-- "x-openvibe-capabilities": [-- "host.deploy.create"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-deploy",-- "security": [-- {-- "openvibeToken": [-- "host.deploy.create"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}/source": {-- "delete": {-- "operationId": "delete_api_v1_sites_id_source",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "get": {-- "operationId": "get_api_v1_sites_id_source",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "put": {-- "operationId": "put_api_v1_sites_id_source",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}/source/deploys": {-- "post": {-- "operationId": "post_api_v1_sites_id_source_deploys",-- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",-- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",-- "tags": [-- "host.deploy"-- ],-- "x-openvibe-capabilities": [-- "host.deploy.create"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-deploy",-- "security": [-- {-- "openvibeToken": [-- "host.deploy.create"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.deploy-create-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- },-- "/api/v1/sites/{id}/takedown": {-- "delete": {-- "operationId": "delete_api_v1_sites_id_takedown",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "x-openvibe-input": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- },-- "post": {-- "operationId": "post_api_v1_sites_id_takedown",-- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",-- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",-- "tags": [-- "host.site"-- ],-- "x-openvibe-capabilities": [-- "host.site.manage"-- ],-- "x-openvibe-visibility": [-- "first-party"-- ],-- "x-openvibe-quota-class": "host-manage",-- "security": [-- {-- "openvibeToken": [-- "host.site.manage"-- ]-- }-- ],-- "requestBody": {-- "required": false,-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-request.v1"-- }-- }-- }-- },-- "parameters": [-- {-- "name": "id",-- "in": "path",-- "required": true,-- "schema": {-- "type": "string"-- }-- }-- ],-- "responses": {-- "2XX": {-- "description": "Success",-- "content": {-- "application/json": {-- "schema": {-- "$ref": "#/components/schemas/host.site-manage-result.v1"-- }-- }-- }-- },-- "default": {-- "description": "An error (RFC 9457 problem details)",-- "content": {-- "application/problem+json": {-- "schema": {-- "$ref": "#/components/schemas/errors.problem.v1"-- }-- }-- }-- }-- }-- }-- }-- },-- "components": {-- "schemas": {-- "common.no-body.v1": {-- "title": "NoBody",-- "description": "common.no-body@1: the capability's request carries no body; its parameters are the path and query of the routes in implementedBy (an id, a page cursor). An input schema that says so explicitly, so every active capability names one (roadmap WS-C task 4).",-- "type": "object",-- "maxProperties": 0-- },-- "common.resource-list-result.v1": {-- "title": "ResourceListResult",-- "description": "A page of the resource index (roadmap WS-Z7).",-- "type": "object",-- "additionalProperties": false,-- "required": [-- "resources",-- "next_cursor"-- ],-- "properties": {-- "resources": {-- "type": "array",-- "items": {-- "$ref": "#/components/schemas/common.resource-summary.v1"-- }-- },-- "next_cursor": {-- "type": [-- "string",-- "null"-- ]-- },-- "partial": {-- "type": "array",-- "description": "Authorities a merged index (OpenVibe.Services, ADR-048) could not read for this page: a slow or failing authority is omitted, never fails the page. Each entry names the authority and the problem code it answered. Added in 1.1.0; a single authority's own index leaves it out.",-- "items": {-- "type": "object",-- "required": [-- "service",-- "code"-- ],-- "additionalProperties": false,-- "properties": {-- "service": {-- "type": "string",-- "pattern": "^[a-z][a-z0-9-]{1,39}$"-- },-- "code": {-- "type": "string",-- "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"-- }-- }-- }-- }-- }-- },-- "common.resource-summary.v1": {-- "title": "ResourceSummary",-- "description": "One resource of any service, as the resource index lists it (roadmap WS-Z7): every service answers GET /api/v1/resources with these, so OpenVibe.Services shows any resource without owning its data.",-- "type": "object",-- "additionalProperties": false,-- "required": [-- "id",-- "kind",-- "service",-- "state",-- "created_at"-- ],-- "properties": {-- "id": {-- "type": "string"-- },-- "kind": {-- "type": "string",-- "description": "service.kind, e.g. watch.watch, actor.actor, media.object, events.subscription"-- },-- "service": {-- "type": "string"-- },-- "project_id": {-- "type": "string",-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "ovrn": {-- "type": "string",-- "maxLength": 200,-- "pattern": "^ovrn:[a-z][a-z0-9-]{0,31}:prj_[0-9A-HJKMNP-TV-Z]{26}:[a-z][a-z0-9-]{0,39}/[a-z]{3}_[0-9A-HJKMNP-TV-Z]{26}$",-- "description": "Optional resource name (ADR-034 section 2), the name grants, audit, events, usage records and bills use: ovrn:<service>:<project_id>:<type>/<id>, e.g. ovrn:watch:<project_id>:watch/<wch_id>, with the pattern of common.usage-recorded@1 resource. Its service, project and id are this summary's service, project_id and id. Added in 1.1.0."-- },-- "owner": {-- "$ref": "#/components/schemas/identity.subject-ref.v1"-- },-- "name": {-- "type": "string"-- },-- "state": {-- "type": "string"-- },-- "created_at": {-- "type": "string",-- "format": "date-time"-- },-- "updated_at": {-- "type": "string",-- "format": "date-time"-- },-- "usage": {-- "type": "object",-- "additionalProperties": {-- "type": "number",-- "minimum": 0-- },-- "properties": {},-- "description": "cost units by name (WS-Z1)"-- },-- "links": {-- "type": "object",-- "additionalProperties": false,-- "properties": {-- "self": {-- "type": "string",-- "format": "uri"-- },-- "console": {-- "type": "string",-- "format": "uri"-- },-- "docs": {-- "type": "string",-- "format": "uri"-- }-- }-- }-- }-- },-- "errors.problem.v1": {-- "title": "Problem",-- "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",-- "type": "object",-- "required": [-- "type",-- "title",-- "status",-- "code"-- ],-- "additionalProperties": true,-- "properties": {-- "type": {-- "type": "string",-- "format": "uri-reference"-- },-- "title": {-- "type": "string",-- "minLength": 1-- },-- "status": {-- "type": "integer",-- "minimum": 400,-- "maximum": 599-- },-- "detail": {-- "type": "string"-- },-- "instance": {-- "type": "string",-- "format": "uri-reference"-- },-- "code": {-- "type": "string",-- "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"-- },-- "request_id": {-- "type": "string"-- },-- "trace_id": {-- "type": "string",-- "pattern": "^[0-9a-f]{32}$"-- },-- "errors": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "message"-- ],-- "properties": {-- "path": {-- "type": "string"-- },-- "message": {-- "type": "string"-- }-- }-- }-- },-- "error": {-- "type": "string",-- "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."-- }-- }-- },-- "host.catalog-manage-request.v1": {-- "title": "HostCatalogManageRequest",-- "description": "host.catalog-manage-request@1: bodies of host.catalog.manage on OpenVibe.Host (a Network staff user only). POST/PATCH /api/v1/catalog/providers { slug, name, homepage_url, description?, affiliate_url?, affiliate_note?, status? }; POST/PATCH /api/v1/catalog/plans { provider_id, external_id, name, kind, currency, price_monthly, source_url, vcpu?, ram_mb?, disk_gb?, disk_type?, bandwidth_gb?, unmetered?, port_mbps?, ipv4?, locations?, price_hourly?, setup_fee?, checked_at?, status? } (a plan from OpenVibe.Sources takes only status); POST/PATCH /api/v1/catalog/promos { provider_id, title, url, details?, code?, affiliate?, starts_at?, ends_at?, status? }. A PATCH carries any subset. Unknown fields are refused (422 host.catalog.invalid); a missing entry is 404 host.catalog.not_found; anyone but staff is 403 host.catalog.forbidden. A staff plan's checked_at defaults to now: the staff member confirming the price that day.",-- "anyOf": [-- {-- "type": "object",-- "additionalProperties": false,-- "properties": {-- "slug": {-- "type": "string",-- "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",-- "maxLength": 80-- },-- "name": {-- "type": "string",-- "minLength": 1,-- "maxLength": 2048-- },-- "homepage_url": {-- "type": "string",-- "maxLength": 2048,-- "pattern": "^https?://"-- },-- "description": {-- "type": [-- "string",-- "null"-- ],-- "maxLength": 2048-- },-- "affiliate_url": {-- "anyOf": [-- {-- "type": "string",-- "maxLength": 2048,-- "pattern": "^https?://"-- },-- {-- "type": "null"-- }-- ]-- },-- "affiliate_note": {-- "type": [-- "string",-- "null"-- ],-- "maxLength": 2048,-- "description": "The exact disclosure shown beside the provider's affiliate links."-- },-- "status": {-- "enum": [-- "active",-- "hidden"-- ]-- }-- }-- },-- {-- "type": "object",-- "additionalProperties": false,-- "properties": {-- "provider_id": {-- "type": "string"-- },-- "external_id": {-- "type": "string",-- "minLength": 1,-- "maxLength": 2048-- },-- "name": {-- "type": "string",-- "minLength": 1,-- "maxLength": 2048-- },-- "kind": {-- "enum": [-- "cloud",-- "vps",-- "dedicated",-- "storage",-- "domain"-- ]-- },-- "vcpu": {-- "type": "number",-- "minimum": 0-- },-- "ram_mb": {-- "type": "number",-- "minimum": 0-- },-- "disk_gb": {-- "type": "number",-- "minimum": 0-- },-- "disk_type": {-- "enum": [-- "ssd",-- "nvme",-- "hdd",-- null-- ]-- },-- "bandwidth_gb": {-- "type": "number",-- "minimum": 0-- },-- "unmetered": {-- "type": [-- "boolean",-- "null"-- ]-- },-- "port_mbps": {-- "type": "number",-- "minimum": 0-- },-- "ipv4": {-- "type": "integer",-- "minimum": 0-- },-- "locations": {-- "type": [-- "array",-- "null"-- ],-- "items": {-- "type": "string",-- "minLength": 1-- }-- },-- "currency": {-- "type": "string",-- "pattern": "^[A-Z]{3}$",-- "description": "ISO 4217."-- },-- "price_monthly": {-- "type": "number",-- "minimum": 0,-- "exclusiveMaximum": 100000000-- },-- "price_hourly": {-- "type": [-- "number",-- "null"-- ],-- "minimum": 0-- },-- "setup_fee": {-- "type": [-- "number",-- "null"-- ],-- "minimum": 0-- },-- "source_url": {-- "type": "string",-- "maxLength": 2048,-- "pattern": "^https?://"-- },-- "checked_at": {-- "type": "integer",-- "minimum": 0,-- "description": "Epoch milliseconds the price was confirmed."-- },-- "status": {-- "enum": [-- "active",-- "gone",-- "hidden"-- ]-- }-- }-- },-- {-- "type": "object",-- "additionalProperties": false,-- "properties": {-- "provider_id": {-- "type": "string"-- },-- "title": {-- "type": "string",-- "minLength": 1,-- "maxLength": 2048-- },-- "details": {-- "type": [-- "string",-- "null"-- ],-- "maxLength": 2048-- },-- "code": {-- "type": [-- "string",-- "null"-- ],-- "maxLength": 2048-- },-- "url": {-- "type": "string",-- "maxLength": 2048,-- "pattern": "^https?://"-- },-- "affiliate": {-- "type": [-- "boolean",-- "null"-- ]-- },-- "starts_at": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "Epoch milliseconds."-- },-- "ends_at": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "Epoch milliseconds."-- },-- "status": {-- "enum": [-- "active",-- "ended",-- "hidden"-- ]-- }-- }-- }-- ]-- },-- "host.catalog-manage-result.v1": {-- "title": "HostCatalogManageResult",-- "description": "host.catalog-manage-result@1: the saved entry, under its type's name: { provider } (with affiliate_rel and affiliate_disclosure when it has an affiliate link), { plan } or { promo } (an active promo past ends_at reads as ended). 201 on create, 200 on update.",-- "anyOf": [-- {-- "type": "object",-- "required": [-- "provider"-- ],-- "properties": {-- "provider": {-- "type": "object",-- "required": [-- "id"-- ],-- "properties": {-- "id": {-- "type": "string"-- }-- },-- "additionalProperties": true-- }-- }-- },-- {-- "type": "object",-- "required": [-- "plan"-- ],-- "properties": {-- "plan": {-- "type": "object",-- "required": [-- "id"-- ],-- "properties": {-- "id": {-- "type": "string"-- }-- },-- "additionalProperties": true-- }-- }-- },-- {-- "type": "object",-- "required": [-- "promo"-- ],-- "properties": {-- "promo": {-- "type": "object",-- "required": [-- "id"-- ],-- "properties": {-- "id": {-- "type": "string"-- }-- },-- "additionalProperties": true-- }-- }-- }-- ]-- },-- "host.deploy-create-request.v1": {-- "title": "HostDeployCreateRequest",-- "description": "host.deploy-create-request@1: bodies of host.deploy.create on OpenVibe.Host (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.",-- "anyOf": [-- {-- "type": "string",-- "contentEncoding": "binary",-- "description": "The upload itself: the tar or tar.gz bytes, or the multipart/form-data body (as common.binary@1)."-- },-- {-- "type": "object",-- "properties": {-- "deploy_id": {-- "anyOf": [-- {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- {-- "type": "null"-- }-- ]-- },-- "expected_active": {-- "anyOf": [-- {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- {-- "type": "null"-- }-- ],-- "description": "The deploy you saw active (null: none); refused with 409 site.active_changed when it moved."-- }-- }-- },-- {-- "$ref": "#/components/schemas/common.no-body.v1"-- }-- ]-- },-- "host.deploy-create-result.v1": {-- "title": "HostDeployCreateResult",-- "description": "host.deploy-create-result@1: answers of host.deploy.create on OpenVibe.Host. GET /api/v1/sites/:id/deploys?limit= → { active_deploy_id, deploys, activations } (newest first; the last 20 pointer switches). POST /api/v1/sites/:id/deploys → 201 { deploy, activated, url } (the ready deploy with its validation log; activated when activate=1 switched the site to it). GET /api/v1/deploys/:id → { deploy } with its files. GET /api/v1/deploys/:id/log → { deploy_id, state, log }. POST /api/v1/deploys/:id/activate and /sites/:id/rollback → { active_deploy_id, previous_deploy_id, changed } (changed false when it was already active). Emits host.deploy.created|activated|failed.",-- "anyOf": [-- {-- "type": "object",-- "required": [-- "active_deploy_id",-- "deploys",-- "activations"-- ],-- "properties": {-- "active_deploy_id": {-- "anyOf": [-- {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- {-- "type": "null"-- }-- ]-- },-- "deploys": {-- "type": "array",-- "items": {-- "$ref": "#/components/schemas/host.deploy.v1"-- }-- },-- "activations": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "deploy_id",-- "previous_deploy_id",-- "kind",-- "actor",-- "at"-- ],-- "properties": {-- "deploy_id": {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "previous_deploy_id": {-- "anyOf": [-- {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- {-- "type": "null"-- }-- ]-- },-- "kind": {-- "enum": [-- "activate",-- "rollback"-- ]-- },-- "actor": {-- "type": "string"-- },-- "at": {-- "type": "string",-- "format": "date-time"-- }-- }-- }-- }-- }-- },-- {-- "type": "object",-- "required": [-- "deploy"-- ],-- "properties": {-- "deploy": {-- "$ref": "#/components/schemas/host.deploy.v1"-- },-- "activated": {-- "type": "boolean"-- },-- "url": {-- "type": "string"-- }-- }-- },-- {-- "type": "object",-- "required": [-- "deploy_id",-- "state",-- "log"-- ],-- "properties": {-- "deploy_id": {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "state": {-- "enum": [-- "ready",-- "failed",-- "deleted"-- ]-- },-- "log": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "level",-- "message",-- "at"-- ],-- "properties": {-- "level": {-- "enum": [-- "info",-- "warn",-- "error"-- ]-- },-- "message": {-- "type": "string"-- },-- "at": {-- "type": "string",-- "format": "date-time"-- }-- }-- }-- }-- }-- },-- {-- "type": "object",-- "required": [-- "active_deploy_id",-- "previous_deploy_id",-- "changed"-- ],-- "properties": {-- "active_deploy_id": {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "previous_deploy_id": {-- "anyOf": [-- {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- {-- "type": "null"-- }-- ]-- },-- "changed": {-- "type": "boolean"-- }-- }-- }-- ]-- },-- "host.deploy.v1": {-- "title": "HostDeploy",-- "description": "host.deploy@1: one immutable static deploy on OpenVibe.Host (server/http/serialize.js deploy): ready (validated and stored, never executed) or failed (refused, with its failure code and log), whether the site serves it, its size and manifest hash. GET /api/v1/deploys/:id adds the files; the upload answer adds the log.",-- "type": "object",-- "required": [-- "id",-- "site_id",-- "project_id",-- "state",-- "active",-- "source",-- "file_count",-- "total_bytes",-- "new_bytes",-- "manifest_sha256",-- "failure_code",-- "created_by",-- "created_at"-- ],-- "properties": {-- "id": {-- "type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "site_id": {-- "type": "string",-- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "project_id": {-- "type": "string",-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "state": {-- "enum": [-- "ready",-- "failed",-- "deleted"-- ]-- },-- "active": {-- "type": "boolean"-- },-- "source": {-- "enum": [-- "archive",-- "files",-- "preview",-- "git"-- ]-- },-- "git": {-- "type": "object",-- "required": [-- "provider",-- "repo_url",-- "ref",-- "commit_sha"-- ],-- "properties": {-- "provider": {-- "type": "string"-- },-- "repo_url": {-- "type": "string"-- },-- "ref": {-- "type": "string"-- },-- "commit_sha": {-- "type": "string",-- "pattern": "^[0-9a-f]{40}$"-- }-- },-- "description": "Present on source git: the commit this deploy was built from (public provenance, never a credential)."-- },-- "file_count": {-- "type": "integer",-- "minimum": 0-- },-- "total_bytes": {-- "type": "integer",-- "minimum": 0-- },-- "new_bytes": {-- "type": "integer",-- "minimum": 0,-- "description": "Bytes this deploy added to the project's store."-- },-- "manifest_sha256": {-- "type": [-- "string",-- "null"-- ],-- "pattern": "^[0-9a-f]{64}$"-- },-- "failure_code": {-- "type": [-- "string",-- "null"-- ]-- },-- "created_by": {-- "type": "string"-- },-- "created_at": {-- "type": "string",-- "format": "date-time"-- },-- "files": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "path",-- "sha256",-- "size",-- "content_type"-- ],-- "properties": {-- "path": {-- "type": "string"-- },-- "sha256": {-- "type": "string",-- "pattern": "^[0-9a-f]{64}$"-- },-- "size": {-- "type": "integer",-- "minimum": 0-- },-- "content_type": {-- "type": "string"-- }-- }-- }-- },-- "log": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "level",-- "message",-- "at"-- ],-- "properties": {-- "level": {-- "enum": [-- "info",-- "warn",-- "error"-- ]-- },-- "message": {-- "type": "string"-- },-- "at": {-- "type": "string",-- "format": "date-time"-- }-- }-- }-- }-- }-- },-- "host.domain-manage-request.v1": {-- "title": "HostDomainManageRequest",-- "description": "host.domain-manage-request@1: bodies of host.domain.manage on OpenVibe.Host (a maintainer or above of the project). POST /api/v1/sites/:id/domains { hostname } adds a custom domain, pending until its TXT record is verified: a fully qualified host name, lowercased (422 domain.invalid_hostname; 422 domain.reserved for any OpenVibe domain; 403 domain.sandbox in sandbox projects; 429 quota.custom_domains; 409 domain.exists, domain.taken). GET /api/v1/sites/:id/domains, POST /api/v1/domains/:id/verify (checks the TXT record now) and DELETE /api/v1/domains/:id (409 domain.default: the default domain goes only with the site) take no body.",-- "anyOf": [-- {-- "type": "object",-- "required": [-- "hostname"-- ],-- "properties": {-- "hostname": {-- "type": "string",-- "minLength": 1,-- "maxLength": 254,-- "description": "e.g. www.example.org (a trailing dot is dropped)."-- }-- }-- },-- {-- "$ref": "#/components/schemas/common.no-body.v1"-- }-- ]-- },-- "host.domain-manage-result.v1": {-- "title": "HostDomainManageResult",-- "description": "host.domain-manage-result@1: answers of host.domain.manage on OpenVibe.Host. GET /api/v1/sites/:id/domains → { domains } (the default domain first). POST /api/v1/sites/:id/domains → 201 { domain } with the DNS records to publish. POST /api/v1/domains/:id/verify → { domain } after the check (status verified and served once the TXT record matches, else last_error says what was found; emits host.domain.verified). DELETE /api/v1/domains/:id → { deleted: true }.",-- "anyOf": [-- {-- "type": "object",-- "required": [-- "domains"-- ],-- "properties": {-- "domains": {-- "type": "array",-- "items": {-- "$ref": "#/components/schemas/host.domain.v1"-- }-- }-- }-- },-- {-- "type": "object",-- "required": [-- "domain"-- ],-- "properties": {-- "domain": {-- "$ref": "#/components/schemas/host.domain.v1"-- }-- }-- },-- {-- "type": "object",-- "required": [-- "deleted"-- ],-- "properties": {-- "deleted": {-- "const": true-- }-- }-- }-- ]-- },-- "host.domain.v1": {-- "title": "HostDomain",-- "description": "host.domain@1: one domain of a static site on OpenVibe.Host (server/http/serialize.js domain): the default <site>.openvibe.host, or a custom domain that is served only once its DNS TXT record is verified (re-checked daily; it lapses when the record is gone). A custom domain carries the records its owner must publish (the TXT verification value is public by design and shown only to members); TLS certificates are issued by an operator.",-- "type": "object",-- "required": [-- "id",-- "site_id",-- "hostname",-- "kind",-- "status",-- "served",-- "verified_at",-- "last_checked_at",-- "last_error"-- ],-- "properties": {-- "id": {-- "type": "string",-- "pattern": "^dom_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "site_id": {-- "type": "string",-- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "hostname": {-- "type": "string"-- },-- "kind": {-- "enum": [-- "default",-- "custom"-- ]-- },-- "status": {-- "enum": [-- "pending",-- "verified",-- "failed",-- "lapsed"-- ]-- },-- "served": {-- "type": "boolean"-- },-- "verified_at": {-- "type": [-- "string",-- "null"-- ],-- "format": "date-time"-- },-- "last_checked_at": {-- "type": [-- "string",-- "null"-- ],-- "format": "date-time"-- },-- "last_error": {-- "type": [-- "string",-- "null"-- ]-- },-- "instructions": {-- "type": "object",-- "required": [-- "verification",-- "routing",-- "tls"-- ],-- "properties": {-- "verification": {-- "type": "object",-- "required": [-- "type",-- "name",-- "value"-- ],-- "properties": {-- "type": {-- "const": "TXT"-- },-- "name": {-- "type": "string",-- "description": "_openvibe-host.<hostname>"-- },-- "value": {-- "type": "string",-- "description": "openvibe-host-verification=<token>"-- },-- "note": {-- "type": "string"-- }-- }-- },-- "routing": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "type",-- "name",-- "value"-- ],-- "properties": {-- "type": {-- "type": "string"-- },-- "name": {-- "type": "string"-- },-- "value": {-- "type": "string"-- },-- "note": {-- "type": "string"-- }-- }-- },-- "description": "A CNAME for a subdomain; A/AAAA for an apex domain when the operator configured them."-- },-- "tls": {-- "type": "string"-- }-- }-- }-- }-- },-- "host.project.v1": {-- "title": "HostProject",-- "description": "host.project@1: one OpenVibe.Host tenant project (server/http/serialize.js project): owned by a person (usr_…), production or sandbox, with the caller's role in it and any staff takedown. POST /api/v1/projects and GET /api/v1/projects/:id add the effective quota and the usage.",-- "type": "object",-- "required": [-- "id",-- "name",-- "environment",-- "network_project_id",-- "owner",-- "role",-- "created_at",-- "takedown"-- ],-- "properties": {-- "id": {-- "type": "string",-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "name": {-- "type": "string",-- "minLength": 1,-- "maxLength": 80-- },-- "environment": {-- "enum": [-- "production",-- "sandbox"-- ]-- },-- "network_project_id": {-- "type": [-- "string",-- "null"-- ],-- "description": "The OpenVibe.Network project once Network has projects."-- },-- "owner": {-- "type": "string",-- "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "role": {-- "enum": [-- "owner",-- "maintainer",-- "deployer",-- "staff",-- null-- ],-- "description": "The caller's role (staff: a Network admin who is not a member)."-- },-- "created_at": {-- "type": "string",-- "format": "date-time"-- },-- "takedown": {-- "type": [-- "object",-- "null"-- ],-- "required": [-- "scope",-- "reason",-- "since"-- ],-- "description": "A staff takedown covering it: serving stops while the content is kept for review.",-- "properties": {-- "scope": {-- "enum": [-- "project",-- "site"-- ]-- },-- "reason": {-- "type": "string"-- },-- "since": {-- "type": [-- "string",-- "null"-- ],-- "format": "date-time"-- }-- }-- },-- "quota": {-- "type": "object",-- "required": [-- "storage_bytes",-- "deploys_per_day",-- "max_files",-- "max_file_bytes",-- "sites",-- "custom_domains"-- ],-- "description": "The effective quota: the project's override where set, else its environment's default.",-- "properties": {-- "storage_bytes": {-- "type": "integer",-- "minimum": 0-- },-- "deploys_per_day": {-- "type": "integer",-- "minimum": 0-- },-- "max_files": {-- "type": "integer",-- "minimum": 0-- },-- "max_file_bytes": {-- "type": "integer",-- "minimum": 0-- },-- "sites": {-- "type": "integer",-- "minimum": 0-- },-- "custom_domains": {-- "type": "integer",-- "minimum": 0-- }-- }-- },-- "usage": {-- "type": "object",-- "required": [-- "storage_bytes",-- "objects",-- "deploys_last_24h",-- "sites",-- "custom_domains"-- ],-- "properties": {-- "storage_bytes": {-- "type": "integer",-- "minimum": 0-- },-- "objects": {-- "type": "integer",-- "minimum": 0-- },-- "deploys_last_24h": {-- "type": "integer",-- "minimum": 0-- },-- "sites": {-- "type": "integer",-- "minimum": 0-- },-- "custom_domains": {-- "type": "integer",-- "minimum": 0-- }-- }-- }-- }-- },-- "host.site-config-request.v1": {-- "title": "HostSiteConfigRequest",-- "description": "host.site-config-request@1: the body of PUT /api/v1/sites/:id/config on OpenVibe.Host (host.site.config; the acting principal must be a maintainer or owner of the site's project). { headers?, redirects?, spa? } replaces the whole configuration: a field left out is reset to its default. A redirect's status defaults to 301. Refusals are 422 problem+json: site_config.reserved_header, site_config.header_name, site_config.header_value (longer than 1024 characters or a control character), site_config.too_many (over 50 headers or 200 redirects), site_config.redirect (not a local path, a duplicate from, or a status outside 301/302/307/308), site_config.headers and site_config.redirects (wrong type). GET and DELETE /api/v1/sites/:id/config take no body (DELETE resets to the defaults).",-- "type": "object",-- "additionalProperties": false,-- "properties": {-- "headers": {-- "type": "object",-- "additionalProperties": {-- "type": "string"-- }-- },-- "redirects": {-- "type": "array",-- "items": {-- "type": "object",-- "additionalProperties": false,-- "required": [-- "from",-- "to"-- ],-- "properties": {-- "from": {-- "type": "string"-- },-- "to": {-- "type": "string"-- },-- "status": {-- "enum": [-- 301,-- 302,-- 307,-- 308-- ]-- }-- }-- }-- },-- "spa": {-- "type": "boolean"-- }-- }-- },-- "host.site-config-result.v1": {-- "title": "HostSiteConfigResult",-- "description": "host.site-config-result@1: every answer of host.site.config on OpenVibe.Host. GET, PUT and DELETE /api/v1/sites/:id/config → { config } (after a PUT, the configuration as stored; after a DELETE, the defaults).",-- "type": "object",-- "additionalProperties": false,-- "required": [-- "config"-- ],-- "properties": {-- "config": {-- "$ref": "#/components/schemas/host.site-config.v1"-- }-- }-- },-- "host.site-config.v1": {-- "title": "HostSiteConfig",-- "description": "host.site-config@1: one Host site's serving configuration (plan T12 J3). headers are applied to every response of the site before the platform's own, which always win; the platform's security, routing, caching, scope and transport headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, Cache-Control, Content-Type, Location, Service-Worker-Allowed, Alt-Svc and the rest of Host's reserved list) and every X-Forwarded-* header are refused. redirects are local paths only (no scheme, host, protocol-relative URL, backslash or control character, also after percent-decoding). spa serves /index.html for an extensionless path that has no file. A site with no configuration answers { headers: {}, redirects: [], spa: false }.",-- "type": "object",-- "additionalProperties": false,-- "required": [-- "headers",-- "redirects",-- "spa"-- ],-- "properties": {-- "headers": {-- "type": "object",-- "maxProperties": 50,-- "propertyNames": {-- "pattern": "^[A-Za-z0-9][A-Za-z0-9-]{0,63}$"-- },-- "additionalProperties": {-- "type": "string",-- "maxLength": 1024-- }-- },-- "redirects": {-- "type": "array",-- "maxItems": 200,-- "items": {-- "type": "object",-- "additionalProperties": false,-- "required": [-- "from",-- "to",-- "status"-- ],-- "properties": {-- "from": {-- "type": "string",-- "pattern": "^/(?!/)",-- "maxLength": 1024-- },-- "to": {-- "type": "string",-- "pattern": "^/(?!/)",-- "maxLength": 1024-- },-- "status": {-- "enum": [-- 301,-- 302,-- 307,-- 308-- ]-- }-- }-- }-- },-- "spa": {-- "type": "boolean"-- }-- }-- },-- "host.site-manage-request.v1": {-- "title": "HostSiteManageRequest",-- "description": "host.site-manage-request@1: bodies of host.site.manage on OpenVibe.Host (judged by the acting principal's project role too; a sandbox token is refused on production projects). POST /api/v1/projects { name, environment?, network_project_id? } creates a project owned by the person named with X-OV-Subject (403 project.owner_must_be_user; 422 project.invalid_name over 80 characters, project.invalid_environment; 429 quota.projects; 409 project.network_project_taken). PUT /api/v1/projects/:id/quota { storage_bytes?, deploys_per_day?, max_files?, max_file_bytes?, sites?, custom_domains? } (a Network staff user: 403 auth.staff_only; fields left out keep their value). PUT /api/v1/projects/:id/members/:principal { role } (the owner: 422 member.invalid_role, 409 member.owner_fixed). POST /api/v1/projects/:id/sites { name } (a maintainer; lowercased and trimmed, one DNS label of 3–40 characters: 422 site.invalid_name, site.name_reserved; 409 site.name_taken, site.name_held; 429 quota.sites). POST /api/v1/projects/:id/takedown and /sites/:id/takedown { reason } (staff: stop serving, keep the content; 409 takedown.exists); DELETE on those { note? } lifts it. GET /api/v1/projects, /projects/:id, /projects/:id/quota, /projects/:id/sites and /sites/:id, and DELETE /api/v1/projects/:id, /projects/:id/members/:principal, /sites/:id and /deploys/:id take no body (deleting refuses taken-down content for non-staff: 409 site.taken_down; an active deploy: 409 deploy.active).",-- "anyOf": [-- {-- "type": "object",-- "required": [-- "name"-- ],-- "properties": {-- "name": {-- "type": "string",-- "minLength": 1,-- "description": "1–80 characters once trimmed."-- },-- "environment": {-- "enum": [-- "production",-- "sandbox",-- null-- ],-- "description": "Default production; a sandbox credential creates sandbox projects only."-- },-- "network_project_id": {-- "anyOf": [-- {-- "type": "string",-- "pattern": "^([A-Za-z0-9_:-]{3,80})?$"-- },-- {-- "type": "null"-- }-- ]-- }-- }-- },-- {-- "type": "object",-- "properties": {-- "storage_bytes": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "A non-negative integer, or null for the environment default."-- },-- "deploys_per_day": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "A non-negative integer, or null for the environment default."-- },-- "max_files": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "A non-negative integer, or null for the environment default."-- },-- "max_file_bytes": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "A non-negative integer, or null for the environment default."-- },-- "sites": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "A non-negative integer, or null for the environment default."-- },-- "custom_domains": {-- "type": [-- "integer",-- "null"-- ],-- "minimum": 0,-- "description": "A non-negative integer, or null for the environment default."-- }-- }-- },-- {-- "type": "object",-- "required": [-- "role"-- ],-- "properties": {-- "role": {-- "enum": [-- "owner",-- "maintainer",-- "deployer"-- ],-- "description": "Only a person (usr_…) can be an owner."-- }-- }++ }++ },++ "components": {++ "schemas": {++ "errors.problem.v1": {++ "title": "Problem",++ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",++ "type": "object",++ "required": [++ "type",++ "title",++ "status",++ "code"++ ],++ "additionalProperties": true,++ "properties": {++ "type": {++ "type": "string",++ "format": "uri-reference"},-- {-- "type": "object",-- "required": [-- "name"-- ],-- "properties": {-- "name": {-- "type": "string",-- "pattern": "^\\s*[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){2,39}\\s*$",-- "description": "The site name (lowercased)."-- }-- }++ "title": {++ "type": "string",++ "minLength": 1},-- {-- "type": "object",-- "required": [-- "reason"-- ],-- "properties": {-- "reason": {-- "type": "string",-- "minLength": 1,-- "maxLength": 500,-- "description": "Members see it."-- }-- }++ "status": {++ "type": "integer",++ "minimum": 400,++ "maximum": 599},-- {-- "type": "object",-- "properties": {-- "note": {-- "type": [-- "string",-- "null"-- ],-- "description": "Cut to 500 characters."-- }-- }++ "detail": {++ "type": "string"},-- {-- "$ref": "#/components/schemas/common.no-body.v1"-- }-- ]-- },-- "host.site-manage-result.v1": {-- "title": "HostSiteManageResult",-- "description": "host.site-manage-result@1: answers of host.site.manage on OpenVibe.Host. GET /api/v1/projects → { projects } (the caller's projects with their role). POST /api/v1/projects → 201 { project } (with quota and usage). GET /api/v1/projects/:id → { project, sites, members }. GET and PUT /api/v1/projects/:id/quota → { quota, usage }. PUT and DELETE /api/v1/projects/:id/members/:principal → { members }. GET /api/v1/projects/:id/sites → { sites }. POST /api/v1/projects/:id/sites → 201 { site }. GET /api/v1/sites/:id → { site, domains }. DELETE /api/v1/projects/:id and /sites/:id → { deleted: true } (serving stops at once; the objects are removed). DELETE /api/v1/deploys/:id → { deleted: true, objects_removed }. POST …/takedown → 201 { takedown }; DELETE …/takedown → { lifted: true }.",-- "anyOf": [-- {-- "type": "object",-- "required": [-- "projects"-- ],-- "properties": {-- "projects": {-- "type": "array",-- "items": {-- "$ref": "#/components/schemas/host.project.v1"-- }-- }-- }++ "instance": {++ "type": "string",++ "format": "uri-reference"},-- {-- "type": "object",-- "required": [-- "project"-- ],-- "properties": {-- "project": {-- "$ref": "#/components/schemas/host.project.v1"-- },-- "sites": {-- "type": "array",-- "items": {-- "$ref": "#/components/schemas/host.site.v1"-- }-- },-- "members": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "principal",-- "role",-- "added_at"-- ],-- "properties": {-- "principal": {-- "type": "string",-- "description": "usr_…, app:app_… or svc:…"-- },-- "role": {-- "enum": [-- "owner",-- "maintainer",-- "deployer"-- ]-- },-- "added_at": {-- "type": "string",-- "format": "date-time"-- }-- }-- }-- }-- }++ "code": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"},-- {-- "type": "object",-- "required": [-- "quota",-- "usage"-- ],-- "properties": {-- "quota": {-- "type": "object",-- "required": [-- "storage_bytes",-- "deploys_per_day",-- "max_files",-- "max_file_bytes",-- "sites",-- "custom_domains"-- ],-- "description": "The effective quota: the project's override where set, else its environment's default.",-- "properties": {-- "storage_bytes": {-- "type": "integer",-- "minimum": 0-- },-- "deploys_per_day": {-- "type": "integer",-- "minimum": 0-- },-- "max_files": {-- "type": "integer",-- "minimum": 0-- },-- "max_file_bytes": {-- "type": "integer",-- "minimum": 0-- },-- "sites": {-- "type": "integer",-- "minimum": 0-- },-- "custom_domains": {-- "type": "integer",-- "minimum": 0-- }-- }-- },-- "usage": {-- "type": "object",-- "required": [-- "storage_bytes",-- "objects",-- "deploys_last_24h",-- "sites",-- "custom_domains"-- ],-- "properties": {-- "storage_bytes": {-- "type": "integer",-- "minimum": 0-- },-- "objects": {-- "type": "integer",-- "minimum": 0-- },-- "deploys_last_24h": {-- "type": "integer",-- "minimum": 0-- },-- "sites": {-- "type": "integer",-- "minimum": 0-- },-- "custom_domains": {-- "type": "integer",-- "minimum": 0-- }-- }-- }-- }++ "request_id": {++ "type": "string"},-- {-- "type": "object",-- "required": [-- "members"-- ],-- "properties": {-- "members": {-- "type": "array",-- "items": {-- "type": "object",-- "required": [-- "principal",-- "role",-- "added_at"-- ],-- "properties": {-- "principal": {-- "type": "string",-- "description": "usr_…, app:app_… or svc:…"-- },-- "role": {-- "enum": [-- "owner",-- "maintainer",-- "deployer"-- ]-- },-- "added_at": {-- "type": "string",-- "format": "date-time"-- }-- }-- }-- }-- }++ "trace_id": {++ "type": "string",++ "pattern": "^[0-9a-f]{32}$"},-- {-- "type": "object",-- "required": [-- "sites"-- ],-- "properties": {-- "sites": {-- "type": "array",-- "items": {-- "$ref": "#/components/schemas/host.site.v1"++ "errors": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "message"++ ],++ "properties": {++ "path": {++ "type": "string"++ },++ "message": {++ "type": "string"}}}},++ "error": {++ "type": "string",++ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."++ }++ }++ },++ "host.catalog-manage-request.v1": {++ "title": "HostCatalogManageRequest",++ "description": "host.catalog-manage-request@1: bodies of host.catalog.manage on OpenVibe.Host (a Network staff user only). POST/PATCH /api/v1/catalog/providers { slug, name, homepage_url, description?, affiliate_url?, affiliate_note?, status? }; POST/PATCH /api/v1/catalog/plans { provider_id, external_id, name, kind, currency, price_monthly, source_url, vcpu?, ram_mb?, disk_gb?, disk_type?, bandwidth_gb?, unmetered?, port_mbps?, ipv4?, locations?, price_hourly?, setup_fee?, checked_at?, status? } (a plan from OpenVibe.Sources takes only status); POST/PATCH /api/v1/catalog/promos { provider_id, title, url, details?, code?, affiliate?, starts_at?, ends_at?, status? }. A PATCH carries any subset. Unknown fields are refused (422 host.catalog.invalid); a missing entry is 404 host.catalog.not_found; anyone but staff is 403 host.catalog.forbidden. A staff plan's checked_at defaults to now: the staff member confirming the price that day.",++ "anyOf": [{"type": "object",-- "required": [-- "site"-- ],++ "additionalProperties": false,"properties": {-- "site": {-- "$ref": "#/components/schemas/host.site.v1"++ "slug": {++ "type": "string",++ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",++ "maxLength": 80},-- "domains": {-- "type": "array",-- "items": {-- "$ref": "#/components/schemas/host.domain.v1"-- }-- }-- }-- },-- {-- "type": "object",-- "required": [-- "deleted"-- ],-- "properties": {-- "deleted": {-- "const": true++ "name": {++ "type": "string",++ "minLength": 1,++ "maxLength": 2048},-- "objects_removed": {-- "type": "integer",-- "minimum": 0-- }-- }-- },-- {-- "type": "object",-- "required": [-- "takedown"-- ],-- "properties": {-- "takedown": {-- "type": "object",-- "required": [-- "scope",-- "reason",-- "since"-- ],-- "description": "The takedown now in force.",-- "properties": {-- "scope": {-- "enum": [-- "project",-- "site"-- ]-- },-- "reason": {-- "type": "string"-- },-- "since": {-- "type": [-- "string",-- "null"-- ],-- "format": "date-time"-- }-- }-- }-- }-- },-- {-- "type": "object",-- "required": [-- "lifted"-- ],-- "properties": {-- "lifted": {-- "const": true-- }-- }-- }-- ]-- },-- "host.site.v1": {-- "title": "HostSite",-- "description": "host.site@1: one static site on OpenVibe.Host (server/http/serialize.js site): its name (one DNS label), the default hostname and URL it is served at, the deploy it serves (one pointer; null until a deploy is activated) and any staff takedown.",-- "type": "object",-- "required": [-- "id",-- "project_id",-- "name",-- "hostname",-- "url",-- "active_deploy_id",-- "takedown",-- "created_at",-- "updated_at"-- ],-- "properties": {-- "id": {-- "type": "string",-- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "project_id": {-- "type": "string",-- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"-- },-- "name": {-- "type": "string",-- "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$"-- },-- "hostname": {-- "type": "string"-- },-- "url": {-- "type": "string"-- },-- "active_deploy_id": {-- "anyOf": [-- {++ "homepage_url": {"type": "string",-- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"++ "maxLength": 2048,++ "pattern": "^https?://"},-- {-- "type": "null"-- }-- ]-- },-- "takedown": {-- "type": [-- "object",-- "null"-- ],-- "required": [-- "scope",-- "reason",-- "since"-- ],-- "description": "A staff takedown covering it: serving stops while the content is kept for review.",-- "properties": {-- "scope": {-- "enum": [-- "project",-- "site"++ "description": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048++ },++ "affiliate_url": {++ "anyOf": [++ {++ "type": "string",++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ {++ "type": "null"++ }]},-- "reason": {-- "type": "string"-- },-- "since": {++ "affiliate_note": {"type": ["string","null"],-- "format": "date-time"++ "maxLength": 2048,++ "description": "The exact disclosure shown beside the provider's affiliate links."++ },++ "status": {++ "enum": [++ "active",++ "hidden"++ ]}}},-- "created_at": {-- "type": "string",-- "format": "date-time"-- },-- "updated_at": {-- "type": "string",-- "format": "date-time"-- }-- }-- },-- "identity.subject-ref.v1": {-- "title": "SubjectRef",-- "description": "The one cross-platform reference to an actor. Issued by OpenVibe.Network. Never a service-local integer id.",-- "oneOf": [{"type": "object",-- "required": [-- "type",-- "id"-- ],"additionalProperties": false,"properties": {-- "type": {-- "const": "user"++ "provider_id": {++ "type": "string"},-- "id": {++ "external_id": {"type": "string",-- "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"-- }-- },-- "description": "UserSubject"-- },-- {-- "type": "object",-- "required": [-- "type",-- "id"-- ],-- "additionalProperties": false,-- "properties": {-- "type": {-- "const": "guest"++ "minLength": 1,++ "maxLength": 2048++ },++ "name": {++ "type": "string",++ "minLength": 1,++ "maxLength": 2048++ },++ "kind": {++ "enum": [++ "cloud",++ "vps",++ "dedicated",++ "storage",++ "domain"++ ]++ },++ "vcpu": {++ "type": "number",++ "minimum": 0++ },++ "ram_mb": {++ "type": "number",++ "minimum": 0++ },++ "disk_gb": {++ "type": "number",++ "minimum": 0++ },++ "disk_type": {++ "enum": [++ "ssd",++ "nvme",++ "hdd",++ null++ ]++ },++ "bandwidth_gb": {++ "type": "number",++ "minimum": 0++ },++ "unmetered": {++ "type": [++ "boolean",++ "null"++ ]++ },++ "port_mbps": {++ "type": "number",++ "minimum": 0++ },++ "ipv4": {++ "type": "integer",++ "minimum": 0++ },++ "locations": {++ "type": [++ "array",++ "null"++ ],++ "items": {++ "type": "string",++ "minLength": 1++ }++ },++ "currency": {++ "type": "string",++ "pattern": "^[A-Z]{3}$",++ "description": "ISO 4217."++ },++ "price_monthly": {++ "type": "number",++ "minimum": 0,++ "exclusiveMaximum": 100000000},-- "id": {++ "price_hourly": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "setup_fee": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0++ },++ "source_url": {"type": "string",-- "pattern": "^gst_[0-9A-HJKMNP-TV-Z]{26}$"++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "checked_at": {++ "type": "integer",++ "minimum": 0,++ "description": "Epoch milliseconds the price was confirmed."++ },++ "status": {++ "enum": [++ "active",++ "gone",++ "hidden"++ ]}-- },-- "description": "GuestSubject"++ }},{"type": "object",-- "required": [-- "type",-- "id"-- ],"additionalProperties": false,"properties": {-- "type": {-- "const": "app"++ "provider_id": {++ "type": "string"++ },++ "title": {++ "type": "string",++ "minLength": 1,++ "maxLength": 2048++ },++ "details": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048++ },++ "code": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048},-- "id": {++ "url": {"type": "string",-- "pattern": "^app_[0-9A-HJKMNP-TV-Z]{26}$"++ "maxLength": 2048,++ "pattern": "^https?://"++ },++ "affiliate": {++ "type": [++ "boolean",++ "null"++ ]++ },++ "starts_at": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0,++ "description": "Epoch milliseconds."++ },++ "ends_at": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0,++ "description": "Epoch milliseconds."++ },++ "status": {++ "enum": [++ "active",++ "ended",++ "hidden"++ ]}-- },-- "description": "AppSubject"-- },++ }++ }++ ]++ },++ "host.catalog-manage-result.v1": {++ "title": "HostCatalogManageResult",++ "description": "host.catalog-manage-result@1: the saved entry, under its type's name: { provider } (with affiliate_rel and affiliate_disclosure when it has an affiliate link), { plan } or { promo } (an active promo past ends_at reads as ended). 201 on create, 200 on update.",++ "anyOf": [{"type": "object","required": [-- "type",-- "id"++ "provider"],-- "additionalProperties": false,"properties": {-- "type": {-- "const": "mod"-- },-- "id": {-- "type": "string",-- "pattern": "^mod_[0-9A-HJKMNP-TV-Z]{26}$"++ "provider": {++ "type": "object",++ "required": [++ "id"++ ],++ "properties": {++ "id": {++ "type": "string"++ }++ },++ "additionalProperties": true}-- },-- "description": "ModSubject"++ }},{"type": "object","required": [-- "type",-- "id"++ "plan"],-- "additionalProperties": false,"properties": {-- "type": {-- "enum": [-- "service",-- "system"-- ]-- },-- "id": {-- "type": "string",-- "pattern": "^[a-z][a-z0-9-]{1,39}$"++ "plan": {++ "type": "object",++ "required": [++ "id"++ ],++ "properties": {++ "id": {++ "type": "string"++ }++ },++ "additionalProperties": true}-- },-- "description": "PrincipalSubject"++ }},{"type": "object","required": [-- "type",-- "id"++ "promo"],-- "additionalProperties": false,"properties": {-- "type": {-- "const": "agent"-- },-- "id": {-- "type": "string",-- "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"++ "promo": {++ "type": "object",++ "required": [++ "id"++ ],++ "properties": {++ "id": {++ "type": "string"++ }++ },++ "additionalProperties": true}-- },-- "description": "AgentSubject: an agent (OpenVibe.Actor, or a developer app's agent) acting under grants its owner delegated (roadmap WS-Z2). In an event envelope, on_behalf_of names the owner."++ }}]}@@@ -89,8 +89,8 @@"service": "host","name": "OpenVibe.Host","origin": "https://openvibe.host",-- "operations": 42,-- "capabilities": 6++ "operations": 6,++ "capabilities": 1},{"service": "inventory",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.149.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.149.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.150.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -2,9 +2,9 @@"id": "host.deploy.create","version": "1.0","owner": "host",-- "status": "active",++ "status": "retired","visibility": "first-party",-- "description": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.deploy.create on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.","permissions": ["host:deploy"],@@@ -17,15 +17,7 @@"host.deploy.activated","host.deploy.failed"],-- "implementedBy": [-- "GET /api/v1/sites/:id/deploys",-- "POST /api/v1/sites/:id/deploys",-- "POST /api/v1/sites/:id/source/deploys",-- "GET /api/v1/deploys/:id",-- "GET /api/v1/deploys/:id/log",-- "POST /api/v1/deploys/:id/activate",-- "POST /api/v1/sites/:id/rollback"-- ],++ "implementedBy": [],"inputSchema": "host.deploy-create-request@1","outputSchema": "host.deploy-create-result@1"}@@@ -2,9 +2,9 @@"id": "host.domain.manage","version": "1.0","owner": "host",-- "status": "active",++ "status": "retired","visibility": "first-party",-- "description": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.domain.manage on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.","permissions": ["host:write"],@@@ -15,12 +15,7 @@"events": ["host.domain.verified"],-- "implementedBy": [-- "GET /api/v1/sites/:id/domains",-- "POST /api/v1/sites/:id/domains",-- "POST /api/v1/domains/:id/verify",-- "DELETE /api/v1/domains/:id"-- ],++ "implementedBy": [],"inputSchema": "host.domain-manage-request@1","outputSchema": "host.domain-manage-result@1"}@@@ -2,9 +2,9 @@"id": "host.resource.read","version": "1.0","owner": "host",-- "status": "active",++ "status": "retired","visibility": "first-party",-- "description": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.resource.read on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.","permissions": ["resources:read"],@@@ -13,10 +13,7 @@],"quotaClass": "standard","events": [],-- "implementedBy": [-- "GET /api/v1/resources",-- "GET /api/v1/resources/:ovrn"-- ],++ "implementedBy": [],"inputSchema": "common.no-body@1","outputSchema": "common.resource-list-result@1"}@@@ -2,9 +2,9 @@"id": "host.site.config","version": "1.0","owner": "host",-- "status": "active",++ "status": "retired","visibility": "first-party",-- "description": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.site.config on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.","permissions": ["host:write"],@@@ -13,11 +13,7 @@],"quotaClass": "host-manage","events": [],-- "implementedBy": [-- "GET /api/v1/sites/:id/config",-- "PUT /api/v1/sites/:id/config",-- "DELETE /api/v1/sites/:id/config"-- ],++ "implementedBy": [],"inputSchema": "host.site-config-request@1","outputSchema": "host.site-config-result@1"}@@@ -2,9 +2,9 @@"id": "host.site.manage","version": "1.0","owner": "host",-- "status": "active",++ "status": "retired","visibility": "first-party",-- "description": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",++ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.site.manage on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.","permissions": ["host:write"],@@@ -13,28 +13,7 @@],"quotaClass": "host-manage","events": [],-- "implementedBy": [-- "GET /api/v1/projects",-- "POST /api/v1/projects",-- "GET /api/v1/projects/:id",-- "DELETE /api/v1/projects/:id",-- "GET /api/v1/projects/:id/quota",-- "PUT /api/v1/projects/:id/quota",-- "PUT /api/v1/projects/:id/members/:principal",-- "DELETE /api/v1/projects/:id/members/:principal",-- "GET /api/v1/projects/:id/sites",-- "POST /api/v1/projects/:id/sites",-- "GET /api/v1/sites/:id",-- "GET /api/v1/sites/:id/source",-- "PUT /api/v1/sites/:id/source",-- "DELETE /api/v1/sites/:id/source",-- "DELETE /api/v1/sites/:id",-- "DELETE /api/v1/deploys/:id",-- "POST /api/v1/projects/:id/takedown",-- "DELETE /api/v1/projects/:id/takedown",-- "POST /api/v1/sites/:id/takedown",-- "DELETE /api/v1/sites/:id/takedown"-- ],++ "implementedBy": [],"inputSchema": "host.site-manage-request@1","outputSchema": "host.site-manage-result@1"}@@@ -4,24 +4,24 @@"name": "OpenVibe.Video","icon": "fa-film","accent": "#f87171",-- "tagline": "Your videos, everywhere.",-- "description": "OpenVibe.Video will be the home of long-form video on the OpenVibe network: watch pages, channels and playlists for uploads and past streams, a creator tool that publishes one upload to many platforms, and AI captions, highlights and editing, delivered by OpenVibe.Media.",++ "tagline": "Watch what OpenVibe streamed.",++ "description": "OpenVibe.Video is the watch site for the OpenVibe network: stream recordings and clips from OpenVibe.Live, each with a player, AI chapters and WebVTT captions, its clips and its OpenVibe.Community thread, and a page per channel. The files stay on OpenVibe.Media. Uploads, playlists and publishing to other platforms come later.","pillars": [{"title": "Watch",-- "text": "Channels, playlists and search for uploads and past streams."++ "text": "Recordings and clips from OpenVibe.Live, and a page per channel."},{-- "title": "Publish everywhere",-- "text": "One upload, sent to the platforms you choose, tracked in one place."++ "title": "Chapters and captions",++ "text": "Chapters from the AI moments of a stream, captions from its AI transcript."},{-- "title": "AI tools",-- "text": "Captions, translations, highlights and shorts from long videos."++ "title": "From your streams",++ "text": "What you stream on OpenVibe.Live and make public lands here."},{-- "title": "From your streams",-- "text": "Recordings from OpenVibe.Live land here, ready to share."++ "title": "Next",++ "text": "Uploads, playlists and publishing to other platforms are not built yet."}],"keywords": "openvibe video, video hosting, youtube alternative, multi-platform upload, ai video tools",@@@ -30,15 +30,15 @@"service": "media-hub","noRepo": true,"meanwhile": [-- {-- "label": "OpenVibe.Live",-- "url": "https://openvibe.live",-- "note": "Streams, recordings and clips live on OpenVibe.Live today."-- },{"label": "OpenRestream","url": "https://openre.stream","note": "Restreaming to many platforms is the sibling product."++ },++ {++ "label": "OpenVibe.Live",++ "url": "https://openvibe.live",++ "note": "Owners manage their recordings and clips on OpenVibe.Live."}]}@@@ -65,19 +65,10 @@}},"capabilities": [-- "host.site.manage",-- "host.deploy.create",-- "host.domain.manage",-- "host.resource.read",-- "host.site.config","host.catalog.manage"],"eventsProduced": [-- "host.deploy.created",-- "host.deploy.activated",-- "host.deploy.failed","host.release.published",-- "host.domain.verified","host.index_document.upserted","host.index_document.deleted"],@@@ -137,5 +128,5 @@]}},-- "notes": "Stage A: the ovhost operator CLI (no server). Stage B: the Host API service on port 4910 (unit openvibe-host.service, state /var/lib/openvibe-host-api): tenant projects keyed by project id (prj_, network_project_id once Network has projects, ADR-014), static sites served by Host header at <site>.openvibe.host (a registrable domain separate from every other OpenVibe domain) and on TXT-verified custom domains, immutable content-addressed deploys with rollback, quotas enforced here, upload logs. Consumes OpenVibe.Network (SSO, JWKS, client-credentials) and publishes through OpenVibe.Events (events.event.publish). The ovhost CLI publishes host.release.published (subject release, visibility public) when a network service's release goes live (ovhost deploy/rollback/announce; release notifications, WS-P task 9); host.deploy.activated is Stage B's tenant activations only. Stage C (sandboxed user code) is not started."++ "notes": "Stage A: the ovhost operator CLI (no server). The Host service on port 4910 (unit openvibe-host.service) serves openvibe.host, hosting compared: providers, plans and promotions with dated, sourced prices from OpenVibe.Sources and staff entries (host.catalog.manage), discussion on OpenVibe.Community and its pages as OpenVibe.Search documents (host.index_document.*). The ovhost CLI publishes host.release.published. Stage B (tenant static hosting) moved to OpenVibe.Space on 2026-10-12 (plan T20): its host.* capabilities and events are retired at 0.150.0 in favour of space.*, and Host answers the old routes and tenant hosts with 410 host.moved_to_space."}@@@ -87,7 +87,7 @@"none": "no claims: one process serves the three domains"}},-- "notes": "Port 4990, unit openvibe-media-hub.service, one process for openvibe.download, openvibe.pics and openvibe.video (plan T10 D4, by Host header). v1: openvibe.download is a private drive — account-only uploads streamed into OpenVibe.Media (app media-hub; a plain form up to 256 MB, resumable multipart beyond), private files and folders with per-person limits, share links that expire, need a signed-in downloader and may name accounts (matched by subject), reports that suspend a share for staff, and sandboxed attachment downloads. openvibe.pics and openvibe.video answer with coming pages: their uploads wait for scanning and abuse intake (the video.*/pics.*/download.* capabilities stay planned until an app may call them). Consumes OpenVibe.Network (SSO with PKCE S256 as OAuth client media-hub, JWKS, identity.subject.resolve) and OpenVibe.Media; answers account export and deletion (ADR-033).",++ "notes": "Port 4990, unit openvibe-media-hub.service, one process for openvibe.download, openvibe.pics and openvibe.video (plan T10 D4, by Host header). v1: openvibe.download is a private drive — account-only uploads streamed into OpenVibe.Media (app media-hub; a plain form up to 256 MB, resumable multipart beyond), private files and folders with per-person limits, share links that expire, need a signed-in downloader and may name accounts (matched by subject), reports that suspend a share for staff, and sandboxed attachment downloads. openvibe.pics and openvibe.video answer with coming pages: their uploads wait for scanning and abuse intake (the video.*/pics.*/download.* capabilities stay planned until an app may call them). Consumes OpenVibe.Network (SSO with PKCE S256 as OAuth client media-hub, JWKS, identity.subject.resolve) and OpenVibe.Media; answers account export and deletion (ADR-033). Since 2026-10-12 the same process serves openvibe.video, OpenVibe.Video v1: public, read-only watch pages for OpenVibe.Live's stream recordings and clips (read from Live's public API, files on OpenVibe.Media), with WebVTT captions from the AI transcript and chapters from the AI moments. video.* stays planned until an app may call it; openvibe.pics stays parked.","health": "/api/health","ready": "/api/ready","internalOrigin": "http://127.0.0.1:4990",@@@ -95,7 +95,7 @@"name": "Media Hub","icon": "media-hub","tagline": "Video, pics and downloads",-- "what": "The media-hub products in one service: video watch pages, chapters, captions and playlists (openvibe.video); image hosting and albums (openvibe.pics); share links, drive and backup (openvibe.download). Bytes stay in OpenVibe.Media.",++ "what": "Your private drive with share links you control (openvibe.download), and watch pages for OpenVibe.Live's recordings and clips with AI chapters and captions (openvibe.video). Image hosting on openvibe.pics is not open.","legalProfile": "hosting","position": 20}@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.149.0",++ "version": "0.150.0","description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.","main": "index.js","types": "generated/typescript/index.d.ts",@@@ -823,19 +823,22 @@ await assert.rejects(failing.getToken(), /401: invalid_client/);// ── Release notifications (WS-P task 9, ADR-016): host.release.published, public, identifiers only ──// A network service's release went live (subject release, visibility public: browsers get it over--// Events realtime). Tenant hosting's activations stay host.deploy.activated (first-party, its own shape);--// neither payload passes for the other.++// Events realtime). Tenant hosting's activations are space.deploy.activated since the engine moved to OpenVibe.Space++// (0.149.0; host.deploy.activated is retired at 0.150.0): first-party, its own shape; neither payload passes for the other.{const R = (p) => contracts.validate('host.release.published@1', p).valid;-- const D = (p) => contracts.validate('host.deploy.activated@1', p).valid;++ const D = (p) => contracts.validate('space.deploy.activated@1', p).valid;const cat = (id) => contracts.catalog.find(c => c.id === id);ok(cat('host.release.published') && cat('host.release.published').owner === 'host' && cat('host.release.published').visibility === 'public', 'host.release.published is a public Host event');-- ok(cat('host.deploy.activated') && cat('host.deploy.activated').visibility === 'first-party', 'host.deploy.activated stays first-party (tenant hosting)');-- for (const id of ['host.release.published', 'host.deploy.activated']) ok(services.get('host').eventsProduced.includes(id), `the host manifest produces ${id}`);++ ok(cat('space.deploy.activated') && cat('space.deploy.activated').visibility === 'first-party', 'space.deploy.activated is first-party (tenant hosting)');++ ok(cat('host.deploy.activated') && cat('host.deploy.activated').status === 'retired', 'host.deploy.activated is retired (the engine moved to Space)');++ ok(services.get('host').eventsProduced.includes('host.release.published'), 'the host manifest produces host.release.published');++ ok(!services.get('host').eventsProduced.includes('host.deploy.activated'), 'the host manifest no longer produces host.deploy.activated');++ ok(services.get('space').eventsProduced.includes('space.deploy.activated'), 'the space manifest produces space.deploy.activated');const rel = { service: 'live', release: 'd4e849f2', commit: null, origin: 'https://openvibe.live', deployed_at: '2026-09-26T08:00:05.000Z' };-- const ten = JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures/host.deploy.activated/valid/tenant-site.json'), 'utf8'));++ const ten = JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures/space.deploy.activated/valid/tenant-site.json'), 'utf8'));ok(R(rel) && D(ten) && !R(ten) && !D(rel) && !R({ ...rel, ...ten }), 'a release and a tenant activation are two contracts that never mix');-- ok(!contracts.schema('host.deploy.activated').oneOf && !contracts.schema('host.release.published').oneOf, 'one shape each');++ ok(!contracts.schema('space.deploy.activated').oneOf && !contracts.schema('host.release.published').oneOf, 'one shape each');for (const k of ['service', 'release', 'commit', 'origin', 'deployed_at']) ok(!R({ ...rel, [k]: undefined }), `a release needs ${k} (commit and origin may be null)`);for (const extra of [{ commits: [] }, { notes: 'x' }, { url: 'https://openvibe.live/updates' }]) ok(!R({ ...rel, ...extra }), `a release carries identifiers only (${Object.keys(extra)[0]})`);ok(R({ ...rel, release: 'd4e849f2a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9' }) && !R({ ...rel, release: 'd4e84' }), 'a release is 7 to 40 hex, as registry.release-manifest@1 says');
@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -4,6 +4,18 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
the notes were in the tag and commit messages (`git tag -n1`).
+## 0.150.0 — 2026-10-12
+
+- OpenVibe.Host removed its copy of the static hosting engine (Host#84); OpenVibe.Space serves it as `space.*` (0.149.0).
+ The five engine capabilities (`host.site.manage`, `host.deploy.create`, `host.domain.manage`, `host.site.config`,
+ `host.resource.read`) are retired with no routes, and the fourteen engine schemas (project, site, deploy, domain,
+ site-config, their request/result pairs and the `host.deploy.activated` payload) are retired but stay loadable, each
+ deprecated in favour of its `space.*` twin until 1.0.0. The host manifest keeps `host.catalog.manage`,
+ `host.index_document.*` and `host.release.published`; Host answers the old routes with 410 `host.moved_to_space`.
+- OpenVibe.Video's first slice is live on openvibe.video (MediaHub#28): the product text and the media-hub manifest say what
+ it serves (watch pages for Live's recordings and clips, AI chapters and captions) and what is not built. `video.*` stays
+ planned.
+
## 0.149.0 — 2026-10-12
## 0.149.0 — 2026-10-12
- The static hosting engine moved from OpenVibe.Host to OpenVibe.Space (plan T20 step 2), so its contracts are now
- The static hosting engine moved from OpenVibe.Host to OpenVibe.Space (plan T20 step 2), so its contracts are now
@@ -112,6 +112,104 @@
@@ -112,6 +112,104 @@
"since": "0.113.0",
"since": "0.113.0",
"removeAfter": "1.0.0",
"removeAfter": "1.0.0",
"reason": "the developer portal (manifests, releases, trust, playgrounds) moves from OpenVibe.Codes to OpenVibe.Services (owner 2026-10-08; Codes becomes the open coding-agent harness); retired at once, kept loadable for historical events and compatibility"
"reason": "the developer portal (manifests, releases, trust, playgrounds) moves from OpenVibe.Codes to OpenVibe.Services (owner 2026-10-08; Codes becomes the open coding-agent harness); retired at once, kept loadable for historical events and compatibility"
+ },
+ {
+ "id": "host.deploy-create-request",
+ "replacement": "space.deploy-create-request@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.deploy-create-result",
+ "replacement": "space.deploy-create-result@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.deploy",
+ "replacement": "space.deploy@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.domain-manage-request",
+ "replacement": "space.domain-manage-request@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.domain-manage-result",
+ "replacement": "space.domain-manage-result@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.domain",
+ "replacement": "space.domain@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.project",
+ "replacement": "space.project@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.site-manage-request",
+ "replacement": "space.site-manage-request@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.site-manage-result",
+ "replacement": "space.site-manage-result@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.site",
+ "replacement": "space.site@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.site-config",
+ "replacement": "space.site-config@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.site-config-request",
+ "replacement": "space.site-config-request@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.site-config-result",
+ "replacement": "space.site-config-result@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
+ },
+ {
+ "id": "host.deploy.activated",
+ "replacement": "space.deploy.activated@1",
+ "since": "0.150.0",
+ "removeAfter": "1.0.0",
+ "reason": "the static hosting engine moved from OpenVibe.Host to OpenVibe.Space (2026-10-12, plan T20)"
}
}
]
]
}
}
@@ -5468,7 +5468,7 @@
@@ -5468,7 +5468,7 @@
"schema": "host/deploy-create-request.v1.json",
"schema": "host/deploy-create-request.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.deploy-create-result",
"id": "host.deploy-create-result",
@@ -5477,7 +5477,7 @@
@@ -5477,7 +5477,7 @@
"schema": "host/deploy-create-result.v1.json",
"schema": "host/deploy-create-result.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.deploy",
"id": "host.deploy",
@@ -5486,7 +5486,7 @@
@@ -5486,7 +5486,7 @@
"schema": "host/deploy.v1.json",
"schema": "host/deploy.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.domain-manage-request",
"id": "host.domain-manage-request",
@@ -5495,7 +5495,7 @@
@@ -5495,7 +5495,7 @@
"schema": "host/domain-manage-request.v1.json",
"schema": "host/domain-manage-request.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.domain-manage-result",
"id": "host.domain-manage-result",
@@ -5504,7 +5504,7 @@
@@ -5504,7 +5504,7 @@
"schema": "host/domain-manage-result.v1.json",
"schema": "host/domain-manage-result.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.domain",
"id": "host.domain",
@@ -5513,7 +5513,7 @@
@@ -5513,7 +5513,7 @@
"schema": "host/domain.v1.json",
"schema": "host/domain.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.project",
"id": "host.project",
@@ -5522,7 +5522,7 @@
@@ -5522,7 +5522,7 @@
"schema": "host/project.v1.json",
"schema": "host/project.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.site-manage-request",
"id": "host.site-manage-request",
@@ -5531,7 +5531,7 @@
@@ -5531,7 +5531,7 @@
"schema": "host/site-manage-request.v1.json",
"schema": "host/site-manage-request.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.site-config",
"id": "host.site-config",
@@ -5540,7 +5540,7 @@
@@ -5540,7 +5540,7 @@
"schema": "host/site-config.v1.json",
"schema": "host/site-config.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.site-config-request",
"id": "host.site-config-request",
@@ -5549,7 +5549,7 @@
@@ -5549,7 +5549,7 @@
"schema": "host/site-config-request.v1.json",
"schema": "host/site-config-request.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.site-config-result",
"id": "host.site-config-result",
@@ -5558,7 +5558,7 @@
@@ -5558,7 +5558,7 @@
"schema": "host/site-config-result.v1.json",
"schema": "host/site-config-result.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.deploy.activated",
"id": "host.deploy.activated",
@@ -5567,7 +5567,7 @@
@@ -5567,7 +5567,7 @@
"schema": "events/payloads/host.deploy.activated.v1.json",
"schema": "events/payloads/host.deploy.activated.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active",
+ "status": "retired",
"adr": "ADR-004"
"adr": "ADR-004"
},
},
{
{
@@ -5587,7 +5587,7 @@
@@ -5587,7 +5587,7 @@
"schema": "host/site-manage-result.v1.json",
"schema": "host/site-manage-result.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "host.catalog-manage-request",
"id": "host.catalog-manage-request",
@@ -5614,7 +5614,7 @@
@@ -5614,7 +5614,7 @@
"schema": "host/site.v1.json",
"schema": "host/site.v1.json",
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
- "status": "active"
+ "status": "retired"
},
},
{
{
"id": "network.node",
"id": "network.node",
@@ -61896,7 +61896,7 @@
@@ -61896,7 +61896,7 @@
"host.deploy-create-request": {
"host.deploy-create-request": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/deploy-create-request.v1.json",
"$id": "https://openvibe.network/contracts/host/deploy-create-request.v1.json",
@@ -61945,7 +61945,7 @@
@@ -61945,7 +61945,7 @@
"host.deploy-create-result": {
"host.deploy-create-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/deploy-create-result.v1.json",
"$id": "https://openvibe.network/contracts/host/deploy-create-result.v1.json",
@@ -62121,7 +62121,7 @@
@@ -62121,7 +62121,7 @@
"host.deploy": {
"host.deploy": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/deploy.v1.json",
"$id": "https://openvibe.network/contracts/host/deploy.v1.json",
@@ -62293,7 +62293,7 @@
@@ -62293,7 +62293,7 @@
"host.domain-manage-request": {
"host.domain-manage-request": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/domain-manage-request.v1.json",
"$id": "https://openvibe.network/contracts/host/domain-manage-request.v1.json",
@@ -62323,7 +62323,7 @@
@@ -62323,7 +62323,7 @@
"host.domain-manage-result": {
"host.domain-manage-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/domain-manage-result.v1.json",
"$id": "https://openvibe.network/contracts/host/domain-manage-result.v1.json",
@@ -62372,7 +62372,7 @@
@@ -62372,7 +62372,7 @@
"host.domain": {
"host.domain": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/domain.v1.json",
"$id": "https://openvibe.network/contracts/host/domain.v1.json",
@@ -62508,7 +62508,7 @@
@@ -62508,7 +62508,7 @@
"host.project": {
"host.project": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/project.v1.json",
"$id": "https://openvibe.network/contracts/host/project.v1.json",
@@ -62672,7 +62672,7 @@
@@ -62672,7 +62672,7 @@
"host.site-manage-request": {
"host.site-manage-request": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-manage-request.v1.json",
"$id": "https://openvibe.network/contracts/host/site-manage-request.v1.json",
@@ -62828,7 +62828,7 @@
@@ -62828,7 +62828,7 @@
"host.site-config": {
"host.site-config": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-config.v1.json",
"$id": "https://openvibe.network/contracts/host/site-config.v1.json",
@@ -62895,7 +62895,7 @@
@@ -62895,7 +62895,7 @@
"host.site-config-request": {
"host.site-config-request": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-config-request.v1.json",
"$id": "https://openvibe.network/contracts/host/site-config-request.v1.json",
@@ -62946,7 +62946,7 @@
@@ -62946,7 +62946,7 @@
"host.site-config-result": {
"host.site-config-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-config-result.v1.json",
"$id": "https://openvibe.network/contracts/host/site-config-result.v1.json",
@@ -62967,7 +62967,7 @@
@@ -62967,7 +62967,7 @@
"host.deploy.activated": {
"host.deploy.activated": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/events/payloads/host.deploy.activated.v1.json",
"$id": "https://openvibe.network/contracts/events/payloads/host.deploy.activated.v1.json",
@@ -63107,7 +63107,7 @@
@@ -63107,7 +63107,7 @@
"host.site-manage-result": {
"host.site-manage-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site-manage-result.v1.json",
"$id": "https://openvibe.network/contracts/host/site-manage-result.v1.json",
@@ -63705,7 +63705,7 @@
@@ -63705,7 +63705,7 @@
"host.site": {
"host.site": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"schema": {
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/host/site.v1.json",
"$id": "https://openvibe.network/contracts/host/site.v1.json",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -381,4251 +381,378 @@
@@ -381,4251 +381,378 @@
}
}
}
}
}
}
- },
- "/api/v1/deploys/{id}": {
- "delete": {
- "operationId": "delete_api_v1_deploys_id",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "get": {
- "operationId": "get_api_v1_deploys_id",
- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
- "tags": [
- "host.deploy"
- ],
- "x-openvibe-capabilities": [
- "host.deploy.create"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-deploy",
- "security": [
- {
- "openvibeToken": [
- "host.deploy.create"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.deploy-create-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/deploys/{id}/activate": {
- "post": {
- "operationId": "post_api_v1_deploys_id_activate",
- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
- "tags": [
- "host.deploy"
- ],
- "x-openvibe-capabilities": [
- "host.deploy.create"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-deploy",
- "security": [
- {
- "openvibeToken": [
- "host.deploy.create"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/deploys/{id}/log": {
- "get": {
- "operationId": "get_api_v1_deploys_id_log",
- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
- "tags": [
- "host.deploy"
- ],
- "x-openvibe-capabilities": [
- "host.deploy.create"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-deploy",
- "security": [
- {
- "openvibeToken": [
- "host.deploy.create"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.deploy-create-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/domains/{id}": {
- "delete": {
- "operationId": "delete_api_v1_domains_id",
- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
- "tags": [
- "host.domain"
- ],
- "x-openvibe-capabilities": [
- "host.domain.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.domain.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.domain-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.domain-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/domains/{id}/verify": {
- "post": {
- "operationId": "post_api_v1_domains_id_verify",
- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
- "tags": [
- "host.domain"
- ],
- "x-openvibe-capabilities": [
- "host.domain.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.domain.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.domain-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.domain-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/projects": {
- "get": {
- "operationId": "get_api_v1_projects",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "post": {
- "operationId": "post_api_v1_projects",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- }
- }
- }
- },
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/projects/{id}": {
- "delete": {
- "operationId": "delete_api_v1_projects_id",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "get": {
- "operationId": "get_api_v1_projects_id",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/projects/{id}/members/{principal}": {
- "delete": {
- "operationId": "delete_api_v1_projects_id_members_principal",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "principal",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "put": {
- "operationId": "put_api_v1_projects_id_members_principal",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "principal",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/projects/{id}/quota": {
- "get": {
- "operationId": "get_api_v1_projects_id_quota",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "put": {
- "operationId": "put_api_v1_projects_id_quota",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/projects/{id}/sites": {
- "get": {
- "operationId": "get_api_v1_projects_id_sites",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "post": {
- "operationId": "post_api_v1_projects_id_sites",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/projects/{id}/takedown": {
- "delete": {
- "operationId": "delete_api_v1_projects_id_takedown",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "post": {
- "operationId": "post_api_v1_projects_id_takedown",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/resources": {
- "get": {
- "operationId": "get_api_v1_resources",
- "summary": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ov",
- "description": "**host.resource.read** (first-party): Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",
- "tags": [
- "host.resource"
- ],
- "x-openvibe-capabilities": [
- "host.resource.read"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "standard",
- "security": [
- {
- "openvibeToken": [
- "host.resource.read"
- ]
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/common.resource-list-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/resources/{ovrn}": {
- "get": {
- "operationId": "get_api_v1_resources_ovrn",
- "summary": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ov",
- "description": "**host.resource.read** (first-party): Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",
- "tags": [
- "host.resource"
- ],
- "x-openvibe-capabilities": [
- "host.resource.read"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "standard",
- "security": [
- {
- "openvibeToken": [
- "host.resource.read"
- ]
- }
- ],
- "parameters": [
- {
- "name": "ovrn",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/common.resource-list-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}": {
- "delete": {
- "operationId": "delete_api_v1_sites_id",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "get": {
- "operationId": "get_api_v1_sites_id",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}/config": {
- "delete": {
- "operationId": "delete_api_v1_sites_id_config",
- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",
- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.config"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.config"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-config-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "headers",
- "in": "query",
- "required": false,
- "schema": {
- "type": "object",
- "additionalProperties": {
- "type": "string"
- }
- }
- },
- {
- "name": "redirects",
- "in": "query",
- "required": false,
- "schema": {
- "type": "array",
- "items": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "from",
- "to"
- ],
- "properties": {
- "from": {
- "type": "string"
- },
- "to": {
- "type": "string"
- },
- "status": {
- "enum": [
- 301,
- 302,
- 307,
- 308
- ]
- }
- }
- }
- }
- },
- {
- "name": "spa",
- "in": "query",
- "required": false,
- "schema": {
- "type": "boolean"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-config-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "get": {
- "operationId": "get_api_v1_sites_id_config",
- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",
- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.config"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.config"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-config-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "headers",
- "in": "query",
- "required": false,
- "schema": {
- "type": "object",
- "additionalProperties": {
- "type": "string"
- }
- }
- },
- {
- "name": "redirects",
- "in": "query",
- "required": false,
- "schema": {
- "type": "array",
- "items": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "from",
- "to"
- ],
- "properties": {
- "from": {
- "type": "string"
- },
- "to": {
- "type": "string"
- },
- "status": {
- "enum": [
- 301,
- 302,
- 307,
- 308
- ]
- }
- }
- }
- }
- },
- {
- "name": "spa",
- "in": "query",
- "required": false,
- "schema": {
- "type": "boolean"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-config-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "put": {
- "operationId": "put_api_v1_sites_id_config",
- "summary": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html).",
- "description": "**host.site.config** (first-party): Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.config"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.config"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-config-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-config-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}/deploys": {
- "get": {
- "operationId": "get_api_v1_sites_id_deploys",
- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
- "tags": [
- "host.deploy"
- ],
- "x-openvibe-capabilities": [
- "host.deploy.create"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-deploy",
- "security": [
- {
- "openvibeToken": [
- "host.deploy.create"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.deploy-create-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "post": {
- "operationId": "post_api_v1_sites_id_deploys",
- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
- "tags": [
- "host.deploy"
- ],
- "x-openvibe-capabilities": [
- "host.deploy.create"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-deploy",
- "security": [
- {
- "openvibeToken": [
- "host.deploy.create"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}/domains": {
- "get": {
- "operationId": "get_api_v1_sites_id_domains",
- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
- "tags": [
- "host.domain"
- ],
- "x-openvibe-capabilities": [
- "host.domain.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.domain.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.domain-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.domain-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "post": {
- "operationId": "post_api_v1_sites_id_domains",
- "summary": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it.",
- "description": "**host.domain.manage** (first-party): Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
- "tags": [
- "host.domain"
- ],
- "x-openvibe-capabilities": [
- "host.domain.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.domain.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.domain-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.domain-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}/rollback": {
- "post": {
- "operationId": "post_api_v1_sites_id_rollback",
- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
- "tags": [
- "host.deploy"
- ],
- "x-openvibe-capabilities": [
- "host.deploy.create"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-deploy",
- "security": [
- {
- "openvibeToken": [
- "host.deploy.create"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}/source": {
- "delete": {
- "operationId": "delete_api_v1_sites_id_source",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "get": {
- "operationId": "get_api_v1_sites_id_source",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "put": {
- "operationId": "put_api_v1_sites_id_source",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}/source/deploys": {
- "post": {
- "operationId": "post_api_v1_sites_id_source_deploys",
- "summary": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys ",
- "description": "**host.deploy.create** (first-party): Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
- "tags": [
- "host.deploy"
- ],
- "x-openvibe-capabilities": [
- "host.deploy.create"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-deploy",
- "security": [
- {
- "openvibeToken": [
- "host.deploy.create"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.deploy-create-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/sites/{id}/takedown": {
- "delete": {
- "operationId": "delete_api_v1_sites_id_takedown",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "x-openvibe-input": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- },
- "post": {
- "operationId": "post_api_v1_sites_id_takedown",
- "summary": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner ",
- "description": "**host.site.manage** (first-party): Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
- "tags": [
- "host.site"
- ],
- "x-openvibe-capabilities": [
- "host.site.manage"
- ],
- "x-openvibe-visibility": [
- "first-party"
- ],
- "x-openvibe-quota-class": "host-manage",
- "security": [
- {
- "openvibeToken": [
- "host.site.manage"
- ]
- }
- ],
- "requestBody": {
- "required": false,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-request.v1"
- }
- }
- }
- },
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "2XX": {
- "description": "Success",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/host.site-manage-result.v1"
- }
- }
- }
- },
- "default": {
- "description": "An error (RFC 9457 problem details)",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/errors.problem.v1"
- }
- }
- }
- }
- }
- }
- }
- },
- "components": {
- "schemas": {
- "common.no-body.v1": {
- "title": "NoBody",
- "description": "common.no-body@1: the capability's request carries no body; its parameters are the path and query of the routes in implementedBy (an id, a page cursor). An input schema that says so explicitly, so every active capability names one (roadmap WS-C task 4).",
- "type": "object",
- "maxProperties": 0
- },
- "common.resource-list-result.v1": {
- "title": "ResourceListResult",
- "description": "A page of the resource index (roadmap WS-Z7).",
- "type": "object",
- "additionalProperties": false,
- "required": [
- "resources",
- "next_cursor"
- ],
- "properties": {
- "resources": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/common.resource-summary.v1"
- }
- },
- "next_cursor": {
- "type": [
- "string",
- "null"
- ]
- },
- "partial": {
- "type": "array",
- "description": "Authorities a merged index (OpenVibe.Services, ADR-048) could not read for this page: a slow or failing authority is omitted, never fails the page. Each entry names the authority and the problem code it answered. Added in 1.1.0; a single authority's own index leaves it out.",
- "items": {
- "type": "object",
- "required": [
- "service",
- "code"
- ],
- "additionalProperties": false,
- "properties": {
- "service": {
- "type": "string",
- "pattern": "^[a-z][a-z0-9-]{1,39}$"
- },
- "code": {
- "type": "string",
- "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
- }
- }
- }
- }
- }
- },
- "common.resource-summary.v1": {
- "title": "ResourceSummary",
- "description": "One resource of any service, as the resource index lists it (roadmap WS-Z7): every service answers GET /api/v1/resources with these, so OpenVibe.Services shows any resource without owning its data.",
- "type": "object",
- "additionalProperties": false,
- "required": [
- "id",
- "kind",
- "service",
- "state",
- "created_at"
- ],
- "properties": {
- "id": {
- "type": "string"
- },
- "kind": {
- "type": "string",
- "description": "service.kind, e.g. watch.watch, actor.actor, media.object, events.subscription"
- },
- "service": {
- "type": "string"
- },
- "project_id": {
- "type": "string",
- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "ovrn": {
- "type": "string",
- "maxLength": 200,
- "pattern": "^ovrn:[a-z][a-z0-9-]{0,31}:prj_[0-9A-HJKMNP-TV-Z]{26}:[a-z][a-z0-9-]{0,39}/[a-z]{3}_[0-9A-HJKMNP-TV-Z]{26}$",
- "description": "Optional resource name (ADR-034 section 2), the name grants, audit, events, usage records and bills use: ovrn:<service>:<project_id>:<type>/<id>, e.g. ovrn:watch:<project_id>:watch/<wch_id>, with the pattern of common.usage-recorded@1 resource. Its service, project and id are this summary's service, project_id and id. Added in 1.1.0."
- },
- "owner": {
- "$ref": "#/components/schemas/identity.subject-ref.v1"
- },
- "name": {
- "type": "string"
- },
- "state": {
- "type": "string"
- },
- "created_at": {
- "type": "string",
- "format": "date-time"
- },
- "updated_at": {
- "type": "string",
- "format": "date-time"
- },
- "usage": {
- "type": "object",
- "additionalProperties": {
- "type": "number",
- "minimum": 0
- },
- "properties": {},
- "description": "cost units by name (WS-Z1)"
- },
- "links": {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "self": {
- "type": "string",
- "format": "uri"
- },
- "console": {
- "type": "string",
- "format": "uri"
- },
- "docs": {
- "type": "string",
- "format": "uri"
- }
- }
- }
- }
- },
- "errors.problem.v1": {
- "title": "Problem",
- "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
- "type": "object",
- "required": [
- "type",
- "title",
- "status",
- "code"
- ],
- "additionalProperties": true,
- "properties": {
- "type": {
- "type": "string",
- "format": "uri-reference"
- },
- "title": {
- "type": "string",
- "minLength": 1
- },
- "status": {
- "type": "integer",
- "minimum": 400,
- "maximum": 599
- },
- "detail": {
- "type": "string"
- },
- "instance": {
- "type": "string",
- "format": "uri-reference"
- },
- "code": {
- "type": "string",
- "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
- },
- "request_id": {
- "type": "string"
- },
- "trace_id": {
- "type": "string",
- "pattern": "^[0-9a-f]{32}$"
- },
- "errors": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "message"
- ],
- "properties": {
- "path": {
- "type": "string"
- },
- "message": {
- "type": "string"
- }
- }
- }
- },
- "error": {
- "type": "string",
- "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."
- }
- }
- },
- "host.catalog-manage-request.v1": {
- "title": "HostCatalogManageRequest",
- "description": "host.catalog-manage-request@1: bodies of host.catalog.manage on OpenVibe.Host (a Network staff user only). POST/PATCH /api/v1/catalog/providers { slug, name, homepage_url, description?, affiliate_url?, affiliate_note?, status? }; POST/PATCH /api/v1/catalog/plans { provider_id, external_id, name, kind, currency, price_monthly, source_url, vcpu?, ram_mb?, disk_gb?, disk_type?, bandwidth_gb?, unmetered?, port_mbps?, ipv4?, locations?, price_hourly?, setup_fee?, checked_at?, status? } (a plan from OpenVibe.Sources takes only status); POST/PATCH /api/v1/catalog/promos { provider_id, title, url, details?, code?, affiliate?, starts_at?, ends_at?, status? }. A PATCH carries any subset. Unknown fields are refused (422 host.catalog.invalid); a missing entry is 404 host.catalog.not_found; anyone but staff is 403 host.catalog.forbidden. A staff plan's checked_at defaults to now: the staff member confirming the price that day.",
- "anyOf": [
- {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "slug": {
- "type": "string",
- "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
- "maxLength": 80
- },
- "name": {
- "type": "string",
- "minLength": 1,
- "maxLength": 2048
- },
- "homepage_url": {
- "type": "string",
- "maxLength": 2048,
- "pattern": "^https?://"
- },
- "description": {
- "type": [
- "string",
- "null"
- ],
- "maxLength": 2048
- },
- "affiliate_url": {
- "anyOf": [
- {
- "type": "string",
- "maxLength": 2048,
- "pattern": "^https?://"
- },
- {
- "type": "null"
- }
- ]
- },
- "affiliate_note": {
- "type": [
- "string",
- "null"
- ],
- "maxLength": 2048,
- "description": "The exact disclosure shown beside the provider's affiliate links."
- },
- "status": {
- "enum": [
- "active",
- "hidden"
- ]
- }
- }
- },
- {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "provider_id": {
- "type": "string"
- },
- "external_id": {
- "type": "string",
- "minLength": 1,
- "maxLength": 2048
- },
- "name": {
- "type": "string",
- "minLength": 1,
- "maxLength": 2048
- },
- "kind": {
- "enum": [
- "cloud",
- "vps",
- "dedicated",
- "storage",
- "domain"
- ]
- },
- "vcpu": {
- "type": "number",
- "minimum": 0
- },
- "ram_mb": {
- "type": "number",
- "minimum": 0
- },
- "disk_gb": {
- "type": "number",
- "minimum": 0
- },
- "disk_type": {
- "enum": [
- "ssd",
- "nvme",
- "hdd",
- null
- ]
- },
- "bandwidth_gb": {
- "type": "number",
- "minimum": 0
- },
- "unmetered": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "port_mbps": {
- "type": "number",
- "minimum": 0
- },
- "ipv4": {
- "type": "integer",
- "minimum": 0
- },
- "locations": {
- "type": [
- "array",
- "null"
- ],
- "items": {
- "type": "string",
- "minLength": 1
- }
- },
- "currency": {
- "type": "string",
- "pattern": "^[A-Z]{3}$",
- "description": "ISO 4217."
- },
- "price_monthly": {
- "type": "number",
- "minimum": 0,
- "exclusiveMaximum": 100000000
- },
- "price_hourly": {
- "type": [
- "number",
- "null"
- ],
- "minimum": 0
- },
- "setup_fee": {
- "type": [
- "number",
- "null"
- ],
- "minimum": 0
- },
- "source_url": {
- "type": "string",
- "maxLength": 2048,
- "pattern": "^https?://"
- },
- "checked_at": {
- "type": "integer",
- "minimum": 0,
- "description": "Epoch milliseconds the price was confirmed."
- },
- "status": {
- "enum": [
- "active",
- "gone",
- "hidden"
- ]
- }
- }
- },
- {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "provider_id": {
- "type": "string"
- },
- "title": {
- "type": "string",
- "minLength": 1,
- "maxLength": 2048
- },
- "details": {
- "type": [
- "string",
- "null"
- ],
- "maxLength": 2048
- },
- "code": {
- "type": [
- "string",
- "null"
- ],
- "maxLength": 2048
- },
- "url": {
- "type": "string",
- "maxLength": 2048,
- "pattern": "^https?://"
- },
- "affiliate": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "starts_at": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "Epoch milliseconds."
- },
- "ends_at": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "Epoch milliseconds."
- },
- "status": {
- "enum": [
- "active",
- "ended",
- "hidden"
- ]
- }
- }
- }
- ]
- },
- "host.catalog-manage-result.v1": {
- "title": "HostCatalogManageResult",
- "description": "host.catalog-manage-result@1: the saved entry, under its type's name: { provider } (with affiliate_rel and affiliate_disclosure when it has an affiliate link), { plan } or { promo } (an active promo past ends_at reads as ended). 201 on create, 200 on update.",
- "anyOf": [
- {
- "type": "object",
- "required": [
- "provider"
- ],
- "properties": {
- "provider": {
- "type": "object",
- "required": [
- "id"
- ],
- "properties": {
- "id": {
- "type": "string"
- }
- },
- "additionalProperties": true
- }
- }
- },
- {
- "type": "object",
- "required": [
- "plan"
- ],
- "properties": {
- "plan": {
- "type": "object",
- "required": [
- "id"
- ],
- "properties": {
- "id": {
- "type": "string"
- }
- },
- "additionalProperties": true
- }
- }
- },
- {
- "type": "object",
- "required": [
- "promo"
- ],
- "properties": {
- "promo": {
- "type": "object",
- "required": [
- "id"
- ],
- "properties": {
- "id": {
- "type": "string"
- }
- },
- "additionalProperties": true
- }
- }
- }
- ]
- },
- "host.deploy-create-request.v1": {
- "title": "HostDeployCreateRequest",
- "description": "host.deploy-create-request@1: bodies of host.deploy.create on OpenVibe.Host (a deployer or above of the project; an app principal added as deployer can deploy from CI). POST /api/v1/sites/:id/deploys uploads a deploy: the raw body is a tar or tar.gz archive (Content-Type application/gzip, application/x-gzip, application/x-tar or application/octet-stream), or multipart/form-data with archive=<one archive> or files=<file>… (each part's filename is its path); optional fields activate=1, root=<subdirectory to deploy> and strip=folder (removes a shared first segment) also work as query parameters. It is validated (path traversal, links, special and hidden files, server-side code, file types, sizes and quotas) and never executed; a refusal is a problem whose extra carries the failed deploy_id and its log (413 upload.too_large, quota.storage; 422 validation codes; 429 quota.deploys_per_day; 403 site.taken_down; 503 upload.busy; 507 storage.host_full). POST /api/v1/deploys/:id/activate { expected_active? } and POST /api/v1/sites/:id/rollback { deploy_id?, expected_active? } switch the site's pointer in one step (rollback without deploy_id goes to the deploy active before; 409 deploy.not_ready, site.active_changed when expected_active is stale, deploy.no_previous). GET /api/v1/sites/:id/deploys, /deploys/:id and /deploys/:id/log take no body.",
- "anyOf": [
- {
- "type": "string",
- "contentEncoding": "binary",
- "description": "The upload itself: the tar or tar.gz bytes, or the multipart/form-data body (as common.binary@1)."
- },
- {
- "type": "object",
- "properties": {
- "deploy_id": {
- "anyOf": [
- {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- {
- "type": "null"
- }
- ]
- },
- "expected_active": {
- "anyOf": [
- {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- {
- "type": "null"
- }
- ],
- "description": "The deploy you saw active (null: none); refused with 409 site.active_changed when it moved."
- }
- }
- },
- {
- "$ref": "#/components/schemas/common.no-body.v1"
- }
- ]
- },
- "host.deploy-create-result.v1": {
- "title": "HostDeployCreateResult",
- "description": "host.deploy-create-result@1: answers of host.deploy.create on OpenVibe.Host. GET /api/v1/sites/:id/deploys?limit= → { active_deploy_id, deploys, activations } (newest first; the last 20 pointer switches). POST /api/v1/sites/:id/deploys → 201 { deploy, activated, url } (the ready deploy with its validation log; activated when activate=1 switched the site to it). GET /api/v1/deploys/:id → { deploy } with its files. GET /api/v1/deploys/:id/log → { deploy_id, state, log }. POST /api/v1/deploys/:id/activate and /sites/:id/rollback → { active_deploy_id, previous_deploy_id, changed } (changed false when it was already active). Emits host.deploy.created|activated|failed.",
- "anyOf": [
- {
- "type": "object",
- "required": [
- "active_deploy_id",
- "deploys",
- "activations"
- ],
- "properties": {
- "active_deploy_id": {
- "anyOf": [
- {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- {
- "type": "null"
- }
- ]
- },
- "deploys": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/host.deploy.v1"
- }
- },
- "activations": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "deploy_id",
- "previous_deploy_id",
- "kind",
- "actor",
- "at"
- ],
- "properties": {
- "deploy_id": {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "previous_deploy_id": {
- "anyOf": [
- {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- {
- "type": "null"
- }
- ]
- },
- "kind": {
- "enum": [
- "activate",
- "rollback"
- ]
- },
- "actor": {
- "type": "string"
- },
- "at": {
- "type": "string",
- "format": "date-time"
- }
- }
- }
- }
- }
- },
- {
- "type": "object",
- "required": [
- "deploy"
- ],
- "properties": {
- "deploy": {
- "$ref": "#/components/schemas/host.deploy.v1"
- },
- "activated": {
- "type": "boolean"
- },
- "url": {
- "type": "string"
- }
- }
- },
- {
- "type": "object",
- "required": [
- "deploy_id",
- "state",
- "log"
- ],
- "properties": {
- "deploy_id": {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "state": {
- "enum": [
- "ready",
- "failed",
- "deleted"
- ]
- },
- "log": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "level",
- "message",
- "at"
- ],
- "properties": {
- "level": {
- "enum": [
- "info",
- "warn",
- "error"
- ]
- },
- "message": {
- "type": "string"
- },
- "at": {
- "type": "string",
- "format": "date-time"
- }
- }
- }
- }
- }
- },
- {
- "type": "object",
- "required": [
- "active_deploy_id",
- "previous_deploy_id",
- "changed"
- ],
- "properties": {
- "active_deploy_id": {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "previous_deploy_id": {
- "anyOf": [
- {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- {
- "type": "null"
- }
- ]
- },
- "changed": {
- "type": "boolean"
- }
- }
- }
- ]
- },
- "host.deploy.v1": {
- "title": "HostDeploy",
- "description": "host.deploy@1: one immutable static deploy on OpenVibe.Host (server/http/serialize.js deploy): ready (validated and stored, never executed) or failed (refused, with its failure code and log), whether the site serves it, its size and manifest hash. GET /api/v1/deploys/:id adds the files; the upload answer adds the log.",
- "type": "object",
- "required": [
- "id",
- "site_id",
- "project_id",
- "state",
- "active",
- "source",
- "file_count",
- "total_bytes",
- "new_bytes",
- "manifest_sha256",
- "failure_code",
- "created_by",
- "created_at"
- ],
- "properties": {
- "id": {
- "type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "site_id": {
- "type": "string",
- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "project_id": {
- "type": "string",
- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "state": {
- "enum": [
- "ready",
- "failed",
- "deleted"
- ]
- },
- "active": {
- "type": "boolean"
- },
- "source": {
- "enum": [
- "archive",
- "files",
- "preview",
- "git"
- ]
- },
- "git": {
- "type": "object",
- "required": [
- "provider",
- "repo_url",
- "ref",
- "commit_sha"
- ],
- "properties": {
- "provider": {
- "type": "string"
- },
- "repo_url": {
- "type": "string"
- },
- "ref": {
- "type": "string"
- },
- "commit_sha": {
- "type": "string",
- "pattern": "^[0-9a-f]{40}$"
- }
- },
- "description": "Present on source git: the commit this deploy was built from (public provenance, never a credential)."
- },
- "file_count": {
- "type": "integer",
- "minimum": 0
- },
- "total_bytes": {
- "type": "integer",
- "minimum": 0
- },
- "new_bytes": {
- "type": "integer",
- "minimum": 0,
- "description": "Bytes this deploy added to the project's store."
- },
- "manifest_sha256": {
- "type": [
- "string",
- "null"
- ],
- "pattern": "^[0-9a-f]{64}$"
- },
- "failure_code": {
- "type": [
- "string",
- "null"
- ]
- },
- "created_by": {
- "type": "string"
- },
- "created_at": {
- "type": "string",
- "format": "date-time"
- },
- "files": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "path",
- "sha256",
- "size",
- "content_type"
- ],
- "properties": {
- "path": {
- "type": "string"
- },
- "sha256": {
- "type": "string",
- "pattern": "^[0-9a-f]{64}$"
- },
- "size": {
- "type": "integer",
- "minimum": 0
- },
- "content_type": {
- "type": "string"
- }
- }
- }
- },
- "log": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "level",
- "message",
- "at"
- ],
- "properties": {
- "level": {
- "enum": [
- "info",
- "warn",
- "error"
- ]
- },
- "message": {
- "type": "string"
- },
- "at": {
- "type": "string",
- "format": "date-time"
- }
- }
- }
- }
- }
- },
- "host.domain-manage-request.v1": {
- "title": "HostDomainManageRequest",
- "description": "host.domain-manage-request@1: bodies of host.domain.manage on OpenVibe.Host (a maintainer or above of the project). POST /api/v1/sites/:id/domains { hostname } adds a custom domain, pending until its TXT record is verified: a fully qualified host name, lowercased (422 domain.invalid_hostname; 422 domain.reserved for any OpenVibe domain; 403 domain.sandbox in sandbox projects; 429 quota.custom_domains; 409 domain.exists, domain.taken). GET /api/v1/sites/:id/domains, POST /api/v1/domains/:id/verify (checks the TXT record now) and DELETE /api/v1/domains/:id (409 domain.default: the default domain goes only with the site) take no body.",
- "anyOf": [
- {
- "type": "object",
- "required": [
- "hostname"
- ],
- "properties": {
- "hostname": {
- "type": "string",
- "minLength": 1,
- "maxLength": 254,
- "description": "e.g. www.example.org (a trailing dot is dropped)."
- }
- }
- },
- {
- "$ref": "#/components/schemas/common.no-body.v1"
- }
- ]
- },
- "host.domain-manage-result.v1": {
- "title": "HostDomainManageResult",
- "description": "host.domain-manage-result@1: answers of host.domain.manage on OpenVibe.Host. GET /api/v1/sites/:id/domains → { domains } (the default domain first). POST /api/v1/sites/:id/domains → 201 { domain } with the DNS records to publish. POST /api/v1/domains/:id/verify → { domain } after the check (status verified and served once the TXT record matches, else last_error says what was found; emits host.domain.verified). DELETE /api/v1/domains/:id → { deleted: true }.",
- "anyOf": [
- {
- "type": "object",
- "required": [
- "domains"
- ],
- "properties": {
- "domains": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/host.domain.v1"
- }
- }
- }
- },
- {
- "type": "object",
- "required": [
- "domain"
- ],
- "properties": {
- "domain": {
- "$ref": "#/components/schemas/host.domain.v1"
- }
- }
- },
- {
- "type": "object",
- "required": [
- "deleted"
- ],
- "properties": {
- "deleted": {
- "const": true
- }
- }
- }
- ]
- },
- "host.domain.v1": {
- "title": "HostDomain",
- "description": "host.domain@1: one domain of a static site on OpenVibe.Host (server/http/serialize.js domain): the default <site>.openvibe.host, or a custom domain that is served only once its DNS TXT record is verified (re-checked daily; it lapses when the record is gone). A custom domain carries the records its owner must publish (the TXT verification value is public by design and shown only to members); TLS certificates are issued by an operator.",
- "type": "object",
- "required": [
- "id",
- "site_id",
- "hostname",
- "kind",
- "status",
- "served",
- "verified_at",
- "last_checked_at",
- "last_error"
- ],
- "properties": {
- "id": {
- "type": "string",
- "pattern": "^dom_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "site_id": {
- "type": "string",
- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "hostname": {
- "type": "string"
- },
- "kind": {
- "enum": [
- "default",
- "custom"
- ]
- },
- "status": {
- "enum": [
- "pending",
- "verified",
- "failed",
- "lapsed"
- ]
- },
- "served": {
- "type": "boolean"
- },
- "verified_at": {
- "type": [
- "string",
- "null"
- ],
- "format": "date-time"
- },
- "last_checked_at": {
- "type": [
- "string",
- "null"
- ],
- "format": "date-time"
- },
- "last_error": {
- "type": [
- "string",
- "null"
- ]
- },
- "instructions": {
- "type": "object",
- "required": [
- "verification",
- "routing",
- "tls"
- ],
- "properties": {
- "verification": {
- "type": "object",
- "required": [
- "type",
- "name",
- "value"
- ],
- "properties": {
- "type": {
- "const": "TXT"
- },
- "name": {
- "type": "string",
- "description": "_openvibe-host.<hostname>"
- },
- "value": {
- "type": "string",
- "description": "openvibe-host-verification=<token>"
- },
- "note": {
- "type": "string"
- }
- }
- },
- "routing": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "type",
- "name",
- "value"
- ],
- "properties": {
- "type": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "value": {
- "type": "string"
- },
- "note": {
- "type": "string"
- }
- }
- },
- "description": "A CNAME for a subdomain; A/AAAA for an apex domain when the operator configured them."
- },
- "tls": {
- "type": "string"
- }
- }
- }
- }
- },
- "host.project.v1": {
- "title": "HostProject",
- "description": "host.project@1: one OpenVibe.Host tenant project (server/http/serialize.js project): owned by a person (usr_…), production or sandbox, with the caller's role in it and any staff takedown. POST /api/v1/projects and GET /api/v1/projects/:id add the effective quota and the usage.",
- "type": "object",
- "required": [
- "id",
- "name",
- "environment",
- "network_project_id",
- "owner",
- "role",
- "created_at",
- "takedown"
- ],
- "properties": {
- "id": {
- "type": "string",
- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "name": {
- "type": "string",
- "minLength": 1,
- "maxLength": 80
- },
- "environment": {
- "enum": [
- "production",
- "sandbox"
- ]
- },
- "network_project_id": {
- "type": [
- "string",
- "null"
- ],
- "description": "The OpenVibe.Network project once Network has projects."
- },
- "owner": {
- "type": "string",
- "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "role": {
- "enum": [
- "owner",
- "maintainer",
- "deployer",
- "staff",
- null
- ],
- "description": "The caller's role (staff: a Network admin who is not a member)."
- },
- "created_at": {
- "type": "string",
- "format": "date-time"
- },
- "takedown": {
- "type": [
- "object",
- "null"
- ],
- "required": [
- "scope",
- "reason",
- "since"
- ],
- "description": "A staff takedown covering it: serving stops while the content is kept for review.",
- "properties": {
- "scope": {
- "enum": [
- "project",
- "site"
- ]
- },
- "reason": {
- "type": "string"
- },
- "since": {
- "type": [
- "string",
- "null"
- ],
- "format": "date-time"
- }
- }
- },
- "quota": {
- "type": "object",
- "required": [
- "storage_bytes",
- "deploys_per_day",
- "max_files",
- "max_file_bytes",
- "sites",
- "custom_domains"
- ],
- "description": "The effective quota: the project's override where set, else its environment's default.",
- "properties": {
- "storage_bytes": {
- "type": "integer",
- "minimum": 0
- },
- "deploys_per_day": {
- "type": "integer",
- "minimum": 0
- },
- "max_files": {
- "type": "integer",
- "minimum": 0
- },
- "max_file_bytes": {
- "type": "integer",
- "minimum": 0
- },
- "sites": {
- "type": "integer",
- "minimum": 0
- },
- "custom_domains": {
- "type": "integer",
- "minimum": 0
- }
- }
- },
- "usage": {
- "type": "object",
- "required": [
- "storage_bytes",
- "objects",
- "deploys_last_24h",
- "sites",
- "custom_domains"
- ],
- "properties": {
- "storage_bytes": {
- "type": "integer",
- "minimum": 0
- },
- "objects": {
- "type": "integer",
- "minimum": 0
- },
- "deploys_last_24h": {
- "type": "integer",
- "minimum": 0
- },
- "sites": {
- "type": "integer",
- "minimum": 0
- },
- "custom_domains": {
- "type": "integer",
- "minimum": 0
- }
- }
- }
- }
- },
- "host.site-config-request.v1": {
- "title": "HostSiteConfigRequest",
- "description": "host.site-config-request@1: the body of PUT /api/v1/sites/:id/config on OpenVibe.Host (host.site.config; the acting principal must be a maintainer or owner of the site's project). { headers?, redirects?, spa? } replaces the whole configuration: a field left out is reset to its default. A redirect's status defaults to 301. Refusals are 422 problem+json: site_config.reserved_header, site_config.header_name, site_config.header_value (longer than 1024 characters or a control character), site_config.too_many (over 50 headers or 200 redirects), site_config.redirect (not a local path, a duplicate from, or a status outside 301/302/307/308), site_config.headers and site_config.redirects (wrong type). GET and DELETE /api/v1/sites/:id/config take no body (DELETE resets to the defaults).",
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "headers": {
- "type": "object",
- "additionalProperties": {
- "type": "string"
- }
- },
- "redirects": {
- "type": "array",
- "items": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "from",
- "to"
- ],
- "properties": {
- "from": {
- "type": "string"
- },
- "to": {
- "type": "string"
- },
- "status": {
- "enum": [
- 301,
- 302,
- 307,
- 308
- ]
- }
- }
- }
- },
- "spa": {
- "type": "boolean"
- }
- }
- },
- "host.site-config-result.v1": {
- "title": "HostSiteConfigResult",
- "description": "host.site-config-result@1: every answer of host.site.config on OpenVibe.Host. GET, PUT and DELETE /api/v1/sites/:id/config → { config } (after a PUT, the configuration as stored; after a DELETE, the defaults).",
- "type": "object",
- "additionalProperties": false,
- "required": [
- "config"
- ],
- "properties": {
- "config": {
- "$ref": "#/components/schemas/host.site-config.v1"
- }
- }
- },
- "host.site-config.v1": {
- "title": "HostSiteConfig",
- "description": "host.site-config@1: one Host site's serving configuration (plan T12 J3). headers are applied to every response of the site before the platform's own, which always win; the platform's security, routing, caching, scope and transport headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, Cache-Control, Content-Type, Location, Service-Worker-Allowed, Alt-Svc and the rest of Host's reserved list) and every X-Forwarded-* header are refused. redirects are local paths only (no scheme, host, protocol-relative URL, backslash or control character, also after percent-decoding). spa serves /index.html for an extensionless path that has no file. A site with no configuration answers { headers: {}, redirects: [], spa: false }.",
- "type": "object",
- "additionalProperties": false,
- "required": [
- "headers",
- "redirects",
- "spa"
- ],
- "properties": {
- "headers": {
- "type": "object",
- "maxProperties": 50,
- "propertyNames": {
- "pattern": "^[A-Za-z0-9][A-Za-z0-9-]{0,63}$"
- },
- "additionalProperties": {
- "type": "string",
- "maxLength": 1024
- }
- },
- "redirects": {
- "type": "array",
- "maxItems": 200,
- "items": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "from",
- "to",
- "status"
- ],
- "properties": {
- "from": {
- "type": "string",
- "pattern": "^/(?!/)",
- "maxLength": 1024
- },
- "to": {
- "type": "string",
- "pattern": "^/(?!/)",
- "maxLength": 1024
- },
- "status": {
- "enum": [
- 301,
- 302,
- 307,
- 308
- ]
- }
- }
- }
- },
- "spa": {
- "type": "boolean"
- }
- }
- },
- "host.site-manage-request.v1": {
- "title": "HostSiteManageRequest",
- "description": "host.site-manage-request@1: bodies of host.site.manage on OpenVibe.Host (judged by the acting principal's project role too; a sandbox token is refused on production projects). POST /api/v1/projects { name, environment?, network_project_id? } creates a project owned by the person named with X-OV-Subject (403 project.owner_must_be_user; 422 project.invalid_name over 80 characters, project.invalid_environment; 429 quota.projects; 409 project.network_project_taken). PUT /api/v1/projects/:id/quota { storage_bytes?, deploys_per_day?, max_files?, max_file_bytes?, sites?, custom_domains? } (a Network staff user: 403 auth.staff_only; fields left out keep their value). PUT /api/v1/projects/:id/members/:principal { role } (the owner: 422 member.invalid_role, 409 member.owner_fixed). POST /api/v1/projects/:id/sites { name } (a maintainer; lowercased and trimmed, one DNS label of 3–40 characters: 422 site.invalid_name, site.name_reserved; 409 site.name_taken, site.name_held; 429 quota.sites). POST /api/v1/projects/:id/takedown and /sites/:id/takedown { reason } (staff: stop serving, keep the content; 409 takedown.exists); DELETE on those { note? } lifts it. GET /api/v1/projects, /projects/:id, /projects/:id/quota, /projects/:id/sites and /sites/:id, and DELETE /api/v1/projects/:id, /projects/:id/members/:principal, /sites/:id and /deploys/:id take no body (deleting refuses taken-down content for non-staff: 409 site.taken_down; an active deploy: 409 deploy.active).",
- "anyOf": [
- {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string",
- "minLength": 1,
- "description": "1–80 characters once trimmed."
- },
- "environment": {
- "enum": [
- "production",
- "sandbox",
- null
- ],
- "description": "Default production; a sandbox credential creates sandbox projects only."
- },
- "network_project_id": {
- "anyOf": [
- {
- "type": "string",
- "pattern": "^([A-Za-z0-9_:-]{3,80})?$"
- },
- {
- "type": "null"
- }
- ]
- }
- }
- },
- {
- "type": "object",
- "properties": {
- "storage_bytes": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "A non-negative integer, or null for the environment default."
- },
- "deploys_per_day": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "A non-negative integer, or null for the environment default."
- },
- "max_files": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "A non-negative integer, or null for the environment default."
- },
- "max_file_bytes": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "A non-negative integer, or null for the environment default."
- },
- "sites": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "A non-negative integer, or null for the environment default."
- },
- "custom_domains": {
- "type": [
- "integer",
- "null"
- ],
- "minimum": 0,
- "description": "A non-negative integer, or null for the environment default."
- }
- }
- },
- {
- "type": "object",
- "required": [
- "role"
- ],
- "properties": {
- "role": {
- "enum": [
- "owner",
- "maintainer",
- "deployer"
- ],
- "description": "Only a person (usr_…) can be an owner."
- }
- }
+ }
+ },
+ "components": {
+ "schemas": {
+ "errors.problem.v1": {
+ "title": "Problem",
+ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
+ "type": "object",
+ "required": [
+ "type",
+ "title",
+ "status",
+ "code"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "type": {
+ "type": "string",
+ "format": "uri-reference"
},
},
- {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string",
- "pattern": "^\\s*[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){2,39}\\s*$",
- "description": "The site name (lowercased)."
- }
- }
+ "title": {
+ "type": "string",
+ "minLength": 1
},
},
- {
- "type": "object",
- "required": [
- "reason"
- ],
- "properties": {
- "reason": {
- "type": "string",
- "minLength": 1,
- "maxLength": 500,
- "description": "Members see it."
- }
- }
+ "status": {
+ "type": "integer",
+ "minimum": 400,
+ "maximum": 599
},
},
- {
- "type": "object",
- "properties": {
- "note": {
- "type": [
- "string",
- "null"
- ],
- "description": "Cut to 500 characters."
- }
- }
+ "detail": {
+ "type": "string"
},
},
- {
- "$ref": "#/components/schemas/common.no-body.v1"
- }
- ]
- },
- "host.site-manage-result.v1": {
- "title": "HostSiteManageResult",
- "description": "host.site-manage-result@1: answers of host.site.manage on OpenVibe.Host. GET /api/v1/projects → { projects } (the caller's projects with their role). POST /api/v1/projects → 201 { project } (with quota and usage). GET /api/v1/projects/:id → { project, sites, members }. GET and PUT /api/v1/projects/:id/quota → { quota, usage }. PUT and DELETE /api/v1/projects/:id/members/:principal → { members }. GET /api/v1/projects/:id/sites → { sites }. POST /api/v1/projects/:id/sites → 201 { site }. GET /api/v1/sites/:id → { site, domains }. DELETE /api/v1/projects/:id and /sites/:id → { deleted: true } (serving stops at once; the objects are removed). DELETE /api/v1/deploys/:id → { deleted: true, objects_removed }. POST …/takedown → 201 { takedown }; DELETE …/takedown → { lifted: true }.",
- "anyOf": [
- {
- "type": "object",
- "required": [
- "projects"
- ],
- "properties": {
- "projects": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/host.project.v1"
- }
- }
- }
+ "instance": {
+ "type": "string",
+ "format": "uri-reference"
},
},
- {
- "type": "object",
- "required": [
- "project"
- ],
- "properties": {
- "project": {
- "$ref": "#/components/schemas/host.project.v1"
- },
- "sites": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/host.site.v1"
- }
- },
- "members": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "principal",
- "role",
- "added_at"
- ],
- "properties": {
- "principal": {
- "type": "string",
- "description": "usr_…, app:app_… or svc:…"
- },
- "role": {
- "enum": [
- "owner",
- "maintainer",
- "deployer"
- ]
- },
- "added_at": {
- "type": "string",
- "format": "date-time"
- }
- }
- }
- }
- }
+ "code": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
},
},
- {
- "type": "object",
- "required": [
- "quota",
- "usage"
- ],
- "properties": {
- "quota": {
- "type": "object",
- "required": [
- "storage_bytes",
- "deploys_per_day",
- "max_files",
- "max_file_bytes",
- "sites",
- "custom_domains"
- ],
- "description": "The effective quota: the project's override where set, else its environment's default.",
- "properties": {
- "storage_bytes": {
- "type": "integer",
- "minimum": 0
- },
- "deploys_per_day": {
- "type": "integer",
- "minimum": 0
- },
- "max_files": {
- "type": "integer",
- "minimum": 0
- },
- "max_file_bytes": {
- "type": "integer",
- "minimum": 0
- },
- "sites": {
- "type": "integer",
- "minimum": 0
- },
- "custom_domains": {
- "type": "integer",
- "minimum": 0
- }
- }
- },
- "usage": {
- "type": "object",
- "required": [
- "storage_bytes",
- "objects",
- "deploys_last_24h",
- "sites",
- "custom_domains"
- ],
- "properties": {
- "storage_bytes": {
- "type": "integer",
- "minimum": 0
- },
- "objects": {
- "type": "integer",
- "minimum": 0
- },
- "deploys_last_24h": {
- "type": "integer",
- "minimum": 0
- },
- "sites": {
- "type": "integer",
- "minimum": 0
- },
- "custom_domains": {
- "type": "integer",
- "minimum": 0
- }
- }
- }
- }
+ "request_id": {
+ "type": "string"
},
},
- {
- "type": "object",
- "required": [
- "members"
- ],
- "properties": {
- "members": {
- "type": "array",
- "items": {
- "type": "object",
- "required": [
- "principal",
- "role",
- "added_at"
- ],
- "properties": {
- "principal": {
- "type": "string",
- "description": "usr_…, app:app_… or svc:…"
- },
- "role": {
- "enum": [
- "owner",
- "maintainer",
- "deployer"
- ]
- },
- "added_at": {
- "type": "string",
- "format": "date-time"
- }
- }
- }
- }
- }
+ "trace_id": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{32}$"
},
},
- {
- "type": "object",
- "required": [
- "sites"
- ],
- "properties": {
- "sites": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/host.site.v1"
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
}
}
}
}
}
}
},
},
+ "error": {
+ "type": "string",
+ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."
+ }
+ }
+ },
+ "host.catalog-manage-request.v1": {
+ "title": "HostCatalogManageRequest",
+ "description": "host.catalog-manage-request@1: bodies of host.catalog.manage on OpenVibe.Host (a Network staff user only). POST/PATCH /api/v1/catalog/providers { slug, name, homepage_url, description?, affiliate_url?, affiliate_note?, status? }; POST/PATCH /api/v1/catalog/plans { provider_id, external_id, name, kind, currency, price_monthly, source_url, vcpu?, ram_mb?, disk_gb?, disk_type?, bandwidth_gb?, unmetered?, port_mbps?, ipv4?, locations?, price_hourly?, setup_fee?, checked_at?, status? } (a plan from OpenVibe.Sources takes only status); POST/PATCH /api/v1/catalog/promos { provider_id, title, url, details?, code?, affiliate?, starts_at?, ends_at?, status? }. A PATCH carries any subset. Unknown fields are refused (422 host.catalog.invalid); a missing entry is 404 host.catalog.not_found; anyone but staff is 403 host.catalog.forbidden. A staff plan's checked_at defaults to now: the staff member confirming the price that day.",
+ "anyOf": [
{
{
"type": "object",
"type": "object",
- "required": [
- "site"
- ],
+ "additionalProperties": false,
"properties": {
"properties": {
- "site": {
- "$ref": "#/components/schemas/host.site.v1"
+ "slug": {
+ "type": "string",
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
+ "maxLength": 80
},
},
- "domains": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/host.domain.v1"
- }
- }
- }
- },
- {
- "type": "object",
- "required": [
- "deleted"
- ],
- "properties": {
- "deleted": {
- "const": true
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 2048
},
},
- "objects_removed": {
- "type": "integer",
- "minimum": 0
- }
- }
- },
- {
- "type": "object",
- "required": [
- "takedown"
- ],
- "properties": {
- "takedown": {
- "type": "object",
- "required": [
- "scope",
- "reason",
- "since"
- ],
- "description": "The takedown now in force.",
- "properties": {
- "scope": {
- "enum": [
- "project",
- "site"
- ]
- },
- "reason": {
- "type": "string"
- },
- "since": {
- "type": [
- "string",
- "null"
- ],
- "format": "date-time"
- }
- }
- }
- }
- },
- {
- "type": "object",
- "required": [
- "lifted"
- ],
- "properties": {
- "lifted": {
- "const": true
- }
- }
- }
- ]
- },
- "host.site.v1": {
- "title": "HostSite",
- "description": "host.site@1: one static site on OpenVibe.Host (server/http/serialize.js site): its name (one DNS label), the default hostname and URL it is served at, the deploy it serves (one pointer; null until a deploy is activated) and any staff takedown.",
- "type": "object",
- "required": [
- "id",
- "project_id",
- "name",
- "hostname",
- "url",
- "active_deploy_id",
- "takedown",
- "created_at",
- "updated_at"
- ],
- "properties": {
- "id": {
- "type": "string",
- "pattern": "^site_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "project_id": {
- "type": "string",
- "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
- },
- "name": {
- "type": "string",
- "pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){2,39}$"
- },
- "hostname": {
- "type": "string"
- },
- "url": {
- "type": "string"
- },
- "active_deploy_id": {
- "anyOf": [
- {
+ "homepage_url": {
"type": "string",
"type": "string",
- "pattern": "^dpl_[0-9A-HJKMNP-TV-Z]{26}$"
+ "maxLength": 2048,
+ "pattern": "^https?://"
},
},
- {
- "type": "null"
- }
- ]
- },
- "takedown": {
- "type": [
- "object",
- "null"
- ],
- "required": [
- "scope",
- "reason",
- "since"
- ],
- "description": "A staff takedown covering it: serving stops while the content is kept for review.",
- "properties": {
- "scope": {
- "enum": [
- "project",
- "site"
+ "description": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
+ },
+ "affiliate_url": {
+ "anyOf": [
+ {
+ "type": "string",
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ {
+ "type": "null"
+ }
]
]
},
},
- "reason": {
- "type": "string"
- },
- "since": {
+ "affiliate_note": {
"type": [
"type": [
"string",
"string",
"null"
"null"
],
],
- "format": "date-time"
+ "maxLength": 2048,
+ "description": "The exact disclosure shown beside the provider's affiliate links."
+ },
+ "status": {
+ "enum": [
+ "active",
+ "hidden"
+ ]
}
}
}
}
},
},
- "created_at": {
- "type": "string",
- "format": "date-time"
- },
- "updated_at": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "identity.subject-ref.v1": {
- "title": "SubjectRef",
- "description": "The one cross-platform reference to an actor. Issued by OpenVibe.Network. Never a service-local integer id.",
- "oneOf": [
{
{
"type": "object",
"type": "object",
- "required": [
- "type",
- "id"
- ],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
- "type": {
- "const": "user"
+ "provider_id": {
+ "type": "string"
},
},
- "id": {
+ "external_id": {
"type": "string",
"type": "string",
- "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
- }
- },
- "description": "UserSubject"
- },
- {
- "type": "object",
- "required": [
- "type",
- "id"
- ],
- "additionalProperties": false,
- "properties": {
- "type": {
- "const": "guest"
+ "minLength": 1,
+ "maxLength": 2048
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 2048
+ },
+ "kind": {
+ "enum": [
+ "cloud",
+ "vps",
+ "dedicated",
+ "storage",
+ "domain"
+ ]
+ },
+ "vcpu": {
+ "type": "number",
+ "minimum": 0
+ },
+ "ram_mb": {
+ "type": "number",
+ "minimum": 0
+ },
+ "disk_gb": {
+ "type": "number",
+ "minimum": 0
+ },
+ "disk_type": {
+ "enum": [
+ "ssd",
+ "nvme",
+ "hdd",
+ null
+ ]
+ },
+ "bandwidth_gb": {
+ "type": "number",
+ "minimum": 0
+ },
+ "unmetered": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "port_mbps": {
+ "type": "number",
+ "minimum": 0
+ },
+ "ipv4": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "locations": {
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "currency": {
+ "type": "string",
+ "pattern": "^[A-Z]{3}$",
+ "description": "ISO 4217."
+ },
+ "price_monthly": {
+ "type": "number",
+ "minimum": 0,
+ "exclusiveMaximum": 100000000
},
},
- "id": {
+ "price_hourly": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "setup_fee": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "source_url": {
"type": "string",
"type": "string",
- "pattern": "^gst_[0-9A-HJKMNP-TV-Z]{26}$"
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "checked_at": {
+ "type": "integer",
+ "minimum": 0,
+ "description": "Epoch milliseconds the price was confirmed."
+ },
+ "status": {
+ "enum": [
+ "active",
+ "gone",
+ "hidden"
+ ]
}
}
- },
- "description": "GuestSubject"
+ }
},
},
{
{
"type": "object",
"type": "object",
- "required": [
- "type",
- "id"
- ],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
- "type": {
- "const": "app"
+ "provider_id": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 2048
+ },
+ "details": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
+ },
+ "code": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
},
},
- "id": {
+ "url": {
"type": "string",
"type": "string",
- "pattern": "^app_[0-9A-HJKMNP-TV-Z]{26}$"
+ "maxLength": 2048,
+ "pattern": "^https?://"
+ },
+ "affiliate": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "starts_at": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0,
+ "description": "Epoch milliseconds."
+ },
+ "ends_at": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0,
+ "description": "Epoch milliseconds."
+ },
+ "status": {
+ "enum": [
+ "active",
+ "ended",
+ "hidden"
+ ]
}
}
- },
- "description": "AppSubject"
- },
+ }
+ }
+ ]
+ },
+ "host.catalog-manage-result.v1": {
+ "title": "HostCatalogManageResult",
+ "description": "host.catalog-manage-result@1: the saved entry, under its type's name: { provider } (with affiliate_rel and affiliate_disclosure when it has an affiliate link), { plan } or { promo } (an active promo past ends_at reads as ended). 201 on create, 200 on update.",
+ "anyOf": [
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "type",
- "id"
+ "provider"
],
],
- "additionalProperties": false,
"properties": {
"properties": {
- "type": {
- "const": "mod"
- },
- "id": {
- "type": "string",
- "pattern": "^mod_[0-9A-HJKMNP-TV-Z]{26}$"
+ "provider": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true
}
}
- },
- "description": "ModSubject"
+ }
},
},
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "type",
- "id"
+ "plan"
],
],
- "additionalProperties": false,
"properties": {
"properties": {
- "type": {
- "enum": [
- "service",
- "system"
- ]
- },
- "id": {
- "type": "string",
- "pattern": "^[a-z][a-z0-9-]{1,39}$"
+ "plan": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true
}
}
- },
- "description": "PrincipalSubject"
+ }
},
},
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "type",
- "id"
+ "promo"
],
],
- "additionalProperties": false,
"properties": {
"properties": {
- "type": {
- "const": "agent"
- },
- "id": {
- "type": "string",
- "pattern": "^agt_[0-9A-HJKMNP-TV-Z]{26}$"
+ "promo": {
+ "type": "object",
+ "required": [
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": true
}
}
- },
- "description": "AgentSubject: an agent (OpenVibe.Actor, or a developer app's agent) acting under grants its owner delegated (roadmap WS-Z2). In an event envelope, on_behalf_of names the owner."
+ }
}
}
]
]
}
}
@@ -89,8 +89,8 @@
@@ -89,8 +89,8 @@
"service": "host",
"service": "host",
"name": "OpenVibe.Host",
"name": "OpenVibe.Host",
"origin": "https://openvibe.host",
"origin": "https://openvibe.host",
- "operations": 42,
- "capabilities": 6
+ "operations": 6,
+ "capabilities": 1
},
},
{
{
"service": "inventory",
"service": "inventory",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.149.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.149.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.149.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.150.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.150.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -2,9 +2,9 @@
@@ -2,9 +2,9 @@
"id": "host.deploy.create",
"id": "host.deploy.create",
"version": "1.0",
"version": "1.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"visibility": "first-party",
"visibility": "first-party",
- "description": "Upload an immutable static deploy (tar/tar.gz or multipart files; validated for path traversal, links, special and hidden files, server-side code, file types and quotas; never executed), list deploys and their upload logs, activate a deploy and roll a site back to any earlier ready deploy (one atomic pointer switch). Also judged by the acting principal's project role (deployer or above); an app principal added to a project as deployer can deploy from CI. A site with a Git source also accepts a CI-built deploy at /sites/:id/source/deploys naming the ref and full commit_sha; it is always a preview and records that commit as immutable provenance.",
+ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.deploy.create on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"permissions": [
"host:deploy"
"host:deploy"
],
],
@@ -17,15 +17,7 @@
@@ -17,15 +17,7 @@
"host.deploy.activated",
"host.deploy.activated",
"host.deploy.failed"
"host.deploy.failed"
],
],
- "implementedBy": [
- "GET /api/v1/sites/:id/deploys",
- "POST /api/v1/sites/:id/deploys",
- "POST /api/v1/sites/:id/source/deploys",
- "GET /api/v1/deploys/:id",
- "GET /api/v1/deploys/:id/log",
- "POST /api/v1/deploys/:id/activate",
- "POST /api/v1/sites/:id/rollback"
- ],
+ "implementedBy": [],
"inputSchema": "host.deploy-create-request@1",
"inputSchema": "host.deploy-create-request@1",
"outputSchema": "host.deploy-create-result@1"
"outputSchema": "host.deploy-create-result@1"
}
}
@@ -2,9 +2,9 @@
@@ -2,9 +2,9 @@
"id": "host.domain.manage",
"id": "host.domain.manage",
"version": "1.0",
"version": "1.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"visibility": "first-party",
"visibility": "first-party",
- "description": "Add a custom domain to a static site (never an OpenVibe domain; not in sandbox projects), read its DNS TXT verification and routing records, trigger a verification check, and remove it. A custom domain is served only after its TXT record is verified; TLS certificates are issued by an operator and never pass through this capability.",
+ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.domain.manage on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"permissions": [
"host:write"
"host:write"
],
],
@@ -15,12 +15,7 @@
@@ -15,12 +15,7 @@
"events": [
"events": [
"host.domain.verified"
"host.domain.verified"
],
],
- "implementedBy": [
- "GET /api/v1/sites/:id/domains",
- "POST /api/v1/sites/:id/domains",
- "POST /api/v1/domains/:id/verify",
- "DELETE /api/v1/domains/:id"
- ],
+ "implementedBy": [],
"inputSchema": "host.domain-manage-request@1",
"inputSchema": "host.domain-manage-request@1",
"outputSchema": "host.domain-manage-result@1"
"outputSchema": "host.domain-manage-result@1"
}
}
@@ -2,9 +2,9 @@
@@ -2,9 +2,9 @@
"id": "host.resource.read",
"id": "host.resource.read",
"version": "1.0",
"version": "1.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"visibility": "first-party",
"visibility": "first-party",
- "description": "Read OpenVibe.Host's resource index (ADR-048): GET /api/v1/resources lists the resources Host owns as a page of common.resource-summary@1 (common.resource-list-result@1), and GET /api/v1/resources/:ovrn reads one by its OVRN (common.resource-summary@1). Every authority serves these for OpenVibe.Services to fan out and merge; Host's own resources are its static sites (kind host.site, id sit_<ULID>), the immutable deploys of those sites (kind host.deploy, id dpl_<ULID>) and their default and custom domains (kind host.domain, id dom_<ULID>), each with the project_id of the Network project that owns it. Host lists no projects; only Network lists projects. Planned until Host ships the index.",
+ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.resource.read on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"permissions": [
"resources:read"
"resources:read"
],
],
@@ -13,10 +13,7 @@
@@ -13,10 +13,7 @@
],
],
"quotaClass": "standard",
"quotaClass": "standard",
"events": [],
"events": [],
- "implementedBy": [
- "GET /api/v1/resources",
- "GET /api/v1/resources/:ovrn"
- ],
+ "implementedBy": [],
"inputSchema": "common.no-body@1",
"inputSchema": "common.no-body@1",
"outputSchema": "common.resource-list-result@1"
"outputSchema": "common.resource-list-result@1"
}
}
@@ -2,9 +2,9 @@
@@ -2,9 +2,9 @@
"id": "host.site.config",
"id": "host.site.config",
"version": "1.0",
"version": "1.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"visibility": "first-party",
"visibility": "first-party",
- "description": "Read, set and reset a Host site's serving configuration: response headers, local-only redirects and the SPA fallback (extensionless paths serve index.html). A capability holder must also hold the acting principal's project role (maintainer or owner to change, any role to read). Reserved headers (Content-Security-Policy, Strict-Transport-Security, Set-Cookie, X-Forwarded-*, caching, scope, transport and the platform's own) are refused, and a redirect target must be a local path, so a site can never become an open redirect.",
+ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.site.config on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"permissions": [
"host:write"
"host:write"
],
],
@@ -13,11 +13,7 @@
@@ -13,11 +13,7 @@
],
],
"quotaClass": "host-manage",
"quotaClass": "host-manage",
"events": [],
"events": [],
- "implementedBy": [
- "GET /api/v1/sites/:id/config",
- "PUT /api/v1/sites/:id/config",
- "DELETE /api/v1/sites/:id/config"
- ],
+ "implementedBy": [],
"inputSchema": "host.site-config-request@1",
"inputSchema": "host.site-config-request@1",
"outputSchema": "host.site-config-result@1"
"outputSchema": "host.site-config-result@1"
}
}
@@ -2,9 +2,9 @@
@@ -2,9 +2,9 @@
"id": "host.site.manage",
"id": "host.site.manage",
"version": "1.0",
"version": "1.0",
"owner": "host",
"owner": "host",
- "status": "active",
+ "status": "retired",
"visibility": "first-party",
"visibility": "first-party",
- "description": "Manage OpenVibe.Host tenant projects and static sites: create a project (owned by the person named with X-OV-Subject; apps cannot own projects), read projects, quotas and usage, manage members (owner role), create and delete sites, delete a deploy that is not active. Also judged by the acting principal's project role; a sandbox token (env=sandbox) is refused on production projects. Quota changes and takedowns (stop serving a site or a whole project while keeping its content for review; lift) additionally need a Network staff user. Read, set or remove a site's Git source (provider, public repository URL and branch; never a credential).",
+ "description": "RETIRED at 0.150.0: the static hosting engine moved from OpenVibe.Host to OpenVibe.Space on 2026-10-12 (plan T20). Use space.site.manage on OpenVibe.Space. Host answers the old routes with 410 host.moved_to_space.",
"permissions": [
"permissions": [
"host:write"
"host:write"
],
],
@@ -13,28 +13,7 @@
@@ -13,28 +13,7 @@
],
],
"quotaClass": "host-manage",
"quotaClass": "host-manage",
"events": [],
"events": [],
- "implementedBy": [
- "GET /api/v1/projects",
- "POST /api/v1/projects",
- "GET /api/v1/projects/:id",
- "DELETE /api/v1/projects/:id",
- "GET /api/v1/projects/:id/quota",
- "PUT /api/v1/projects/:id/quota",
- "PUT /api/v1/projects/:id/members/:principal",
- "DELETE /api/v1/projects/:id/members/:principal",
- "GET /api/v1/projects/:id/sites",
- "POST /api/v1/projects/:id/sites",
- "GET /api/v1/sites/:id",
- "GET /api/v1/sites/:id/source",
- "PUT /api/v1/sites/:id/source",
- "DELETE /api/v1/sites/:id/source",
- "DELETE /api/v1/sites/:id",
- "DELETE /api/v1/deploys/:id",
- "POST /api/v1/projects/:id/takedown",
- "DELETE /api/v1/projects/:id/takedown",
- "POST /api/v1/sites/:id/takedown",
- "DELETE /api/v1/sites/:id/takedown"
- ],
+ "implementedBy": [],
"inputSchema": "host.site-manage-request@1",
"inputSchema": "host.site-manage-request@1",
"outputSchema": "host.site-manage-result@1"
"outputSchema": "host.site-manage-result@1"
}
}
@@ -4,24 +4,24 @@
@@ -4,24 +4,24 @@
"name": "OpenVibe.Video",
"name": "OpenVibe.Video",
"icon": "fa-film",
"icon": "fa-film",
"accent": "#f87171",
"accent": "#f87171",
- "tagline": "Your videos, everywhere.",
- "description": "OpenVibe.Video will be the home of long-form video on the OpenVibe network: watch pages, channels and playlists for uploads and past streams, a creator tool that publishes one upload to many platforms, and AI captions, highlights and editing, delivered by OpenVibe.Media.",
+ "tagline": "Watch what OpenVibe streamed.",
+ "description": "OpenVibe.Video is the watch site for the OpenVibe network: stream recordings and clips from OpenVibe.Live, each with a player, AI chapters and WebVTT captions, its clips and its OpenVibe.Community thread, and a page per channel. The files stay on OpenVibe.Media. Uploads, playlists and publishing to other platforms come later.",
"pillars": [
"pillars": [
{
{
"title": "Watch",
"title": "Watch",
- "text": "Channels, playlists and search for uploads and past streams."
+ "text": "Recordings and clips from OpenVibe.Live, and a page per channel."
},
},
{
{
- "title": "Publish everywhere",
- "text": "One upload, sent to the platforms you choose, tracked in one place."
+ "title": "Chapters and captions",
+ "text": "Chapters from the AI moments of a stream, captions from its AI transcript."
},
},
{
{
- "title": "AI tools",
- "text": "Captions, translations, highlights and shorts from long videos."
+ "title": "From your streams",
+ "text": "What you stream on OpenVibe.Live and make public lands here."
},
},
{
{
- "title": "From your streams",
- "text": "Recordings from OpenVibe.Live land here, ready to share."
+ "title": "Next",
+ "text": "Uploads, playlists and publishing to other platforms are not built yet."
}
}
],
],
"keywords": "openvibe video, video hosting, youtube alternative, multi-platform upload, ai video tools",
"keywords": "openvibe video, video hosting, youtube alternative, multi-platform upload, ai video tools",
@@ -30,15 +30,15 @@
@@ -30,15 +30,15 @@
"service": "media-hub",
"service": "media-hub",
"noRepo": true,
"noRepo": true,
"meanwhile": [
"meanwhile": [
- {
- "label": "OpenVibe.Live",
- "url": "https://openvibe.live",
- "note": "Streams, recordings and clips live on OpenVibe.Live today."
- },
{
{
"label": "OpenRestream",
"label": "OpenRestream",
"url": "https://openre.stream",
"url": "https://openre.stream",
"note": "Restreaming to many platforms is the sibling product."
"note": "Restreaming to many platforms is the sibling product."
+ },
+ {
+ "label": "OpenVibe.Live",
+ "url": "https://openvibe.live",
+ "note": "Owners manage their recordings and clips on OpenVibe.Live."
}
}
]
]
}
}
@@ -65,19 +65,10 @@
@@ -65,19 +65,10 @@
}
}
},
},
"capabilities": [
"capabilities": [
- "host.site.manage",
- "host.deploy.create",
- "host.domain.manage",
- "host.resource.read",
- "host.site.config",
"host.catalog.manage"
"host.catalog.manage"
],
],
"eventsProduced": [
"eventsProduced": [
- "host.deploy.created",
- "host.deploy.activated",
- "host.deploy.failed",
"host.release.published",
"host.release.published",
- "host.domain.verified",
"host.index_document.upserted",
"host.index_document.upserted",
"host.index_document.deleted"
"host.index_document.deleted"
],
],
@@ -137,5 +128,5 @@
@@ -137,5 +128,5 @@
]
]
}
}
},
},
- "notes": "Stage A: the ovhost operator CLI (no server). Stage B: the Host API service on port 4910 (unit openvibe-host.service, state /var/lib/openvibe-host-api): tenant projects keyed by project id (prj_, network_project_id once Network has projects, ADR-014), static sites served by Host header at <site>.openvibe.host (a registrable domain separate from every other OpenVibe domain) and on TXT-verified custom domains, immutable content-addressed deploys with rollback, quotas enforced here, upload logs. Consumes OpenVibe.Network (SSO, JWKS, client-credentials) and publishes through OpenVibe.Events (events.event.publish). The ovhost CLI publishes host.release.published (subject release, visibility public) when a network service's release goes live (ovhost deploy/rollback/announce; release notifications, WS-P task 9); host.deploy.activated is Stage B's tenant activations only. Stage C (sandboxed user code) is not started."
+ "notes": "Stage A: the ovhost operator CLI (no server). The Host service on port 4910 (unit openvibe-host.service) serves openvibe.host, hosting compared: providers, plans and promotions with dated, sourced prices from OpenVibe.Sources and staff entries (host.catalog.manage), discussion on OpenVibe.Community and its pages as OpenVibe.Search documents (host.index_document.*). The ovhost CLI publishes host.release.published. Stage B (tenant static hosting) moved to OpenVibe.Space on 2026-10-12 (plan T20): its host.* capabilities and events are retired at 0.150.0 in favour of space.*, and Host answers the old routes and tenant hosts with 410 host.moved_to_space."
}
}
@@ -87,7 +87,7 @@
@@ -87,7 +87,7 @@
"none": "no claims: one process serves the three domains"
"none": "no claims: one process serves the three domains"
}
}
},
},
- "notes": "Port 4990, unit openvibe-media-hub.service, one process for openvibe.download, openvibe.pics and openvibe.video (plan T10 D4, by Host header). v1: openvibe.download is a private drive — account-only uploads streamed into OpenVibe.Media (app media-hub; a plain form up to 256 MB, resumable multipart beyond), private files and folders with per-person limits, share links that expire, need a signed-in downloader and may name accounts (matched by subject), reports that suspend a share for staff, and sandboxed attachment downloads. openvibe.pics and openvibe.video answer with coming pages: their uploads wait for scanning and abuse intake (the video.*/pics.*/download.* capabilities stay planned until an app may call them). Consumes OpenVibe.Network (SSO with PKCE S256 as OAuth client media-hub, JWKS, identity.subject.resolve) and OpenVibe.Media; answers account export and deletion (ADR-033).",
+ "notes": "Port 4990, unit openvibe-media-hub.service, one process for openvibe.download, openvibe.pics and openvibe.video (plan T10 D4, by Host header). v1: openvibe.download is a private drive — account-only uploads streamed into OpenVibe.Media (app media-hub; a plain form up to 256 MB, resumable multipart beyond), private files and folders with per-person limits, share links that expire, need a signed-in downloader and may name accounts (matched by subject), reports that suspend a share for staff, and sandboxed attachment downloads. openvibe.pics and openvibe.video answer with coming pages: their uploads wait for scanning and abuse intake (the video.*/pics.*/download.* capabilities stay planned until an app may call them). Consumes OpenVibe.Network (SSO with PKCE S256 as OAuth client media-hub, JWKS, identity.subject.resolve) and OpenVibe.Media; answers account export and deletion (ADR-033). Since 2026-10-12 the same process serves openvibe.video, OpenVibe.Video v1: public, read-only watch pages for OpenVibe.Live's stream recordings and clips (read from Live's public API, files on OpenVibe.Media), with WebVTT captions from the AI transcript and chapters from the AI moments. video.* stays planned until an app may call it; openvibe.pics stays parked.",
"health": "/api/health",
"health": "/api/health",
"ready": "/api/ready",
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:4990",
"internalOrigin": "http://127.0.0.1:4990",
@@ -95,7 +95,7 @@
@@ -95,7 +95,7 @@
"name": "Media Hub",
"name": "Media Hub",
"icon": "media-hub",
"icon": "media-hub",
"tagline": "Video, pics and downloads",
"tagline": "Video, pics and downloads",
- "what": "The media-hub products in one service: video watch pages, chapters, captions and playlists (openvibe.video); image hosting and albums (openvibe.pics); share links, drive and backup (openvibe.download). Bytes stay in OpenVibe.Media.",
+ "what": "Your private drive with share links you control (openvibe.download), and watch pages for OpenVibe.Live's recordings and clips with AI chapters and captions (openvibe.video). Image hosting on openvibe.pics is not open.",
"legalProfile": "hosting",
"legalProfile": "hosting",
"position": 20
"position": 20
}
}
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.149.0",
+ "version": "0.150.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",
@@ -823,19 +823,22 @@ await assert.rejects(failing.getToken(), /401: invalid_client/);
@@ -823,19 +823,22 @@ await assert.rejects(failing.getToken(), /401: invalid_client/);
// ── Release notifications (WS-P task 9, ADR-016): host.release.published, public, identifiers only ──
// ── Release notifications (WS-P task 9, ADR-016): host.release.published, public, identifiers only ──
// A network service's release went live (subject release, visibility public: browsers get it over
// A network service's release went live (subject release, visibility public: browsers get it over
-// Events realtime). Tenant hosting's activations stay host.deploy.activated (first-party, its own shape);
-// neither payload passes for the other.
+// Events realtime). Tenant hosting's activations are space.deploy.activated since the engine moved to OpenVibe.Space
+// (0.149.0; host.deploy.activated is retired at 0.150.0): first-party, its own shape; neither payload passes for the other.
{
{
const R = (p) => contracts.validate('host.release.published@1', p).valid;
const R = (p) => contracts.validate('host.release.published@1', p).valid;
- const D = (p) => contracts.validate('host.deploy.activated@1', p).valid;
+ const D = (p) => contracts.validate('space.deploy.activated@1', p).valid;
const cat = (id) => contracts.catalog.find(c => c.id === id);
const cat = (id) => contracts.catalog.find(c => c.id === id);
ok(cat('host.release.published') && cat('host.release.published').owner === 'host' && cat('host.release.published').visibility === 'public', 'host.release.published is a public Host event');
ok(cat('host.release.published') && cat('host.release.published').owner === 'host' && cat('host.release.published').visibility === 'public', 'host.release.published is a public Host event');
- ok(cat('host.deploy.activated') && cat('host.deploy.activated').visibility === 'first-party', 'host.deploy.activated stays first-party (tenant hosting)');
- for (const id of ['host.release.published', 'host.deploy.activated']) ok(services.get('host').eventsProduced.includes(id), `the host manifest produces ${id}`);
+ ok(cat('space.deploy.activated') && cat('space.deploy.activated').visibility === 'first-party', 'space.deploy.activated is first-party (tenant hosting)');
+ ok(cat('host.deploy.activated') && cat('host.deploy.activated').status === 'retired', 'host.deploy.activated is retired (the engine moved to Space)');
+ ok(services.get('host').eventsProduced.includes('host.release.published'), 'the host manifest produces host.release.published');
+ ok(!services.get('host').eventsProduced.includes('host.deploy.activated'), 'the host manifest no longer produces host.deploy.activated');
+ ok(services.get('space').eventsProduced.includes('space.deploy.activated'), 'the space manifest produces space.deploy.activated');
const rel = { service: 'live', release: 'd4e849f2', commit: null, origin: 'https://openvibe.live', deployed_at: '2026-09-26T08:00:05.000Z' };
const rel = { service: 'live', release: 'd4e849f2', commit: null, origin: 'https://openvibe.live', deployed_at: '2026-09-26T08:00:05.000Z' };
- const ten = JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures/host.deploy.activated/valid/tenant-site.json'), 'utf8'));
+ const ten = JSON.parse(fs.readFileSync(path.join(ROOT, 'fixtures/space.deploy.activated/valid/tenant-site.json'), 'utf8'));
ok(R(rel) && D(ten) && !R(ten) && !D(rel) && !R({ ...rel, ...ten }), 'a release and a tenant activation are two contracts that never mix');
ok(R(rel) && D(ten) && !R(ten) && !D(rel) && !R({ ...rel, ...ten }), 'a release and a tenant activation are two contracts that never mix');
- ok(!contracts.schema('host.deploy.activated').oneOf && !contracts.schema('host.release.published').oneOf, 'one shape each');
+ ok(!contracts.schema('space.deploy.activated').oneOf && !contracts.schema('host.release.published').oneOf, 'one shape each');
for (const k of ['service', 'release', 'commit', 'origin', 'deployed_at']) ok(!R({ ...rel, [k]: undefined }), `a release needs ${k} (commit and origin may be null)`);
for (const k of ['service', 'release', 'commit', 'origin', 'deployed_at']) ok(!R({ ...rel, [k]: undefined }), `a release needs ${k} (commit and origin may be null)`);
for (const extra of [{ commits: [] }, { notes: 'x' }, { url: 'https://openvibe.live/updates' }]) ok(!R({ ...rel, ...extra }), `a release carries identifiers only (${Object.keys(extra)[0]})`);
for (const extra of [{ commits: [] }, { notes: 'x' }, { url: 'https://openvibe.live/updates' }]) ok(!R({ ...rel, ...extra }), `a release carries identifiers only (${Object.keys(extra)[0]})`);
ok(R({ ...rel, release: 'd4e849f2a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9' }) && !R({ ...rel, release: 'd4e84' }), 'a release is 7 to 40 hex, as registry.release-manifest@1 says');
ok(R({ ...rel, release: 'd4e849f2a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9' }) && !R({ ...rel, release: 'd4e84' }), 'a release is 7 to 40 hex, as registry.release-manifest@1 says');