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)
Changes
@@@ -4,6 +4,16 @@ 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.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@@@ -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",nnew file mode 100644@@@ -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"++ ]++ }++ }++}nnew file mode 100644@@@ -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"++ }++ }++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "subject": "42",++ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"++}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",++ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",++ "title": "Saturday streams",++ "protocol": "rtmp"++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",++ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "managed_stream_id": 0,++ "channel_url": "https://openvibe.live/@alex",++ "created": false++}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "managed_stream_id": 31,++ "channel_url": "https://openvibe.live/@alex",++ "created": true++}@@@ -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",@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -103,8 +103,8 @@"service": "live","name": "OpenVibe.Live","origin": "https://openvibe.live",-- "operations": 30,-- "capabilities": 9++ "operations": 31,++ "capabilities": 10},{"service": "media",@@@ -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"@@@ -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.",@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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.nnew file mode 100644@@@ -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"++}@@@ -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",@@@ -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",@@@ -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",
@@ -4,6 +4,16 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -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,
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.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
## 0.125.1 — 2026-10-09
- The product at openre.stream is **OpenRestream** (owner, 2026-10-09): an open restreaming platform. Every name
- The product at openre.stream is **OpenRestream** (owner, 2026-10-09): an open restreaming platform. Every name
@@ -4929,6 +4929,24 @@
@@ -4929,6 +4929,24 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"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",
"id": "live.url-registry-refresh-result",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,33 @@
@@ -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"
+ ]
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,26 @@
@@ -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"
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "subject": "42",
+ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",
+ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",
+ "title": "Saturday streams",
+ "protocol": "rtmp"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "subject": "usr_01J8ZQ4Y7N3M2K1H0G9F8E7D6C",
+ "openre_stream_id": "std_01J8ZQ4Y7N3M2K1H0G9F8E7D6C"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "managed_stream_id": 0,
+ "channel_url": "https://openvibe.live/@alex",
+ "created": false
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "managed_stream_id": 31,
+ "channel_url": "https://openvibe.live/@alex",
+ "created": true
+}
@@ -55379,6 +55379,75 @@
@@ -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": {
"live.url-registry-refresh-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "live",
"owner": "live",
@@ -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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -103,8 +103,8 @@
@@ -103,8 +103,8 @@
"service": "live",
"service": "live",
"name": "OpenVibe.Live",
"name": "OpenVibe.Live",
"origin": "https://openvibe.live",
"origin": "https://openvibe.live",
- "operations": 30,
- "capabilities": 9
+ "operations": 31,
+ "capabilities": 10
},
},
{
{
"service": "media",
"service": "media",
@@ -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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -1503,6 +1503,62 @@
@@ -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": {
"/internal/tips/deliveries": {
"post": {
"post": {
"operationId": "post_internal_tips_deliveries",
"operationId": "post_internal_tips_deliveries",
@@ -2941,6 +2997,61 @@
@@ -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": {
"live.stream-read-result.v1": {
"title": "LiveStreamReadResult",
"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.",
"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.",
@@ -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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"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.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -52009,6 +52009,27 @@ export interface LiveAvatarWriteResult {
@@ -52009,6 +52009,27 @@ export interface LiveAvatarWriteResult {
changed: boolean;
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) */
/** [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.
* 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.
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -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"
+}
@@ -30,6 +30,7 @@
@@ -30,6 +30,7 @@
"capabilities": [
"capabilities": [
"live.analytics.read",
"live.analytics.read",
"live.avatar.write",
"live.avatar.write",
+ "live.openre.slot.bind",
"live.channel.read",
"live.channel.read",
"live.chat_context.read",
"live.chat_context.read",
"live.chat_effects.write",
"live.chat_effects.write",
@@ -22,25 +22,25 @@
@@ -22,25 +22,25 @@
"site": {
"site": {
"name": "OpenRestream",
"name": "OpenRestream",
"icon": "stream",
"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",
"legalProfile": "streaming",
"position": 18,
"position": 18,
"tld": "stream",
"tld": "stream",
"accent": "#ef4444",
"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": [
"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",
"title": "Open API and SDK",
@@ -48,6 +48,18 @@
@@ -48,6 +48,18 @@
}
}
],
],
"faq": [
"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?",
"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."
"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 @@
@@ -69,7 +81,7 @@
"answer": "Yes. OBS and any RTMP encoder work, and so do WHIP encoders (OBS 30 and later, ffmpeg, GStreamer)."
"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": {
"highlight": {
"title": "Go live from your browser — no OBS needed",
"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.",
"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 @@
@@ -88,14 +100,14 @@
"url": "https://openvibe.live/docs/go-live-in-your-browser"
"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": {
"relationships": {
"plannedRepo": "OpenRestream",
"plannedRepo": "OpenRestream",
"meanwhile": [
"meanwhile": [
{
{
- "label": "Go live on OpenVibe.Live",
+ "label": "Go live from your browser",
"url": "https://openvibe.live/broadcast",
"url": "https://openvibe.live/broadcast",
- "note": "Ingest and restreaming run inside Live today."
+ "note": "No OBS: OpenVibe.Live's browser broadcaster."
},
},
{
{
"label": "Restreaming docs",
"label": "Restreaming docs",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"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",