openvibers/openvibe.contracts Commits
HOLD until the Billing cutover: Contracts 0.200.0, Tips and VIP are live sites (#180)
Changes
@@@ -4,6 +4,20 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,the notes were in the tag and commit messages (`git tag -n1`).++## 0.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@@@ -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"] },@@@ -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"] },@@@ -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"] },@@@ -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",@@@ -29,7 +29,8 @@"tip","paid_message","tts",-- "media_request"++ "media_request",++ "sound"]},"created_at": {@@@ -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."@@@ -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",@@@ -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": [@@@ -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"}@@@ -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"},@@@ -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"},@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -208,8 +208,8 @@"service": "tips","name": "OpenVibe.Tips","origin": "https://openvibe.tips",-- "operations": 26,-- "capabilities": 18++ "operations": 27,++ "capabilities": 19},{"service": "tools",@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"},@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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"@@@ -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;/**nnew file mode 100644@@@ -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"++}@@@ -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",@@@ -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",@@@ -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",
@@ -4,6 +4,20 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -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,
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
the notes were in the tag and commit messages (`git tag -n1`).
+## 0.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
## 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
- Chat's catalog copy says what it is now: rooms with AI members on their own models with tools, Discord-style servers
@@ -14,7 +14,7 @@
@@ -14,7 +14,7 @@
"description": "The supporter, null when external, anonymous or unmapped."
"description": "The supporter, null when external, anonymous or unmapped."
},
},
"supporter_name": { "type": ["string", "null"], "description": "Display name at the time." },
"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)." },
"amount": { "type": "integer", "minimum": 1, "description": "Integer amount in currency minor units (Vibes bits)." },
"currency": { "type": "string", "description": "vibes-bits today." },
"currency": { "type": "string", "description": "vibes-bits today." },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
@@ -14,7 +14,7 @@
@@ -14,7 +14,7 @@
"description": "The supporter, null when external, anonymous or unmapped."
"description": "The supporter, null when external, anonymous or unmapped."
},
},
"supporter_name": { "type": ["string", "null"], "description": "Display name at the time." },
"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)." },
"amount": { "type": "integer", "minimum": 1, "description": "Integer amount in currency minor units (Vibes bits)." },
"currency": { "type": "string", "description": "vibes-bits today." },
"currency": { "type": "string", "description": "vibes-bits today." },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
@@ -14,7 +14,7 @@
@@ -14,7 +14,7 @@
"description": "The supporter, null when external, anonymous or unmapped."
"description": "The supporter, null when external, anonymous or unmapped."
},
},
"supporter_name": { "type": ["string", "null"], "description": "Display name at the time." },
"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)." },
"amount": { "type": "integer", "minimum": 1, "description": "Integer amount in currency minor units (Vibes bits)." },
"currency": { "type": "string", "description": "vibes-bits today." },
"currency": { "type": "string", "description": "vibes-bits today." },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
"settlement": { "enum": ["billing", "external", "simulated", "imported"] },
@@ -59,7 +59,8 @@
@@ -59,7 +59,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -119,6 +120,34 @@
@@ -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": {
"goal_id": {
"type": [
"type": [
"string",
"string",
@@ -29,7 +29,8 @@
@@ -29,7 +29,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"created_at": {
"created_at": {
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/tips/paid-request.v1.json",
"$id": "https://openvibe.network/contracts/tips/paid-request.v1.json",
"title": "TipsPaidRequest",
"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",
"type": "object",
"required": [
"required": [
"creator",
"creator",
@@ -108,6 +108,20 @@
@@ -108,6 +108,20 @@
},
},
"description": "A media request (kind media_request)."
"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": {
"goal_id": {
"type": "string",
"type": "string",
"description": "One of the creator's open goals."
"description": "One of the creator's open goals."
@@ -85,6 +85,13 @@
@@ -85,6 +85,13 @@
"pattern": "^[1-9][0-9]*$",
"pattern": "^[1-9][0-9]*$",
"description": "The smallest media request (1 to 1000000 bits)."
"description": "The smallest media request (1 to 1000000 bits)."
},
},
+ "sounds_enabled": {
+ "type": "boolean"
+ },
+ "sound_min": {
+ "type": "integer",
+ "minimum": 1
+ },
"media_max_seconds": {
"media_max_seconds": {
"type": [
"type": [
"integer",
"integer",
@@ -82,6 +82,13 @@
@@ -82,6 +82,13 @@
"null"
"null"
],
],
"minimum": 1
"minimum": 1
+ },
+ "sound": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 1
}
}
}
}
},
},
@@ -119,6 +126,41 @@
@@ -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": {
"page": {
"type": "object",
"type": "object",
"required": [
"required": [
@@ -29,7 +29,8 @@
@@ -29,7 +29,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -113,6 +114,34 @@
@@ -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": {
"hidden": {
"type": "boolean"
"type": "boolean"
}
}
@@ -23,7 +23,8 @@
@@ -23,7 +23,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -83,6 +84,20 @@
@@ -83,6 +84,20 @@
},
},
"description": "A media request (kind media_request)."
"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": {
"goal_id": {
"type": "string"
"type": "string"
},
},
@@ -16049,7 +16049,8 @@
@@ -16049,7 +16049,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -16157,7 +16158,8 @@
@@ -16157,7 +16158,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -16298,7 +16300,8 @@
@@ -16298,7 +16300,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -17299,7 +17302,8 @@
@@ -17299,7 +17302,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -17359,6 +17363,34 @@
@@ -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": {
"goal_id": {
"type": [
"type": [
"string",
"string",
@@ -17831,7 +17863,8 @@
@@ -17831,7 +17863,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"created_at": {
"created_at": {
@@ -18513,7 +18546,7 @@
@@ -18513,7 +18546,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/tips/paid-request.v1.json",
"$id": "https://openvibe.network/contracts/tips/paid-request.v1.json",
"title": "TipsPaidRequest",
"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",
"type": "object",
"required": [
"required": [
"creator",
"creator",
@@ -18619,6 +18652,20 @@
@@ -18619,6 +18652,20 @@
},
},
"description": "A media request (kind media_request)."
"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": {
"goal_id": {
"type": "string",
"type": "string",
"description": "One of the creator's open goals."
"description": "One of the creator's open goals."
@@ -18813,6 +18860,13 @@
@@ -18813,6 +18860,13 @@
"pattern": "^[1-9][0-9]*$",
"pattern": "^[1-9][0-9]*$",
"description": "The smallest media request (1 to 1000000 bits)."
"description": "The smallest media request (1 to 1000000 bits)."
},
},
+ "sounds_enabled": {
+ "type": "boolean"
+ },
+ "sound_min": {
+ "type": "integer",
+ "minimum": 1
+ },
"media_max_seconds": {
"media_max_seconds": {
"type": [
"type": [
"integer",
"integer",
@@ -19040,6 +19094,13 @@
@@ -19040,6 +19094,13 @@
"null"
"null"
],
],
"minimum": 1
"minimum": 1
+ },
+ "sound": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 1
}
}
}
}
},
},
@@ -19077,6 +19138,41 @@
@@ -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": {
"page": {
"type": "object",
"type": "object",
"required": [
"required": [
@@ -19186,7 +19282,8 @@
@@ -19186,7 +19282,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -19270,6 +19367,34 @@
@@ -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": {
"hidden": {
"type": "boolean"
"type": "boolean"
}
}
@@ -19305,7 +19430,8 @@
@@ -19305,7 +19430,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -19365,6 +19491,20 @@
@@ -19365,6 +19491,20 @@
},
},
"description": "A media request (kind media_request)."
"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": {
"goal_id": {
"type": "string"
"type": "string"
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -208,8 +208,8 @@
@@ -208,8 +208,8 @@
"service": "tips",
"service": "tips",
"name": "OpenVibe.Tips",
"name": "OpenVibe.Tips",
"origin": "https://openvibe.tips",
"origin": "https://openvibe.tips",
- "operations": 26,
- "capabilities": 18
+ "operations": 27,
+ "capabilities": 19
},
},
{
{
"service": "tools",
"service": "tools",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -1418,6 +1418,62 @@
@@ -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": {
"/api/v1/tts-requests": {
"post": {
"post": {
"operationId": "post_api_v1_tts_requests",
"operationId": "post_api_v1_tts_requests",
@@ -2301,7 +2357,8 @@
@@ -2301,7 +2357,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -2361,6 +2418,34 @@
@@ -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": {
"goal_id": {
"type": [
"type": [
"string",
"string",
@@ -2812,7 +2897,8 @@
@@ -2812,7 +2897,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"created_at": {
"created_at": {
@@ -3445,7 +3531,7 @@
@@ -3445,7 +3531,7 @@
},
},
"tips.paid-request.v1": {
"tips.paid-request.v1": {
"title": "TipsPaidRequest",
"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",
"type": "object",
"required": [
"required": [
"creator",
"creator",
@@ -3551,6 +3637,20 @@
@@ -3551,6 +3637,20 @@
},
},
"description": "A media request (kind media_request)."
"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": {
"goal_id": {
"type": "string",
"type": "string",
"description": "One of the creator's open goals."
"description": "One of the creator's open goals."
@@ -3724,6 +3824,13 @@
@@ -3724,6 +3824,13 @@
"pattern": "^[1-9][0-9]*$",
"pattern": "^[1-9][0-9]*$",
"description": "The smallest media request (1 to 1000000 bits)."
"description": "The smallest media request (1 to 1000000 bits)."
},
},
+ "sounds_enabled": {
+ "type": "boolean"
+ },
+ "sound_min": {
+ "type": "integer",
+ "minimum": 1
+ },
"media_max_seconds": {
"media_max_seconds": {
"type": [
"type": [
"integer",
"integer",
@@ -3944,6 +4051,13 @@
@@ -3944,6 +4051,13 @@
"null"
"null"
],
],
"minimum": 1
"minimum": 1
+ },
+ "sound": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 1
}
}
}
}
},
},
@@ -3981,6 +4095,41 @@
@@ -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": {
"page": {
"type": "object",
"type": "object",
"required": [
"required": [
@@ -4083,7 +4232,8 @@
@@ -4083,7 +4232,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -4167,6 +4317,34 @@
@@ -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": {
"hidden": {
"type": "boolean"
"type": "boolean"
}
}
@@ -4195,7 +4373,8 @@
@@ -4195,7 +4373,8 @@
"tip",
"tip",
"paid_message",
"paid_message",
"tts",
"tts",
- "media_request"
+ "media_request",
+ "sound"
]
]
},
},
"amount": {
"amount": {
@@ -4255,6 +4434,20 @@
@@ -4255,6 +4434,20 @@
},
},
"description": "A media request (kind media_request)."
"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": {
"goal_id": {
"type": "string"
"type": "string"
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -139983,7 +139983,7 @@ export interface TipsInteractionReadyPayload {
@@ -139983,7 +139983,7 @@ export interface TipsInteractionReadyPayload {
* Display name at the time.
* Display name at the time.
*/
*/
supporter_name: string | null;
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).
* Integer amount in currency minor units (Vibes bits).
*/
*/
@@ -140020,7 +140020,7 @@ export interface TipsInteractionFailedPayload {
@@ -140020,7 +140020,7 @@ export interface TipsInteractionFailedPayload {
* Display name at the time.
* Display name at the time.
*/
*/
supporter_name: string | null;
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).
* Integer amount in currency minor units (Vibes bits).
*/
*/
@@ -140072,7 +140072,7 @@ export interface TipsInteractionCancelledPayload {
@@ -140072,7 +140072,7 @@ export interface TipsInteractionCancelledPayload {
* Display name at the time.
* Display name at the time.
*/
*/
supporter_name: string | null;
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).
* Integer amount in currency minor units (Vibes bits).
*/
*/
@@ -140387,7 +140387,7 @@ export interface TipsInteraction {
@@ -140387,7 +140387,7 @@ export interface TipsInteraction {
*/
*/
supporter: SubjectRef | null;
supporter: SubjectRef | null;
supporter_name: string | null;
supporter_name: string | null;
- kind: "tip" | "paid_message" | "tts" | "media_request";
+ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
amount: number;
amount: number;
/**
/**
* vibes-bits.
* vibes-bits.
@@ -140402,6 +140402,17 @@ export interface TipsInteraction {
@@ -140402,6 +140402,17 @@ export interface TipsInteraction {
url: string;
url: string;
provider?: string;
provider?: string;
} | null;
} | 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.
* The goal the supporter picked.
*/
*/
@@ -140513,7 +140524,7 @@ export type TipsModerationResult =
@@ -140513,7 +140524,7 @@ export type TipsModerationResult =
*/
*/
export interface TipsModerationView {
export interface TipsModerationView {
id: string;
id: string;
- kind: "tip" | "paid_message" | "tts" | "media_request";
+ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
created_at: string;
created_at: string;
settled_at: string | null;
settled_at: string | null;
payment_state: "pending" | "settled" | "reversed" | "failed";
payment_state: "pending" | "settled" | "reversed" | "failed";
@@ -140732,7 +140743,7 @@ export interface TipsOverlayToken {
@@ -140732,7 +140743,7 @@ export interface TipsOverlayToken {
/** [email protected] (owner: tips) */
/** [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 {
export interface TipsPaidRequest {
/**
/**
@@ -140788,6 +140799,15 @@ export interface TipsPaidRequest {
@@ -140788,6 +140799,15 @@ export interface TipsPaidRequest {
*/
*/
url: string;
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.
* One of the creator's open goals.
*/
*/
@@ -140872,6 +140892,8 @@ export interface TipsProfileUpdateRequest {
@@ -140872,6 +140892,8 @@ export interface TipsProfileUpdateRequest {
* The smallest media request (1 to 1000000 bits).
* The smallest media request (1 to 1000000 bits).
*/
*/
media_request_min?: number | string;
media_request_min?: number | string;
+ sounds_enabled?: boolean;
+ sound_min?: number;
/**
/**
* The longest media request (10 to 10800 seconds).
* The longest media request (10 to 10800 seconds).
*/
*/
@@ -140950,6 +140972,7 @@ export interface TipsProfile {
@@ -140950,6 +140972,7 @@ export interface TipsProfile {
paid_message: number;
paid_message: number;
tts: number | null;
tts: number | null;
media_request: number | null;
media_request: number | null;
+ sound?: number | null;
};
};
tts: {
tts: {
enabled: boolean;
enabled: boolean;
@@ -140960,6 +140983,431 @@ export interface TipsProfile {
@@ -140960,6 +140983,431 @@ export interface TipsProfile {
enabled: boolean;
enabled: boolean;
max_seconds: number;
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: {
page: {
goal_amounts: boolean;
goal_amounts: boolean;
goal_supporters: boolean;
goal_supporters: boolean;
@@ -140985,7 +141433,7 @@ export interface TipsProfile {
@@ -140985,7 +141433,7 @@ export interface TipsProfile {
*/
*/
export interface TipsPublicInteraction {
export interface TipsPublicInteraction {
interaction_id: string;
interaction_id: string;
- kind: "tip" | "paid_message" | "tts" | "media_request";
+ kind: "tip" | "paid_message" | "tts" | "media_request" | "sound";
/**
/**
* Vibes bits; null when hidden.
* Vibes bits; null when hidden.
*/
*/
@@ -141007,6 +141455,17 @@ export interface TipsPublicInteraction {
@@ -141007,6 +141455,17 @@ export interface TipsPublicInteraction {
media: {
media: {
url: string;
url: string;
} | null;
} | 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;
hidden: boolean;
}
}
@@ -141019,7 +141478,7 @@ export interface TipsSimulationRequest {
@@ -141019,7 +141478,7 @@ export interface TipsSimulationRequest {
* The creator whose overlays show it (default: the signed-in person).
* The creator whose overlays show it (default: the signed-in person).
*/
*/
creator?: SubjectRef | string;
creator?: SubjectRef | string;
- kind?: "tip" | "paid_message" | "tts" | "media_request";
+ kind?: "tip" | "paid_message" | "tts" | "media_request" | "sound";
/**
/**
* Vibes bits.
* Vibes bits.
*/
*/
@@ -141056,6 +141515,15 @@ export interface TipsSimulationRequest {
@@ -141056,6 +141515,15 @@ export interface TipsSimulationRequest {
*/
*/
url: string;
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;
goal_id?: string;
supporter_name?: string | null;
supporter_name?: string | null;
/**
/**
new file mode 100644
new file mode 100644
@@ -0,0 +1,23 @@
@@ -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"
+}
@@ -15,50 +15,72 @@
@@ -15,50 +15,72 @@
"ready": "/api/ready",
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:4610",
"internalOrigin": "http://127.0.0.1:4610",
"exposure": {
"exposure": {
- "state": "internal",
- "publicSite": "placeholder",
- "note": "the domain serves the OpenVibe.Sites placeholder page"
+ "state": "live",
+ "publicSite": "service"
},
},
"site": {
"site": {
"name": "Tips",
"name": "Tips",
"icon": "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",
"legalProfile": "streaming",
"position": 12,
"position": 12,
"tld": "tips",
"tld": "tips",
"accent": "#4ade80",
"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": [
"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": {
"relationships": {
"plannedRepo": "OpenVibe.Tips",
"plannedRepo": "OpenVibe.Tips",
"meanwhile": [
"meanwhile": [
{
{
- "label": "Tip with Vibes on OpenVibe.Live",
+ "label": "Go live on OpenVibe.Live",
"url": "https://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": [
"capabilities": [
"tips.profile.get",
"tips.profile.get",
@@ -67,6 +89,7 @@
@@ -67,6 +89,7 @@
"tips.superchat.create",
"tips.superchat.create",
"tips.tts.request",
"tips.tts.request",
"tips.media_request.create",
"tips.media_request.create",
+ "tips.sound.request",
"tips.interaction.get",
"tips.interaction.get",
"tips.interaction.list",
"tips.interaction.list",
"tips.interaction.record",
"tips.interaction.record",
@@ -15,50 +15,72 @@
@@ -15,50 +15,72 @@
"ready": "/api/ready",
"ready": "/api/ready",
"internalOrigin": "http://127.0.0.1:4620",
"internalOrigin": "http://127.0.0.1:4620",
"exposure": {
"exposure": {
- "state": "internal",
- "publicSite": "placeholder",
- "note": "the domain serves the OpenVibe.Sites placeholder page"
+ "state": "live",
+ "publicSite": "service"
},
},
"site": {
"site": {
"name": "VIP",
"name": "VIP",
"icon": "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",
"legalProfile": "account",
"position": 13,
"position": 13,
"tld": "vip",
"tld": "vip",
"accent": "#e879f9",
"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": [
"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": {
"relationships": {
"plannedRepo": "OpenVibe.VIP",
"plannedRepo": "OpenVibe.VIP",
"meanwhile": [
"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": [
"capabilities": [
"vip.plan.create",
"vip.plan.create",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",