openvibers/openvibe.contracts Commits

media.vod@1 and media.clip@1, with the watch id a page is addressed by (0.325.0) (#328)

OP OpenVibers committed 6 days ago · 5a5c793847 · 59 files, +1067 −89

* media.vod@1 and media.clip@1, with the watch id a page is addressed by (0.319.0)

A watch page on openvibe.video becomes /watch?v=<watch id>, YouTube's shape, so a
page cannot be found by counting. Media mints the id, since Media owns VODs and
clips, and these are the two result shapes that carry it.

Both are additive and optional: watch_id is 11 characters of URL-safe base64 from
8 random bytes, one id space across VODs and clips, fixed for the row's life and
never the numeric id. It is optional because a row written before Media's
backfill may answer without one.

The rest of each shape is what consumers already read: the numeric id (internal),
the tenant, the app-local user ids, title and status, duration and size, the file
basename, playback_url, thumbnail, storage provider, visibility, view counts and
times; a clip also names the recording it was cut from and its window in it.

Valid and invalid fixtures cover a public recording and an unlisted one before the
backfill, a person-made clip and an AI clip, a watch id of the wrong length, one
with a character base64url never has, one with a slash, and an unknown visibility.

* media.vod@1 and media.clip@1, with the watch id a page is addressed by (0.320.0)

A watch page on openvibe.video becomes /watch?v=<watch id>, YouTube's shape, so a
page cannot be found by counting. Media mints the id, since Media owns VODs and
clips, and these are the two result shapes that carry it.

Both are additive and optional: watch_id is 11 characters of URL-safe base64 from
8 random bytes, one id space across VODs and clips, fixed for the row's life and
never the numeric id. It is optional because a row written before Media's
backfill may answer without one.

Merged main (which took 0.319.0 for the AI/Exchange site merge) and renumbered to
0.320.0; generated/ rewritten on top of it.

* Merge main (0.320.0) and renumber this release to 0.321.0

* Merge remote-tracking branch 'origin/main' into video-watch-ids

# Conflicts:
#	CHANGELOG.md
#	generated/openapi/actor.json
#	generated/openapi/ai.json
#	generated/openapi/bench.json
#	generated/openapi/billing.json
#	generated/openapi/blog.json
#	generated/openapi/bot.json
#	generated/openapi/chat.json
#	generated/openapi/codes.json
#	generated/openapi/community.json
#	generated/openapi/connect.json
#	generated/openapi/coupons.json
#	generated/openapi/deals.json
#	generated/openapi/design.json
#	generated/openapi/domains.json
#	generated/openapi/events.json
#	generated/openapi/food.json
#	generated/openapi/games.json
#	generated/openapi/host.json
#	generated/openapi/inventory.json
#	generated/openapi/live.json
#	generated/openapi/media-hub.json
#	generated/openapi/media.json
#	generated/openapi/network.json
#	generated/openapi/news.json
#	generated/openapi/openre.json
#	generated/openapi/play.json
#	generated/openapi/quest.json
#	generated/openapi/report.json
#	generated/openapi/reviews.json
#	generated/openapi/run.json
#	generated/openapi/search.json
#	generated/openapi/services.json
#	generated/openapi/sources.json
#	generated/openapi/space.json
#	generated/openapi/tips.json
#	generated/openapi/today.json
#	generated/openapi/tools.json
#	generated/openapi/trade.json
#	generated/openapi/vip.json
#	generated/openapi/vision.json
#	generated/openapi/watch.json
#	generated/openapi/wiki.json
#	generated/openapi/work.json
#	generated/openapi/zone.json
#	package.json

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 5acde934..a8b61d78 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,9 @@
# Changelog
++## 0.325.0 — 2026-11-07
++
++- Add `media.vod@1` and `media.clip@1`: one recorded stream and one clip as OpenVibe.Media's API answers them. Both carry `watch_id`, the id openvibe.video addresses a watch page by (`openvibe.video/watch?v=<watch_id>`), and the shape around it that consumers already read — the numeric id (internal), the owning tenant, the app-local user ids, title and status, duration and size, the file basename, `playback_url`, thumbnail, storage provider, visibility, view counts and times; a clip also names the recording it was cut from, its window in that recording and whether an automation cut it. `watch_id` is **additive and optional** (11 characters of URL-safe base64 from 8 random bytes, one id space across VODs and clips, fixed for the row's life and never the numeric id), because a row written before Media's backfill may answer without one.
++- Valid and invalid fixtures cover a public recording with a watch id and an unlisted one before the backfill, a person-made clip and an AI clip, a watch id of the wrong length, one with a character base64url never has, one with a slash, and an unknown visibility.
## 0.324.0 — 2026-11-07
- Space's builder API moves under `/api/v1/builder/spaces`: `GET /api/v1/spaces` was the forum's old API (it lives on OpenVibe.Community since 2026-11-07, and Space still answers it with a redirect), so the API the person's own agent works through needs an address of its own. The capabilities name the new routes: `space.build.read` (`GET /api/v1/builder/spaces`, `…/:id`, `…/:id/files`, `…/:id/files/:path`, `…/:id/preview`), `space.build.create` (`POST /api/v1/builder/spaces`), `space.build.write` (`PUT /api/v1/builder/spaces/:id/files`) and `space.build.publish` (`POST /api/v1/builder/spaces/:id/publish`, and the person's answer at `POST /api/v1/agent/approvals/:id/decide`).
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 36690bfc..b7890445 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -5170,6 +5170,24 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "media.vod",
++ "version": "1.0.0",
++ "owner": "media",
++ "schema": "media/vod.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "media.clip",
++ "version": "1.0.0",
++ "owner": "media",
++ "schema": "media/clip.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "media.file-read-result",
"version": "1.0.0",
ddiff --git a/contracts/media/clip.v1.json b/contracts/media/clip.v1.json
nnew file mode 100644
iindex 00000000..89c2d17c
---- /dev/null
++++ b/contracts/media/clip.v1.json
@@@ -0,0 +1,193 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/media/clip.v1.json",
++ "title": "MediaClip",
++ "description": "media.clip@1: one clip as OpenVibe.Media's API answers it (server/vod/clips-routes.js clipPublic: GET /api/v1/:app/clips/:id, the list, create, trim and update). Its numeric id, the recording it was cut from, the clipper and the clipped channel, title and status (processing, ready or failed), its window in the source, duration, the file basename, the URL its bytes play from, thumbnail, visibility, whether an automation cut it (auto_generated) and its view counts. watch_id is the id openvibe.video addresses the watch page by (openvibe.video/watch?v=<watch_id>): 11 characters of URL-safe base64 from 8 random bytes, in the same id space as a VOD's, fixed for the row's life, never derived from the numeric id. More fields may be added.",
++ "type": "object",
++ "required": [
++ "id",
++ "app_id",
++ "title",
++ "status",
++ "visibility",
++ "is_public",
++ "playback_url",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer",
++ "minimum": 1,
++ "description": "The clip's numeric id inside Media. Internal: a watch page is addressed by watch_id."
++ },
++ "watch_id": {
++ "type": "string",
++ "pattern": "^[A-Za-z0-9_-]{11}$",
++ "description": "The id of its watch page on openvibe.video (openvibe.video/watch?v=<watch_id>): 8 random bytes as URL-safe base64, 64 bits. One id space across VODs and clips — a watch id never names both a VOD and a clip. Optional: a row written before the ids existed may answer without one until Media's backfill fills it."
++ },
++ "app_id": {
++ "type": "string",
++ "description": "The tenant that owns the clip (live, media-hub…)."
++ },
++ "vod_id": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "description": "The recording it was cut from, when it has one."
++ },
++ "stream_id": {
++ "type": [
++ "integer",
++ "null"
++ ]
++ },
++ "user_id": {
++ "type": [
++ "string",
++ "integer",
++ "null"
++ ],
++ "description": "The clipper's app-local user id; it is not a Network subject id."
++ },
++ "channel_user_id": {
++ "type": [
++ "string",
++ "integer",
++ "null"
++ ],
++ "description": "The clipped channel's app-local user id (who the clip is of)."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "description": {
++ "type": "string"
++ },
++ "status": {
++ "enum": [
++ "processing",
++ "ready",
++ "failed"
++ ],
++ "description": "processing while the cut runs, ready when its file is there, failed when the cut failed (cut_error, and will_retry while a retry is queued)."
++ },
++ "cut_error": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "will_retry": {
++ "type": "boolean"
++ },
++ "start_time": {
++ "type": "number",
++ "minimum": 0,
++ "description": "The clip's start in the source recording, seconds."
++ },
++ "end_time": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "file_path": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The file's basename only."
++ },
++ "playback_url": {
++ "type": "string",
++ "description": "The URL its bytes play from on openvibe.media."
++ },
++ "thumbnail_url": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "storage_provider": {
++ "type": "string"
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private"
++ ],
++ "description": "public: anyone. unlisted: reached only by its exact id, never listed, noindex. private: missing to everyone but its owner and staff."
++ },
++ "is_public": {
++ "type": "boolean"
++ },
++ "auto_generated": {
++ "type": "boolean",
++ "description": "True when an automation (Live's AI moments) cut it, not a person. An AI clip is noindex and never in a sitemap."
++ },
++ "ai_overview": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "ai_analyzed_at": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "view_count": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "unique_views": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "readiness": {
++ "type": "object",
++ "description": "The object's readiness levels when the read asked for them.",
++ "properties": {
++ "metadata": {
++ "type": "boolean"
++ },
++ "bytes_verified": {
++ "type": "boolean"
++ },
++ "playable": {
++ "type": "boolean"
++ },
++ "reason": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ },
++ "hls_url": {
++ "type": "string",
++ "description": "The object's master playlist, when it has one."
++ },
++ "hls_expires_at": {
++ "type": [
++ "string",
++ "integer"
++ ]
++ },
++ "created_at": {
++ "type": "string",
++ "description": "UTC 'YYYY-MM-DD HH:MM:SS' as the store keeps it."
++ }
++ }
++}
ddiff --git a/contracts/media/vod.v1.json b/contracts/media/vod.v1.json
nnew file mode 100644
iindex 00000000..14ab43a9
---- /dev/null
++++ b/contracts/media/vod.v1.json
@@@ -0,0 +1,190 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/media/vod.v1.json",
++ "title": "MediaVod",
++ "description": "media.vod@1: one recorded stream (VOD) as OpenVibe.Media's API answers it (server/vod/finalize.js vodPublic: GET /api/v1/:app/vods/:id, the list, and every read that returns a row). Its numeric id, its app-local user id, title and description, derived status (pending, recording, ready or failed), duration and size, the file basename, the URL its bytes play from (playback_url; hls_url is the master playlist when the object has one), thumbnail, storage provider, visibility, view counts, readiness and times. watch_id is the id openvibe.video addresses the watch page by (openvibe.video/watch?v=<watch_id>): 11 characters of URL-safe base64 from 8 random bytes, fixed for the row's life, never derived from the numeric id. More fields may be added; a consumer reads what it knows.",
++ "type": "object",
++ "required": [
++ "id",
++ "app_id",
++ "title",
++ "status",
++ "duration",
++ "visibility",
++ "is_public",
++ "playback_url",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer",
++ "minimum": 1,
++ "description": "The VOD's numeric id inside Media. Internal: a watch page is addressed by watch_id."
++ },
++ "watch_id": {
++ "type": "string",
++ "pattern": "^[A-Za-z0-9_-]{11}$",
++ "description": "The id of its watch page on openvibe.video (openvibe.video/watch?v=<watch_id>): 8 random bytes as URL-safe base64, 64 bits. One id space across VODs and clips. Optional: a row written before the ids existed may answer without one until Media's backfill fills it."
++ },
++ "app_id": {
++ "type": "string",
++ "description": "The tenant that owns the recording (live, media-hub, games…)."
++ },
++ "stream_id": {
++ "type": [
++ "integer",
++ "null"
++ ]
++ },
++ "managed_stream_id": {
++ "type": [
++ "integer",
++ "null"
++ ]
++ },
++ "user_id": {
++ "type": [
++ "string",
++ "integer",
++ "null"
++ ],
++ "description": "The owning app's local user id; it is not a Network subject id."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "description": {
++ "type": "string"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "recording",
++ "ready",
++ "failed",
++ "unknown"
++ ],
++ "description": "Derived (db.vodStatus): recording while it is written, failed when its health quarantined it, ready once a file and a duration or size are there, pending before."
++ },
++ "duration": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_source": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "probe (ffprobe), remux (packet timeline) or null (stored 0)."
++ },
++ "file_size": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "file_path": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The file's basename only; a server path is never returned."
++ },
++ "playback_url": {
++ "type": "string",
++ "description": "The URL its bytes play from on openvibe.media."
++ },
++ "thumbnail_url": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "storage_provider": {
++ "type": "string",
++ "description": "local, b2 or r2."
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private"
++ ],
++ "description": "public: anyone. unlisted: reached only by its exact id, never listed, noindex. private: missing to everyone but its owner and staff."
++ },
++ "is_public": {
++ "type": "boolean",
++ "description": "True only for visibility public (kept beside it for older readers)."
++ },
++ "health_status": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "clips_only": {
++ "type": "boolean"
++ },
++ "is_recording": {
++ "type": "boolean"
++ },
++ "ai_overview": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "ai_analyzed_at": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "view_count": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "unique_views": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "readiness": {
++ "type": "object",
++ "description": "The object's readiness levels (server/objects/readiness.js) when the read asked for them.",
++ "properties": {
++ "metadata": {
++ "type": "boolean"
++ },
++ "bytes_verified": {
++ "type": "boolean"
++ },
++ "playable": {
++ "type": "boolean"
++ },
++ "reason": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ },
++ "hls_url": {
++ "type": "string",
++ "description": "The object's master playlist, when it has one (MEDIA_HLS_ENABLED)."
++ },
++ "hls_expires_at": {
++ "type": [
++ "string",
++ "integer"
++ ]
++ },
++ "created_at": {
++ "type": "string",
++ "description": "UTC 'YYYY-MM-DD HH:MM:SS' as the store keeps it."
++ }
++ }
++}
ddiff --git a/fixtures/media.clip/invalid/unknown-visibility.json b/fixtures/media.clip/invalid/unknown-visibility.json
nnew file mode 100644
iindex 00000000..8ddb5181
---- /dev/null
++++ b/fixtures/media.clip/invalid/unknown-visibility.json
@@@ -0,0 +1 @@
++{ "id": 497, "watch_id": "dQw4w9WgXcQ", "app_id": "live", "title": "A clip with a visibility nobody offers", "status": "ready", "visibility": "friends", "is_public": false, "playback_url": "https://openvibe.media/c/497", "created_at": "2026-11-06 23:15:00" }
ddiff --git a/fixtures/media.clip/invalid/watch-id-not-url-safe.json b/fixtures/media.clip/invalid/watch-id-not-url-safe.json
nnew file mode 100644
iindex 00000000..ee6db3e6
---- /dev/null
++++ b/fixtures/media.clip/invalid/watch-id-not-url-safe.json
@@@ -0,0 +1 @@
++{ "id": 496, "watch_id": "dQw4w9WgXcQ/", "app_id": "live", "title": "A clip whose watch id has a slash", "status": "ready", "visibility": "public", "is_public": true, "playback_url": "https://openvibe.media/c/496", "created_at": "2026-11-06 23:10:00" }
ddiff --git a/fixtures/media.clip/valid/ai-clip-before-the-backfill.json b/fixtures/media.clip/valid/ai-clip-before-the-backfill.json
nnew file mode 100644
iindex 00000000..1309c4c2
---- /dev/null
++++ b/fixtures/media.clip/valid/ai-clip-before-the-backfill.json
@@@ -0,0 +1 @@
++{ "id": 495, "app_id": "live", "vod_id": 6203, "stream_id": 912, "user_id": 80, "channel_user_id": 80, "title": "AI clip: the best thirty seconds", "description": "", "status": "ready", "start_time": 3600, "end_time": 3630, "duration": 30, "duration_seconds": 30, "file_path": "clip-live-495-1759915000000.webm", "playback_url": "https://openvibe.media/c/495", "thumbnail_url": null, "storage_provider": "local", "visibility": "public", "is_public": true, "auto_generated": true, "view_count": 0, "unique_views": 0, "created_at": "2026-11-06 21:50:00" }
ddiff --git a/fixtures/media.clip/valid/person-made-clip-with-watch-id.json b/fixtures/media.clip/valid/person-made-clip-with-watch-id.json
nnew file mode 100644
iindex 00000000..3a5397fd
---- /dev/null
++++ b/fixtures/media.clip/valid/person-made-clip-with-watch-id.json
@@@ -0,0 +1 @@
++{ "id": 494, "watch_id": "x7Kp2mQaB9c", "app_id": "live", "vod_id": 6203, "stream_id": 912, "user_id": 57, "channel_user_id": 80, "title": "That landing", "description": "", "status": "ready", "start_time": 1890.5, "end_time": 1920.5, "duration": 30, "duration_seconds": 30, "file_path": "clip-live-494-1759914000000.webm", "playback_url": "https://openvibe.media/c/494", "thumbnail_url": "https://openvibe.media/t/clip-494.jpg", "storage_provider": "local", "visibility": "public", "is_public": true, "auto_generated": false, "ai_overview": null, "ai_analyzed_at": null, "view_count": 412, "unique_views": 318, "created_at": "2026-11-06 21:40:00" }
ddiff --git a/fixtures/media.vod/invalid/watch-id-invalid-character.json b/fixtures/media.vod/invalid/watch-id-invalid-character.json
nnew file mode 100644
iindex 00000000..37d567bf
---- /dev/null
++++ b/fixtures/media.vod/invalid/watch-id-invalid-character.json
@@@ -0,0 +1 @@
++{ "id": 6205, "watch_id": "dQw4w9WgXc!", "app_id": "live", "title": "A VOD whose watch id has a character base64url never has", "status": "ready", "duration": 60, "visibility": "public", "is_public": true, "playback_url": "https://openvibe.media/v/6205", "created_at": "2026-11-06 23:00:00" }
ddiff --git a/fixtures/media.vod/invalid/watch-id-wrong-length.json b/fixtures/media.vod/invalid/watch-id-wrong-length.json
nnew file mode 100644
iindex 00000000..008e45ba
---- /dev/null
++++ b/fixtures/media.vod/invalid/watch-id-wrong-length.json
@@@ -0,0 +1 @@
++{ "id": 6206, "watch_id": "too-short", "app_id": "live", "title": "A VOD with a 9-character watch id", "status": "ready", "duration": 60, "visibility": "public", "is_public": true, "playback_url": "https://openvibe.media/v/6206", "created_at": "2026-11-06 23:05:00" }
ddiff --git a/fixtures/media.vod/valid/public-recording-with-watch-id.json b/fixtures/media.vod/valid/public-recording-with-watch-id.json
nnew file mode 100644
iindex 00000000..9e997c75
---- /dev/null
++++ b/fixtures/media.vod/valid/public-recording-with-watch-id.json
@@@ -0,0 +1 @@
++{ "id": 6203, "watch_id": "dQw4w9WgXcQ", "app_id": "live", "stream_id": 912, "managed_stream_id": 88, "user_id": 80, "title": "Fortnite, and the last ten minutes", "description": "", "status": "ready", "duration": 5400, "duration_seconds": 5400, "duration_source": "probe", "file_size": 734003200, "file_path": "vod-live-6203-1759910400000.webm", "playback_url": "https://openvibe.media/v/6203", "thumbnail_url": "https://openvibe.media/t/vod-6203.jpg", "storage_provider": "local", "visibility": "public", "is_public": true, "health_status": "ok", "clips_only": false, "is_recording": false, "ai_overview": null, "ai_analyzed_at": null, "view_count": 1321, "unique_views": 902, "created_at": "2026-11-06 21:00:00" }
ddiff --git a/fixtures/media.vod/valid/unlisted-before-the-backfill.json b/fixtures/media.vod/valid/unlisted-before-the-backfill.json
nnew file mode 100644
iindex 00000000..443c82d5
---- /dev/null
++++ b/fixtures/media.vod/valid/unlisted-before-the-backfill.json
@@@ -0,0 +1 @@
++{ "id": 6204, "app_id": "live", "user_id": 80, "title": "An unlisted rehearsal", "description": "", "status": "ready", "duration": 300, "duration_seconds": 300, "duration_source": "probe", "file_size": 18874368, "file_path": "vod-live-6204-1759914000000.webm", "playback_url": "https://openvibe.media/v/6204", "thumbnail_url": null, "storage_provider": "b2", "visibility": "unlisted", "is_public": false, "clips_only": false, "is_recording": false, "view_count": 3, "unique_views": 3, "created_at": "2026-11-06 22:00:00" }
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex c3721957..fa6425cb 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -56760,6 +56760,399 @@
}
}
},
++ "media.vod": {
++ "version": "1.0.0",
++ "owner": "media",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/media/vod.v1.json",
++ "title": "MediaVod",
++ "description": "media.vod@1: one recorded stream (VOD) as OpenVibe.Media's API answers it (server/vod/finalize.js vodPublic: GET /api/v1/:app/vods/:id, the list, and every read that returns a row). Its numeric id, its app-local user id, title and description, derived status (pending, recording, ready or failed), duration and size, the file basename, the URL its bytes play from (playback_url; hls_url is the master playlist when the object has one), thumbnail, storage provider, visibility, view counts, readiness and times. watch_id is the id openvibe.video addresses the watch page by (openvibe.video/watch?v=<watch_id>): 11 characters of URL-safe base64 from 8 random bytes, fixed for the row's life, never derived from the numeric id. More fields may be added; a consumer reads what it knows.",
++ "type": "object",
++ "required": [
++ "id",
++ "app_id",
++ "title",
++ "status",
++ "duration",
++ "visibility",
++ "is_public",
++ "playback_url",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer",
++ "minimum": 1,
++ "description": "The VOD's numeric id inside Media. Internal: a watch page is addressed by watch_id."
++ },
++ "watch_id": {
++ "type": "string",
++ "pattern": "^[A-Za-z0-9_-]{11}$",
++ "description": "The id of its watch page on openvibe.video (openvibe.video/watch?v=<watch_id>): 8 random bytes as URL-safe base64, 64 bits. One id space across VODs and clips. Optional: a row written before the ids existed may answer without one until Media's backfill fills it."
++ },
++ "app_id": {
++ "type": "string",
++ "description": "The tenant that owns the recording (live, media-hub, games…)."
++ },
++ "stream_id": {
++ "type": [
++ "integer",
++ "null"
++ ]
++ },
++ "managed_stream_id": {
++ "type": [
++ "integer",
++ "null"
++ ]
++ },
++ "user_id": {
++ "type": [
++ "string",
++ "integer",
++ "null"
++ ],
++ "description": "The owning app's local user id; it is not a Network subject id."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 300
++ },
++ "description": {
++ "type": "string"
++ },
++ "status": {
++ "enum": [
++ "pending",
++ "recording",
++ "ready",
++ "failed",
++ "unknown"
++ ],
++ "description": "Derived (db.vodStatus): recording while it is written, failed when its health quarantined it, ready once a file and a duration or size are there, pending before."
++ },
++ "duration": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_source": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "probe (ffprobe), remux (packet timeline) or null (stored 0)."
++ },
++ "file_size": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "file_path": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The file's basename only; a server path is never returned."
++ },
++ "playback_url": {
++ "type": "string",
++ "description": "The URL its bytes play from on openvibe.media."
++ },
++ "thumbnail_url": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "storage_provider": {
++ "type": "string",
++ "description": "local, b2 or r2."
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private"
++ ],
++ "description": "public: anyone. unlisted: reached only by its exact id, never listed, noindex. private: missing to everyone but its owner and staff."
++ },
++ "is_public": {
++ "type": "boolean",
++ "description": "True only for visibility public (kept beside it for older readers)."
++ },
++ "health_status": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "clips_only": {
++ "type": "boolean"
++ },
++ "is_recording": {
++ "type": "boolean"
++ },
++ "ai_overview": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "ai_analyzed_at": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "view_count": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "unique_views": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "readiness": {
++ "type": "object",
++ "description": "The object's readiness levels (server/objects/readiness.js) when the read asked for them.",
++ "properties": {
++ "metadata": {
++ "type": "boolean"
++ },
++ "bytes_verified": {
++ "type": "boolean"
++ },
++ "playable": {
++ "type": "boolean"
++ },
++ "reason": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ },
++ "hls_url": {
++ "type": "string",
++ "description": "The object's master playlist, when it has one (MEDIA_HLS_ENABLED)."
++ },
++ "hls_expires_at": {
++ "type": [
++ "string",
++ "integer"
++ ]
++ },
++ "created_at": {
++ "type": "string",
++ "description": "UTC 'YYYY-MM-DD HH:MM:SS' as the store keeps it."
++ }
++ }
++ }
++ },
++ "media.clip": {
++ "version": "1.0.0",
++ "owner": "media",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/media/clip.v1.json",
++ "title": "MediaClip",
++ "description": "media.clip@1: one clip as OpenVibe.Media's API answers it (server/vod/clips-routes.js clipPublic: GET /api/v1/:app/clips/:id, the list, create, trim and update). Its numeric id, the recording it was cut from, the clipper and the clipped channel, title and status (processing, ready or failed), its window in the source, duration, the file basename, the URL its bytes play from, thumbnail, visibility, whether an automation cut it (auto_generated) and its view counts. watch_id is the id openvibe.video addresses the watch page by (openvibe.video/watch?v=<watch_id>): 11 characters of URL-safe base64 from 8 random bytes, in the same id space as a VOD's, fixed for the row's life, never derived from the numeric id. More fields may be added.",
++ "type": "object",
++ "required": [
++ "id",
++ "app_id",
++ "title",
++ "status",
++ "visibility",
++ "is_public",
++ "playback_url",
++ "created_at"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer",
++ "minimum": 1,
++ "description": "The clip's numeric id inside Media. Internal: a watch page is addressed by watch_id."
++ },
++ "watch_id": {
++ "type": "string",
++ "pattern": "^[A-Za-z0-9_-]{11}$",
++ "description": "The id of its watch page on openvibe.video (openvibe.video/watch?v=<watch_id>): 8 random bytes as URL-safe base64, 64 bits. One id space across VODs and clips — a watch id never names both a VOD and a clip. Optional: a row written before the ids existed may answer without one until Media's backfill fills it."
++ },
++ "app_id": {
++ "type": "string",
++ "description": "The tenant that owns the clip (live, media-hub…)."
++ },
++ "vod_id": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "description": "The recording it was cut from, when it has one."
++ },
++ "stream_id": {
++ "type": [
++ "integer",
++ "null"
++ ]
++ },
++ "user_id": {
++ "type": [
++ "string",
++ "integer",
++ "null"
++ ],
++ "description": "The clipper's app-local user id; it is not a Network subject id."
++ },
++ "channel_user_id": {
++ "type": [
++ "string",
++ "integer",
++ "null"
++ ],
++ "description": "The clipped channel's app-local user id (who the clip is of)."
++ },
++ "title": {
++ "type": "string",
++ "maxLength": 200
++ },
++ "description": {
++ "type": "string"
++ },
++ "status": {
++ "enum": [
++ "processing",
++ "ready",
++ "failed"
++ ],
++ "description": "processing while the cut runs, ready when its file is there, failed when the cut failed (cut_error, and will_retry while a retry is queued)."
++ },
++ "cut_error": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "will_retry": {
++ "type": "boolean"
++ },
++ "start_time": {
++ "type": "number",
++ "minimum": 0,
++ "description": "The clip's start in the source recording, seconds."
++ },
++ "end_time": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration": {
++ "type": "number",
++ "minimum": 0
++ },
++ "duration_seconds": {
++ "type": "number",
++ "minimum": 0
++ },
++ "file_path": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The file's basename only."
++ },
++ "playback_url": {
++ "type": "string",
++ "description": "The URL its bytes play from on openvibe.media."
++ },
++ "thumbnail_url": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "storage_provider": {
++ "type": "string"
++ },
++ "visibility": {
++ "enum": [
++ "public",
++ "unlisted",
++ "private"
++ ],
++ "description": "public: anyone. unlisted: reached only by its exact id, never listed, noindex. private: missing to everyone but its owner and staff."
++ },
++ "is_public": {
++ "type": "boolean"
++ },
++ "auto_generated": {
++ "type": "boolean",
++ "description": "True when an automation (Live's AI moments) cut it, not a person. An AI clip is noindex and never in a sitemap."
++ },
++ "ai_overview": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "ai_analyzed_at": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "view_count": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "unique_views": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "readiness": {
++ "type": "object",
++ "description": "The object's readiness levels when the read asked for them.",
++ "properties": {
++ "metadata": {
++ "type": "boolean"
++ },
++ "bytes_verified": {
++ "type": "boolean"
++ },
++ "playable": {
++ "type": "boolean"
++ },
++ "reason": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ },
++ "hls_url": {
++ "type": "string",
++ "description": "The object's master playlist, when it has one."
++ },
++ "hls_expires_at": {
++ "type": [
++ "string",
++ "integer"
++ ]
++ },
++ "created_at": {
++ "type": "string",
++ "description": "UTC 'YYYY-MM-DD HH:MM:SS' as the store keeps it."
++ }
++ }
++ }
++ },
"media.file-read-result": {
"version": "1.0.0",
"owner": "media",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 9627ec94..f6ee8ec1 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 1ccf40ae..e306c826 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex ba7ccee0..430c74f3 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex 9e5d9f48..23d56846 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex f8c44134..abdeb6e8 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex 0bfafe8c..229fded0 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex aa54f65d..717c0913 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex b9fa493b..a008c664 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 085c2775..b955f59b 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/connect.json b/generated/openapi/connect.json
iindex a7e34bee..98e2d95e 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex c7f955eb..dbcf6b7a 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex f3b0d292..9cd2d8d6 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/design.json b/generated/openapi/design.json
iindex 5a2d1577..0d3575c8 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex da7f6efe..ae61734b 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 2ba3f156..8c80bb60 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 55c77834..3432c33c 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 648ecc7b..ebd28c86 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex cff73c92..278a9e78 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex cf90761f..a4e26910 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 95949701..2f6ff741 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 5b51c0bb..4bfcb9f3 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 2169b4e2..e956e63e 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex fa1028f8..6401d327 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 4c956ece..63d31bef 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex e9a8bbbc..6c5241ba 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.324.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex bcd82bf5..7f92ca1f 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 05759819..2ad039f1 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex fb986dc3..2be67b74 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex ef609724..a61962a5 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 4364f748..751cbf96 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 3d50557f..0bc3fa1c 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex c5de159e..0428da83 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex ca5af62c..35107bba 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex ea52cb85..25c47cff 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 97c941a5..7b75f5e6 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/today.json b/generated/openapi/today.json
iindex f6d94eeb..28696b33 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 7d8de38b..aa2f4db2 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 5725ecea..6ae49e0a 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 84ed7e9e..1da4b2f4 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex 5363a518..4b412e97 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 37f20f48..dbc01d99 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 870f93d7..6156ded7 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex e04abc41..ae80523e 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 50d1010d..1186e8f0 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.324.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.324.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.325.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.325.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex ebbe117b..013873d5 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -204168,6 +204168,178 @@ export interface MediaAvatarReleaseResult {
released: number;
}
++/** [email protected] (owner: media) */
++/**
++ * media.vod@1: one recorded stream (VOD) as OpenVibe.Media's API answers it (server/vod/finalize.js vodPublic: GET /api/v1/:app/vods/:id, the list, and every read that returns a row). Its numeric id, its app-local user id, title and description, derived status (pending, recording, ready or failed), duration and size, the file basename, the URL its bytes play from (playback_url; hls_url is the master playlist when the object has one), thumbnail, storage provider, visibility, view counts, readiness and times. watch_id is the id openvibe.video addresses the watch page by (openvibe.video/watch?v=<watch_id>): 11 characters of URL-safe base64 from 8 random bytes, fixed for the row's life, never derived from the numeric id. More fields may be added; a consumer reads what it knows.
++ */
++export interface MediaVod {
++ /**
++ * The VOD's numeric id inside Media. Internal: a watch page is addressed by watch_id.
++ */
++ id: number;
++ /**
++ * The id of its watch page on openvibe.video (openvibe.video/watch?v=<watch_id>): 8 random bytes as URL-safe base64, 64 bits. One id space across VODs and clips. Optional: a row written before the ids existed may answer without one until Media's backfill fills it.
++ */
++ watch_id?: string;
++ /**
++ * The tenant that owns the recording (live, media-hub, games…).
++ */
++ app_id: string;
++ stream_id?: number | null;
++ managed_stream_id?: number | null;
++ /**
++ * The owning app's local user id; it is not a Network subject id.
++ */
++ user_id?: string | number | null;
++ title: string;
++ description?: string;
++ /**
++ * Derived (db.vodStatus): recording while it is written, failed when its health quarantined it, ready once a file and a duration or size are there, pending before.
++ */
++ status: "pending" | "recording" | "ready" | "failed" | "unknown";
++ duration: number;
++ duration_seconds?: number;
++ /**
++ * probe (ffprobe), remux (packet timeline) or null (stored 0).
++ */
++ duration_source?: string | null;
++ file_size?: number;
++ /**
++ * The file's basename only; a server path is never returned.
++ */
++ file_path?: string | null;
++ /**
++ * The URL its bytes play from on openvibe.media.
++ */
++ playback_url: string;
++ thumbnail_url?: string | null;
++ /**
++ * local, b2 or r2.
++ */
++ storage_provider?: string;
++ /**
++ * public: anyone. unlisted: reached only by its exact id, never listed, noindex. private: missing to everyone but its owner and staff.
++ */
++ visibility: "public" | "unlisted" | "private";
++ /**
++ * True only for visibility public (kept beside it for older readers).
++ */
++ is_public: boolean;
++ health_status?: string | null;
++ clips_only?: boolean;
++ is_recording?: boolean;
++ ai_overview?: string | null;
++ ai_analyzed_at?: string | null;
++ view_count?: number;
++ unique_views?: number;
++ /**
++ * The object's readiness levels (server/objects/readiness.js) when the read asked for them.
++ */
++ readiness?: {
++ metadata?: boolean;
++ bytes_verified?: boolean;
++ playable?: boolean;
++ reason?: string | null;
++ };
++ /**
++ * The object's master playlist, when it has one (MEDIA_HLS_ENABLED).
++ */
++ hls_url?: string;
++ hls_expires_at?: string | number;
++ /**
++ * UTC 'YYYY-MM-DD HH:MM:SS' as the store keeps it.
++ */
++ created_at: string;
++}
++
++/** [email protected] (owner: media) */
++/**
++ * media.clip@1: one clip as OpenVibe.Media's API answers it (server/vod/clips-routes.js clipPublic: GET /api/v1/:app/clips/:id, the list, create, trim and update). Its numeric id, the recording it was cut from, the clipper and the clipped channel, title and status (processing, ready or failed), its window in the source, duration, the file basename, the URL its bytes play from, thumbnail, visibility, whether an automation cut it (auto_generated) and its view counts. watch_id is the id openvibe.video addresses the watch page by (openvibe.video/watch?v=<watch_id>): 11 characters of URL-safe base64 from 8 random bytes, in the same id space as a VOD's, fixed for the row's life, never derived from the numeric id. More fields may be added.
++ */
++export interface MediaClip {
++ /**
++ * The clip's numeric id inside Media. Internal: a watch page is addressed by watch_id.
++ */
++ id: number;
++ /**
++ * The id of its watch page on openvibe.video (openvibe.video/watch?v=<watch_id>): 8 random bytes as URL-safe base64, 64 bits. One id space across VODs and clips — a watch id never names both a VOD and a clip. Optional: a row written before the ids existed may answer without one until Media's backfill fills it.
++ */
++ watch_id?: string;
++ /**
++ * The tenant that owns the clip (live, media-hub…).
++ */
++ app_id: string;
++ /**
++ * The recording it was cut from, when it has one.
++ */
++ vod_id?: number | null;
++ stream_id?: number | null;
++ /**
++ * The clipper's app-local user id; it is not a Network subject id.
++ */
++ user_id?: string | number | null;
++ /**
++ * The clipped channel's app-local user id (who the clip is of).
++ */
++ channel_user_id?: string | number | null;
++ title: string;
++ description?: string;
++ /**
++ * processing while the cut runs, ready when its file is there, failed when the cut failed (cut_error, and will_retry while a retry is queued).
++ */
++ status: "processing" | "ready" | "failed";
++ cut_error?: string | null;
++ will_retry?: boolean;
++ /**
++ * The clip's start in the source recording, seconds.
++ */
++ start_time?: number;
++ end_time?: number;
++ duration?: number;
++ duration_seconds?: number;
++ /**
++ * The file's basename only.
++ */
++ file_path?: string | null;
++ /**
++ * The URL its bytes play from on openvibe.media.
++ */
++ playback_url: string;
++ thumbnail_url?: string | null;
++ storage_provider?: string;
++ /**
++ * public: anyone. unlisted: reached only by its exact id, never listed, noindex. private: missing to everyone but its owner and staff.
++ */
++ visibility: "public" | "unlisted" | "private";
++ is_public: boolean;
++ /**
++ * True when an automation (Live's AI moments) cut it, not a person. An AI clip is noindex and never in a sitemap.
++ */
++ auto_generated?: boolean;
++ ai_overview?: string | null;
++ ai_analyzed_at?: string | null;
++ view_count?: number;
++ unique_views?: number;
++ /**
++ * The object's readiness levels when the read asked for them.
++ */
++ readiness?: {
++ metadata?: boolean;
++ bytes_verified?: boolean;
++ playable?: boolean;
++ reason?: string | null;
++ };
++ /**
++ * The object's master playlist, when it has one.
++ */
++ hls_url?: string;
++ hls_expires_at?: string | number;
++ /**
++ * UTC 'YYYY-MM-DD HH:MM:SS' as the store keeps it.
++ */
++ created_at: string;
++}
++
/** [email protected] (owner: media) */
/**
* media.file-read-result@1: answers of media.object.read on OpenVibe.Media. GET /api/v1/:app/files/:key → media.file@1 (the file's metadata; 404 when it is not the tenant's); GET /f/:key → the bytes, with Content-Type and Range (a sandbox file only through its signed URL).
ddiff --git a/package.json b/package.json
iindex d7ca4cd1..746c75fa 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.324.0",
++ "version": "0.325.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",