openvibers/openvibe.contracts Commits
Support inboxes open to developer apps: chat.inbox.read, chat.inbox.reply and chat.inbox.manage (public, sensitive) with their schemas (0.214.0) (#211)
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.214.0 — 2026-10-26++++- **Support inboxes open to developer apps** (the owner, 2026-10-24/25: openvibe.chat "fully modular and SDK and++ API"). Three public, sensitive capabilities owned by `chat`, on the routes OpenVibe.Chat already serves; an app acts++ only for the person who authorized it (`on_behalf_of`), and that person's role in the inbox decides the rest:++ - `chat.inbox.read`: the inboxes the person works in, conversations (waiting first), messages, saved replies, and++ the owner's export (JSON or CSV);++ - `chat.inbox.reply`: reply, resolve, reopen, give back to Vibe, assign, mark read, translate;++ - `chat.inbox.manage`: make an inbox, and as its owner change it (Vibe, sites, hours, routing, retention), its people,++ saved replies, webhooks, actions and verified visitors.++- **Schemas:** `chat.inbox-request@1`, `chat.inbox-result@1`, `chat.inbox-reply-request@1`,++ `chat.inbox-conversations-result@1` (public), with fixtures.++- **`capability@1`:** `resourceConstraints` may say `inbox_member`.++## 0.213.0 — 2026-10-25- **Plain names in every menu** (the owner, 2026-10-24: make the products consumer-friendly and familiar, with the@@@ -16,7 +16,7 @@"inputSchema": { "type": "string" },"outputSchema": { "type": "string" },"permissions": { "type": "array", "items": { "type": "string" } },-- "resourceConstraints": { "type": "array", "items": { "enum": ["namespace", "owner", "room_member", "space_member", "project", "none"] } },++ "resourceConstraints": { "type": "array", "items": { "enum": ["namespace", "owner", "room_member", "space_member", "inbox_member", "project", "none"] } },"quotaClass": { "type": "string" },"events": { "type": "array", "items": { "type": "string" } },"implementedBy": { "type": "array", "items": { "type": "string" }, "description": "Current route(s) that perform this action today, e.g. 'POST /api/v1/:app/files'." },@@@ -7413,6 +7413,42 @@"visibility": "public","compatibility": "backward","status": "active"++ },++ {++ "id": "chat.inbox-request",++ "version": "1.0.0",++ "owner": "chat",++ "schema": "chat/inbox-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "chat.inbox-result",++ "version": "1.0.0",++ "owner": "chat",++ "schema": "chat/inbox-result.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "chat.inbox-reply-request",++ "version": "1.0.0",++ "owner": "chat",++ "schema": "chat/inbox-reply-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "chat.inbox-conversations-result",++ "version": "1.0.0",++ "owner": "chat",++ "schema": "chat/inbox-conversations-result.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"}]}nnew file mode 100644@@@ -0,0 +1,75 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-conversations-result.v1.json",++ "title": "ChatInboxConversationsResult",++ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",++ "type": "object",++ "properties": {++ "conversations": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "status"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "status": {++ "enum": [++ "bot",++ "waiting",++ "open",++ "resolved"++ ]++ }++ }++ }++ },++ "conversation": {++ "type": [++ "object",++ "null"++ ]++ },++ "messages": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "author",++ "body"++ ],++ "properties": {++ "id": {++ "type": "integer"++ },++ "author": {++ "enum": [++ "visitor",++ "agent",++ "ai",++ "system"++ ]++ },++ "body": {++ "type": "string"++ }++ }++ }++ },++ "message": {++ "type": "object"++ },++ "replies": {++ "type": "array",++ "items": {++ "type": "object"++ }++ }++ }++}nnew file mode 100644@@@ -0,0 +1,72 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-reply-request.v1.json",++ "title": "ChatInboxReplyRequest",++ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",++ "anyOf": [++ {++ "type": "object",++ "required": [++ "message"++ ],++ "properties": {++ "message": {++ "type": "string",++ "minLength": 1,++ "maxLength": 4000++ }++ },++ "additionalProperties": false++ },++ {++ "type": "object",++ "properties": {++ "status": {++ "enum": [++ "open",++ "resolved",++ "bot"++ ]++ },++ "assignee_id": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 1++ }++ },++ "additionalProperties": false,++ "anyOf": [++ {++ "required": [++ "status"++ ]++ },++ {++ "required": [++ "assignee_id"++ ]++ }++ ]++ },++ {++ "type": "object",++ "required": [++ "to"++ ],++ "properties": {++ "to": {++ "type": "string",++ "maxLength": 16,++ "description": "A language code (en, es, ja, …)."++ },++ "text": {++ "type": "string",++ "maxLength": 4000++ }++ },++ "additionalProperties": false++ }++ ]++}nnew file mode 100644@@@ -0,0 +1,115 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-request.v1.json",++ "title": "ChatInboxRequest",++ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",++ "type": "object",++ "properties": {++ "name": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ },++ "greeting": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "color": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ },++ "ai_enabled": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "ai_instructions": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "knowledge_urls": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "allowed_origins": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "handoff": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "hours": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "route": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "retention_days": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ }++ }++}nnew file mode 100644@@@ -0,0 +1,73 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-result.v1.json",++ "title": "ChatInboxResult",++ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",++ "type": "object",++ "properties": {++ "inbox": {++ "type": "object",++ "required": [++ "id",++ "name"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "name": {++ "type": "string"++ }++ }++ },++ "inboxes": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "name",++ "role"++ ],++ "properties": {++ "id": {++ "type": "string"++ },++ "name": {++ "type": "string"++ },++ "role": {++ "enum": [++ "owner",++ "agent"++ ]++ },++ "waiting": {++ "type": "integer"++ },++ "open": {++ "type": "integer"++ }++ }++ }++ },++ "members": {++ "type": "array",++ "items": {++ "type": "object"++ }++ },++ "embed": {++ "type": "object",++ "properties": {++ "script": {++ "type": "string"++ },++ "panel": {++ "type": "string"++ }++ }++ }++ }++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "messages": [++ {++ "id": 1,++ "author": "robot",++ "body": "hi"++ }++ ]++}nnew file mode 100644@@@ -0,0 +1,22 @@++{++ "conversation": {++ "id": "cnv_01J9ZQ3M5K8V2R4T6Y8W0X2C4C",++ "status": "open"++ },++ "messages": [++ {++ "id": 1,++ "author": "visitor",++ "author_name": "Dana",++ "body": "My lamp arrived cracked",++ "created_at": "2026-10-25 02:00:00"++ },++ {++ "id": 2,++ "author": "agent",++ "author_name": "Ann",++ "body": "Sorry! A new shade ships today.",++ "created_at": "2026-10-25 02:01:00"++ }++ ]++}nnew file mode 100644@@@ -0,0 +1,12 @@++{++ "conversations": [++ {++ "id": "cnv_01J9ZQ3M5K8V2R4T6Y8W0X2C4C",++ "status": "waiting",++ "visitor_name": "Dana",++ "verified": true,++ "preview": "My lamp arrived cracked",++ "agent_unread": 1++ }++ ]++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "message": ""++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "status": "closed"++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "message": "Hi! Your order ships today."++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "status": "resolved",++ "assignee_id": 42++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "to": "es",++ "text": "Your order ships today."++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "color": "orange"++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "retention_days": 3++}nnew file mode 100644@@@ -0,0 +1,16 @@++{++ "hours": {++ "tz": "America/Los_Angeles",++ "days": [++ 1,++ 2,++ 3,++ 4,++ 5++ ],++ "start": "09:00",++ "end": "17:00"++ },++ "route": "round_robin",++ "retention_days": 90++}nnew file mode 100644@@@ -0,0 +1,13 @@++{++ "name": "Pixel Lamp Co.",++ "greeting": "Questions about your lamp? Ask away.",++ "color": "#7c5cff",++ "ai_enabled": true,++ "ai_instructions": "We sell smart lamps.",++ "knowledge_urls": [++ "https://pixellamp.example/faq"++ ],++ "allowed_origins": [++ "https://pixellamp.example"++ ]++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "inboxes": [++ {++ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",++ "name": "x",++ "role": "boss"++ }++ ]++}nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "inbox": {++ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",++ "name": "Pixel Lamp Co."++ },++ "embed": {++ "script": "<script src=\"https://openvibe.chat/widget.js\" data-inbox=\"inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B\" async></script>",++ "panel": "https://openvibe.chat/embed/inbox/inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B"++ }++}nnew file mode 100644@@@ -0,0 +1,11 @@++{++ "inboxes": [++ {++ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",++ "name": "Pixel Lamp Co.",++ "role": "owner",++ "waiting": 2,++ "open": 5++ }++ ]++}@@@ -1699,6 +1699,7 @@"owner","room_member","space_member",++ "inbox_member","project","none"]@@@ -82803,6 +82804,361 @@}}}++ },++ "chat.inbox-request": {++ "version": "1.0.0",++ "owner": "chat",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-request.v1.json",++ "title": "ChatInboxRequest",++ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",++ "type": "object",++ "properties": {++ "name": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ },++ "greeting": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "color": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ },++ "ai_enabled": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "ai_instructions": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "knowledge_urls": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "allowed_origins": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "handoff": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "hours": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "route": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "retention_days": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ }++ }++ }++ },++ "chat.inbox-result": {++ "version": "1.0.0",++ "owner": "chat",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-result.v1.json",++ "title": "ChatInboxResult",++ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",++ "type": "object",++ "properties": {++ "inbox": {++ "type": "object",++ "required": [++ "id",++ "name"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "name": {++ "type": "string"++ }++ }++ },++ "inboxes": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "name",++ "role"++ ],++ "properties": {++ "id": {++ "type": "string"++ },++ "name": {++ "type": "string"++ },++ "role": {++ "enum": [++ "owner",++ "agent"++ ]++ },++ "waiting": {++ "type": "integer"++ },++ "open": {++ "type": "integer"++ }++ }++ }++ },++ "members": {++ "type": "array",++ "items": {++ "type": "object"++ }++ },++ "embed": {++ "type": "object",++ "properties": {++ "script": {++ "type": "string"++ },++ "panel": {++ "type": "string"++ }++ }++ }++ }++ }++ },++ "chat.inbox-reply-request": {++ "version": "1.0.0",++ "owner": "chat",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-reply-request.v1.json",++ "title": "ChatInboxReplyRequest",++ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",++ "anyOf": [++ {++ "type": "object",++ "required": [++ "message"++ ],++ "properties": {++ "message": {++ "type": "string",++ "minLength": 1,++ "maxLength": 4000++ }++ },++ "additionalProperties": false++ },++ {++ "type": "object",++ "properties": {++ "status": {++ "enum": [++ "open",++ "resolved",++ "bot"++ ]++ },++ "assignee_id": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 1++ }++ },++ "additionalProperties": false,++ "anyOf": [++ {++ "required": [++ "status"++ ]++ },++ {++ "required": [++ "assignee_id"++ ]++ }++ ]++ },++ {++ "type": "object",++ "required": [++ "to"++ ],++ "properties": {++ "to": {++ "type": "string",++ "maxLength": 16,++ "description": "A language code (en, es, ja, …)."++ },++ "text": {++ "type": "string",++ "maxLength": 4000++ }++ },++ "additionalProperties": false++ }++ ]++ }++ },++ "chat.inbox-conversations-result": {++ "version": "1.0.0",++ "owner": "chat",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/chat/inbox-conversations-result.v1.json",++ "title": "ChatInboxConversationsResult",++ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",++ "type": "object",++ "properties": {++ "conversations": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "status"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "status": {++ "enum": [++ "bot",++ "waiting",++ "open",++ "resolved"++ ]++ }++ }++ }++ },++ "conversation": {++ "type": [++ "object",++ "null"++ ]++ },++ "messages": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "author",++ "body"++ ],++ "properties": {++ "id": {++ "type": "integer"++ },++ "author": {++ "enum": [++ "visitor",++ "agent",++ "ai",++ "system"++ ]++ },++ "body": {++ "type": "string"++ }++ }++ }++ },++ "message": {++ "type": "object"++ },++ "replies": {++ "type": "array",++ "items": {++ "type": "object"++ }++ }++ }++ }}}}@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.213.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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"@@@ -16,6 +16,2931 @@}],"paths": {++ "/api/chat/inboxes": {++ "get": {++ "operationId": "get_api_chat_inboxes",++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-read",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.read"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_chat_inboxes",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}": {++ "delete": {++ "operationId": "delete_api_chat_inboxes_id",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "name",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ }++ },++ {++ "name": "greeting",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "description": "The first line a visitor sees."++ },++ {++ "name": "color",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ }++ },++ {++ "name": "ai_enabled",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "description": "Vibe, the assistant, answers first."++ },++ {++ "name": "ai_instructions",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ {++ "name": "knowledge_urls",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ {++ "name": "allowed_origins",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "description": "The sites the widget answers (empty: any)."++ },++ {++ "name": "handoff",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ {++ "name": "hours",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "description": "When the people answer; null: always."++ },++ {++ "name": "route",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ {++ "name": "retention_days",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ },++ "description": "How long finished conversations stay; null: forever."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "get": {++ "operationId": "get_api_chat_inboxes_id",++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-read",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "patch": {++ "operationId": "patch_api_chat_inboxes_id",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/actions": {++ "get": {++ "operationId": "get_api_chat_inboxes_id_actions",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "name",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ }++ },++ {++ "name": "greeting",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "description": "The first line a visitor sees."++ },++ {++ "name": "color",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ }++ },++ {++ "name": "ai_enabled",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "description": "Vibe, the assistant, answers first."++ },++ {++ "name": "ai_instructions",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ {++ "name": "knowledge_urls",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ {++ "name": "allowed_origins",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "description": "The sites the widget answers (empty: any)."++ },++ {++ "name": "handoff",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ {++ "name": "hours",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "description": "When the people answer; null: always."++ },++ {++ "name": "route",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ {++ "name": "retention_days",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ },++ "description": "How long finished conversations stay; null: forever."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_chat_inboxes_id_actions",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/actions/{actionId}": {++ "delete": {++ "operationId": "delete_api_chat_inboxes_id_actions_actionId",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "actionId",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "name",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ }++ },++ {++ "name": "greeting",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "description": "The first line a visitor sees."++ },++ {++ "name": "color",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ }++ },++ {++ "name": "ai_enabled",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "description": "Vibe, the assistant, answers first."++ },++ {++ "name": "ai_instructions",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ {++ "name": "knowledge_urls",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ {++ "name": "allowed_origins",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "description": "The sites the widget answers (empty: any)."++ },++ {++ "name": "handoff",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ {++ "name": "hours",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "description": "When the people answer; null: always."++ },++ {++ "name": "route",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ {++ "name": "retention_days",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ },++ "description": "How long finished conversations stay; null: forever."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/actions/{actionId}/test": {++ "post": {++ "operationId": "post_api_chat_inboxes_id_actions_actionId_test",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "actionId",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/conversations": {++ "get": {++ "operationId": "get_api_chat_inboxes_id_conversations",++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-read",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/conversations/{cid}": {++ "patch": {++ "operationId": "patch_api_chat_inboxes_id_conversations_cid",++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.reply"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-reply",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.reply"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "cid",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/conversations/{cid}/messages": {++ "get": {++ "operationId": "get_api_chat_inboxes_id_conversations_cid_messages",++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-read",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "cid",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_chat_inboxes_id_conversations_cid_messages",++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.reply"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-reply",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.reply"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "cid",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/conversations/{cid}/messages/{mid}/translate": {++ "post": {++ "operationId": "post_api_chat_inboxes_id_conversations_cid_messages_mid_translate",++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.reply"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-reply",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.reply"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "cid",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "mid",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/conversations/{cid}/read": {++ "post": {++ "operationId": "post_api_chat_inboxes_id_conversations_cid_read",++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.reply"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-reply",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.reply"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "cid",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/export": {++ "get": {++ "operationId": "get_api_chat_inboxes_id_export",++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-read",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/identity": {++ "post": {++ "operationId": "post_api_chat_inboxes_id_identity",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/members": {++ "post": {++ "operationId": "post_api_chat_inboxes_id_members",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/members/{userId}": {++ "delete": {++ "operationId": "delete_api_chat_inboxes_id_members_userId",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "userId",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "name",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ }++ },++ {++ "name": "greeting",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "description": "The first line a visitor sees."++ },++ {++ "name": "color",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ }++ },++ {++ "name": "ai_enabled",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "description": "Vibe, the assistant, answers first."++ },++ {++ "name": "ai_instructions",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ {++ "name": "knowledge_urls",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ {++ "name": "allowed_origins",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "description": "The sites the widget answers (empty: any)."++ },++ {++ "name": "handoff",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ {++ "name": "hours",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "description": "When the people answer; null: always."++ },++ {++ "name": "route",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ {++ "name": "retention_days",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ },++ "description": "How long finished conversations stay; null: forever."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/replies": {++ "get": {++ "operationId": "get_api_chat_inboxes_id_replies",++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-read",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_chat_inboxes_id_replies",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/replies/{replyId}": {++ "delete": {++ "operationId": "delete_api_chat_inboxes_id_replies_replyId",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "replyId",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "name",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ }++ },++ {++ "name": "greeting",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "description": "The first line a visitor sees."++ },++ {++ "name": "color",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ }++ },++ {++ "name": "ai_enabled",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "description": "Vibe, the assistant, answers first."++ },++ {++ "name": "ai_instructions",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ {++ "name": "knowledge_urls",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ {++ "name": "allowed_origins",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "description": "The sites the widget answers (empty: any)."++ },++ {++ "name": "handoff",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ {++ "name": "hours",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "description": "When the people answer; null: always."++ },++ {++ "name": "route",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ {++ "name": "retention_days",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ },++ "description": "How long finished conversations stay; null: forever."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/translate": {++ "post": {++ "operationId": "post_api_chat_inboxes_id_translate",++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.reply"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-reply",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.reply"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/webhooks": {++ "get": {++ "operationId": "get_api_chat_inboxes_id_webhooks",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "name",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ }++ },++ {++ "name": "greeting",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "description": "The first line a visitor sees."++ },++ {++ "name": "color",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ }++ },++ {++ "name": "ai_enabled",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "description": "Vibe, the assistant, answers first."++ },++ {++ "name": "ai_instructions",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ {++ "name": "knowledge_urls",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ {++ "name": "allowed_origins",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "description": "The sites the widget answers (empty: any)."++ },++ {++ "name": "handoff",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ {++ "name": "hours",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "description": "When the people answer; null: always."++ },++ {++ "name": "route",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ {++ "name": "retention_days",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ },++ "description": "How long finished conversations stay; null: forever."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_chat_inboxes_id_webhooks",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/webhooks/{hookId}": {++ "delete": {++ "operationId": "delete_api_chat_inboxes_id_webhooks_hookId",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "hookId",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "name",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ }++ },++ {++ "name": "greeting",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "description": "The first line a visitor sees."++ },++ {++ "name": "color",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ }++ },++ {++ "name": "ai_enabled",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "description": "Vibe, the assistant, answers first."++ },++ {++ "name": "ai_instructions",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ {++ "name": "knowledge_urls",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ {++ "name": "allowed_origins",++ "in": "query",++ "required": false,++ "schema": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "description": "The sites the widget answers (empty: any)."++ },++ {++ "name": "handoff",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ {++ "name": "hours",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "description": "When the people answer; null: always."++ },++ {++ "name": "route",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ {++ "name": "retention_days",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ },++ "description": "How long finished conversations stay; null: forever."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/chat/inboxes/{id}/webhooks/{hookId}/test": {++ "post": {++ "operationId": "post_api_chat_inboxes_id_webhooks_hookId_test",++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "tags": [++ "chat.inbox"++ ],++ "x-openvibe-capabilities": [++ "chat.inbox.manage"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "chat-inbox-manage",++ "security": [++ {++ "openvibeToken": [++ "chat.inbox.manage"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-request.v1"++ }++ }++ }++ },++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "hookId",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/chat.inbox-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/api/v1/resources": {"get": {"operationId": "get_api_v1_resources",@@@ -2395,6 +5320,333 @@}]},++ "chat.inbox-conversations-result.v1": {++ "title": "ChatInboxConversationsResult",++ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",++ "type": "object",++ "properties": {++ "conversations": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "status"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "status": {++ "enum": [++ "bot",++ "waiting",++ "open",++ "resolved"++ ]++ }++ }++ }++ },++ "conversation": {++ "type": [++ "object",++ "null"++ ]++ },++ "messages": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "author",++ "body"++ ],++ "properties": {++ "id": {++ "type": "integer"++ },++ "author": {++ "enum": [++ "visitor",++ "agent",++ "ai",++ "system"++ ]++ },++ "body": {++ "type": "string"++ }++ }++ }++ },++ "message": {++ "type": "object"++ },++ "replies": {++ "type": "array",++ "items": {++ "type": "object"++ }++ }++ }++ },++ "chat.inbox-reply-request.v1": {++ "title": "ChatInboxReplyRequest",++ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",++ "anyOf": [++ {++ "type": "object",++ "required": [++ "message"++ ],++ "properties": {++ "message": {++ "type": "string",++ "minLength": 1,++ "maxLength": 4000++ }++ },++ "additionalProperties": false++ },++ {++ "type": "object",++ "properties": {++ "status": {++ "enum": [++ "open",++ "resolved",++ "bot"++ ]++ },++ "assignee_id": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 1++ }++ },++ "additionalProperties": false,++ "anyOf": [++ {++ "required": [++ "status"++ ]++ },++ {++ "required": [++ "assignee_id"++ ]++ }++ ]++ },++ {++ "type": "object",++ "required": [++ "to"++ ],++ "properties": {++ "to": {++ "type": "string",++ "maxLength": 16,++ "description": "A language code (en, es, ja, …)."++ },++ "text": {++ "type": "string",++ "maxLength": 4000++ }++ },++ "additionalProperties": false++ }++ ]++ },++ "chat.inbox-request.v1": {++ "title": "ChatInboxRequest",++ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",++ "type": "object",++ "properties": {++ "name": {++ "type": "string",++ "minLength": 2,++ "maxLength": 60++ },++ "greeting": {++ "type": "string",++ "maxLength": 300,++ "description": "The first line a visitor sees."++ },++ "color": {++ "type": "string",++ "pattern": "^#[0-9a-fA-F]{6}$"++ },++ "ai_enabled": {++ "type": "boolean",++ "description": "Vibe, the assistant, answers first."++ },++ "ai_instructions": {++ "type": "string",++ "maxLength": 4000,++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."++ },++ "knowledge_urls": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 10,++ "items": {++ "type": "string",++ "maxLength": 500++ }++ },++ {++ "type": "string",++ "maxLength": 5000++ }++ ],++ "description": "https pages Vibe may read (an array, or one a line)."++ },++ "allowed_origins": {++ "anyOf": [++ {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "string",++ "maxLength": 200++ }++ },++ {++ "type": "string",++ "maxLength": 4000++ }++ ],++ "description": "The sites the widget answers (empty: any)."++ },++ "handoff": {++ "type": "boolean",++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."++ },++ "hours": {++ "type": [++ "object",++ "null"++ ],++ "properties": {++ "tz": {++ "type": "string",++ "maxLength": 64++ },++ "days": {++ "type": "array",++ "items": {++ "type": "integer",++ "minimum": 0,++ "maximum": 6++ }++ },++ "start": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ },++ "end": {++ "type": "string",++ "pattern": "^\\d{2}:\\d{2}$"++ }++ },++ "description": "When the people answer; null: always."++ },++ "route": {++ "enum": [++ "none",++ "round_robin"++ ],++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."++ },++ "retention_days": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 7,++ "maximum": 3650,++ "description": "How long finished conversations stay; null: forever."++ }++ }++ },++ "chat.inbox-result.v1": {++ "title": "ChatInboxResult",++ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",++ "type": "object",++ "properties": {++ "inbox": {++ "type": "object",++ "required": [++ "id",++ "name"++ ],++ "properties": {++ "id": {++ "type": "string",++ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "name": {++ "type": "string"++ }++ }++ },++ "inboxes": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "id",++ "name",++ "role"++ ],++ "properties": {++ "id": {++ "type": "string"++ },++ "name": {++ "type": "string"++ },++ "role": {++ "enum": [++ "owner",++ "agent"++ ]++ },++ "waiting": {++ "type": "integer"++ },++ "open": {++ "type": "integer"++ }++ }++ }++ },++ "members": {++ "type": "array",++ "items": {++ "type": "object"++ }++ },++ "embed": {++ "type": "object",++ "properties": {++ "script": {++ "type": "string"++ },++ "panel": {++ "type": "string"++ }++ }++ }++ }++ },"chat.ingress-ack.v1": {"title": "ChatIngressAck","description": "chat.ingress-ack@1: what OpenVibe.Chat's service ingress answers when there is nothing to return (POST /internal/chat/events, chat.event.publish; POST /internal/chat/invalidate, chat.cache.invalidate), and the error every /internal/chat route answers: 400 a body Chat refuses, 401/403 no service token or no grant for the capability, 403/404 a refused or unknown DM participant or stream, 409 an idempotency key reused with another body, 503 Chat unavailable or a delivery in progress (retry with the same key).",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.213.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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"@@@ -40,8 +40,8 @@"service": "chat","name": "OpenVibe.Chat","origin": "https://openvibe.chat",-- "operations": 25,-- "capabilities": 14++ "operations": 52,++ "capabilities": 17},{"service": "codes",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.213.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.213.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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"@@@ -4042,7 +4042,7 @@ export interface Capability {inputSchema?: string;outputSchema?: string;permissions: string[];-- resourceConstraints: ("namespace" | "owner" | "room_member" | "space_member" | "project" | "none")[];++ resourceConstraints: ("namespace" | "owner" | "room_member" | "space_member" | "inbox_member" | "project" | "none")[];quotaClass: string;events: string[];/**@@@ -205667,3 +205667,259 @@ export interface QuestAppQuest {updated_at: string;completions: number;}++++/** [email protected] (owner: chat) */++/**++ * chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.++ */++export interface ChatInboxRequest {++ name?: string;++ /**++ * The first line a visitor sees.++ */++ greeting?: string;++ color?: string;++ /**++ * Vibe, the assistant, answers first.++ */++ ai_enabled?: boolean;++ /**++ * What Vibe should know and how to answer (content, never rules that override Chat's).++ */++ ai_instructions?: string;++ /**++ * https pages Vibe may read (an array, or one a line).++ */++ knowledge_urls?:++ | []++ | [string]++ | [string, string]++ | [string, string, string]++ | [string, string, string, string]++ | [string, string, string, string, string]++ | [string, string, string, string, string, string]++ | [string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string, string]++ | string;++ /**++ * The sites the widget answers (empty: any).++ */++ allowed_origins?:++ | []++ | [string]++ | [string, string]++ | [string, string, string]++ | [string, string, string, string]++ | [string, string, string, string, string]++ | [string, string, string, string, string, string]++ | [string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string, string, string, string, string]++ | [string, string, string, string, string, string, string, string, string, string, string, string, string, string]++ | [++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string++ ]++ | [++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string++ ]++ | [++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string++ ]++ | [++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string++ ]++ | [++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string++ ]++ | [++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string,++ string++ ]++ | string;++ /**++ * The inbox's people answer too (false: a site assistant where only Vibe answers).++ */++ handoff?: boolean;++ /**++ * When the people answer; null: always.++ */++ hours?: {++ tz?: string;++ days?: number[];++ start?: string;++ end?: string;++ } | null;++ /**++ * round_robin: a visitor waiting for a person goes to the next of the people.++ */++ route?: "none" | "round_robin";++ /**++ * How long finished conversations stay; null: forever.++ */++ retention_days?: number | null;++}++++/** [email protected] (owner: chat) */++/**++ * chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.++ */++export interface ChatInboxResult {++ inbox?: {++ id: string;++ name: string;++ };++ inboxes?: {++ id: string;++ name: string;++ role: "owner" | "agent";++ waiting?: number;++ open?: number;++ }[];++ members?: {}[];++ embed?: {++ script?: string;++ panel?: string;++ };++}++++/** [email protected] (owner: chat) */++/**++ * chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.++ */++export type ChatInboxReplyRequest =++ | {++ message: string;++ }++ | {++ [k: string]: unknown | undefined;++ }++ | {++ /**++ * A language code (en, es, ja, …).++ */++ to: string;++ text?: string;++ };++++/** [email protected] (owner: chat) */++/**++ * chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.++ */++export interface ChatInboxConversationsResult {++ conversations?: {++ id: string;++ status: "bot" | "waiting" | "open" | "resolved";++ }[];++ conversation?: {} | null;++ messages?: {++ id: number;++ author: "visitor" | "agent" | "ai" | "system";++ body: string;++ }[];++ message?: {};++ replies?: {}[];++}nnew file mode 100644@@@ -0,0 +1,37 @@++{++ "id": "chat.inbox.manage",++ "version": "1.0",++ "owner": "chat",++ "status": "active",++ "visibility": "public",++ "sensitive": true,++ "description": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",++ "permissions": [++ "chat:inbox:manage"++ ],++ "resourceConstraints": [++ "inbox_member"++ ],++ "quotaClass": "chat-inbox-manage",++ "events": [],++ "implementedBy": [++ "POST /api/chat/inboxes",++ "PATCH /api/chat/inboxes/:id",++ "DELETE /api/chat/inboxes/:id",++ "POST /api/chat/inboxes/:id/members",++ "DELETE /api/chat/inboxes/:id/members/:userId",++ "POST /api/chat/inboxes/:id/replies",++ "DELETE /api/chat/inboxes/:id/replies/:replyId",++ "GET /api/chat/inboxes/:id/webhooks",++ "POST /api/chat/inboxes/:id/webhooks",++ "POST /api/chat/inboxes/:id/webhooks/:hookId/test",++ "DELETE /api/chat/inboxes/:id/webhooks/:hookId",++ "GET /api/chat/inboxes/:id/actions",++ "POST /api/chat/inboxes/:id/actions",++ "POST /api/chat/inboxes/:id/actions/:actionId/test",++ "DELETE /api/chat/inboxes/:id/actions/:actionId",++ "POST /api/chat/inboxes/:id/identity"++ ],++ "inputSchema": "chat.inbox-request@1",++ "outputSchema": "chat.inbox-result@1"++}nnew file mode 100644@@@ -0,0 +1,27 @@++{++ "id": "chat.inbox.read",++ "version": "1.0",++ "owner": "chat",++ "status": "active",++ "visibility": "public",++ "sensitive": true,++ "description": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",++ "permissions": [++ "chat:inbox:read"++ ],++ "resourceConstraints": [++ "inbox_member"++ ],++ "quotaClass": "chat-inbox-read",++ "events": [],++ "implementedBy": [++ "GET /api/chat/inboxes",++ "GET /api/chat/inboxes/:id",++ "GET /api/chat/inboxes/:id/conversations",++ "GET /api/chat/inboxes/:id/conversations/:cid/messages",++ "GET /api/chat/inboxes/:id/replies",++ "GET /api/chat/inboxes/:id/export"++ ],++ "inputSchema": "common.no-body@1",++ "outputSchema": "chat.inbox-conversations-result@1"++}nnew file mode 100644@@@ -0,0 +1,26 @@++{++ "id": "chat.inbox.reply",++ "version": "1.0",++ "owner": "chat",++ "status": "active",++ "visibility": "public",++ "sensitive": true,++ "description": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",++ "permissions": [++ "chat:inbox:reply"++ ],++ "resourceConstraints": [++ "inbox_member"++ ],++ "quotaClass": "chat-inbox-reply",++ "events": [],++ "implementedBy": [++ "POST /api/chat/inboxes/:id/conversations/:cid/messages",++ "PATCH /api/chat/inboxes/:id/conversations/:cid",++ "POST /api/chat/inboxes/:id/conversations/:cid/read",++ "POST /api/chat/inboxes/:id/conversations/:cid/messages/:mid/translate",++ "POST /api/chat/inboxes/:id/translate"++ ],++ "inputSchema": "chat.inbox-reply-request@1",++ "outputSchema": "chat.inbox-conversations-result@1"++}@@@ -27,7 +27,10 @@"chat.stats.read","chat.ticket.write","chat.resource.read",-- "chat.resource.control"++ "chat.resource.control",++ "chat.inbox.read",++ "chat.inbox.reply",++ "chat.inbox.manage"],"eventsProduced": ["chat.message.created",@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.213.0",++ "version": "0.214.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.213.0",++ "version": "0.214.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.213.0",++ "version": "0.214.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.214.0 — 2026-10-26
+
+- **Support inboxes open to developer apps** (the owner, 2026-10-24/25: openvibe.chat "fully modular and SDK and
+ API"). Three public, sensitive capabilities owned by `chat`, on the routes OpenVibe.Chat already serves; an app acts
+ only for the person who authorized it (`on_behalf_of`), and that person's role in the inbox decides the rest:
+ - `chat.inbox.read`: the inboxes the person works in, conversations (waiting first), messages, saved replies, and
+ the owner's export (JSON or CSV);
+ - `chat.inbox.reply`: reply, resolve, reopen, give back to Vibe, assign, mark read, translate;
+ - `chat.inbox.manage`: make an inbox, and as its owner change it (Vibe, sites, hours, routing, retention), its people,
+ saved replies, webhooks, actions and verified visitors.
+- **Schemas:** `chat.inbox-request@1`, `chat.inbox-result@1`, `chat.inbox-reply-request@1`,
+ `chat.inbox-conversations-result@1` (public), with fixtures.
+- **`capability@1`:** `resourceConstraints` may say `inbox_member`.
+
## 0.213.0 — 2026-10-25
## 0.213.0 — 2026-10-25
- **Plain names in every menu** (the owner, 2026-10-24: make the products consumer-friendly and familiar, with the
- **Plain names in every menu** (the owner, 2026-10-24: make the products consumer-friendly and familiar, with the
@@ -16,7 +16,7 @@
@@ -16,7 +16,7 @@
"inputSchema": { "type": "string" },
"inputSchema": { "type": "string" },
"outputSchema": { "type": "string" },
"outputSchema": { "type": "string" },
"permissions": { "type": "array", "items": { "type": "string" } },
"permissions": { "type": "array", "items": { "type": "string" } },
- "resourceConstraints": { "type": "array", "items": { "enum": ["namespace", "owner", "room_member", "space_member", "project", "none"] } },
+ "resourceConstraints": { "type": "array", "items": { "enum": ["namespace", "owner", "room_member", "space_member", "inbox_member", "project", "none"] } },
"quotaClass": { "type": "string" },
"quotaClass": { "type": "string" },
"events": { "type": "array", "items": { "type": "string" } },
"events": { "type": "array", "items": { "type": "string" } },
"implementedBy": { "type": "array", "items": { "type": "string" }, "description": "Current route(s) that perform this action today, e.g. 'POST /api/v1/:app/files'." },
"implementedBy": { "type": "array", "items": { "type": "string" }, "description": "Current route(s) that perform this action today, e.g. 'POST /api/v1/:app/files'." },
@@ -7413,6 +7413,42 @@
@@ -7413,6 +7413,42 @@
"visibility": "public",
"visibility": "public",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
+ },
+ {
+ "id": "chat.inbox-request",
+ "version": "1.0.0",
+ "owner": "chat",
+ "schema": "chat/inbox-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "chat.inbox-result",
+ "version": "1.0.0",
+ "owner": "chat",
+ "schema": "chat/inbox-result.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "chat.inbox-reply-request",
+ "version": "1.0.0",
+ "owner": "chat",
+ "schema": "chat/inbox-reply-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "chat.inbox-conversations-result",
+ "version": "1.0.0",
+ "owner": "chat",
+ "schema": "chat/inbox-conversations-result.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-conversations-result.v1.json",
+ "title": "ChatInboxConversationsResult",
+ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",
+ "type": "object",
+ "properties": {
+ "conversations": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "status"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "status": {
+ "enum": [
+ "bot",
+ "waiting",
+ "open",
+ "resolved"
+ ]
+ }
+ }
+ }
+ },
+ "conversation": {
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "author",
+ "body"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "author": {
+ "enum": [
+ "visitor",
+ "agent",
+ "ai",
+ "system"
+ ]
+ },
+ "body": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object"
+ },
+ "replies": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,72 @@
@@ -0,0 +1,72 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-reply-request.v1.json",
+ "title": "ChatInboxReplyRequest",
+ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 4000
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "status": {
+ "enum": [
+ "open",
+ "resolved",
+ "bot"
+ ]
+ },
+ "assignee_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 1
+ }
+ },
+ "additionalProperties": false,
+ "anyOf": [
+ {
+ "required": [
+ "status"
+ ]
+ },
+ {
+ "required": [
+ "assignee_id"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "object",
+ "required": [
+ "to"
+ ],
+ "properties": {
+ "to": {
+ "type": "string",
+ "maxLength": 16,
+ "description": "A language code (en, es, ja, …)."
+ },
+ "text": {
+ "type": "string",
+ "maxLength": 4000
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,115 @@
@@ -0,0 +1,115 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-request.v1.json",
+ "title": "ChatInboxRequest",
+ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ },
+ "greeting": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ },
+ "ai_enabled": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "ai_instructions": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "knowledge_urls": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "allowed_origins": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "handoff": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "hours": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "route": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "retention_days": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-result.v1.json",
+ "title": "ChatInboxResult",
+ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",
+ "type": "object",
+ "properties": {
+ "inbox": {
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "inboxes": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "role"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "role": {
+ "enum": [
+ "owner",
+ "agent"
+ ]
+ },
+ "waiting": {
+ "type": "integer"
+ },
+ "open": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "members": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ },
+ "embed": {
+ "type": "object",
+ "properties": {
+ "script": {
+ "type": "string"
+ },
+ "panel": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "messages": [
+ {
+ "id": 1,
+ "author": "robot",
+ "body": "hi"
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
+{
+ "conversation": {
+ "id": "cnv_01J9ZQ3M5K8V2R4T6Y8W0X2C4C",
+ "status": "open"
+ },
+ "messages": [
+ {
+ "id": 1,
+ "author": "visitor",
+ "author_name": "Dana",
+ "body": "My lamp arrived cracked",
+ "created_at": "2026-10-25 02:00:00"
+ },
+ {
+ "id": 2,
+ "author": "agent",
+ "author_name": "Ann",
+ "body": "Sorry! A new shade ships today.",
+ "created_at": "2026-10-25 02:01:00"
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
+{
+ "conversations": [
+ {
+ "id": "cnv_01J9ZQ3M5K8V2R4T6Y8W0X2C4C",
+ "status": "waiting",
+ "visitor_name": "Dana",
+ "verified": true,
+ "preview": "My lamp arrived cracked",
+ "agent_unread": 1
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "message": ""
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "status": "closed"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "message": "Hi! Your order ships today."
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "status": "resolved",
+ "assignee_id": 42
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "to": "es",
+ "text": "Your order ships today."
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "color": "orange"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "retention_days": 3
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
+{
+ "hours": {
+ "tz": "America/Los_Angeles",
+ "days": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "start": "09:00",
+ "end": "17:00"
+ },
+ "route": "round_robin",
+ "retention_days": 90
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
+{
+ "name": "Pixel Lamp Co.",
+ "greeting": "Questions about your lamp? Ask away.",
+ "color": "#7c5cff",
+ "ai_enabled": true,
+ "ai_instructions": "We sell smart lamps.",
+ "knowledge_urls": [
+ "https://pixellamp.example/faq"
+ ],
+ "allowed_origins": [
+ "https://pixellamp.example"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "inboxes": [
+ {
+ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",
+ "name": "x",
+ "role": "boss"
+ }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "inbox": {
+ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",
+ "name": "Pixel Lamp Co."
+ },
+ "embed": {
+ "script": "<script src=\"https://openvibe.chat/widget.js\" data-inbox=\"inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B\" async></script>",
+ "panel": "https://openvibe.chat/embed/inbox/inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B"
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
+{
+ "inboxes": [
+ {
+ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",
+ "name": "Pixel Lamp Co.",
+ "role": "owner",
+ "waiting": 2,
+ "open": 5
+ }
+ ]
+}
@@ -1699,6 +1699,7 @@
@@ -1699,6 +1699,7 @@
"owner",
"owner",
"room_member",
"room_member",
"space_member",
"space_member",
+ "inbox_member",
"project",
"project",
"none"
"none"
]
]
@@ -82803,6 +82804,361 @@
@@ -82803,6 +82804,361 @@
}
}
}
}
}
}
+ },
+ "chat.inbox-request": {
+ "version": "1.0.0",
+ "owner": "chat",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-request.v1.json",
+ "title": "ChatInboxRequest",
+ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ },
+ "greeting": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ },
+ "ai_enabled": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "ai_instructions": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "knowledge_urls": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "allowed_origins": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "handoff": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "hours": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "route": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "retention_days": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ }
+ }
+ }
+ },
+ "chat.inbox-result": {
+ "version": "1.0.0",
+ "owner": "chat",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-result.v1.json",
+ "title": "ChatInboxResult",
+ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",
+ "type": "object",
+ "properties": {
+ "inbox": {
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "inboxes": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "role"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "role": {
+ "enum": [
+ "owner",
+ "agent"
+ ]
+ },
+ "waiting": {
+ "type": "integer"
+ },
+ "open": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "members": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ },
+ "embed": {
+ "type": "object",
+ "properties": {
+ "script": {
+ "type": "string"
+ },
+ "panel": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "chat.inbox-reply-request": {
+ "version": "1.0.0",
+ "owner": "chat",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-reply-request.v1.json",
+ "title": "ChatInboxReplyRequest",
+ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 4000
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "status": {
+ "enum": [
+ "open",
+ "resolved",
+ "bot"
+ ]
+ },
+ "assignee_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 1
+ }
+ },
+ "additionalProperties": false,
+ "anyOf": [
+ {
+ "required": [
+ "status"
+ ]
+ },
+ {
+ "required": [
+ "assignee_id"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "object",
+ "required": [
+ "to"
+ ],
+ "properties": {
+ "to": {
+ "type": "string",
+ "maxLength": 16,
+ "description": "A language code (en, es, ja, …)."
+ },
+ "text": {
+ "type": "string",
+ "maxLength": 4000
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ }
+ },
+ "chat.inbox-conversations-result": {
+ "version": "1.0.0",
+ "owner": "chat",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/chat/inbox-conversations-result.v1.json",
+ "title": "ChatInboxConversationsResult",
+ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",
+ "type": "object",
+ "properties": {
+ "conversations": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "status"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "status": {
+ "enum": [
+ "bot",
+ "waiting",
+ "open",
+ "resolved"
+ ]
+ }
+ }
+ }
+ },
+ "conversation": {
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "author",
+ "body"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "author": {
+ "enum": [
+ "visitor",
+ "agent",
+ "ai",
+ "system"
+ ]
+ },
+ "body": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object"
+ },
+ "replies": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ }
+ }
+ }
}
}
}
}
}
}
@@ -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.213.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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"
@@ -16,6 +16,2931 @@
@@ -16,6 +16,2931 @@
}
}
],
],
"paths": {
"paths": {
+ "/api/chat/inboxes": {
+ "get": {
+ "operationId": "get_api_chat_inboxes",
+ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
+ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.read"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_chat_inboxes",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}": {
+ "delete": {
+ "operationId": "delete_api_chat_inboxes_id",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ }
+ },
+ {
+ "name": "greeting",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "description": "The first line a visitor sees."
+ },
+ {
+ "name": "color",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ {
+ "name": "ai_enabled",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "description": "Vibe, the assistant, answers first."
+ },
+ {
+ "name": "ai_instructions",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ {
+ "name": "knowledge_urls",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ {
+ "name": "allowed_origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "description": "The sites the widget answers (empty: any)."
+ },
+ {
+ "name": "handoff",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ {
+ "name": "hours",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "description": "When the people answer; null: always."
+ },
+ {
+ "name": "route",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ {
+ "name": "retention_days",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ },
+ "description": "How long finished conversations stay; null: forever."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "get_api_chat_inboxes_id",
+ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
+ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "operationId": "patch_api_chat_inboxes_id",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/actions": {
+ "get": {
+ "operationId": "get_api_chat_inboxes_id_actions",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ }
+ },
+ {
+ "name": "greeting",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "description": "The first line a visitor sees."
+ },
+ {
+ "name": "color",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ {
+ "name": "ai_enabled",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "description": "Vibe, the assistant, answers first."
+ },
+ {
+ "name": "ai_instructions",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ {
+ "name": "knowledge_urls",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ {
+ "name": "allowed_origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "description": "The sites the widget answers (empty: any)."
+ },
+ {
+ "name": "handoff",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ {
+ "name": "hours",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "description": "When the people answer; null: always."
+ },
+ {
+ "name": "route",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ {
+ "name": "retention_days",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ },
+ "description": "How long finished conversations stay; null: forever."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_actions",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/actions/{actionId}": {
+ "delete": {
+ "operationId": "delete_api_chat_inboxes_id_actions_actionId",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "actionId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ }
+ },
+ {
+ "name": "greeting",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "description": "The first line a visitor sees."
+ },
+ {
+ "name": "color",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ {
+ "name": "ai_enabled",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "description": "Vibe, the assistant, answers first."
+ },
+ {
+ "name": "ai_instructions",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ {
+ "name": "knowledge_urls",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ {
+ "name": "allowed_origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "description": "The sites the widget answers (empty: any)."
+ },
+ {
+ "name": "handoff",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ {
+ "name": "hours",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "description": "When the people answer; null: always."
+ },
+ {
+ "name": "route",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ {
+ "name": "retention_days",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ },
+ "description": "How long finished conversations stay; null: forever."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/actions/{actionId}/test": {
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_actions_actionId_test",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "actionId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/conversations": {
+ "get": {
+ "operationId": "get_api_chat_inboxes_id_conversations",
+ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
+ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/conversations/{cid}": {
+ "patch": {
+ "operationId": "patch_api_chat_inboxes_id_conversations_cid",
+ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
+ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.reply"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-reply",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.reply"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "cid",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/conversations/{cid}/messages": {
+ "get": {
+ "operationId": "get_api_chat_inboxes_id_conversations_cid_messages",
+ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
+ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "cid",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_conversations_cid_messages",
+ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
+ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.reply"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-reply",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.reply"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "cid",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/conversations/{cid}/messages/{mid}/translate": {
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_conversations_cid_messages_mid_translate",
+ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
+ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.reply"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-reply",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.reply"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "cid",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "mid",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/conversations/{cid}/read": {
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_conversations_cid_read",
+ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
+ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.reply"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-reply",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.reply"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "cid",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/export": {
+ "get": {
+ "operationId": "get_api_chat_inboxes_id_export",
+ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
+ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/identity": {
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_identity",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/members": {
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_members",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/members/{userId}": {
+ "delete": {
+ "operationId": "delete_api_chat_inboxes_id_members_userId",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "userId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ }
+ },
+ {
+ "name": "greeting",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "description": "The first line a visitor sees."
+ },
+ {
+ "name": "color",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ {
+ "name": "ai_enabled",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "description": "Vibe, the assistant, answers first."
+ },
+ {
+ "name": "ai_instructions",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ {
+ "name": "knowledge_urls",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ {
+ "name": "allowed_origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "description": "The sites the widget answers (empty: any)."
+ },
+ {
+ "name": "handoff",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ {
+ "name": "hours",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "description": "When the people answer; null: always."
+ },
+ {
+ "name": "route",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ {
+ "name": "retention_days",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ },
+ "description": "How long finished conversations stay; null: forever."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/replies": {
+ "get": {
+ "operationId": "get_api_chat_inboxes_id_replies",
+ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
+ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_replies",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/replies/{replyId}": {
+ "delete": {
+ "operationId": "delete_api_chat_inboxes_id_replies_replyId",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "replyId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ }
+ },
+ {
+ "name": "greeting",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "description": "The first line a visitor sees."
+ },
+ {
+ "name": "color",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ {
+ "name": "ai_enabled",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "description": "Vibe, the assistant, answers first."
+ },
+ {
+ "name": "ai_instructions",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ {
+ "name": "knowledge_urls",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ {
+ "name": "allowed_origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "description": "The sites the widget answers (empty: any)."
+ },
+ {
+ "name": "handoff",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ {
+ "name": "hours",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "description": "When the people answer; null: always."
+ },
+ {
+ "name": "route",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ {
+ "name": "retention_days",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ },
+ "description": "How long finished conversations stay; null: forever."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/translate": {
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_translate",
+ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
+ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.reply"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-reply",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.reply"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/webhooks": {
+ "get": {
+ "operationId": "get_api_chat_inboxes_id_webhooks",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ }
+ },
+ {
+ "name": "greeting",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "description": "The first line a visitor sees."
+ },
+ {
+ "name": "color",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ {
+ "name": "ai_enabled",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "description": "Vibe, the assistant, answers first."
+ },
+ {
+ "name": "ai_instructions",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ {
+ "name": "knowledge_urls",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ {
+ "name": "allowed_origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "description": "The sites the widget answers (empty: any)."
+ },
+ {
+ "name": "handoff",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ {
+ "name": "hours",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "description": "When the people answer; null: always."
+ },
+ {
+ "name": "route",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ {
+ "name": "retention_days",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ },
+ "description": "How long finished conversations stay; null: forever."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_webhooks",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/webhooks/{hookId}": {
+ "delete": {
+ "operationId": "delete_api_chat_inboxes_id_webhooks_hookId",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "hookId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "name",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ }
+ },
+ {
+ "name": "greeting",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "description": "The first line a visitor sees."
+ },
+ {
+ "name": "color",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ }
+ },
+ {
+ "name": "ai_enabled",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "description": "Vibe, the assistant, answers first."
+ },
+ {
+ "name": "ai_instructions",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ {
+ "name": "knowledge_urls",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ {
+ "name": "allowed_origins",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "description": "The sites the widget answers (empty: any)."
+ },
+ {
+ "name": "handoff",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ {
+ "name": "hours",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "description": "When the people answer; null: always."
+ },
+ {
+ "name": "route",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ {
+ "name": "retention_days",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ },
+ "description": "How long finished conversations stay; null: forever."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/chat/inboxes/{id}/webhooks/{hookId}/test": {
+ "post": {
+ "operationId": "post_api_chat_inboxes_id_webhooks_hookId_test",
+ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
+ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "tags": [
+ "chat.inbox"
+ ],
+ "x-openvibe-capabilities": [
+ "chat.inbox.manage"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "chat-inbox-manage",
+ "security": [
+ {
+ "openvibeToken": [
+ "chat.inbox.manage"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-request.v1"
+ }
+ }
+ }
+ },
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "hookId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/chat.inbox-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/api/v1/resources": {
"/api/v1/resources": {
"get": {
"get": {
"operationId": "get_api_v1_resources",
"operationId": "get_api_v1_resources",
@@ -2395,6 +5320,333 @@
@@ -2395,6 +5320,333 @@
}
}
]
]
},
},
+ "chat.inbox-conversations-result.v1": {
+ "title": "ChatInboxConversationsResult",
+ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",
+ "type": "object",
+ "properties": {
+ "conversations": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "status"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "status": {
+ "enum": [
+ "bot",
+ "waiting",
+ "open",
+ "resolved"
+ ]
+ }
+ }
+ }
+ },
+ "conversation": {
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "author",
+ "body"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "author": {
+ "enum": [
+ "visitor",
+ "agent",
+ "ai",
+ "system"
+ ]
+ },
+ "body": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "message": {
+ "type": "object"
+ },
+ "replies": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ }
+ }
+ },
+ "chat.inbox-reply-request.v1": {
+ "title": "ChatInboxReplyRequest",
+ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "message": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 4000
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "status": {
+ "enum": [
+ "open",
+ "resolved",
+ "bot"
+ ]
+ },
+ "assignee_id": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 1
+ }
+ },
+ "additionalProperties": false,
+ "anyOf": [
+ {
+ "required": [
+ "status"
+ ]
+ },
+ {
+ "required": [
+ "assignee_id"
+ ]
+ }
+ ]
+ },
+ {
+ "type": "object",
+ "required": [
+ "to"
+ ],
+ "properties": {
+ "to": {
+ "type": "string",
+ "maxLength": 16,
+ "description": "A language code (en, es, ja, …)."
+ },
+ "text": {
+ "type": "string",
+ "maxLength": 4000
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ },
+ "chat.inbox-request.v1": {
+ "title": "ChatInboxRequest",
+ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 60
+ },
+ "greeting": {
+ "type": "string",
+ "maxLength": 300,
+ "description": "The first line a visitor sees."
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^#[0-9a-fA-F]{6}$"
+ },
+ "ai_enabled": {
+ "type": "boolean",
+ "description": "Vibe, the assistant, answers first."
+ },
+ "ai_instructions": {
+ "type": "string",
+ "maxLength": 4000,
+ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
+ },
+ "knowledge_urls": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 10,
+ "items": {
+ "type": "string",
+ "maxLength": 500
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 5000
+ }
+ ],
+ "description": "https pages Vibe may read (an array, or one a line)."
+ },
+ "allowed_origins": {
+ "anyOf": [
+ {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ {
+ "type": "string",
+ "maxLength": 4000
+ }
+ ],
+ "description": "The sites the widget answers (empty: any)."
+ },
+ "handoff": {
+ "type": "boolean",
+ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
+ },
+ "hours": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "tz": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "days": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 6
+ }
+ },
+ "start": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ },
+ "end": {
+ "type": "string",
+ "pattern": "^\\d{2}:\\d{2}$"
+ }
+ },
+ "description": "When the people answer; null: always."
+ },
+ "route": {
+ "enum": [
+ "none",
+ "round_robin"
+ ],
+ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
+ },
+ "retention_days": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 7,
+ "maximum": 3650,
+ "description": "How long finished conversations stay; null: forever."
+ }
+ }
+ },
+ "chat.inbox-result.v1": {
+ "title": "ChatInboxResult",
+ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",
+ "type": "object",
+ "properties": {
+ "inbox": {
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "inboxes": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "role"
+ ],
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "role": {
+ "enum": [
+ "owner",
+ "agent"
+ ]
+ },
+ "waiting": {
+ "type": "integer"
+ },
+ "open": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "members": {
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ },
+ "embed": {
+ "type": "object",
+ "properties": {
+ "script": {
+ "type": "string"
+ },
+ "panel": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
"chat.ingress-ack.v1": {
"chat.ingress-ack.v1": {
"title": "ChatIngressAck",
"title": "ChatIngressAck",
"description": "chat.ingress-ack@1: what OpenVibe.Chat's service ingress answers when there is nothing to return (POST /internal/chat/events, chat.event.publish; POST /internal/chat/invalidate, chat.cache.invalidate), and the error every /internal/chat route answers: 400 a body Chat refuses, 401/403 no service token or no grant for the capability, 403/404 a refused or unknown DM participant or stream, 409 an idempotency key reused with another body, 503 Chat unavailable or a delivery in progress (retry with the same key).",
"description": "chat.ingress-ack@1: what OpenVibe.Chat's service ingress answers when there is nothing to return (POST /internal/chat/events, chat.event.publish; POST /internal/chat/invalidate, chat.cache.invalidate), and the error every /internal/chat route answers: 400 a body Chat refuses, 401/403 no service token or no grant for the capability, 403/404 a refused or unknown DM participant or stream, 409 an idempotency key reused with another body, 503 Chat unavailable or a delivery in progress (retry with the same key).",
@@ -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.213.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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"
@@ -40,8 +40,8 @@
@@ -40,8 +40,8 @@
"service": "chat",
"service": "chat",
"name": "OpenVibe.Chat",
"name": "OpenVibe.Chat",
"origin": "https://openvibe.chat",
"origin": "https://openvibe.chat",
- "operations": 25,
- "capabilities": 14
+ "operations": 52,
+ "capabilities": 17
},
},
{
{
"service": "codes",
"service": "codes",
@@ -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.213.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.213.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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.213.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for 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.214.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for 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"
@@ -4042,7 +4042,7 @@ export interface Capability {
@@ -4042,7 +4042,7 @@ export interface Capability {
inputSchema?: string;
inputSchema?: string;
outputSchema?: string;
outputSchema?: string;
permissions: string[];
permissions: string[];
- resourceConstraints: ("namespace" | "owner" | "room_member" | "space_member" | "project" | "none")[];
+ resourceConstraints: ("namespace" | "owner" | "room_member" | "space_member" | "inbox_member" | "project" | "none")[];
quotaClass: string;
quotaClass: string;
events: string[];
events: string[];
/**
/**
@@ -205667,3 +205667,259 @@ export interface QuestAppQuest {
@@ -205667,3 +205667,259 @@ export interface QuestAppQuest {
updated_at: string;
updated_at: string;
completions: number;
completions: number;
}
}
+
+/** [email protected] (owner: chat) */
+/**
+ * chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.
+ */
+export interface ChatInboxRequest {
+ name?: string;
+ /**
+ * The first line a visitor sees.
+ */
+ greeting?: string;
+ color?: string;
+ /**
+ * Vibe, the assistant, answers first.
+ */
+ ai_enabled?: boolean;
+ /**
+ * What Vibe should know and how to answer (content, never rules that override Chat's).
+ */
+ ai_instructions?: string;
+ /**
+ * https pages Vibe may read (an array, or one a line).
+ */
+ knowledge_urls?:
+ | []
+ | [string]
+ | [string, string]
+ | [string, string, string]
+ | [string, string, string, string]
+ | [string, string, string, string, string]
+ | [string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string, string]
+ | string;
+ /**
+ * The sites the widget answers (empty: any).
+ */
+ allowed_origins?:
+ | []
+ | [string]
+ | [string, string]
+ | [string, string, string]
+ | [string, string, string, string]
+ | [string, string, string, string, string]
+ | [string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string, string, string, string, string]
+ | [string, string, string, string, string, string, string, string, string, string, string, string, string, string]
+ | [
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string
+ ]
+ | [
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string
+ ]
+ | [
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string
+ ]
+ | [
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string
+ ]
+ | [
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string
+ ]
+ | [
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string,
+ string
+ ]
+ | string;
+ /**
+ * The inbox's people answer too (false: a site assistant where only Vibe answers).
+ */
+ handoff?: boolean;
+ /**
+ * When the people answer; null: always.
+ */
+ hours?: {
+ tz?: string;
+ days?: number[];
+ start?: string;
+ end?: string;
+ } | null;
+ /**
+ * round_robin: a visitor waiting for a person goes to the next of the people.
+ */
+ route?: "none" | "round_robin";
+ /**
+ * How long finished conversations stay; null: forever.
+ */
+ retention_days?: number | null;
+}
+
+/** [email protected] (owner: chat) */
+/**
+ * chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.
+ */
+export interface ChatInboxResult {
+ inbox?: {
+ id: string;
+ name: string;
+ };
+ inboxes?: {
+ id: string;
+ name: string;
+ role: "owner" | "agent";
+ waiting?: number;
+ open?: number;
+ }[];
+ members?: {}[];
+ embed?: {
+ script?: string;
+ panel?: string;
+ };
+}
+
+/** [email protected] (owner: chat) */
+/**
+ * chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.
+ */
+export type ChatInboxReplyRequest =
+ | {
+ message: string;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ /**
+ * A language code (en, es, ja, …).
+ */
+ to: string;
+ text?: string;
+ };
+
+/** [email protected] (owner: chat) */
+/**
+ * chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.
+ */
+export interface ChatInboxConversationsResult {
+ conversations?: {
+ id: string;
+ status: "bot" | "waiting" | "open" | "resolved";
+ }[];
+ conversation?: {} | null;
+ messages?: {
+ id: number;
+ author: "visitor" | "agent" | "ai" | "system";
+ body: string;
+ }[];
+ message?: {};
+ replies?: {}[];
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,37 @@
@@ -0,0 +1,37 @@
+{
+ "id": "chat.inbox.manage",
+ "version": "1.0",
+ "owner": "chat",
+ "status": "active",
+ "visibility": "public",
+ "sensitive": true,
+ "description": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
+ "permissions": [
+ "chat:inbox:manage"
+ ],
+ "resourceConstraints": [
+ "inbox_member"
+ ],
+ "quotaClass": "chat-inbox-manage",
+ "events": [],
+ "implementedBy": [
+ "POST /api/chat/inboxes",
+ "PATCH /api/chat/inboxes/:id",
+ "DELETE /api/chat/inboxes/:id",
+ "POST /api/chat/inboxes/:id/members",
+ "DELETE /api/chat/inboxes/:id/members/:userId",
+ "POST /api/chat/inboxes/:id/replies",
+ "DELETE /api/chat/inboxes/:id/replies/:replyId",
+ "GET /api/chat/inboxes/:id/webhooks",
+ "POST /api/chat/inboxes/:id/webhooks",
+ "POST /api/chat/inboxes/:id/webhooks/:hookId/test",
+ "DELETE /api/chat/inboxes/:id/webhooks/:hookId",
+ "GET /api/chat/inboxes/:id/actions",
+ "POST /api/chat/inboxes/:id/actions",
+ "POST /api/chat/inboxes/:id/actions/:actionId/test",
+ "DELETE /api/chat/inboxes/:id/actions/:actionId",
+ "POST /api/chat/inboxes/:id/identity"
+ ],
+ "inputSchema": "chat.inbox-request@1",
+ "outputSchema": "chat.inbox-result@1"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
+{
+ "id": "chat.inbox.read",
+ "version": "1.0",
+ "owner": "chat",
+ "status": "active",
+ "visibility": "public",
+ "sensitive": true,
+ "description": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
+ "permissions": [
+ "chat:inbox:read"
+ ],
+ "resourceConstraints": [
+ "inbox_member"
+ ],
+ "quotaClass": "chat-inbox-read",
+ "events": [],
+ "implementedBy": [
+ "GET /api/chat/inboxes",
+ "GET /api/chat/inboxes/:id",
+ "GET /api/chat/inboxes/:id/conversations",
+ "GET /api/chat/inboxes/:id/conversations/:cid/messages",
+ "GET /api/chat/inboxes/:id/replies",
+ "GET /api/chat/inboxes/:id/export"
+ ],
+ "inputSchema": "common.no-body@1",
+ "outputSchema": "chat.inbox-conversations-result@1"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
+{
+ "id": "chat.inbox.reply",
+ "version": "1.0",
+ "owner": "chat",
+ "status": "active",
+ "visibility": "public",
+ "sensitive": true,
+ "description": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
+ "permissions": [
+ "chat:inbox:reply"
+ ],
+ "resourceConstraints": [
+ "inbox_member"
+ ],
+ "quotaClass": "chat-inbox-reply",
+ "events": [],
+ "implementedBy": [
+ "POST /api/chat/inboxes/:id/conversations/:cid/messages",
+ "PATCH /api/chat/inboxes/:id/conversations/:cid",
+ "POST /api/chat/inboxes/:id/conversations/:cid/read",
+ "POST /api/chat/inboxes/:id/conversations/:cid/messages/:mid/translate",
+ "POST /api/chat/inboxes/:id/translate"
+ ],
+ "inputSchema": "chat.inbox-reply-request@1",
+ "outputSchema": "chat.inbox-conversations-result@1"
+}
@@ -27,7 +27,10 @@
@@ -27,7 +27,10 @@
"chat.stats.read",
"chat.stats.read",
"chat.ticket.write",
"chat.ticket.write",
"chat.resource.read",
"chat.resource.read",
- "chat.resource.control"
+ "chat.resource.control",
+ "chat.inbox.read",
+ "chat.inbox.reply",
+ "chat.inbox.manage"
],
],
"eventsProduced": [
"eventsProduced": [
"chat.message.created",
"chat.message.created",
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.213.0",
+ "version": "0.214.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.213.0",
+ "version": "0.214.0",
"license": "AGPL-3.0-only",
"license": "AGPL-3.0-only",
"dependencies": {
"dependencies": {
"ajv": "^8.17.1",
"ajv": "^8.17.1",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.213.0",
+ "version": "0.214.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",