openvibers/openvibe.contracts Commits

HOLD until the Billing cutover: Contracts 0.200.0, Tips and VIP are live sites (#180)

OP OpenVibers committed 27 days ago · 30224d6793 · 55 files, +1165 −145

* Contracts 0.200.0: OpenVibe.Tips and OpenVibe.VIP are live sites (after the Billing cutover), with catalog copy, FAQs and what comes next

* Contracts 0.200.0: Tips paid sounds (kind sound, sound fields, profile sounds, tips.sound.request), all optional

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex d92626fa..9fb72968 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,20 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.200.0 — 2026-10-17
++
++- OpenVibe.Tips and OpenVibe.VIP are live sites (`exposure.state: live`, `publicSite: service`) now that OpenVibe.Billing is
++ the money ledger. Tips: a tip page per creator, paid messages, text-to-speech, media requests, paid sounds, goals and OBS overlays on
++ any platform. VIP: memberships open to anyone, with perks across OpenVibe and subscriptions to people's own software
++ (openvibe-sdk/vip). Both catalog entries say so, with FAQs, and name what comes next.
++- Tips: paid sounds (the owner's "paid soundboard … triggers"). A new interaction `kind: sound` appears in every Tips
++ kind enum (interaction, public interaction, moderation view, simulation request, and the tips.interaction.ready,
++ failed and cancelled payloads). Optional `sound` fields cover the paid and simulation requests (`{ id }`) and the
++ interaction and public interaction (`{ id, name, url }`). The profile gets optional `sounds` (`enabled`, up to 12
++ `items`) and `minimums.sound`; the profile update gets `sounds_enabled` and `sound_min`. Capability
++ `tips.sound.request` covers `POST /api/v1/sound-requests`. Everything is optional or additive, so the current
++ Tips release still validates.
++
## 0.199.3 — 2026-10-16
- Chat's catalog copy says what it is now: rooms with AI members on their own models with tools, Discord-style servers
ddiff --git a/contracts/events/payloads/tips.interaction.cancelled.v1.json b/contracts/events/payloads/tips.interaction.cancelled.v1.json
iindex 01664c0c..cdd2c758 100644
---- a/contracts/events/payloads/tips.interaction.cancelled.v1.json
++++ b/contracts/events/payloads/tips.interaction.cancelled.v1.json
@@@ -14,7 +14,7 @@
"description": "The supporter, null when external, anonymous or unmapped."
},
"supporter_name": { "type": ["string", "null"], "description": "Display name at the time." },
-- "kind": { "enum": ["tip", "paid_message", "tts", "media_request"] },
++ "kind": { "enum": ["tip", "paid_message", "tts", "media_request", "sound"] },
"amount": { "type": "integer", "minimum": 1, "description": "Integer amount in currency minor units (Vibes bits)." },
"currency": { "type": "string", "description": "vibes-bits today." },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
ddiff --git a/contracts/events/payloads/tips.interaction.failed.v1.json b/contracts/events/payloads/tips.interaction.failed.v1.json
iindex 31db3e59..e975bb86 100644
---- a/contracts/events/payloads/tips.interaction.failed.v1.json
++++ b/contracts/events/payloads/tips.interaction.failed.v1.json
@@@ -14,7 +14,7 @@
"description": "The supporter, null when external, anonymous or unmapped."
},
"supporter_name": { "type": ["string", "null"], "description": "Display name at the time." },
-- "kind": { "enum": ["tip", "paid_message", "tts", "media_request"] },
++ "kind": { "enum": ["tip", "paid_message", "tts", "media_request", "sound"] },
"amount": { "type": "integer", "minimum": 1, "description": "Integer amount in currency minor units (Vibes bits)." },
"currency": { "type": "string", "description": "vibes-bits today." },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
ddiff --git a/contracts/events/payloads/tips.interaction.ready.v1.json b/contracts/events/payloads/tips.interaction.ready.v1.json
iindex 9ac03bd5..7cfe6c20 100644
---- a/contracts/events/payloads/tips.interaction.ready.v1.json
++++ b/contracts/events/payloads/tips.interaction.ready.v1.json
@@@ -14,7 +14,7 @@
"description": "The supporter, null when external, anonymous or unmapped."
},
"supporter_name": { "type": ["string", "null"], "description": "Display name at the time." },
-- "kind": { "enum": ["tip", "paid_message", "tts", "media_request"] },
++ "kind": { "enum": ["tip", "paid_message", "tts", "media_request", "sound"] },
"amount": { "type": "integer", "minimum": 1, "description": "Integer amount in currency minor units (Vibes bits)." },
"currency": { "type": "string", "description": "vibes-bits today." },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
ddiff --git a/contracts/tips/interaction.v1.json b/contracts/tips/interaction.v1.json
iindex 26455fb5..4921cbb9 100644
---- a/contracts/tips/interaction.v1.json
++++ b/contracts/tips/interaction.v1.json
@@@ -59,7 +59,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -119,6 +120,34 @@
}
]
},
++ "sound": {
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string",
++ "description": "The audio file on openvibe.tips (/sounds/<id>)."
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ],
++ "description": "Kind sound: the sound the overlay plays."
++ },
"goal_id": {
"type": [
"string",
ddiff --git a/contracts/tips/moderation-view.v1.json b/contracts/tips/moderation-view.v1.json
iindex 973545f2..8db37e88 100644
---- a/contracts/tips/moderation-view.v1.json
++++ b/contracts/tips/moderation-view.v1.json
@@@ -29,7 +29,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"created_at": {
ddiff --git a/contracts/tips/paid-request.v1.json b/contracts/tips/paid-request.v1.json
iindex 14627e3d..f85cd6d8 100644
---- a/contracts/tips/paid-request.v1.json
++++ b/contracts/tips/paid-request.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/tips/paid-request.v1.json",
"title": "TipsPaidRequest",
-- "description": "tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.",
++ "description": "tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/sound-requests (tips.sound.request: a paid sound), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.",
"type": "object",
"required": [
"creator",
@@@ -108,6 +108,20 @@
},
"description": "A media request (kind media_request)."
},
++ "sound": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsnd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the creator's sounds (GET /api/v1/profiles/:creator/sounds)."
++ }
++ },
++ "description": "A paid sound (kind sound): the creator’s overlay plays it on stream."
++ },
"goal_id": {
"type": "string",
"description": "One of the creator's open goals."
ddiff --git a/contracts/tips/profile-update-request.v1.json b/contracts/tips/profile-update-request.v1.json
iindex 2f6735cd..c7ba44f2 100644
---- a/contracts/tips/profile-update-request.v1.json
++++ b/contracts/tips/profile-update-request.v1.json
@@@ -85,6 +85,13 @@
"pattern": "^[1-9][0-9]*$",
"description": "The smallest media request (1 to 1000000 bits)."
},
++ "sounds_enabled": {
++ "type": "boolean"
++ },
++ "sound_min": {
++ "type": "integer",
++ "minimum": 1
++ },
"media_max_seconds": {
"type": [
"integer",
ddiff --git a/contracts/tips/profile.v1.json b/contracts/tips/profile.v1.json
iindex f9093bd4..2e01cc2c 100644
---- a/contracts/tips/profile.v1.json
++++ b/contracts/tips/profile.v1.json
@@@ -82,6 +82,13 @@
"null"
],
"minimum": 1
++ },
++ "sound": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 1
}
}
},
@@@ -119,6 +126,41 @@
}
}
},
++ "sounds": {
++ "type": "object",
++ "required": [
++ "enabled"
++ ],
++ "properties": {
++ "enabled": {
++ "type": "boolean"
++ },
++ "items": {
++ "type": "array",
++ "maxItems": 12,
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string"
++ }
++ }
++ }
++ }
++ },
++ "description": "Paid sounds: whether they are on and the creator's sounds (up to 12)."
++ },
"page": {
"type": "object",
"required": [
ddiff --git a/contracts/tips/public-interaction.v1.json b/contracts/tips/public-interaction.v1.json
iindex 7fc39b5b..b3a4f734 100644
---- a/contracts/tips/public-interaction.v1.json
++++ b/contracts/tips/public-interaction.v1.json
@@@ -29,7 +29,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -113,6 +114,34 @@
}
]
},
++ "sound": {
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string",
++ "description": "The audio file on openvibe.tips (/sounds/<id>)."
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ],
++ "description": "Kind sound: the sound the overlay plays."
++ },
"hidden": {
"type": "boolean"
}
ddiff --git a/contracts/tips/simulation-request.v1.json b/contracts/tips/simulation-request.v1.json
iindex 052cb064..1d60c221 100644
---- a/contracts/tips/simulation-request.v1.json
++++ b/contracts/tips/simulation-request.v1.json
@@@ -23,7 +23,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -83,6 +84,20 @@
},
"description": "A media request (kind media_request)."
},
++ "sound": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsnd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the creator's sounds (GET /api/v1/profiles/:creator/sounds)."
++ }
++ },
++ "description": "A paid sound (kind sound): the creator’s overlay plays it on stream."
++ },
"goal_id": {
"type": "string"
},
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 992bc608..ab118272 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -16049,7 +16049,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -16157,7 +16158,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -16298,7 +16300,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -17299,7 +17302,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -17359,6 +17363,34 @@
}
]
},
++ "sound": {
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string",
++ "description": "The audio file on openvibe.tips (/sounds/<id>)."
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ],
++ "description": "Kind sound: the sound the overlay plays."
++ },
"goal_id": {
"type": [
"string",
@@@ -17831,7 +17863,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"created_at": {
@@@ -18513,7 +18546,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/tips/paid-request.v1.json",
"title": "TipsPaidRequest",
-- "description": "tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.",
++ "description": "tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/sound-requests (tips.sound.request: a paid sound), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.",
"type": "object",
"required": [
"creator",
@@@ -18619,6 +18652,20 @@
},
"description": "A media request (kind media_request)."
},
++ "sound": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsnd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the creator's sounds (GET /api/v1/profiles/:creator/sounds)."
++ }
++ },
++ "description": "A paid sound (kind sound): the creator’s overlay plays it on stream."
++ },
"goal_id": {
"type": "string",
"description": "One of the creator's open goals."
@@@ -18813,6 +18860,13 @@
"pattern": "^[1-9][0-9]*$",
"description": "The smallest media request (1 to 1000000 bits)."
},
++ "sounds_enabled": {
++ "type": "boolean"
++ },
++ "sound_min": {
++ "type": "integer",
++ "minimum": 1
++ },
"media_max_seconds": {
"type": [
"integer",
@@@ -19040,6 +19094,13 @@
"null"
],
"minimum": 1
++ },
++ "sound": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 1
}
}
},
@@@ -19077,6 +19138,41 @@
}
}
},
++ "sounds": {
++ "type": "object",
++ "required": [
++ "enabled"
++ ],
++ "properties": {
++ "enabled": {
++ "type": "boolean"
++ },
++ "items": {
++ "type": "array",
++ "maxItems": 12,
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string"
++ }
++ }
++ }
++ }
++ },
++ "description": "Paid sounds: whether they are on and the creator's sounds (up to 12)."
++ },
"page": {
"type": "object",
"required": [
@@@ -19186,7 +19282,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -19270,6 +19367,34 @@
}
]
},
++ "sound": {
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string",
++ "description": "The audio file on openvibe.tips (/sounds/<id>)."
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ],
++ "description": "Kind sound: the sound the overlay plays."
++ },
"hidden": {
"type": "boolean"
}
@@@ -19305,7 +19430,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -19365,6 +19491,20 @@
},
"description": "A media request (kind media_request)."
},
++ "sound": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsnd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the creator's sounds (GET /api/v1/profiles/:creator/sounds)."
++ }
++ },
++ "description": "A paid sound (kind sound): the creator’s overlay plays it on stream."
++ },
"goal_id": {
"type": "string"
},
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex c94b3bcf..b5d0cfb0 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.199.3",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 61f54aa6..914f325a 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.199.3",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 4de08c0a..e363470f 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.199.3",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 eeb2f76c..068dd884 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.199.3",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 42d51291..5168921d 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.199.3",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 3bcea821..5de67ff1 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.199.3",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 cbc7c087..5750405e 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.199.3",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 2af075f1..d3e4fd86 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.199.3",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 327e5020..c934925d 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.199.3",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 842b1f2c..f34e2efc 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.199.3",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 00f2c40d..17532a2e 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.199.3",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 7744a65d..eb7cfd11 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.199.3",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 8b00cd96..a13cdf56 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.199.3",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 b0240516..c3b0ae41 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.199.3",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex eba76438..efcf4d78 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -208,8 +208,8 @@
"service": "tips",
"name": "OpenVibe.Tips",
"origin": "https://openvibe.tips",
-- "operations": 26,
-- "capabilities": 18
++ "operations": 27,
++ "capabilities": 19
},
{
"service": "tools",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 50227bee..71aebece 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.199.3",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 fe4cfb4a..0e0488e3 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.199.3",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 541f576e..78298a75 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.199.3",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 66130c6a..10b59c5d 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.199.3",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 acb6c063..9b88d341 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.199.3",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 ab58361b..25e8be0a 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.199.3",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 98d534dc..7bae7f84 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.199.3",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 55378c1c..e9cc5ecb 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.199.3",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 90d3d7d7..f3763a5b 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.199.3",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 02dafa16..24b77d32 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.199.3",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 dbc5a033..724b5016 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.199.3",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 942bcde9..3d6cd8d8 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.199.3",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 7087bed0..cb098e02 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.199.3",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 b081d23d..5f3c9f3b 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.199.3",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 7c138acc..a77c4370 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.199.3",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 102bc6de..be24e10b 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.199.3",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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"
@@@ -1418,6 +1418,62 @@
}
}
},
++ "/api/v1/sound-requests": {
++ "post": {
++ "operationId": "post_api_v1_sound_requests",
++ "summary": "Start a paid sound for a supporter: one of the creator's sounds, played by the creator's overlay after settlement.",
++ "description": "**tips.sound.request** (first-party): Start a paid sound for a supporter: one of the creator's sounds, played by the creator's overlay after settlement.",
++ "tags": [
++ "tips.sound"
++ ],
++ "x-openvibe-capabilities": [
++ "tips.sound.request"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "payments",
++ "security": [
++ {
++ "openvibeToken": [
++ "tips.sound.request"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/tips.paid-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/tips.paid-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/tts-requests": {
"post": {
"operationId": "post_api_v1_tts_requests",
@@@ -2301,7 +2357,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -2361,6 +2418,34 @@
}
]
},
++ "sound": {
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string",
++ "description": "The audio file on openvibe.tips (/sounds/<id>)."
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ],
++ "description": "Kind sound: the sound the overlay plays."
++ },
"goal_id": {
"type": [
"string",
@@@ -2812,7 +2897,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"created_at": {
@@@ -3445,7 +3531,7 @@
},
"tips.paid-request.v1": {
"title": "TipsPaidRequest",
-- "description": "tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.",
++ "description": "tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/sound-requests (tips.sound.request: a paid sound), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.",
"type": "object",
"required": [
"creator",
@@@ -3551,6 +3637,20 @@
},
"description": "A media request (kind media_request)."
},
++ "sound": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsnd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the creator's sounds (GET /api/v1/profiles/:creator/sounds)."
++ }
++ },
++ "description": "A paid sound (kind sound): the creator’s overlay plays it on stream."
++ },
"goal_id": {
"type": "string",
"description": "One of the creator's open goals."
@@@ -3724,6 +3824,13 @@
"pattern": "^[1-9][0-9]*$",
"description": "The smallest media request (1 to 1000000 bits)."
},
++ "sounds_enabled": {
++ "type": "boolean"
++ },
++ "sound_min": {
++ "type": "integer",
++ "minimum": 1
++ },
"media_max_seconds": {
"type": [
"integer",
@@@ -3944,6 +4051,13 @@
"null"
],
"minimum": 1
++ },
++ "sound": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 1
}
}
},
@@@ -3981,6 +4095,41 @@
}
}
},
++ "sounds": {
++ "type": "object",
++ "required": [
++ "enabled"
++ ],
++ "properties": {
++ "enabled": {
++ "type": "boolean"
++ },
++ "items": {
++ "type": "array",
++ "maxItems": 12,
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string"
++ }
++ }
++ }
++ }
++ },
++ "description": "Paid sounds: whether they are on and the creator's sounds (up to 12)."
++ },
"page": {
"type": "object",
"required": [
@@@ -4083,7 +4232,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -4167,6 +4317,34 @@
}
]
},
++ "sound": {
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "url"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "url": {
++ "type": "string",
++ "description": "The audio file on openvibe.tips (/sounds/<id>)."
++ }
++ }
++ },
++ {
++ "type": "null"
++ }
++ ],
++ "description": "Kind sound: the sound the overlay plays."
++ },
"hidden": {
"type": "boolean"
}
@@@ -4195,7 +4373,8 @@
"tip",
"paid_message",
"tts",
-- "media_request"
++ "media_request",
++ "sound"
]
},
"amount": {
@@@ -4255,6 +4434,20 @@
},
"description": "A media request (kind media_request)."
},
++ "sound": {
++ "type": "object",
++ "required": [
++ "id"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^tsnd_[0-9A-HJKMNP-TV-Z]{26}$",
++ "description": "One of the creator's sounds (GET /api/v1/profiles/:creator/sounds)."
++ }
++ },
++ "description": "A paid sound (kind sound): the creator’s overlay plays it on stream."
++ },
"goal_id": {
"type": "string"
},
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 8e9bac4a..955d7e52 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.199.3",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 ff58872a..68e72beb 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.199.3",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 279401f9..507e63bf 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.199.3",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 5fdf242c..ffa4b5a7 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.199.3",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 1edacd5d..702d59ab 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.199.3",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 a1a19c98..5cfc23ca 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.199.3",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 aa69ea38..3dc24148 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.199.3",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.199.3): each operation lists the capabilities it performs; a token for 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.200.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.200.0): each operation lists the capabilities it performs; a token for 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 3ae91b3d..4632c565 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -139983,7 +139983,7 @@ export interface TipsInteractionReadyPayload {
* Display name at the time.
*/
supporter_name: string | null;
-- kind: "tip" | "paid_message" | "tts" | "media_request";
++ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
/**
* Integer amount in currency minor units (Vibes bits).
*/
@@@ -140020,7 +140020,7 @@ export interface TipsInteractionFailedPayload {
* Display name at the time.
*/
supporter_name: string | null;
-- kind: "tip" | "paid_message" | "tts" | "media_request";
++ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
/**
* Integer amount in currency minor units (Vibes bits).
*/
@@@ -140072,7 +140072,7 @@ export interface TipsInteractionCancelledPayload {
* Display name at the time.
*/
supporter_name: string | null;
-- kind: "tip" | "paid_message" | "tts" | "media_request";
++ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
/**
* Integer amount in currency minor units (Vibes bits).
*/
@@@ -140387,7 +140387,7 @@ export interface TipsInteraction {
*/
supporter: SubjectRef | null;
supporter_name: string | null;
-- kind: "tip" | "paid_message" | "tts" | "media_request";
++ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
amount: number;
/**
* vibes-bits.
@@@ -140402,6 +140402,17 @@ export interface TipsInteraction {
url: string;
provider?: string;
} | null;
++ /**
++ * Kind sound: the sound the overlay plays.
++ */
++ sound?: {
++ id: string;
++ name: string;
++ /**
++ * The audio file on openvibe.tips (/sounds/<id>).
++ */
++ url: string;
++ } | null;
/**
* The goal the supporter picked.
*/
@@@ -140513,7 +140524,7 @@ export type TipsModerationResult =
*/
export interface TipsModerationView {
id: string;
-- kind: "tip" | "paid_message" | "tts" | "media_request";
++ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
created_at: string;
settled_at: string | null;
payment_state: "pending" | "settled" | "reversed" | "failed";
@@@ -140732,7 +140743,7 @@ export interface TipsOverlayToken {
/** [email protected] (owner: tips) */
/**
-- * tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.
++ * tips.paid-request@1: bodies of the paid requests on OpenVibe.Tips: POST /api/v1/checkout (tips.checkout.create: a tip), POST /api/v1/sound-requests (tips.sound.request: a paid sound), POST /api/v1/paid-messages (tips.superchat.create: needs message; paid_message_min applies), POST /api/v1/tts-requests (tips.tts.request: needs text to read, tts.text or message, within the creator's TTS settings) and POST /api/v1/media-requests (tips.media_request.create: needs media.url; the creator's minimum and length apply): { creator, amount, supporter?, supporter_name?, message?, pay_with?, provider?, tts?, media?, goal_id?, target?, privacy? }. The route sets the kind. A service names the supporter; a person pays as themselves. pay_with credit (default) pays from the supporter's Billing credit at once; checkout starts a Billing checkout (from TIPS_MIN_CHECKOUT_BITS, 100 bits by default). Tips never prices money; Billing does. Needs an Idempotency-Key header (8-200 of A-Z a-z 0-9 . _ : -; 400 idempotency.key_required): a replay with the same key and body returns the first answer, the same key with another body is 422 idempotency.key_reused. Refusals are problem+json: 422 tips.invalid_input, tips.invalid_amount, tips.amount_too_small, tips.text_too_long (message over TIPS_MESSAGE_CHARS, 300 by default), tips.invalid_media, tips.invalid_subject, tips.name_taken, tips.goal_not_found or tips.self_dealing; 409 tips.not_accepting, tips.tts_disabled or tips.media_disabled; 409 tips.payment_failed (a replay of a request whose payment failed) and Billing's own refusal code (409 billing.insufficient_funds, else 422), both with the interaction in details; 404 tips.creator_not_found; 429 tips.too_many_pending; 502 tips.billing_unavailable. Unknown fields are ignored.
*/
export interface TipsPaidRequest {
/**
@@@ -140788,6 +140799,15 @@ export interface TipsPaidRequest {
*/
url: string;
};
++ /**
++ * A paid sound (kind sound): the creator’s overlay plays it on stream.
++ */
++ sound?: {
++ /**
++ * One of the creator's sounds (GET /api/v1/profiles/:creator/sounds).
++ */
++ id: string;
++ };
/**
* One of the creator's open goals.
*/
@@@ -140872,6 +140892,8 @@ export interface TipsProfileUpdateRequest {
* The smallest media request (1 to 1000000 bits).
*/
media_request_min?: number | string;
++ sounds_enabled?: boolean;
++ sound_min?: number;
/**
* The longest media request (10 to 10800 seconds).
*/
@@@ -140950,6 +140972,7 @@ export interface TipsProfile {
paid_message: number;
tts: number | null;
media_request: number | null;
++ sound?: number | null;
};
tts: {
enabled: boolean;
@@@ -140960,6 +140983,431 @@ export interface TipsProfile {
enabled: boolean;
max_seconds: number;
};
++ /**
++ * Paid sounds: whether they are on and the creator's sounds (up to 12).
++ */
++ sounds?: {
++ enabled: boolean;
++ /**
++ * @maxItems 12
++ */
++ items?:
++ | []
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ]
++ | [
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ },
++ {
++ id: string;
++ name: string;
++ url: string;
++ }
++ ];
++ };
page: {
goal_amounts: boolean;
goal_supporters: boolean;
@@@ -140985,7 +141433,7 @@ export interface TipsProfile {
*/
export interface TipsPublicInteraction {
interaction_id: string;
-- kind: "tip" | "paid_message" | "tts" | "media_request";
++ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
/**
* Vibes bits; null when hidden.
*/
@@@ -141007,6 +141455,17 @@ export interface TipsPublicInteraction {
media: {
url: string;
} | null;
++ /**
++ * Kind sound: the sound the overlay plays.
++ */
++ sound?: {
++ id: string;
++ name: string;
++ /**
++ * The audio file on openvibe.tips (/sounds/<id>).
++ */
++ url: string;
++ } | null;
hidden: boolean;
}
@@@ -141019,7 +141478,7 @@ export interface TipsSimulationRequest {
* The creator whose overlays show it (default: the signed-in person).
*/
creator?: SubjectRef | string;
-- kind?: "tip" | "paid_message" | "tts" | "media_request";
++ kind?: "tip" | "paid_message" | "tts" | "media_request" | "sound";
/**
* Vibes bits.
*/
@@@ -141056,6 +141515,15 @@ export interface TipsSimulationRequest {
*/
url: string;
};
++ /**
++ * A paid sound (kind sound): the creator’s overlay plays it on stream.
++ */
++ sound?: {
++ /**
++ * One of the creator's sounds (GET /api/v1/profiles/:creator/sounds).
++ */
++ id: string;
++ };
goal_id?: string;
supporter_name?: string | null;
/**
ddiff --git a/manifests/capabilities/tips.sound.request.json b/manifests/capabilities/tips.sound.request.json
nnew file mode 100644
iindex 00000000..46f81e51
---- /dev/null
++++ b/manifests/capabilities/tips.sound.request.json
@@@ -0,0 +1,23 @@
++{
++ "id": "tips.sound.request",
++ "version": "1.0",
++ "owner": "tips",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Start a paid sound for a supporter: one of the creator's sounds, played by the creator's overlay after settlement.",
++ "permissions": [
++ "tips:checkout"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "payments",
++ "events": [
++ "tips.interaction.ready"
++ ],
++ "implementedBy": [
++ "POST /api/v1/sound-requests"
++ ],
++ "inputSchema": "tips.paid-request@1",
++ "outputSchema": "tips.paid-result@1"
++}
ddiff --git a/manifests/services/tips.json b/manifests/services/tips.json
iindex 798ca495..4b98dc31 100644
---- a/manifests/services/tips.json
++++ b/manifests/services/tips.json
@@@ -15,50 +15,72 @@
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:4610",
"exposure": {
-- "state": "internal",
-- "publicSite": "placeholder",
-- "note": "the domain serves the OpenVibe.Sites placeholder page"
++ "state": "live",
++ "publicSite": "service"
},
"site": {
"name": "Tips",
"icon": "tips",
-- "tagline": "Support creators",
-- "what": "Tips, goals, paid messages and alerts for creators, settled by the network's billing ledger.",
++ "tagline": "Tips, paid messages and alerts for any stream",
++ "what": "A tip page and alert kit for creators on any platform: tips, paid messages, text-to-speech and media requests, goals and OBS overlays, settled by the network’s billing ledger.",
"legalProfile": "streaming",
"position": 12,
"tld": "tips",
"accent": "#4ade80",
-- "description": "OpenVibe.Tips is the tipping and alerts layer of the OpenVibe network: tips, donation goals, superchats, paid text-to-speech and media requests, with alert overlays for creators.",
++ "description": "OpenVibe.Tips gives every creator a tip page at openvibe.tips/<name> and an alert kit for their stream, wherever they stream: supporters send a tip, a highlighted paid message, a message read out on stream or a video request, within the creator’s own limits, and an overlay link shows each one in OBS as it lands, next to the creator’s goals. It works for OpenVibe.Live, Twitch, YouTube and Kick alike. Payments settle in OpenVibe.Billing, and every receipt shows separately when the payment settled and when the message was delivered.",
"pillars": [
{
-- "title": "Tips & goals",
-- "text": "Tip a creator, fund a goal, see it land on stream."
++ "title": "A tip page of your own",
++ "text": "openvibe.tips/yourname, with your goals, your supporters and your own minimums."
},
{
-- "title": "Superchat & TTS",
-- "text": "Paid messages read out on stream, through OpenVibe.Chat."
++ "title": "Paid messages, voice and videos",
++ "text": "Highlighted messages, text-to-speech and media requests, each one only where you turned it on."
},
{
-- "title": "Alert overlays",
-- "text": "Overlays for OBS and the browser, themed with the network."
++ "title": "Alerts in OBS",
++ "text": "One overlay link for OBS or any browser source shows tips and goals as they land, on any platform."
},
{
-- "title": "One ledger",
-- "text": "Every transaction on the network's own ledger, visible to you."
++ "title": "Receipts you can read",
++ "text": "When the payment settled and when your message was delivered, shown apart, on one ledger."
}
],
-- "keywords": "openvibe tips, tip streamers, donation alerts, superchat",
-- "launch": "the payments cutover to OpenVibe.Billing and a security review; tips keep working on OpenVibe.Live meanwhile",
++ "keywords": "openvibe tips, tip streamers, donation alerts, superchat, paid messages, text to speech donations, media requests, obs alerts, streamlabs alternative",
++ "launch": "paid sound alerts, and more checkout options as OpenVibe.Billing adds them",
"relationships": {
"plannedRepo": "OpenVibe.Tips",
"meanwhile": [
{
-- "label": "Tip with Vibes on OpenVibe.Live",
++ "label": "Go live on OpenVibe.Live",
"url": "https://openvibe.live",
-- "note": "Tips already work on Live today."
++ "note": "Tips show in your Live chat with your alert sound."
++ },
++ {
++ "label": "Memberships on OpenVibe.VIP",
++ "url": "https://openvibe.vip",
++ "note": "Monthly support, with perks across OpenVibe."
}
]
-- }
++ },
++ "faq": [
++ {
++ "question": "Do I need to stream on OpenVibe.Live?",
++ "answer": "No. Your tip page works as a link anywhere, and the overlay is a browser source for OBS, so it shows alerts on Twitch, YouTube or Kick too. On OpenVibe.Live, tips also appear in your chat with your alert sound."
++ },
++ {
++ "question": "How do supporters pay?",
++ "answer": "In Vibes from their OpenVibe balance (100 Vibes = $1), or through a checkout OpenVibe.Billing offers. Billing settles every payment; Tips never holds money."
++ },
++ {
++ "question": "What do supporters have to send?",
++ "answer": "A new page starts at 1 Vibe for a tip, 100 for a paid message or text-to-speech and 25 for a media request. You set your own minimums, and you choose whether text-to-speech and media requests are on."
++ },
++ {
++ "question": "How do I get the money?",
++ "answer": "Tips arrive as Vibes you can cash out, under the network’s cash-out rules (from 500 Vibes, after a 14-day hold)."
++ }
++ ]
},
"capabilities": [
"tips.profile.get",
@@@ -67,6 +89,7 @@
"tips.superchat.create",
"tips.tts.request",
"tips.media_request.create",
++ "tips.sound.request",
"tips.interaction.get",
"tips.interaction.list",
"tips.interaction.record",
ddiff --git a/manifests/services/vip.json b/manifests/services/vip.json
iindex 7b5420c8..b045edbb 100644
---- a/manifests/services/vip.json
++++ b/manifests/services/vip.json
@@@ -15,50 +15,72 @@
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:4620",
"exposure": {
-- "state": "internal",
-- "publicSite": "placeholder",
-- "note": "the domain serves the OpenVibe.Sites placeholder page"
++ "state": "live",
++ "publicSite": "service"
},
"site": {
"name": "VIP",
"icon": "vip",
-- "tagline": "Memberships and perks",
-- "what": "Creator and network memberships: plans, perks and benefits recognised on every OpenVibe site.",
++ "tagline": "Memberships for creators and their software",
++ "what": "Memberships open to anyone on OpenVibe: creators publish plans with perks, members join through the network’s billing ledger, and apps and tools check a membership with the SDK.",
"legalProfile": "account",
"position": 13,
"tld": "vip",
"accent": "#e879f9",
-- "description": "OpenVibe.VIP is the membership layer of the OpenVibe network: creator memberships, channel subscriptions, VIP tiers and perks that unlock across Live, Community, Blog and more.",
++ "description": "OpenVibe.VIP is a membership site, like Patreon, open to anyone with an OpenVibe account. A creator publishes plans with perks, and members join from their Vibes credit or another way OpenVibe.Billing offers. The perks follow them across OpenVibe: a badge in chat, members-only posts and rooms, roles and emotes. Plans are versioned, so members keep the terms they joined under. Developers sell subscriptions to their own apps and tools the same way: the app signs a person in with OpenVibe and asks VIP whether they are a member (openvibe-sdk/vip).",
"pillars": [
{
-- "title": "Creator memberships",
-- "text": "Subscribe to the people you watch; perks follow you everywhere."
++ "title": "Plans and perks",
++ "text": "Build each plan from perks; members see exactly what they get and keep the version they joined."
},
{
-- "title": "Network VIP",
-- "text": "One membership that supports the whole network."
++ "title": "Perks across OpenVibe",
++ "text": "Badges in chat, members-only posts and rooms, roles and emotes, wherever a site honours them."
},
{
-- "title": "Perks",
-- "text": "Badges, emotes, early access, gated posts — set by creators."
++ "title": "For your software",
++ "text": "Sell a subscription to your app or tool: sign people in with OpenVibe and check their membership with the SDK."
},
{
-- "title": "Transparent",
-- "text": "What it costs and where it goes, in the open."
++ "title": "Open terms",
++ "text": "Every plan version stays public, and payments, renewals and refunds run through one ledger."
}
],
-- "keywords": "openvibe vip, creator memberships, subscriptions",
-- "launch": "the payments cutover to OpenVibe.Billing; checkout stays closed until then",
++ "keywords": "openvibe vip, creator memberships, subscriptions, patreon alternative, members only, software subscriptions, license check",
++ "launch": "OpenVibe’s own premium plan, sold here",
"relationships": {
"plannedRepo": "OpenVibe.VIP",
"meanwhile": [
{
-- "label": "Subscriptions on OpenVibe.Live",
-- "url": "https://openvibe.live",
-- "note": "Channel subscriptions exist on Live today."
++ "label": "Tips on OpenVibe.Tips",
++ "url": "https://openvibe.tips",
++ "note": "One-off support with alerts on stream."
++ },
++ {
++ "label": "The OpenVibe SDK",
++ "url": "https://github.com/OpenVibers/OpenVibe.SDK",
++ "note": "openvibe-sdk/vip checks a membership from your app."
}
]
-- }
++ },
++ "faq": [
++ {
++ "question": "Who can make a plan?",
++ "answer": "Anyone with an OpenVibe account: streamers, writers, communities and developers. Your plans are on your page at openvibe.vip/<name>."
++ },
++ {
++ "question": "How do members pay?",
++ "answer": "From their Vibes credit or another way OpenVibe.Billing offers, renewing automatically or not, as they choose. VIP never holds money."
++ },
++ {
++ "question": "Can I sell a subscription to my own software?",
++ "answer": "Yes. Your app signs a person in with OpenVibe, then asks VIP whether they belong to your plan (openvibe-sdk/vip, checkEntitlement), and unlocks what your plan promises."
++ },
++ {
++ "question": "What happens when a plan changes?",
++ "answer": "A change publishes a new version. Members keep the version they joined while their membership lasts, and every version stays public in the plan’s terms history."
++ }
++ ]
},
"capabilities": [
"vip.plan.create",
ddiff --git a/package.json b/package.json
iindex 5ee0be96..2c55c42c 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.199.3",
++ "version": "0.200.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",