openvibers/openvibe.contracts Commits

Contracts 0.126.0: OpenVibe Live on by default for OpenRestream (live.openre.slot.bind); OpenRestream's copy says what it is (#76)

OP OpenVibers committed 9 Oct 2026 · af2078d986 · 47 files, +425 −76

- live.openre.slot.bind (active, internal): POST /internal/openre/slots on OpenVibe.Live, live.openre-slot-bind-request@1
  -> live.openre-slot-bind-result@1, with fixtures. OpenRestream asks Live for a slot on the person's channel bound to
  one OpenRestream stream (ingest_authority openre), so its sessions show on openvibe.live/@username through Live's
  mirror. Idempotent per stream; 409 live.no_account without a Live account. Live lists the capability.
- manifests/services/openre.json: the site copy pitches an open restreaming platform: one stream to every platform at
  once, OpenVibe Live on by default, free and open source. The browser go-live highlight stays.
- generated/ refreshed; compat vs v0.125.1: no breaking changes.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 4620a619..bb6a752b 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,16 @@ 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,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.126.0 — 2026-10-09
++
++- **OpenVibe Live on by default for OpenRestream.** New capability `live.openre.slot.bind` (active, internal):
++ `POST /internal/openre/slots` on OpenVibe.Live with `live.openre-slot-bind-request@1` →
++ `live.openre-slot-bind-result@1`. OpenRestream asks Live for a slot on the person's channel bound to one
++ OpenRestream stream, ingested by OpenRestream, so the stream's sessions show live on openvibe.live/@username through
++ Live's mirror. It is idempotent per stream; 409 `live.no_account` when the person has no Live account yet. Additive.
++- `manifests/services/openre.json`: OpenRestream's site copy says what it is: an open restreaming platform (one stream
++ to every platform at once, OpenVibe Live on by default, free and open source).
++
## 0.125.1 — 2026-10-09
- The product at openre.stream is **OpenRestream** (owner, 2026-10-09): an open restreaming platform. Every name
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 981e86a3..3d95e7b2 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -4929,6 +4929,24 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "live.openre-slot-bind-request",
++ "version": "1.0.0",
++ "owner": "live",
++ "schema": "live/openre-slot-bind-request.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "live.openre-slot-bind-result",
++ "version": "1.0.0",
++ "owner": "live",
++ "schema": "live/openre-slot-bind-result.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "live.url-registry-refresh-result",
"version": "1.0.0",
ddiff --git a/contracts/live/openre-slot-bind-request.v1.json b/contracts/live/openre-slot-bind-request.v1.json
nnew file mode 100644
iindex 00000000..afb5f270
---- /dev/null
++++ b/contracts/live/openre-slot-bind-request.v1.json
@@@ -0,0 +1,33 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/openre-slot-bind-request.v1.json",
++ "title": "LiveOpenreSlotBindRequest",
++ "description": "live.openre-slot-bind-request@1: the body of POST /internal/openre/slots on OpenVibe.Live (capability live.openre.slot.bind). OpenRestream asks Live for a slot on the person's channel bound to one OpenRestream stream (openre_stream_id, std_\u2026); subject is the person who owns that stream. title names the slot on the person's dashboard.",
++ "type": "object",
++ "required": [
++ "subject",
++ "openre_stream_id"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "subject": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "openre_stream_id": {
++ "type": "string",
++ "pattern": "^std_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "protocol": {
++ "enum": [
++ "rtmp",
++ "webrtc",
++ "jsmpeg"
++ ]
++ }
++ }
++}
ddiff --git a/contracts/live/openre-slot-bind-result.v1.json b/contracts/live/openre-slot-bind-result.v1.json
nnew file mode 100644
iindex 00000000..69463240
---- /dev/null
++++ b/contracts/live/openre-slot-bind-result.v1.json
@@@ -0,0 +1,26 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/openre-slot-bind-result.v1.json",
++ "title": "LiveOpenreSlotBindResult",
++ "description": "live.openre-slot-bind-result@1: the answer of POST /internal/openre/slots: the Live slot (managed_stream_id) now ingested by OpenRestream for that stream, the channel it shows on, and created false when the slot already existed. Refusals are problem bodies: 400 (bad body), 409 live.no_account (no Live account for that subject yet), 409 live.slot_taken (the stream is bound to another person's slot).",
++ "type": "object",
++ "required": [
++ "managed_stream_id",
++ "channel_url",
++ "created"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "managed_stream_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "channel_url": {
++ "type": "string",
++ "format": "uri"
++ },
++ "created": {
++ "type": "boolean"
++ }
++ }
++}
ddiff --git a/fixtures/live.openre-slot-bind-request/invalid/no-stream.json b/fixtures/live.openre-slot-bind-request/invalid/no-stream.json
nnew file mode 100644
iindex 00000000..f6bee747
---- /dev/null
++++ b/fixtures/live.openre-slot-bind-request/invalid/no-stream.json
@@@ -0,0 +1,3 @@
++{
++ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"
++}
ddiff --git a/fixtures/live.openre-slot-bind-request/invalid/not-a-subject.json b/fixtures/live.openre-slot-bind-request/invalid/not-a-subject.json
nnew file mode 100644
iindex 00000000..a3c3dd45
---- /dev/null
++++ b/fixtures/live.openre-slot-bind-request/invalid/not-a-subject.json
@@@ -0,0 +1,4 @@
++{
++ "subject": "42",
++ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"
++}
ddiff --git a/fixtures/live.openre-slot-bind-request/valid/full.json b/fixtures/live.openre-slot-bind-request/valid/full.json
nnew file mode 100644
iindex 00000000..3fd3453f
---- /dev/null
++++ b/fixtures/live.openre-slot-bind-request/valid/full.json
@@@ -0,0 +1,6 @@
++{
++ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",
++ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",
++ "title": "Saturday streams",
++ "protocol": "rtmp"
++}
ddiff --git a/fixtures/live.openre-slot-bind-request/valid/minimal.json b/fixtures/live.openre-slot-bind-request/valid/minimal.json
nnew file mode 100644
iindex 00000000..97306a4c
---- /dev/null
++++ b/fixtures/live.openre-slot-bind-request/valid/minimal.json
@@@ -0,0 +1,4 @@
++{
++ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",
++ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"
++}
ddiff --git a/fixtures/live.openre-slot-bind-result/invalid/zero-id.json b/fixtures/live.openre-slot-bind-result/invalid/zero-id.json
nnew file mode 100644
iindex 00000000..e8657454
---- /dev/null
++++ b/fixtures/live.openre-slot-bind-result/invalid/zero-id.json
@@@ -0,0 +1,5 @@
++{
++ "managed_stream_id": 0,
++ "channel_url": "https://openvibe.live/@alex",
++ "created": false
++}
ddiff --git a/fixtures/live.openre-slot-bind-result/valid/created.json b/fixtures/live.openre-slot-bind-result/valid/created.json
nnew file mode 100644
iindex 00000000..6e62db6f
---- /dev/null
++++ b/fixtures/live.openre-slot-bind-result/valid/created.json
@@@ -0,0 +1,5 @@
++{
++ "managed_stream_id": 31,
++ "channel_url": "https://openvibe.live/@alex",
++ "created": true
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex f4ceffb7..d599dc92 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -55379,6 +55379,75 @@
}
}
},
++ "live.openre-slot-bind-request": {
++ "version": "1.0.0",
++ "owner": "live",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/openre-slot-bind-request.v1.json",
++ "title": "LiveOpenreSlotBindRequest",
++ "description": "live.openre-slot-bind-request@1: the body of POST /internal/openre/slots on OpenVibe.Live (capability live.openre.slot.bind). OpenRestream asks Live for a slot on the person's channel bound to one OpenRestream stream (openre_stream_id, std_…); subject is the person who owns that stream. title names the slot on the person's dashboard.",
++ "type": "object",
++ "required": [
++ "subject",
++ "openre_stream_id"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "subject": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "openre_stream_id": {
++ "type": "string",
++ "pattern": "^std_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "protocol": {
++ "enum": [
++ "rtmp",
++ "webrtc",
++ "jsmpeg"
++ ]
++ }
++ }
++ }
++ },
++ "live.openre-slot-bind-result": {
++ "version": "1.0.0",
++ "owner": "live",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/live/openre-slot-bind-result.v1.json",
++ "title": "LiveOpenreSlotBindResult",
++ "description": "live.openre-slot-bind-result@1: the answer of POST /internal/openre/slots: the Live slot (managed_stream_id) now ingested by OpenRestream for that stream, the channel it shows on, and created false when the slot already existed. Refusals are problem bodies: 400 (bad body), 409 live.no_account (no Live account for that subject yet), 409 live.slot_taken (the stream is bound to another person's slot).",
++ "type": "object",
++ "required": [
++ "managed_stream_id",
++ "channel_url",
++ "created"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "managed_stream_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "channel_url": {
++ "type": "string",
++ "format": "uri"
++ },
++ "created": {
++ "type": "boolean"
++ }
++ }
++ }
++ },
"live.url-registry-refresh-result": {
"version": "1.0.0",
"owner": "live",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 357b7516..0891007e 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 55d33125..5fb9e3b1 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex dbf52dcd..4d84b422 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex feb5f4fc..0b0d729f 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex a0cee729..15bec0b3 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 802d063b..a245061e 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 2ddf27c9..945a339f 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 190dff2a..ac53654d 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 30782c4f..69c7b869 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex aaf03a90..a710496f 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex c155c98f..61e4b729 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 10b74435..67241955 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 64aff815..286904b8 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex faae58bc..91f38d8d 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -103,8 +103,8 @@
"service": "live",
"name": "OpenVibe.Live",
"origin": "https://openvibe.live",
-- "operations": 30,
-- "capabilities": 9
++ "operations": 31,
++ "capabilities": 10
},
{
"service": "media",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 754ddae7..8d7c9f3e 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex a821f9e9..9076e113 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
@@@ -1503,6 +1503,62 @@
}
}
},
++ "/internal/openre/slots": {
++ "post": {
++ "operationId": "post_internal_openre_slots",
++ "summary": "OpenRestream gives a person's stream its own slot on their OpenVibe Live channel, ingested by OpenRestream (ingest_authority openre), so its sessions show live on openvibe.live/@username through Live'",
++ "description": "**live.openre.slot.bind** (internal): OpenRestream gives a person's stream its own slot on their OpenVibe Live channel, ingested by OpenRestream (ingest_authority openre), so its sessions show live on openvibe.live/@username through Live's mirror. Idempotent per OpenRestream stream: a second call returns the same slot. The person must have an OpenVibe Live account (they signed in to Live once); otherwise 409 live.no_account.",
++ "tags": [
++ "live.openre"
++ ],
++ "x-openvibe-capabilities": [
++ "live.openre.slot.bind"
++ ],
++ "x-openvibe-visibility": [
++ "internal"
++ ],
++ "x-openvibe-quota-class": "standard",
++ "security": [
++ {
++ "openvibeToken": [
++ "live.openre.slot.bind"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.openre-slot-bind-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/live.openre-slot-bind-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/internal/tips/deliveries": {
"post": {
"operationId": "post_internal_tips_deliveries",
@@@ -2941,6 +2997,61 @@
}
}
},
++ "live.openre-slot-bind-request.v1": {
++ "title": "LiveOpenreSlotBindRequest",
++ "description": "live.openre-slot-bind-request@1: the body of POST /internal/openre/slots on OpenVibe.Live (capability live.openre.slot.bind). OpenRestream asks Live for a slot on the person's channel bound to one OpenRestream stream (openre_stream_id, std_…); subject is the person who owns that stream. title names the slot on the person's dashboard.",
++ "type": "object",
++ "required": [
++ "subject",
++ "openre_stream_id"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "subject": {
++ "type": "string",
++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "openre_stream_id": {
++ "type": "string",
++ "pattern": "^std_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "protocol": {
++ "enum": [
++ "rtmp",
++ "webrtc",
++ "jsmpeg"
++ ]
++ }
++ }
++ },
++ "live.openre-slot-bind-result.v1": {
++ "title": "LiveOpenreSlotBindResult",
++ "description": "live.openre-slot-bind-result@1: the answer of POST /internal/openre/slots: the Live slot (managed_stream_id) now ingested by OpenRestream for that stream, the channel it shows on, and created false when the slot already existed. Refusals are problem bodies: 400 (bad body), 409 live.no_account (no Live account for that subject yet), 409 live.slot_taken (the stream is bound to another person's slot).",
++ "type": "object",
++ "required": [
++ "managed_stream_id",
++ "channel_url",
++ "created"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "managed_stream_id": {
++ "type": "integer",
++ "minimum": 1
++ },
++ "channel_url": {
++ "type": "string",
++ "format": "uri"
++ },
++ "created": {
++ "type": "boolean"
++ }
++ }
++ },
"live.stream-read-result.v1": {
"title": "LiveStreamReadResult",
"description": "live.stream-read-result@1: answers of live.stream.read on OpenVibe.Live (public, parameters in the path and query). GET /api/streams → { streams } (live now, with each slot's external viewers and total_viewer_count); GET /api/streams/recent?limit= → { streams } (recently ended, with their public VOD from OpenVibe.Media); GET /api/streams/:id → { stream } (plus endpoint while live, cameras, controls, pip_overlay, follower_count, isFollowing for a signed-in viewer); GET /api/streams/channel/:username/resolve/:ref → { managed_stream, live_stream_id, is_live }; GET /api/live-events is a Server-Sent Events feed whose stream-live messages carry { repeat, username, display_name, avatar_url, title, stream_id, slug, managed_id, at }. Ingest keys are never included.",
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 616310e5..fee11aeb 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 5ba7d30d..84da1c19 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 044eb59a..47d30e32 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 5eb8f2b8..0f8a390e 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.125.1",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 42510ac8..6b2f285d 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 8ebb33f3..9357cea2 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 37658ba8..dcdbe190 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 5a99c8de..d05ae1a9 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex ba0dedc2..02b89183 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex e7686956..fd8c5d2b 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 750a1ee5..b5b4c9a8 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 0a54a9ab..a9bbd4e1 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 5df47f3a..dae3eac4 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 77bd4e74..4802e21a 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 297c2d1a..8430c648 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.125.1",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.125.1): 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.126.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.126.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"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 5a2bb5e7..da12f7c6 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -52009,6 +52009,27 @@ export interface LiveAvatarWriteResult {
changed: boolean;
}
++/** [email protected] (owner: live) */
++/**
++ * live.openre-slot-bind-request@1: the body of POST /internal/openre/slots on OpenVibe.Live (capability live.openre.slot.bind). OpenRestream asks Live for a slot on the person's channel bound to one OpenRestream stream (openre_stream_id, std_…); subject is the person who owns that stream. title names the slot on the person's dashboard.
++ */
++export interface LiveOpenreSlotBindRequest {
++ subject: string;
++ openre_stream_id: string;
++ title?: string;
++ protocol?: "rtmp" | "webrtc" | "jsmpeg";
++}
++
++/** [email protected] (owner: live) */
++/**
++ * live.openre-slot-bind-result@1: the answer of POST /internal/openre/slots: the Live slot (managed_stream_id) now ingested by OpenRestream for that stream, the channel it shows on, and created false when the slot already existed. Refusals are problem bodies: 400 (bad body), 409 live.no_account (no Live account for that subject yet), 409 live.slot_taken (the stream is bound to another person's slot).
++ */
++export interface LiveOpenreSlotBindResult {
++ managed_stream_id: number;
++ channel_url: string;
++ created: boolean;
++}
++
/** [email protected] (owner: live) */
/**
* live.url-registry-refresh-result@1: the answer of POST /internal/url-registry/refresh on OpenVibe.Live (capability live.url_registry.refresh): { ok: true, message } after Live reloaded Network's URL registry now (an operator changed a site's URL), or { ok: false, error } when the reload failed.
ddiff --git a/manifests/capabilities/live.openre.slot.bind.json b/manifests/capabilities/live.openre.slot.bind.json
nnew file mode 100644
iindex 00000000..a26488f5
---- /dev/null
++++ b/manifests/capabilities/live.openre.slot.bind.json
@@@ -0,0 +1,21 @@
++{
++ "id": "live.openre.slot.bind",
++ "version": "1.0",
++ "owner": "live",
++ "status": "active",
++ "visibility": "internal",
++ "description": "OpenRestream gives a person's stream its own slot on their OpenVibe Live channel, ingested by OpenRestream (ingest_authority openre), so its sessions show live on openvibe.live/@username through Live's mirror. Idempotent per OpenRestream stream: a second call returns the same slot. The person must have an OpenVibe Live account (they signed in to Live once); otherwise 409 live.no_account.",
++ "permissions": [
++ "streams:slot"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "standard",
++ "events": [],
++ "implementedBy": [
++ "POST /internal/openre/slots"
++ ],
++ "inputSchema": "live.openre-slot-bind-request@1",
++ "outputSchema": "live.openre-slot-bind-result@1"
++}
ddiff --git a/manifests/services/live.json b/manifests/services/live.json
iindex 8bccffa4..30de2439 100644
---- a/manifests/services/live.json
++++ b/manifests/services/live.json
@@@ -30,6 +30,7 @@
"capabilities": [
"live.analytics.read",
"live.avatar.write",
++ "live.openre.slot.bind",
"live.channel.read",
"live.chat_context.read",
"live.chat_effects.write",
ddiff --git a/manifests/services/openre.json b/manifests/services/openre.json
iindex c4d33a9f..f4c8ab9e 100644
---- a/manifests/services/openre.json
++++ b/manifests/services/openre.json
@@@ -22,25 +22,25 @@
"site": {
"name": "OpenRestream",
"icon": "stream",
-- "tagline": "Restream anywhere",
-- "what": "Ingest once and send the stream to every platform at once; keys, destinations and output health in one place.",
++ "tagline": "Go live once, stream everywhere",
++ "what": "Open restreaming: one stream to Twitch, YouTube, Kick and any RTMP or SRT server at once, with OpenVibe Live on by default.",
"legalProfile": "streaming",
"position": 18,
"tld": "stream",
"accent": "#ef4444",
-- "description": "OpenRestream is OpenVibe's open streaming engine, split out of OpenVibe.Live. Go live from a web browser with no OBS, no downloads and no follower minimum, or send RTMP or WHIP from any encoder, and restream to Twitch, YouTube, Kick and any RTMP, RTMPS or SRT destination. Browser broadcasts start on OpenVibe.Live today, and move to OpenRestream ingest channel by channel.",
++ "description": "OpenRestream is an open restreaming platform. Send one stream from OBS or any RTMP encoder and it goes to Twitch, YouTube, Kick and any RTMP, RTMPS or SRT destination at the same time, each with its own health, logs and retries. Your OpenVibe Live channel is on by default, so every stream also shows on openvibe.live with its chat, clips and VODs; switch it off for any stream. It is free and open source, with no follower minimum. No OBS? Go live from your browser on OpenVibe.Live.",
"pillars": [
{
-- "title": "Browser go-live",
-- "text": "Stream from a browser over WebRTC and WHIP, with nothing to install and no follower minimum."
++ "title": "Stream once, go everywhere",
++ "text": "Twitch, YouTube, Kick and any RTMP, RTMPS or SRT server at the same time, each with its own health, logs and retries."
},
{
-- "title": "Ingest",
-- "text": "RTMP ingest with keys and lifecycle in one place, plus WHIP/WebRTC; SRT ingest to follow."
++ "title": "OpenVibe Live on by default",
++ "text": "Every stream also shows on your openvibe.live channel, with chat, clips and VODs. Switch it off for any stream."
},
{
-- "title": "Restream",
-- "text": "Twitch, YouTube, Kick and any RTMP, RTMPS or SRT destination."
++ "title": "Keys you control",
++ "text": "One ingest key per stream, shown once and stored only as a hash. Rotate it any time."
},
{
"title": "Open API and SDK",
@@@ -48,6 +48,18 @@
}
],
"faq": [
++ {
++ "question": "What is OpenRestream?",
++ "answer": "An open restreaming platform at openre.stream: you send one stream from OBS or any RTMP encoder, and it forwards it to every platform you add, plus your OpenVibe Live channel by default."
++ },
++ {
++ "question": "Is OpenVibe Live on by default?",
++ "answer": "Yes. A new stream also goes live on your openvibe.live channel, with chat, clips and VODs. You can switch that off for any stream, and your other destinations keep working."
++ },
++ {
++ "question": "Does it cost anything?",
++ "answer": "No. Restreaming is free for every OpenVibe account, and the code is open source."
++ },
{
"question": "Can I stream without OBS?",
"answer": "Yes. Go live from your browser on OpenVibe.Live: press Go Live, allow your camera and microphone, and you are live. There is nothing to install."
@@@ -69,7 +81,7 @@
"answer": "Yes. OBS and any RTMP encoder work, and so do WHIP encoders (OBS 30 and later, ffmpeg, GStreamer)."
}
],
-- "keywords": "go live from browser, stream without obs, browser streaming, no follower minimum, stream from chromebook, webrtc streaming, whip, rtmp ingest, srt, restream to twitch youtube kick, open source streaming",
++ "keywords": "restream, open restreaming, multistream, restream to twitch youtube kick, rtmp restream, srt, obs restream, free restream, open source restream, go live from browser, no follower minimum",
"highlight": {
"title": "Go live from your browser — no OBS needed",
"text": "Press Go Live, allow your camera and microphone, and you're live, with your own channel and chat. There's nothing to install and no follower or subscriber minimum. It works on a Chromebook, a laptop or a phone.",
@@@ -88,14 +100,14 @@
"url": "https://openvibe.live/docs/go-live-in-your-browser"
}
},
-- "launch": "the stream slots to move from OpenVibe.Live's ingest to OpenRestream, one at a time; no stream uses it yet",
++ "launch": "live on openre.stream since 2026-10-09: sign in, create a stream and restream it from OBS; OpenVibe.Live stream slots move onto its ingest one at a time",
"relationships": {
"plannedRepo": "OpenRestream",
"meanwhile": [
{
-- "label": "Go live on OpenVibe.Live",
++ "label": "Go live from your browser",
"url": "https://openvibe.live/broadcast",
-- "note": "Ingest and restreaming run inside Live today."
++ "note": "No OBS: OpenVibe.Live's browser broadcaster."
},
{
"label": "Restreaming docs",
ddiff --git a/package.json b/package.json
iindex 67ae0222..1aa188d2 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.125.1",
++ "version": "0.126.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",