openvibers/openvibe.contracts Commits
Contracts 0.330.0: OpenVibe.Email, its two capabilities and a place after Chat (#338)
Changes
@@@ -1,5 +1,12 @@# Changelog++## 0.330.0 — 2026-11-07++++- Add the `mail` service manifest: `openvibe.email` as the site **Email** (icon `mail`, the shared glyph font's E054), tagline "An address for every sign-up", the receive-only wording, legal profile `service`, and position 7, directly after Chat. It declares exposure `live`/`service`, port 5250, database `ov_mail`, the Stalwart mail server, `/api/health` and `/api/ready`, its shutdown and due-based recovery, an expand-only rollback, and the purge lease.++- Add the two capabilities OpenVibe.Mail's API already checks: `mail.addresses.write` (make and retire a mask; make an agent inbox) and `mail.messages.read` (the person's addresses, message metadata and the newest burner code, never a body). Both are first-party, `owner`-constrained, and name their routes. Their request and result schemas are recorded in `compatibility/capability-schema-gaps.json` for now, like the config.manage capabilities added in 0.315.0.++- The manifest lists no `eventsProduced` yet: the service publishes `mail.mask.created` and `mail.received`, but their payload contracts are not in this release.++- Sites from the old position 7 up move one place (Services becomes 8, … Connect becomes 52) so Email sits beside Chat without breaking the unique-position rule. No contract changes shape; the only data change is the site order.++## 0.329.0 — 2026-11-07- Add `mail.mask@1`: a per-site address on OpenVibe.Mail that delivers into its owner's OpenVibe mailbox and nowhere else. It carries the `msk_…` id, the owner's Network subject, the `<words>.<four characters>@<mask domain>` address, the person's label and purpose, whether it is enabled (a disabled mask leaves the SQL directory Stalwart reads, so it bounces) and when it was made. M1 is receive-only, so this is metadata: no body, no forwarding target.@@@ -49,6 +49,20 @@"inputSchema","outputSchema"]++ },++ {++ "id": "mail.addresses.write",++ "missing": [++ "inputSchema",++ "outputSchema"++ ]++ },++ {++ "id": "mail.messages.read",++ "missing": [++ "inputSchema",++ "outputSchema"++ ]}]}@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Bench API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 Connect API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Design API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Domains API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"@@@ -141,6 +141,13 @@"operations": 47,"capabilities": 12},++ {++ "service": "mail",++ "name": "OpenVibe.Mail",++ "origin": "https://openvibe.email",++ "operations": 12,++ "capabilities": 2++ },{"service": "media","name": "OpenVibe.Media",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"nnew file mode 100644@@@ -0,0 +1,620 @@++{++ "openapi": "3.1.0",++ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",++ "info": {++ "title": "OpenVibe.Mail API",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"++ }++ },++ "servers": [++ {++ "url": "https://openvibe.email"++ }++ ],++ "paths": {++ "/api/v1/agent-inboxes": {++ "get": {++ "operationId": "get_api_v1_agent_inboxes",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_v1_agent_inboxes",++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",++ "tags": [++ "mail.addresses"++ ],++ "x-openvibe-capabilities": [++ "mail.addresses.write"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-addresses-write",++ "security": [++ {++ "openvibeToken": [++ "mail.addresses.write"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/agent-inboxes/{id}/messages": {++ "get": {++ "operationId": "get_api_v1_agent_inboxes_id_messages",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/burners": {++ "get": {++ "operationId": "get_api_v1_burners",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/burners/{id}/code": {++ "get": {++ "operationId": "get_api_v1_burners_id_code",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/burners/{id}/messages": {++ "get": {++ "operationId": "get_api_v1_burners_id_messages",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/masks": {++ "get": {++ "operationId": "get_api_v1_masks",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_v1_masks",++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",++ "tags": [++ "mail.addresses"++ ],++ "x-openvibe-capabilities": [++ "mail.addresses.write"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-addresses-write",++ "security": [++ {++ "openvibeToken": [++ "mail.addresses.write"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/masks/{id}": {++ "delete": {++ "operationId": "delete_api_v1_masks_id",++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",++ "tags": [++ "mail.addresses"++ ],++ "x-openvibe-capabilities": [++ "mail.addresses.write"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-addresses-write",++ "security": [++ {++ "openvibeToken": [++ "mail.addresses.write"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "get": {++ "operationId": "get_api_v1_masks_id",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/masks/{id}/disable": {++ "post": {++ "operationId": "post_api_v1_masks_id_disable",++ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",++ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",++ "tags": [++ "mail.addresses"++ ],++ "x-openvibe-capabilities": [++ "mail.addresses.write"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-addresses-write",++ "security": [++ {++ "openvibeToken": [++ "mail.addresses.write"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/me/mail": {++ "get": {++ "operationId": "get_api_v1_me_mail",++ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",++ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "tags": [++ "mail.messages"++ ],++ "x-openvibe-capabilities": [++ "mail.messages.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "mail-messages-read",++ "security": [++ {++ "openvibeToken": [++ "mail.messages.read"++ ]++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success"++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ }++ },++ "components": {++ "schemas": {++ "errors.problem.v1": {++ "title": "Problem",++ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",++ "type": "object",++ "required": [++ "type",++ "title",++ "status",++ "code"++ ],++ "additionalProperties": true,++ "properties": {++ "type": {++ "type": "string",++ "format": "uri-reference"++ },++ "title": {++ "type": "string",++ "minLength": 1++ },++ "status": {++ "type": "integer",++ "minimum": 400,++ "maximum": 599++ },++ "detail": {++ "type": "string"++ },++ "instance": {++ "type": "string",++ "format": "uri-reference"++ },++ "code": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"++ },++ "request_id": {++ "type": "string"++ },++ "trace_id": {++ "type": "string",++ "pattern": "^[0-9a-f]{32}$"++ },++ "errors": {++ "type": "array",++ "items": {++ "type": "object",++ "required": [++ "message"++ ],++ "properties": {++ "path": {++ "type": "string"++ },++ "message": {++ "type": "string"++ }++ }++ }++ },++ "error": {++ "type": "string",++ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."++ }++ }++ }++ },++ "securitySchemes": {++ "openvibeToken": {++ "type": "http",++ "scheme": "bearer",++ "bearerFormat": "JWT",++ "description": "An OpenVibe Network token for this service: a person's token, an app token (client credentials, audience of the service) or a first-party service token. Its `cap` claim must include the capability the operation names."++ }++ }++ }++}@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Report API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Today API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Vision API",-- "version": "0.329.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.330.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"nnew file mode 100644@@@ -0,0 +1,25 @@++{++ "id": "mail.addresses.write",++ "version": "1.0",++ "owner": "mail",++ "status": "active",++ "visibility": "first-party",++ "sensitive": true,++ "description": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",++ "permissions": [++ "mail:addresses:write"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "mail-addresses-write",++ "events": [++ "mail.mask.created"++ ],++ "implementedBy": [++ "POST /api/v1/masks",++ "POST /api/v1/masks/:id/disable",++ "DELETE /api/v1/masks/:id",++ "POST /api/v1/agent-inboxes"++ ]++}nnew file mode 100644@@@ -0,0 +1,29 @@++{++ "id": "mail.messages.read",++ "version": "1.0",++ "owner": "mail",++ "status": "active",++ "visibility": "first-party",++ "sensitive": true,++ "description": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",++ "permissions": [++ "mail:messages:read"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "mail-messages-read",++ "events": [++ "mail.received"++ ],++ "implementedBy": [++ "GET /api/v1/me/mail",++ "GET /api/v1/masks",++ "GET /api/v1/masks/:id",++ "GET /api/v1/burners",++ "GET /api/v1/burners/:id/messages",++ "GET /api/v1/burners/:id/code",++ "GET /api/v1/agent-inboxes",++ "GET /api/v1/agent-inboxes/:id/messages"++ ]++}@@@ -103,7 +103,7 @@"tagline": "Agents that work while you are away","what": "Agents that run tasks for you, now or on a schedule, on OpenVibe's own agent or another platform's, on your computers and robots when you allow it, with every result checked and its cost shown.","legalProfile": "ugc",-- "position": 23,++ "position": 24,"neighbourhood": "make"}}@@@ -104,7 +104,7 @@"tagline": "One AI benchmark and comparison engine for every room","what": "The shared AI benchmark and comparison engine: kinds, pinned rounds, blind judgements, elo/pareto/cost boards, an open dataset per kind and private evals.","legalProfile": "service",-- "position": 47,++ "position": 48,"neighbourhood": "build"}}@@@ -24,7 +24,7 @@"tagline": "Long-form, yours to keep","what": "The official OpenVibe blog and a blog for every member: drafts, scheduling, media, comments and feeds, plus AI desks: cited digests of public data and a satire column, labelled as AI.","legalProfile": "info",-- "position": 8,++ "position": 9,"faq": [{"question": "Can anyone have a blog here?",@@@ -24,7 +24,7 @@"tagline": "Drive any robot from your browser","what": "Pair a robot with one pasted command and drive it from any browser, by keyboard, gamepad or on-screen joystick, from its own page or under a live stream, with roles, limits and an emergency stop on every command.","legalProfile": "games",-- "position": 21,++ "position": 22,"neighbourhood": "make"},"capabilities": [@@@ -78,7 +78,7 @@"tagline": "Your camera, your cameras, and Live's cam button","what": "The camera app with a timer, burst, grid and on-device filter; a private wall for the cameras you own, shared through revocable viewer grants; and the stills Live's cam button takes, every photo saved to Pics.","legalProfile": "ugc",-- "position": 46,++ "position": 47,"neighbourhood": "streams"}}@@@ -71,7 +71,7 @@"tagline": "Learn it, play it, never pay it","what": "Every casino game with its insides showing: the rules, the exact odds and what each bet costs. Play with chips worth nothing, and watch a million rounds in your browser. Never real money.","legalProfile": "games",-- "position": 48,++ "position": 49,"neighbourhood": "games"}}@@@ -24,7 +24,7 @@"tagline": "Build and fix apps with AI","what": "The open coding-agent harness: Claude Code, Codex, OpenCode, Command Code, the DeepSeek API and self-hosted models behind one router with hand-offs, sessions and budgets, OpenVibe Git (a code forge with OpenVibe sign-in at git.openvibe.codes) and the way to improve OpenVibe itself.","legalProfile": "ugc",-- "position": 22,++ "position": 23,"faq": [{"question": "What is OpenVibe.Codes?",@@@ -78,7 +78,7 @@"tagline": "Your computer, on the web, privately","what": "Share one port on your computer at its own HTTPS address on openvibe.website. Only the people you pick can open it, signed in with OpenVibe. One file and Node: no router settings, no open ports.","legalProfile": "ugc",-- "position": 51,++ "position": 52,"neighbourhood": "make"}}@@@ -24,7 +24,7 @@"tagline": "Codes that work","what": "Coupon codes with merchant matching, restrictions, expiry and real-people validity reports.","legalProfile": "info",-- "position": 17,++ "position": 18,"tld": "coupons","accent": "#fbbf24","description": "OpenVibe.Coupons is community-checked coupon discovery: codes matched to stores, validity reported by real people, expirations tracked, and a browser helper on the way.",@@@ -24,7 +24,7 @@"tagline": "Deals worth sharing","what": "Deals submitted and voted on by the community, with source, price and freshness always shown, and crowdfunding: one search across Kickstarter, Indiegogo, GoFundMe and more.","legalProfile": "info",-- "position": 16,++ "position": 17,"tld": "deals","accent": "#f97316","description": "OpenVibe.Deals is community deal discovery for the OpenVibe network: deals people vote on, hotness that reflects real interest, keyword alerts, price comparisons, honest discussion, and crowdfunding discovery across every platform at once.",@@@ -73,7 +73,7 @@"tagline": "Make it yours","what": "Try any OpenVibe theme on a Live channel, a Chat room and a shop at once, change its colours with contrast checks that must pass, use it on every site, and step back to any earlier look.","legalProfile": "service",-- "position": 39,++ "position": 40,"neighbourhood": "make"}}@@@ -76,7 +76,7 @@"tagline": "Name it, price it, run it","what": "Every ending and every registrar for a name, with what you will really pay over 1, 3 and 5 years, the renewal traps flagged, and each domain's public history.","legalProfile": "public",-- "position": 37,++ "position": 38,"neighbourhood": "make"}}@@@ -87,7 +87,7 @@"tagline": "Events your services can count on","what": "Publish an event once and every subscriber gets it, signed, retried and replayable: webhooks, a pull API with a cursor, dead letters and realtime streams for the browser.","legalProfile": "service",-- "position": 31,++ "position": 32,"neighbourhood": "build"}}@@@ -82,7 +82,7 @@"tagline": "Every AI model, one account","what": "Every AI model, one account: live prices, speed and uptime of every offer, chat with up to three models side by side, Arena rankings, companions, a private GPU endpoint and one OpenAI- and Anthropic-compatible endpoint. The public pages of OpenVibe.AI live here now.","legalProfile": "ugc",-- "position": 44,++ "position": 45,"neighbourhood": "shop"}}@@@ -88,7 +88,7 @@"tagline": "What should we eat?","what": "Find food banks and budget grocers near you, plan a week of meals for your household and budget, get recipe ideas from what is in your cupboard, and search every delivery app at once.","legalProfile": "tools",-- "position": 24,++ "position": 25,"neighbourhood": "shop"}}@@@ -83,7 +83,7 @@"tagline": "Something to do, alone, together, or live","what": "IRL quest boards on Live, a local guide from OpenStreetMap and group plans the group votes on; add the winner to your own Today.","legalProfile": "ugc",-- "position": 45,++ "position": 46,"neighbourhood": "games"}}@@@ -80,7 +80,7 @@"tagline": "Answers for every OpenVibe site","what": "Every OpenVibe site in one help centre: what each one does, its common questions, and a ticket to a person when the answer is not there.","legalProfile": "account",-- "position": 25,++ "position": 26,"neighbourhood": "people"}}@@@ -24,7 +24,7 @@"tagline": "Hosting, compared honestly","what": "Cloud, VPS and dedicated plans, hosting offers, domain prices and benchmarks people run side by side, each with the day it was checked and its source; never ranked by who pays.","legalProfile": "hosting",-- "position": 15,++ "position": 16,"tld": "host","accent": "#94a3b8","description": "OpenVibe.Host compares hosting: plans from providers' official APIs and staff entries that name their source, priced per month, per vCPU and per GB, each dated and linked to its source; offers posted on LowEndSpirit's Offers board; domain prices per ending with a name check at the registry; and benchmarks people run with YABS on their own servers. Its console lists your own servers on Linode, DigitalOcean, Vultr and Hetzner Cloud in one place. The order comes only from the visitor's sort; affiliate links are marked. Static hosting is OpenVibe.Space.",@@@ -104,7 +104,7 @@"tagline": "Your items, on every OpenVibe site","what": "Keep the items you earn across OpenVibe in one place, and choose what you wear in chat, on stream overlays and on your profile.","legalProfile": "ugc",-- "position": 30,++ "position": 31,"faq": [{"question": "How do I get items?",nnew file mode 100644@@@ -0,0 +1,94 @@++{++ "version": "0.1.0",++ "contractRanges": {++ "openvibe-contracts": ">=0.330.0 <1.0.0"++ },++ "id": "mail",++ "name": "OpenVibe.Mail",++ "status": "alpha",++ "repository": "OpenVibers/OpenVibe.Mail",++ "domains": [++ "openvibe.email"++ ],++ "publicOrigin": "https://openvibe.email",++ "exposure": {++ "state": "live",++ "publicSite": "service",++ "note": "openvibe.email serves the page at / and the API at /api/v1 once the Mail vhost replaces the parked 302 to Chat (the same deploy); mask.openvibe.email, burn1-3.openvibe.email and mail.openvibe.email receive SMTP only"++ },++ "capabilities": [++ "mail.addresses.write",++ "mail.messages.read"++ ],++ "eventsProduced": [],++ "eventsConsumed": [],++ "namespacesOwned": [],++ "lifecycle": {++ "liveness": {++ "endpoint": "/api/health",++ "means": "the process is up and answers HTTP; /api/ready is what requires the PostgreSQL database and the Stalwart mail server, and says which one failed"++ },++ "shutdown": {++ "signal": "SIGTERM",++ "deadlineSeconds": 10,++ "drains": [++ "the purge timer is stopped and a run in flight finishes its transactions",++ "the Events outbox relay is stopped after its current batch",++ "HTTP server closed and in-flight requests drained",++ "PostgreSQL pool closed, then the process exits"++ ]++ },++ "startupRecovery": {++ "resumes": [++ {++ "kind": "state",++ "what": "masks, burners, agent inboxes, mailboxes and the observed-message receipts in ov_mail survive a stop unchanged; Stalwart's message blobs stay on its own disk"++ },++ {++ "kind": "outbox",++ "what": "the Events outbox keeps unsent mail.mask.created and mail.received rows and relays them when OpenVibe.Events answers again"++ },++ {++ "kind": "schedule",++ "what": "the purge job is due-based: its first run after a stop deletes what expired while the service was down and disables the masks whose date has passed"++ }++ ]++ },++ "rollback": {++ "conditions": [++ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",++ "manual: ovhost rollback <service> --to <sha>"++ ],++ "window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",++ "blockers": {++ "none": "migrations 0001-0006 are expand only (CREATE TABLE/VIEW/INDEX and ADD COLUMN); an earlier release reads none of what a later one added"++ }++ },++ "contracts": {++ "range": ">=0.330.0 <1.0.0"++ },++ "leases": {++ "claims": [++ {++ "what": "the due purge run: expired burners, their Stalwart accounts, due masks and observed-message counters",++ "holder": "the Mail process whose transaction last wrote mail_settings.purge_lease",++ "expires": "30 seconds after the last take; the next run takes it then",++ "fencing": "the lease row is claimed by one transaction with updated_at gating the next claim, so a second run skips while the lease is fresh"++ }++ ]++ }++ },++ "notes": "Port 5250, unit openvibe-mail.service, database ov_mail, plus the Stalwart receive-only mail server in openvibe-stalwart.service. M1: masks (<words>.<four characters>@mask.openvibe.email) that deliver into the person's OpenVibe mailbox and nowhere else, burners on rotating subdomains that expire after ten minutes, an hour, a day or a week (or after the first message), and agent inboxes <agent>.<user>@openvibe.email. Nothing here sends or relays mail; a message body is read only by the code endpoint, in memory, and is never stored, logged, served as HTML or put in an event. The page at / is openvibe-shared/shell and the API is /api/v1; OAuth client `mail`, redirect https://openvibe.email/auth/callback. The service registers mail.addresses.write and mail.messages.read for an app or agent acting for a person (on_behalf_of); it holds no service grant of its own. It publishes mail.mask.created and mail.received through Events, but their payload contracts are not in this release, so eventsProduced stays empty until they are. The mask domain, the burner domains and mail.openvibe.email receive SMTP only and are not HTTP origins.",++ "health": "/api/health",++ "ready": "/api/ready",++ "internalOrigin": "http://127.0.0.1:5250",++ "site": {++ "name": "Email",++ "icon": "mail",++ "tagline": "An address for every sign-up",++ "what": "Ten-minute addresses that show you the code, and inboxes for your agents. Receive only.",++ "legalProfile": "service",++ "position": 7,++ "neighbourhood": "people"++ }++}@@@ -101,7 +101,7 @@"tagline": "Videos, pictures and your files","what": "A 25 GB drive with share links and folder backups (openvibe.download), videos you upload or record with AI captions, chapters and the AI cut, plus Live's recordings (openvibe.video), and pictures with embed links, albums, any size and format, and alt text (openvibe.pics).","legalProfile": "hosting",-- "position": 20,++ "position": 21,"neighbourhood": "streams"}}@@@ -75,7 +75,7 @@"tagline": "The internet's meme database","what": "Every entry in the open meme database cites the chat line or VOD second it came from, follows the later uses on a timeline, and keeps a status. Vote for meme of the week, caption a template, and report what needs fixing.","legalProfile": "ugc",-- "position": 42,++ "position": 43,"neighbourhood": "games"}}@@@ -24,7 +24,7 @@"tagline": "Sourced, not spun","what": "Source-backed stories: clustered coverage, cited summaries, multiple perspectives and timelines.","legalProfile": "info",-- "position": 10,++ "position": 11,"tld": "news","accent": "#fb923c","description": "OpenVibe.News aggregates the news with transparency: sourced stories, summaries that show their sources, multiple angles side by side, topic pages and framing you control — not an algorithm you can't see.",@@@ -25,7 +25,7 @@"tagline": "Go live once, stream everywhere","what": "Open restreaming: one stream to Twitch, YouTube, Kick and any RTMP or SRT server at once, with OpenVibe Live on by default.","legalProfile": "service",-- "position": 18,++ "position": 19,"tld": "stream","accent": "#ef4444","description": "OpenRestream is an open restreaming platform. Send one stream from OBS or any RTMP encoder and it goes to Twitch, YouTube, Kick and any RTMP, RTMPS or SRT destination at the same time, each with its own health, logs and retries. Your OpenVibe Live channel is on by default, so every stream also shows on openvibe.live with its chat, clips and VODs; switch it off for any stream. It is free and open source, with no follower minimum. No OBS? Go live from your browser on OpenVibe.Live.",@@@ -87,7 +87,7 @@"tagline": "Achievements, leaderboards and cloud saves for every game","what": "See this week's leaders and the all-time boards of every OpenVibe game, every achievement you have unlocked, and the saves games keep for you so your progress follows you to any device.","legalProfile": "ugc",-- "position": 35,++ "position": 36,"faq": [{"question": "What is OpenVibe Play?",@@@ -111,7 +111,7 @@"tagline": "Badges for what you really do","what": "One quest log across every OpenVibe site: real things you do on the network complete quests that pay badges and OpenCoins, and developer apps add quests on their own events.","legalProfile": "account",-- "position": 27,++ "position": 28,"neighbourhood": "games"}}@@@ -86,7 +86,7 @@"tagline": "Every rental site, one search","what": "Search Craigslist, Facebook Marketplace, Zillow, Apartments.com, Zumper and more at once for apartments, houses, rooms, stays, commercial space, parking, storage and cars, next to affordable housing from HUD and listings people post here.","legalProfile": "ugc",-- "position": 28,++ "position": 29,"neighbourhood": "shop"}}@@@ -78,7 +78,7 @@"tagline": "Every number on OpenVibe, honest","what": "The network's numbers open to everyone, what streamers talked about in The Rundown, and every stream's after-show report, each number with its definition and its date.","legalProfile": "public",-- "position": 38,++ "position": 39,"neighbourhood": "answers"}}@@@ -24,7 +24,7 @@"tagline": "Reviews with receipts","what": "Review signals gathered across sources with provenance, pros and cons, and community discussion. No invented ratings.","legalProfile": "ugc",-- "position": 11,++ "position": 12,"tld": "reviews","accent": "#facc15","description": "OpenVibe.Reviews gathers what people say about products, services, employers, hosts and communities across many sources — with provenance, without fake ratings — and lets the community discuss it.",@@@ -97,7 +97,7 @@"tagline": "Run jobs on machines that can","what": "Send a job to one API with your project's token: Compute places it on a node that offers its runtime, streams its output and meters it per second.","legalProfile": "hosting",-- "position": 34,++ "position": 35,"tld": "run","accent": "#a78bfa","description": "OpenVibe.Run executes jobs: a project submits a job (a pre-registered artifact, its input and its limits) to one API, Run chooses a node from the network's offers that its requirements allow, OpenVibe.Bot hands it to the node and meters every wall-clock second, the output streams back, and the job ends succeeded, failed, cancelled or expired. Alpha: jobs run on nodes paired with OpenVibe through the OpenVibe Node.",@@@ -91,7 +91,7 @@"tagline": "Search the OpenVibe network","what": "One search box over what the network's services have published: streams, clips, pastes, wiki pages, news and more, from OpenVibe's own index.","legalProfile": "public",-- "position": 33,++ "position": 34,"faq": [{"question": "What does OpenVibe Search cover?",@@@ -92,7 +92,7 @@"tagline": "Build on OpenVibe","what": "The developer platform: projects, apps, keys, grants and usage; API, contract, SDK and event docs; OAuth and webhook tools, playgrounds and app releases.","legalProfile": "ugc",-- "position": 7,++ "position": 8,"neighbourhood": "build"}}@@@ -78,7 +78,7 @@"tagline": "Every shoe, every market, the right price","what": "Shoe offers from OpenVibe.Deals, one page per model with every store, price history and the time each price was checked, a cited drops calendar, and price alerts through OpenVibe.Watch. No affiliate links, no raffle bots.","legalProfile": "ugc",-- "position": 50,++ "position": 51,"neighbourhood": "shop"}}@@@ -22,7 +22,7 @@"tagline": "Make a space: an app on your account","what": "Small apps on your OpenVibe account: describe one and OpenVibe AI builds it, or start from a template and change anything in the editor. Spaces sign visitors in, keep shared lists and private data, talk to OpenVibe AI and run their own server code. Static site hosting too.","legalProfile": "ugc",-- "position": 19,++ "position": 20,"tld": "space","accent": "#818cf8","description": "OpenVibe.Space is where you make spaces, small web apps on your OpenVibe account that OpenVibe AI builds from a description or a template, and host static sites: immutable deploys, one-step rollback, private previews, deploys from a public Git repository and custom domains after a TXT check, with names under openvibe.website. Publishing at a public address is open to OpenVibe staff while abuse handling and a designated DMCA agent are put in place. The old /s/* forum paths redirect to openvibe.community.",@@@ -68,7 +68,7 @@"tagline": "Ride, browse, watch","what": "Ride Counter-Strike-style surf maps in the browser against the clock, let an agent surf the web for you and report back with its sources, or lean back and surf what is on across OpenVibe.","legalProfile": "service",-- "position": 41,++ "position": 42,"neighbourhood": "games"}}@@@ -24,7 +24,7 @@"tagline": "Tips, paid messages and alerts for any stream","what": "A tip page and alert kit for creators on any platform: tips, paid messages, text-to-speech and media requests, goals and OBS overlays, settled by the network’s billing ledger.","legalProfile": "streaming",-- "position": 12,++ "position": 13,"tld": "tips","accent": "#4ade80","description": "OpenVibe.Tips gives every creator a tip page at openvibe.tips/<name> and an alert kit for their stream, wherever they stream: supporters send a tip, a highlighted paid message, a message read out on stream or a video request, within the creator’s own limits, and an overlay link shows each one in OBS as it lands, next to the creator’s goals. It works for OpenVibe.Live, Twitch, YouTube and Kick alike. Payments settle in OpenVibe.Billing, and every receipt shows separately when the payment settled and when the message was delivered.",@@@ -90,7 +90,7 @@"tagline": "Everything happening for you, today","what": "Stream schedules, reminders that find you on any OpenVibe site, calendar feeds for your own calendar app, and a morning brief, all in one place.","legalProfile": "account",-- "position": 40,++ "position": 41,"neighbourhood": "answers"}}@@@ -78,7 +78,7 @@"tagline": "Go anywhere: fly, stay, walk, watch","what": "A hundred cities from Wikivoyage and OpenStreetMap with cited places and walking routes, live IRL streams and recordings from OpenVibe.Live, stays from OpenVibe.Rent, and trips you plan and share. Flights link out, no affiliate.","legalProfile": "ugc",-- "position": 49,++ "position": 50,"neighbourhood": "streams"}}@@@ -24,7 +24,7 @@"tagline": "Watchlists and alerts","what": "Informational watchlists, sourced market context and alerts. No custody, no order execution.","legalProfile": "ugc",-- "position": 14,++ "position": 15,"tld": "trade","accent": "#60a5fa","description": "OpenVibe.Trade is the market intelligence room of the OpenVibe network: every company on SEC's ticker list with its filings and reported numbers, AI briefs that cite every line, watchlists and alerts — information and tools, never advice.",@@@ -24,7 +24,7 @@"tagline": "Memberships for creators and their software","what": "Memberships open to anyone on OpenVibe: creators publish plans with perks, members join through the network’s billing ledger, and apps and tools check a membership with the SDK.","legalProfile": "account",-- "position": 13,++ "position": 14,"tld": "vip","accent": "#e879f9","description": "OpenVibe.VIP is a membership site, like Patreon, open to anyone with an OpenVibe account. A creator publishes plans with perks, and members join from their Vibes credit or another way OpenVibe.Billing offers. The perks follow them across OpenVibe: a badge in chat, members-only posts and rooms, roles and emotes. Plans are versioned, so members keep the terms they joined under. Developers sell subscriptions to their own apps and tools the same way: the app signs a person in with OpenVibe and asks VIP whether they are a member (openvibe-sdk/vip).",@@@ -111,7 +111,7 @@"tagline": "See with the best model for the job","what": "Ask a picture a question, read its text with a local engine, compare models side by side with cost and latency, or point the UI check at a page to find overflow, cut-off text, low contrast, overlap and layering faults.","legalProfile": "ugc",-- "position": 43,++ "position": 44,"neighbourhood": "answers"}}@@@ -105,7 +105,7 @@"tagline": "Know the moment it changes","what": "Watch a page, a feed or a JSON API and get told when the value you care about changes or crosses the line you set, checked politely on your cadence.","legalProfile": "service",-- "position": 29,++ "position": 30,"neighbourhood": "build"}}@@@ -24,7 +24,7 @@"tagline": "Knowledge, with sources","what": "Wiki spaces with page trees, revision history, citations and discussion, editable together.","legalProfile": "ugc",-- "position": 9,++ "position": 10,"faq": [{"question": "Can I start my own wiki?",@@@ -84,7 +84,7 @@"tagline": "Find work, with an agent on your side","what": "Job listings from open job boards in one search, saved searches that tell you what is new, and an application tracker where your agent helps you prepare.","legalProfile": "info",-- "position": 26,++ "position": 27,"neighbourhood": "shop"}}@@@ -91,7 +91,7 @@"tagline": "Private S3-compatible storage for your projects","what": "Named storage zones for each project and environment: buckets that the AWS SDKs, rclone and backup tools reach over S3, with access keys you scope to a zone and quotas you set.","legalProfile": "ugc",-- "position": 36,++ "position": 37,"neighbourhood": "build"}}@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.329.0",++ "version": "0.330.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.329.0",++ "version": "0.330.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.329.0",++ "version": "0.330.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",
@@ -1,5 +1,12 @@
@@ -1,5 +1,12 @@
# Changelog
# Changelog
+## 0.330.0 — 2026-11-07
+
+- Add the `mail` service manifest: `openvibe.email` as the site **Email** (icon `mail`, the shared glyph font's E054), tagline "An address for every sign-up", the receive-only wording, legal profile `service`, and position 7, directly after Chat. It declares exposure `live`/`service`, port 5250, database `ov_mail`, the Stalwart mail server, `/api/health` and `/api/ready`, its shutdown and due-based recovery, an expand-only rollback, and the purge lease.
+- Add the two capabilities OpenVibe.Mail's API already checks: `mail.addresses.write` (make and retire a mask; make an agent inbox) and `mail.messages.read` (the person's addresses, message metadata and the newest burner code, never a body). Both are first-party, `owner`-constrained, and name their routes. Their request and result schemas are recorded in `compatibility/capability-schema-gaps.json` for now, like the config.manage capabilities added in 0.315.0.
+- The manifest lists no `eventsProduced` yet: the service publishes `mail.mask.created` and `mail.received`, but their payload contracts are not in this release.
+- Sites from the old position 7 up move one place (Services becomes 8, … Connect becomes 52) so Email sits beside Chat without breaking the unique-position rule. No contract changes shape; the only data change is the site order.
+
## 0.329.0 — 2026-11-07
## 0.329.0 — 2026-11-07
- Add `mail.mask@1`: a per-site address on OpenVibe.Mail that delivers into its owner's OpenVibe mailbox and nowhere else. It carries the `msk_…` id, the owner's Network subject, the `<words>.<four characters>@<mask domain>` address, the person's label and purpose, whether it is enabled (a disabled mask leaves the SQL directory Stalwart reads, so it bounces) and when it was made. M1 is receive-only, so this is metadata: no body, no forwarding target.
- Add `mail.mask@1`: a per-site address on OpenVibe.Mail that delivers into its owner's OpenVibe mailbox and nowhere else. It carries the `msk_…` id, the owner's Network subject, the `<words>.<four characters>@<mask domain>` address, the person's label and purpose, whether it is enabled (a disabled mask leaves the SQL directory Stalwart reads, so it bounces) and when it was made. M1 is receive-only, so this is metadata: no body, no forwarding target.
@@ -49,6 +49,20 @@
@@ -49,6 +49,20 @@
"inputSchema",
"inputSchema",
"outputSchema"
"outputSchema"
]
]
+ },
+ {
+ "id": "mail.addresses.write",
+ "missing": [
+ "inputSchema",
+ "outputSchema"
+ ]
+ },
+ {
+ "id": "mail.messages.read",
+ "missing": [
+ "inputSchema",
+ "outputSchema"
+ ]
}
}
]
]
}
}
@@ -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.329.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Bench API",
"title": "OpenVibe.Bench API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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 Connect API",
"title": "OpenVibe Connect API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Design API",
"title": "OpenVibe.Design API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Domains API",
"title": "OpenVibe.Domains API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"
@@ -141,6 +141,13 @@
@@ -141,6 +141,13 @@
"operations": 47,
"operations": 47,
"capabilities": 12
"capabilities": 12
},
},
+ {
+ "service": "mail",
+ "name": "OpenVibe.Mail",
+ "origin": "https://openvibe.email",
+ "operations": 12,
+ "capabilities": 2
+ },
{
{
"service": "media",
"service": "media",
"name": "OpenVibe.Media",
"name": "OpenVibe.Media",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"
new file mode 100644
new file mode 100644
@@ -0,0 +1,620 @@
@@ -0,0 +1,620 @@
+{
+ "openapi": "3.1.0",
+ "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
+ "info": {
+ "title": "OpenVibe.Mail API",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"
+ }
+ },
+ "servers": [
+ {
+ "url": "https://openvibe.email"
+ }
+ ],
+ "paths": {
+ "/api/v1/agent-inboxes": {
+ "get": {
+ "operationId": "get_api_v1_agent_inboxes",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_v1_agent_inboxes",
+ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
+ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
+ "tags": [
+ "mail.addresses"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.addresses.write"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-addresses-write",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.addresses.write"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/agent-inboxes/{id}/messages": {
+ "get": {
+ "operationId": "get_api_v1_agent_inboxes_id_messages",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/burners": {
+ "get": {
+ "operationId": "get_api_v1_burners",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/burners/{id}/code": {
+ "get": {
+ "operationId": "get_api_v1_burners_id_code",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/burners/{id}/messages": {
+ "get": {
+ "operationId": "get_api_v1_burners_id_messages",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/masks": {
+ "get": {
+ "operationId": "get_api_v1_masks",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_v1_masks",
+ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
+ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
+ "tags": [
+ "mail.addresses"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.addresses.write"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-addresses-write",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.addresses.write"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/masks/{id}": {
+ "delete": {
+ "operationId": "delete_api_v1_masks_id",
+ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
+ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
+ "tags": [
+ "mail.addresses"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.addresses.write"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-addresses-write",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.addresses.write"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "get_api_v1_masks_id",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/masks/{id}/disable": {
+ "post": {
+ "operationId": "post_api_v1_masks_id_disable",
+ "summary": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.e",
+ "description": "**mail.addresses.write** (first-party): Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
+ "tags": [
+ "mail.addresses"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.addresses.write"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-addresses-write",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.addresses.write"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/me/mail": {
+ "get": {
+ "operationId": "get_api_v1_me_mail",
+ "summary": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest",
+ "description": "**mail.messages.read** (first-party): Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "tags": [
+ "mail.messages"
+ ],
+ "x-openvibe-capabilities": [
+ "mail.messages.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "mail-messages-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "mail.messages.read"
+ ]
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success"
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "errors.problem.v1": {
+ "title": "Problem",
+ "description": "RFC 9457 problem details (application/problem+json) with a stable OpenVibe error code and trace identifiers. The legacy 'error' string is allowed during migration so existing clients keep working.",
+ "type": "object",
+ "required": [
+ "type",
+ "title",
+ "status",
+ "code"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "type": {
+ "type": "string",
+ "format": "uri-reference"
+ },
+ "title": {
+ "type": "string",
+ "minLength": 1
+ },
+ "status": {
+ "type": "integer",
+ "minimum": 400,
+ "maximum": 599
+ },
+ "detail": {
+ "type": "string"
+ },
+ "instance": {
+ "type": "string",
+ "format": "uri-reference"
+ },
+ "code": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$"
+ },
+ "request_id": {
+ "type": "string"
+ },
+ "trace_id": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{32}$"
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [
+ "message"
+ ],
+ "properties": {
+ "path": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "error": {
+ "type": "string",
+ "description": "Deprecated compatibility field: same text as title/detail for clients that read {error}."
+ }
+ }
+ }
+ },
+ "securitySchemes": {
+ "openvibeToken": {
+ "type": "http",
+ "scheme": "bearer",
+ "bearerFormat": "JWT",
+ "description": "An OpenVibe Network token for this service: a person's token, an app token (client credentials, audience of the service) or a first-party service token. Its `cap` claim must include the capability the operation names."
+ }
+ }
+ }
+}
@@ -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.329.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Report API",
"title": "OpenVibe.Report API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Today API",
"title": "OpenVibe.Today API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.Vision API",
"title": "OpenVibe.Vision API",
- "version": "0.329.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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.329.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.329.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.330.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.330.0): each operation lists the capabilities it performs; a token for the 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"
new file mode 100644
new file mode 100644
@@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
+{
+ "id": "mail.addresses.write",
+ "version": "1.0",
+ "owner": "mail",
+ "status": "active",
+ "visibility": "first-party",
+ "sensitive": true,
+ "description": "Make and retire the addresses OpenVibe.Mail hands out for a person: a mask (a per-site address that delivers into their OpenVibe mailbox and nowhere else) and an agent inbox (<agent>.<user>@openvibe.email). Turning a mask off makes its address bounce. The caller must act for the person (on_behalf_of); it never sends mail.",
+ "permissions": [
+ "mail:addresses:write"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "mail-addresses-write",
+ "events": [
+ "mail.mask.created"
+ ],
+ "implementedBy": [
+ "POST /api/v1/masks",
+ "POST /api/v1/masks/:id/disable",
+ "DELETE /api/v1/masks/:id",
+ "POST /api/v1/agent-inboxes"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
+{
+ "id": "mail.messages.read",
+ "version": "1.0",
+ "owner": "mail",
+ "status": "active",
+ "visibility": "first-party",
+ "sensitive": true,
+ "description": "Read what arrived for a person's addresses: the addresses they own with their state and counts, and the metadata of a mask's, burner's or agent inbox's messages (sender, subject, time) plus the newest verification code in a burner. Never a message body, and never another person's mail. The caller must act for the person (on_behalf_of), except a burner read with the one-time token its create call returned.",
+ "permissions": [
+ "mail:messages:read"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "mail-messages-read",
+ "events": [
+ "mail.received"
+ ],
+ "implementedBy": [
+ "GET /api/v1/me/mail",
+ "GET /api/v1/masks",
+ "GET /api/v1/masks/:id",
+ "GET /api/v1/burners",
+ "GET /api/v1/burners/:id/messages",
+ "GET /api/v1/burners/:id/code",
+ "GET /api/v1/agent-inboxes",
+ "GET /api/v1/agent-inboxes/:id/messages"
+ ]
+}
@@ -103,7 +103,7 @@
@@ -103,7 +103,7 @@
"tagline": "Agents that work while you are away",
"tagline": "Agents that work while you are away",
"what": "Agents that run tasks for you, now or on a schedule, on OpenVibe's own agent or another platform's, on your computers and robots when you allow it, with every result checked and its cost shown.",
"what": "Agents that run tasks for you, now or on a schedule, on OpenVibe's own agent or another platform's, on your computers and robots when you allow it, with every result checked and its cost shown.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 23,
+ "position": 24,
"neighbourhood": "make"
"neighbourhood": "make"
}
}
}
}
@@ -104,7 +104,7 @@
@@ -104,7 +104,7 @@
"tagline": "One AI benchmark and comparison engine for every room",
"tagline": "One AI benchmark and comparison engine for every room",
"what": "The shared AI benchmark and comparison engine: kinds, pinned rounds, blind judgements, elo/pareto/cost boards, an open dataset per kind and private evals.",
"what": "The shared AI benchmark and comparison engine: kinds, pinned rounds, blind judgements, elo/pareto/cost boards, an open dataset per kind and private evals.",
"legalProfile": "service",
"legalProfile": "service",
- "position": 47,
+ "position": 48,
"neighbourhood": "build"
"neighbourhood": "build"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Long-form, yours to keep",
"tagline": "Long-form, yours to keep",
"what": "The official OpenVibe blog and a blog for every member: drafts, scheduling, media, comments and feeds, plus AI desks: cited digests of public data and a satire column, labelled as AI.",
"what": "The official OpenVibe blog and a blog for every member: drafts, scheduling, media, comments and feeds, plus AI desks: cited digests of public data and a satire column, labelled as AI.",
"legalProfile": "info",
"legalProfile": "info",
- "position": 8,
+ "position": 9,
"faq": [
"faq": [
{
{
"question": "Can anyone have a blog here?",
"question": "Can anyone have a blog here?",
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Drive any robot from your browser",
"tagline": "Drive any robot from your browser",
"what": "Pair a robot with one pasted command and drive it from any browser, by keyboard, gamepad or on-screen joystick, from its own page or under a live stream, with roles, limits and an emergency stop on every command.",
"what": "Pair a robot with one pasted command and drive it from any browser, by keyboard, gamepad or on-screen joystick, from its own page or under a live stream, with roles, limits and an emergency stop on every command.",
"legalProfile": "games",
"legalProfile": "games",
- "position": 21,
+ "position": 22,
"neighbourhood": "make"
"neighbourhood": "make"
},
},
"capabilities": [
"capabilities": [
@@ -78,7 +78,7 @@
@@ -78,7 +78,7 @@
"tagline": "Your camera, your cameras, and Live's cam button",
"tagline": "Your camera, your cameras, and Live's cam button",
"what": "The camera app with a timer, burst, grid and on-device filter; a private wall for the cameras you own, shared through revocable viewer grants; and the stills Live's cam button takes, every photo saved to Pics.",
"what": "The camera app with a timer, burst, grid and on-device filter; a private wall for the cameras you own, shared through revocable viewer grants; and the stills Live's cam button takes, every photo saved to Pics.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 46,
+ "position": 47,
"neighbourhood": "streams"
"neighbourhood": "streams"
}
}
}
}
@@ -71,7 +71,7 @@
@@ -71,7 +71,7 @@
"tagline": "Learn it, play it, never pay it",
"tagline": "Learn it, play it, never pay it",
"what": "Every casino game with its insides showing: the rules, the exact odds and what each bet costs. Play with chips worth nothing, and watch a million rounds in your browser. Never real money.",
"what": "Every casino game with its insides showing: the rules, the exact odds and what each bet costs. Play with chips worth nothing, and watch a million rounds in your browser. Never real money.",
"legalProfile": "games",
"legalProfile": "games",
- "position": 48,
+ "position": 49,
"neighbourhood": "games"
"neighbourhood": "games"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Build and fix apps with AI",
"tagline": "Build and fix apps with AI",
"what": "The open coding-agent harness: Claude Code, Codex, OpenCode, Command Code, the DeepSeek API and self-hosted models behind one router with hand-offs, sessions and budgets, OpenVibe Git (a code forge with OpenVibe sign-in at git.openvibe.codes) and the way to improve OpenVibe itself.",
"what": "The open coding-agent harness: Claude Code, Codex, OpenCode, Command Code, the DeepSeek API and self-hosted models behind one router with hand-offs, sessions and budgets, OpenVibe Git (a code forge with OpenVibe sign-in at git.openvibe.codes) and the way to improve OpenVibe itself.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 22,
+ "position": 23,
"faq": [
"faq": [
{
{
"question": "What is OpenVibe.Codes?",
"question": "What is OpenVibe.Codes?",
@@ -78,7 +78,7 @@
@@ -78,7 +78,7 @@
"tagline": "Your computer, on the web, privately",
"tagline": "Your computer, on the web, privately",
"what": "Share one port on your computer at its own HTTPS address on openvibe.website. Only the people you pick can open it, signed in with OpenVibe. One file and Node: no router settings, no open ports.",
"what": "Share one port on your computer at its own HTTPS address on openvibe.website. Only the people you pick can open it, signed in with OpenVibe. One file and Node: no router settings, no open ports.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 51,
+ "position": 52,
"neighbourhood": "make"
"neighbourhood": "make"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Codes that work",
"tagline": "Codes that work",
"what": "Coupon codes with merchant matching, restrictions, expiry and real-people validity reports.",
"what": "Coupon codes with merchant matching, restrictions, expiry and real-people validity reports.",
"legalProfile": "info",
"legalProfile": "info",
- "position": 17,
+ "position": 18,
"tld": "coupons",
"tld": "coupons",
"accent": "#fbbf24",
"accent": "#fbbf24",
"description": "OpenVibe.Coupons is community-checked coupon discovery: codes matched to stores, validity reported by real people, expirations tracked, and a browser helper on the way.",
"description": "OpenVibe.Coupons is community-checked coupon discovery: codes matched to stores, validity reported by real people, expirations tracked, and a browser helper on the way.",
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Deals worth sharing",
"tagline": "Deals worth sharing",
"what": "Deals submitted and voted on by the community, with source, price and freshness always shown, and crowdfunding: one search across Kickstarter, Indiegogo, GoFundMe and more.",
"what": "Deals submitted and voted on by the community, with source, price and freshness always shown, and crowdfunding: one search across Kickstarter, Indiegogo, GoFundMe and more.",
"legalProfile": "info",
"legalProfile": "info",
- "position": 16,
+ "position": 17,
"tld": "deals",
"tld": "deals",
"accent": "#f97316",
"accent": "#f97316",
"description": "OpenVibe.Deals is community deal discovery for the OpenVibe network: deals people vote on, hotness that reflects real interest, keyword alerts, price comparisons, honest discussion, and crowdfunding discovery across every platform at once.",
"description": "OpenVibe.Deals is community deal discovery for the OpenVibe network: deals people vote on, hotness that reflects real interest, keyword alerts, price comparisons, honest discussion, and crowdfunding discovery across every platform at once.",
@@ -73,7 +73,7 @@
@@ -73,7 +73,7 @@
"tagline": "Make it yours",
"tagline": "Make it yours",
"what": "Try any OpenVibe theme on a Live channel, a Chat room and a shop at once, change its colours with contrast checks that must pass, use it on every site, and step back to any earlier look.",
"what": "Try any OpenVibe theme on a Live channel, a Chat room and a shop at once, change its colours with contrast checks that must pass, use it on every site, and step back to any earlier look.",
"legalProfile": "service",
"legalProfile": "service",
- "position": 39,
+ "position": 40,
"neighbourhood": "make"
"neighbourhood": "make"
}
}
}
}
@@ -76,7 +76,7 @@
@@ -76,7 +76,7 @@
"tagline": "Name it, price it, run it",
"tagline": "Name it, price it, run it",
"what": "Every ending and every registrar for a name, with what you will really pay over 1, 3 and 5 years, the renewal traps flagged, and each domain's public history.",
"what": "Every ending and every registrar for a name, with what you will really pay over 1, 3 and 5 years, the renewal traps flagged, and each domain's public history.",
"legalProfile": "public",
"legalProfile": "public",
- "position": 37,
+ "position": 38,
"neighbourhood": "make"
"neighbourhood": "make"
}
}
}
}
@@ -87,7 +87,7 @@
@@ -87,7 +87,7 @@
"tagline": "Events your services can count on",
"tagline": "Events your services can count on",
"what": "Publish an event once and every subscriber gets it, signed, retried and replayable: webhooks, a pull API with a cursor, dead letters and realtime streams for the browser.",
"what": "Publish an event once and every subscriber gets it, signed, retried and replayable: webhooks, a pull API with a cursor, dead letters and realtime streams for the browser.",
"legalProfile": "service",
"legalProfile": "service",
- "position": 31,
+ "position": 32,
"neighbourhood": "build"
"neighbourhood": "build"
}
}
}
}
@@ -82,7 +82,7 @@
@@ -82,7 +82,7 @@
"tagline": "Every AI model, one account",
"tagline": "Every AI model, one account",
"what": "Every AI model, one account: live prices, speed and uptime of every offer, chat with up to three models side by side, Arena rankings, companions, a private GPU endpoint and one OpenAI- and Anthropic-compatible endpoint. The public pages of OpenVibe.AI live here now.",
"what": "Every AI model, one account: live prices, speed and uptime of every offer, chat with up to three models side by side, Arena rankings, companions, a private GPU endpoint and one OpenAI- and Anthropic-compatible endpoint. The public pages of OpenVibe.AI live here now.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 44,
+ "position": 45,
"neighbourhood": "shop"
"neighbourhood": "shop"
}
}
}
}
@@ -88,7 +88,7 @@
@@ -88,7 +88,7 @@
"tagline": "What should we eat?",
"tagline": "What should we eat?",
"what": "Find food banks and budget grocers near you, plan a week of meals for your household and budget, get recipe ideas from what is in your cupboard, and search every delivery app at once.",
"what": "Find food banks and budget grocers near you, plan a week of meals for your household and budget, get recipe ideas from what is in your cupboard, and search every delivery app at once.",
"legalProfile": "tools",
"legalProfile": "tools",
- "position": 24,
+ "position": 25,
"neighbourhood": "shop"
"neighbourhood": "shop"
}
}
}
}
@@ -83,7 +83,7 @@
@@ -83,7 +83,7 @@
"tagline": "Something to do, alone, together, or live",
"tagline": "Something to do, alone, together, or live",
"what": "IRL quest boards on Live, a local guide from OpenStreetMap and group plans the group votes on; add the winner to your own Today.",
"what": "IRL quest boards on Live, a local guide from OpenStreetMap and group plans the group votes on; add the winner to your own Today.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 45,
+ "position": 46,
"neighbourhood": "games"
"neighbourhood": "games"
}
}
}
}
@@ -80,7 +80,7 @@
@@ -80,7 +80,7 @@
"tagline": "Answers for every OpenVibe site",
"tagline": "Answers for every OpenVibe site",
"what": "Every OpenVibe site in one help centre: what each one does, its common questions, and a ticket to a person when the answer is not there.",
"what": "Every OpenVibe site in one help centre: what each one does, its common questions, and a ticket to a person when the answer is not there.",
"legalProfile": "account",
"legalProfile": "account",
- "position": 25,
+ "position": 26,
"neighbourhood": "people"
"neighbourhood": "people"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Hosting, compared honestly",
"tagline": "Hosting, compared honestly",
"what": "Cloud, VPS and dedicated plans, hosting offers, domain prices and benchmarks people run side by side, each with the day it was checked and its source; never ranked by who pays.",
"what": "Cloud, VPS and dedicated plans, hosting offers, domain prices and benchmarks people run side by side, each with the day it was checked and its source; never ranked by who pays.",
"legalProfile": "hosting",
"legalProfile": "hosting",
- "position": 15,
+ "position": 16,
"tld": "host",
"tld": "host",
"accent": "#94a3b8",
"accent": "#94a3b8",
"description": "OpenVibe.Host compares hosting: plans from providers' official APIs and staff entries that name their source, priced per month, per vCPU and per GB, each dated and linked to its source; offers posted on LowEndSpirit's Offers board; domain prices per ending with a name check at the registry; and benchmarks people run with YABS on their own servers. Its console lists your own servers on Linode, DigitalOcean, Vultr and Hetzner Cloud in one place. The order comes only from the visitor's sort; affiliate links are marked. Static hosting is OpenVibe.Space.",
"description": "OpenVibe.Host compares hosting: plans from providers' official APIs and staff entries that name their source, priced per month, per vCPU and per GB, each dated and linked to its source; offers posted on LowEndSpirit's Offers board; domain prices per ending with a name check at the registry; and benchmarks people run with YABS on their own servers. Its console lists your own servers on Linode, DigitalOcean, Vultr and Hetzner Cloud in one place. The order comes only from the visitor's sort; affiliate links are marked. Static hosting is OpenVibe.Space.",
@@ -104,7 +104,7 @@
@@ -104,7 +104,7 @@
"tagline": "Your items, on every OpenVibe site",
"tagline": "Your items, on every OpenVibe site",
"what": "Keep the items you earn across OpenVibe in one place, and choose what you wear in chat, on stream overlays and on your profile.",
"what": "Keep the items you earn across OpenVibe in one place, and choose what you wear in chat, on stream overlays and on your profile.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 30,
+ "position": 31,
"faq": [
"faq": [
{
{
"question": "How do I get items?",
"question": "How do I get items?",
new file mode 100644
new file mode 100644
@@ -0,0 +1,94 @@
@@ -0,0 +1,94 @@
+{
+ "version": "0.1.0",
+ "contractRanges": {
+ "openvibe-contracts": ">=0.330.0 <1.0.0"
+ },
+ "id": "mail",
+ "name": "OpenVibe.Mail",
+ "status": "alpha",
+ "repository": "OpenVibers/OpenVibe.Mail",
+ "domains": [
+ "openvibe.email"
+ ],
+ "publicOrigin": "https://openvibe.email",
+ "exposure": {
+ "state": "live",
+ "publicSite": "service",
+ "note": "openvibe.email serves the page at / and the API at /api/v1 once the Mail vhost replaces the parked 302 to Chat (the same deploy); mask.openvibe.email, burn1-3.openvibe.email and mail.openvibe.email receive SMTP only"
+ },
+ "capabilities": [
+ "mail.addresses.write",
+ "mail.messages.read"
+ ],
+ "eventsProduced": [],
+ "eventsConsumed": [],
+ "namespacesOwned": [],
+ "lifecycle": {
+ "liveness": {
+ "endpoint": "/api/health",
+ "means": "the process is up and answers HTTP; /api/ready is what requires the PostgreSQL database and the Stalwart mail server, and says which one failed"
+ },
+ "shutdown": {
+ "signal": "SIGTERM",
+ "deadlineSeconds": 10,
+ "drains": [
+ "the purge timer is stopped and a run in flight finishes its transactions",
+ "the Events outbox relay is stopped after its current batch",
+ "HTTP server closed and in-flight requests drained",
+ "PostgreSQL pool closed, then the process exits"
+ ]
+ },
+ "startupRecovery": {
+ "resumes": [
+ {
+ "kind": "state",
+ "what": "masks, burners, agent inboxes, mailboxes and the observed-message receipts in ov_mail survive a stop unchanged; Stalwart's message blobs stay on its own disk"
+ },
+ {
+ "kind": "outbox",
+ "what": "the Events outbox keeps unsent mail.mask.created and mail.received rows and relays them when OpenVibe.Events answers again"
+ },
+ {
+ "kind": "schedule",
+ "what": "the purge job is due-based: its first run after a stop deletes what expired while the service was down and disables the masks whose date has passed"
+ }
+ ]
+ },
+ "rollback": {
+ "conditions": [
+ "automatic: ovhost deploy puts the previous sha back and restarts again when the ready URL does not answer 2xx within ready.timeoutSeconds after the restart (exit 3)",
+ "manual: ovhost rollback <service> --to <sha>"
+ ],
+ "window": "automatic only while ovhost waits for readiness after the restart; manual afterwards, as long as no blocker applies",
+ "blockers": {
+ "none": "migrations 0001-0006 are expand only (CREATE TABLE/VIEW/INDEX and ADD COLUMN); an earlier release reads none of what a later one added"
+ }
+ },
+ "contracts": {
+ "range": ">=0.330.0 <1.0.0"
+ },
+ "leases": {
+ "claims": [
+ {
+ "what": "the due purge run: expired burners, their Stalwart accounts, due masks and observed-message counters",
+ "holder": "the Mail process whose transaction last wrote mail_settings.purge_lease",
+ "expires": "30 seconds after the last take; the next run takes it then",
+ "fencing": "the lease row is claimed by one transaction with updated_at gating the next claim, so a second run skips while the lease is fresh"
+ }
+ ]
+ }
+ },
+ "notes": "Port 5250, unit openvibe-mail.service, database ov_mail, plus the Stalwart receive-only mail server in openvibe-stalwart.service. M1: masks (<words>.<four characters>@mask.openvibe.email) that deliver into the person's OpenVibe mailbox and nowhere else, burners on rotating subdomains that expire after ten minutes, an hour, a day or a week (or after the first message), and agent inboxes <agent>.<user>@openvibe.email. Nothing here sends or relays mail; a message body is read only by the code endpoint, in memory, and is never stored, logged, served as HTML or put in an event. The page at / is openvibe-shared/shell and the API is /api/v1; OAuth client `mail`, redirect https://openvibe.email/auth/callback. The service registers mail.addresses.write and mail.messages.read for an app or agent acting for a person (on_behalf_of); it holds no service grant of its own. It publishes mail.mask.created and mail.received through Events, but their payload contracts are not in this release, so eventsProduced stays empty until they are. The mask domain, the burner domains and mail.openvibe.email receive SMTP only and are not HTTP origins.",
+ "health": "/api/health",
+ "ready": "/api/ready",
+ "internalOrigin": "http://127.0.0.1:5250",
+ "site": {
+ "name": "Email",
+ "icon": "mail",
+ "tagline": "An address for every sign-up",
+ "what": "Ten-minute addresses that show you the code, and inboxes for your agents. Receive only.",
+ "legalProfile": "service",
+ "position": 7,
+ "neighbourhood": "people"
+ }
+}
@@ -101,7 +101,7 @@
@@ -101,7 +101,7 @@
"tagline": "Videos, pictures and your files",
"tagline": "Videos, pictures and your files",
"what": "A 25 GB drive with share links and folder backups (openvibe.download), videos you upload or record with AI captions, chapters and the AI cut, plus Live's recordings (openvibe.video), and pictures with embed links, albums, any size and format, and alt text (openvibe.pics).",
"what": "A 25 GB drive with share links and folder backups (openvibe.download), videos you upload or record with AI captions, chapters and the AI cut, plus Live's recordings (openvibe.video), and pictures with embed links, albums, any size and format, and alt text (openvibe.pics).",
"legalProfile": "hosting",
"legalProfile": "hosting",
- "position": 20,
+ "position": 21,
"neighbourhood": "streams"
"neighbourhood": "streams"
}
}
}
}
@@ -75,7 +75,7 @@
@@ -75,7 +75,7 @@
"tagline": "The internet's meme database",
"tagline": "The internet's meme database",
"what": "Every entry in the open meme database cites the chat line or VOD second it came from, follows the later uses on a timeline, and keeps a status. Vote for meme of the week, caption a template, and report what needs fixing.",
"what": "Every entry in the open meme database cites the chat line or VOD second it came from, follows the later uses on a timeline, and keeps a status. Vote for meme of the week, caption a template, and report what needs fixing.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 42,
+ "position": 43,
"neighbourhood": "games"
"neighbourhood": "games"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Sourced, not spun",
"tagline": "Sourced, not spun",
"what": "Source-backed stories: clustered coverage, cited summaries, multiple perspectives and timelines.",
"what": "Source-backed stories: clustered coverage, cited summaries, multiple perspectives and timelines.",
"legalProfile": "info",
"legalProfile": "info",
- "position": 10,
+ "position": 11,
"tld": "news",
"tld": "news",
"accent": "#fb923c",
"accent": "#fb923c",
"description": "OpenVibe.News aggregates the news with transparency: sourced stories, summaries that show their sources, multiple angles side by side, topic pages and framing you control — not an algorithm you can't see.",
"description": "OpenVibe.News aggregates the news with transparency: sourced stories, summaries that show their sources, multiple angles side by side, topic pages and framing you control — not an algorithm you can't see.",
@@ -25,7 +25,7 @@
@@ -25,7 +25,7 @@
"tagline": "Go live once, stream everywhere",
"tagline": "Go live once, stream everywhere",
"what": "Open restreaming: one stream to Twitch, YouTube, Kick and any RTMP or SRT server at once, with OpenVibe Live on by default.",
"what": "Open restreaming: one stream to Twitch, YouTube, Kick and any RTMP or SRT server at once, with OpenVibe Live on by default.",
"legalProfile": "service",
"legalProfile": "service",
- "position": 18,
+ "position": 19,
"tld": "stream",
"tld": "stream",
"accent": "#ef4444",
"accent": "#ef4444",
"description": "OpenRestream is an open restreaming platform. Send one stream from OBS or any RTMP encoder and it goes to Twitch, YouTube, Kick and any RTMP, RTMPS or SRT destination at the same time, each with its own health, logs and retries. Your OpenVibe Live channel is on by default, so every stream also shows on openvibe.live with its chat, clips and VODs; switch it off for any stream. It is free and open source, with no follower minimum. No OBS? Go live from your browser on OpenVibe.Live.",
"description": "OpenRestream is an open restreaming platform. Send one stream from OBS or any RTMP encoder and it goes to Twitch, YouTube, Kick and any RTMP, RTMPS or SRT destination at the same time, each with its own health, logs and retries. Your OpenVibe Live channel is on by default, so every stream also shows on openvibe.live with its chat, clips and VODs; switch it off for any stream. It is free and open source, with no follower minimum. No OBS? Go live from your browser on OpenVibe.Live.",
@@ -87,7 +87,7 @@
@@ -87,7 +87,7 @@
"tagline": "Achievements, leaderboards and cloud saves for every game",
"tagline": "Achievements, leaderboards and cloud saves for every game",
"what": "See this week's leaders and the all-time boards of every OpenVibe game, every achievement you have unlocked, and the saves games keep for you so your progress follows you to any device.",
"what": "See this week's leaders and the all-time boards of every OpenVibe game, every achievement you have unlocked, and the saves games keep for you so your progress follows you to any device.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 35,
+ "position": 36,
"faq": [
"faq": [
{
{
"question": "What is OpenVibe Play?",
"question": "What is OpenVibe Play?",
@@ -111,7 +111,7 @@
@@ -111,7 +111,7 @@
"tagline": "Badges for what you really do",
"tagline": "Badges for what you really do",
"what": "One quest log across every OpenVibe site: real things you do on the network complete quests that pay badges and OpenCoins, and developer apps add quests on their own events.",
"what": "One quest log across every OpenVibe site: real things you do on the network complete quests that pay badges and OpenCoins, and developer apps add quests on their own events.",
"legalProfile": "account",
"legalProfile": "account",
- "position": 27,
+ "position": 28,
"neighbourhood": "games"
"neighbourhood": "games"
}
}
}
}
@@ -86,7 +86,7 @@
@@ -86,7 +86,7 @@
"tagline": "Every rental site, one search",
"tagline": "Every rental site, one search",
"what": "Search Craigslist, Facebook Marketplace, Zillow, Apartments.com, Zumper and more at once for apartments, houses, rooms, stays, commercial space, parking, storage and cars, next to affordable housing from HUD and listings people post here.",
"what": "Search Craigslist, Facebook Marketplace, Zillow, Apartments.com, Zumper and more at once for apartments, houses, rooms, stays, commercial space, parking, storage and cars, next to affordable housing from HUD and listings people post here.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 28,
+ "position": 29,
"neighbourhood": "shop"
"neighbourhood": "shop"
}
}
}
}
@@ -78,7 +78,7 @@
@@ -78,7 +78,7 @@
"tagline": "Every number on OpenVibe, honest",
"tagline": "Every number on OpenVibe, honest",
"what": "The network's numbers open to everyone, what streamers talked about in The Rundown, and every stream's after-show report, each number with its definition and its date.",
"what": "The network's numbers open to everyone, what streamers talked about in The Rundown, and every stream's after-show report, each number with its definition and its date.",
"legalProfile": "public",
"legalProfile": "public",
- "position": 38,
+ "position": 39,
"neighbourhood": "answers"
"neighbourhood": "answers"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Reviews with receipts",
"tagline": "Reviews with receipts",
"what": "Review signals gathered across sources with provenance, pros and cons, and community discussion. No invented ratings.",
"what": "Review signals gathered across sources with provenance, pros and cons, and community discussion. No invented ratings.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 11,
+ "position": 12,
"tld": "reviews",
"tld": "reviews",
"accent": "#facc15",
"accent": "#facc15",
"description": "OpenVibe.Reviews gathers what people say about products, services, employers, hosts and communities across many sources — with provenance, without fake ratings — and lets the community discuss it.",
"description": "OpenVibe.Reviews gathers what people say about products, services, employers, hosts and communities across many sources — with provenance, without fake ratings — and lets the community discuss it.",
@@ -97,7 +97,7 @@
@@ -97,7 +97,7 @@
"tagline": "Run jobs on machines that can",
"tagline": "Run jobs on machines that can",
"what": "Send a job to one API with your project's token: Compute places it on a node that offers its runtime, streams its output and meters it per second.",
"what": "Send a job to one API with your project's token: Compute places it on a node that offers its runtime, streams its output and meters it per second.",
"legalProfile": "hosting",
"legalProfile": "hosting",
- "position": 34,
+ "position": 35,
"tld": "run",
"tld": "run",
"accent": "#a78bfa",
"accent": "#a78bfa",
"description": "OpenVibe.Run executes jobs: a project submits a job (a pre-registered artifact, its input and its limits) to one API, Run chooses a node from the network's offers that its requirements allow, OpenVibe.Bot hands it to the node and meters every wall-clock second, the output streams back, and the job ends succeeded, failed, cancelled or expired. Alpha: jobs run on nodes paired with OpenVibe through the OpenVibe Node.",
"description": "OpenVibe.Run executes jobs: a project submits a job (a pre-registered artifact, its input and its limits) to one API, Run chooses a node from the network's offers that its requirements allow, OpenVibe.Bot hands it to the node and meters every wall-clock second, the output streams back, and the job ends succeeded, failed, cancelled or expired. Alpha: jobs run on nodes paired with OpenVibe through the OpenVibe Node.",
@@ -91,7 +91,7 @@
@@ -91,7 +91,7 @@
"tagline": "Search the OpenVibe network",
"tagline": "Search the OpenVibe network",
"what": "One search box over what the network's services have published: streams, clips, pastes, wiki pages, news and more, from OpenVibe's own index.",
"what": "One search box over what the network's services have published: streams, clips, pastes, wiki pages, news and more, from OpenVibe's own index.",
"legalProfile": "public",
"legalProfile": "public",
- "position": 33,
+ "position": 34,
"faq": [
"faq": [
{
{
"question": "What does OpenVibe Search cover?",
"question": "What does OpenVibe Search cover?",
@@ -92,7 +92,7 @@
@@ -92,7 +92,7 @@
"tagline": "Build on OpenVibe",
"tagline": "Build on OpenVibe",
"what": "The developer platform: projects, apps, keys, grants and usage; API, contract, SDK and event docs; OAuth and webhook tools, playgrounds and app releases.",
"what": "The developer platform: projects, apps, keys, grants and usage; API, contract, SDK and event docs; OAuth and webhook tools, playgrounds and app releases.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 7,
+ "position": 8,
"neighbourhood": "build"
"neighbourhood": "build"
}
}
}
}
@@ -78,7 +78,7 @@
@@ -78,7 +78,7 @@
"tagline": "Every shoe, every market, the right price",
"tagline": "Every shoe, every market, the right price",
"what": "Shoe offers from OpenVibe.Deals, one page per model with every store, price history and the time each price was checked, a cited drops calendar, and price alerts through OpenVibe.Watch. No affiliate links, no raffle bots.",
"what": "Shoe offers from OpenVibe.Deals, one page per model with every store, price history and the time each price was checked, a cited drops calendar, and price alerts through OpenVibe.Watch. No affiliate links, no raffle bots.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 50,
+ "position": 51,
"neighbourhood": "shop"
"neighbourhood": "shop"
}
}
}
}
@@ -22,7 +22,7 @@
@@ -22,7 +22,7 @@
"tagline": "Make a space: an app on your account",
"tagline": "Make a space: an app on your account",
"what": "Small apps on your OpenVibe account: describe one and OpenVibe AI builds it, or start from a template and change anything in the editor. Spaces sign visitors in, keep shared lists and private data, talk to OpenVibe AI and run their own server code. Static site hosting too.",
"what": "Small apps on your OpenVibe account: describe one and OpenVibe AI builds it, or start from a template and change anything in the editor. Spaces sign visitors in, keep shared lists and private data, talk to OpenVibe AI and run their own server code. Static site hosting too.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 19,
+ "position": 20,
"tld": "space",
"tld": "space",
"accent": "#818cf8",
"accent": "#818cf8",
"description": "OpenVibe.Space is where you make spaces, small web apps on your OpenVibe account that OpenVibe AI builds from a description or a template, and host static sites: immutable deploys, one-step rollback, private previews, deploys from a public Git repository and custom domains after a TXT check, with names under openvibe.website. Publishing at a public address is open to OpenVibe staff while abuse handling and a designated DMCA agent are put in place. The old /s/* forum paths redirect to openvibe.community.",
"description": "OpenVibe.Space is where you make spaces, small web apps on your OpenVibe account that OpenVibe AI builds from a description or a template, and host static sites: immutable deploys, one-step rollback, private previews, deploys from a public Git repository and custom domains after a TXT check, with names under openvibe.website. Publishing at a public address is open to OpenVibe staff while abuse handling and a designated DMCA agent are put in place. The old /s/* forum paths redirect to openvibe.community.",
@@ -68,7 +68,7 @@
@@ -68,7 +68,7 @@
"tagline": "Ride, browse, watch",
"tagline": "Ride, browse, watch",
"what": "Ride Counter-Strike-style surf maps in the browser against the clock, let an agent surf the web for you and report back with its sources, or lean back and surf what is on across OpenVibe.",
"what": "Ride Counter-Strike-style surf maps in the browser against the clock, let an agent surf the web for you and report back with its sources, or lean back and surf what is on across OpenVibe.",
"legalProfile": "service",
"legalProfile": "service",
- "position": 41,
+ "position": 42,
"neighbourhood": "games"
"neighbourhood": "games"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Tips, paid messages and alerts for any stream",
"tagline": "Tips, paid messages and alerts for any stream",
"what": "A tip page and alert kit for creators on any platform: tips, paid messages, text-to-speech and media requests, goals and OBS overlays, settled by the network’s billing ledger.",
"what": "A tip page and alert kit for creators on any platform: tips, paid messages, text-to-speech and media requests, goals and OBS overlays, settled by the network’s billing ledger.",
"legalProfile": "streaming",
"legalProfile": "streaming",
- "position": 12,
+ "position": 13,
"tld": "tips",
"tld": "tips",
"accent": "#4ade80",
"accent": "#4ade80",
"description": "OpenVibe.Tips gives every creator a tip page at openvibe.tips/<name> and an alert kit for their stream, wherever they stream: supporters send a tip, a highlighted paid message, a message read out on stream or a video request, within the creator’s own limits, and an overlay link shows each one in OBS as it lands, next to the creator’s goals. It works for OpenVibe.Live, Twitch, YouTube and Kick alike. Payments settle in OpenVibe.Billing, and every receipt shows separately when the payment settled and when the message was delivered.",
"description": "OpenVibe.Tips gives every creator a tip page at openvibe.tips/<name> and an alert kit for their stream, wherever they stream: supporters send a tip, a highlighted paid message, a message read out on stream or a video request, within the creator’s own limits, and an overlay link shows each one in OBS as it lands, next to the creator’s goals. It works for OpenVibe.Live, Twitch, YouTube and Kick alike. Payments settle in OpenVibe.Billing, and every receipt shows separately when the payment settled and when the message was delivered.",
@@ -90,7 +90,7 @@
@@ -90,7 +90,7 @@
"tagline": "Everything happening for you, today",
"tagline": "Everything happening for you, today",
"what": "Stream schedules, reminders that find you on any OpenVibe site, calendar feeds for your own calendar app, and a morning brief, all in one place.",
"what": "Stream schedules, reminders that find you on any OpenVibe site, calendar feeds for your own calendar app, and a morning brief, all in one place.",
"legalProfile": "account",
"legalProfile": "account",
- "position": 40,
+ "position": 41,
"neighbourhood": "answers"
"neighbourhood": "answers"
}
}
}
}
@@ -78,7 +78,7 @@
@@ -78,7 +78,7 @@
"tagline": "Go anywhere: fly, stay, walk, watch",
"tagline": "Go anywhere: fly, stay, walk, watch",
"what": "A hundred cities from Wikivoyage and OpenStreetMap with cited places and walking routes, live IRL streams and recordings from OpenVibe.Live, stays from OpenVibe.Rent, and trips you plan and share. Flights link out, no affiliate.",
"what": "A hundred cities from Wikivoyage and OpenStreetMap with cited places and walking routes, live IRL streams and recordings from OpenVibe.Live, stays from OpenVibe.Rent, and trips you plan and share. Flights link out, no affiliate.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 49,
+ "position": 50,
"neighbourhood": "streams"
"neighbourhood": "streams"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Watchlists and alerts",
"tagline": "Watchlists and alerts",
"what": "Informational watchlists, sourced market context and alerts. No custody, no order execution.",
"what": "Informational watchlists, sourced market context and alerts. No custody, no order execution.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 14,
+ "position": 15,
"tld": "trade",
"tld": "trade",
"accent": "#60a5fa",
"accent": "#60a5fa",
"description": "OpenVibe.Trade is the market intelligence room of the OpenVibe network: every company on SEC's ticker list with its filings and reported numbers, AI briefs that cite every line, watchlists and alerts — information and tools, never advice.",
"description": "OpenVibe.Trade is the market intelligence room of the OpenVibe network: every company on SEC's ticker list with its filings and reported numbers, AI briefs that cite every line, watchlists and alerts — information and tools, never advice.",
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Memberships for creators and their software",
"tagline": "Memberships for creators and their software",
"what": "Memberships open to anyone on OpenVibe: creators publish plans with perks, members join through the network’s billing ledger, and apps and tools check a membership with the SDK.",
"what": "Memberships open to anyone on OpenVibe: creators publish plans with perks, members join through the network’s billing ledger, and apps and tools check a membership with the SDK.",
"legalProfile": "account",
"legalProfile": "account",
- "position": 13,
+ "position": 14,
"tld": "vip",
"tld": "vip",
"accent": "#e879f9",
"accent": "#e879f9",
"description": "OpenVibe.VIP is a membership site, like Patreon, open to anyone with an OpenVibe account. A creator publishes plans with perks, and members join from their Vibes credit or another way OpenVibe.Billing offers. The perks follow them across OpenVibe: a badge in chat, members-only posts and rooms, roles and emotes. Plans are versioned, so members keep the terms they joined under. Developers sell subscriptions to their own apps and tools the same way: the app signs a person in with OpenVibe and asks VIP whether they are a member (openvibe-sdk/vip).",
"description": "OpenVibe.VIP is a membership site, like Patreon, open to anyone with an OpenVibe account. A creator publishes plans with perks, and members join from their Vibes credit or another way OpenVibe.Billing offers. The perks follow them across OpenVibe: a badge in chat, members-only posts and rooms, roles and emotes. Plans are versioned, so members keep the terms they joined under. Developers sell subscriptions to their own apps and tools the same way: the app signs a person in with OpenVibe and asks VIP whether they are a member (openvibe-sdk/vip).",
@@ -111,7 +111,7 @@
@@ -111,7 +111,7 @@
"tagline": "See with the best model for the job",
"tagline": "See with the best model for the job",
"what": "Ask a picture a question, read its text with a local engine, compare models side by side with cost and latency, or point the UI check at a page to find overflow, cut-off text, low contrast, overlap and layering faults.",
"what": "Ask a picture a question, read its text with a local engine, compare models side by side with cost and latency, or point the UI check at a page to find overflow, cut-off text, low contrast, overlap and layering faults.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 43,
+ "position": 44,
"neighbourhood": "answers"
"neighbourhood": "answers"
}
}
}
}
@@ -105,7 +105,7 @@
@@ -105,7 +105,7 @@
"tagline": "Know the moment it changes",
"tagline": "Know the moment it changes",
"what": "Watch a page, a feed or a JSON API and get told when the value you care about changes or crosses the line you set, checked politely on your cadence.",
"what": "Watch a page, a feed or a JSON API and get told when the value you care about changes or crosses the line you set, checked politely on your cadence.",
"legalProfile": "service",
"legalProfile": "service",
- "position": 29,
+ "position": 30,
"neighbourhood": "build"
"neighbourhood": "build"
}
}
}
}
@@ -24,7 +24,7 @@
@@ -24,7 +24,7 @@
"tagline": "Knowledge, with sources",
"tagline": "Knowledge, with sources",
"what": "Wiki spaces with page trees, revision history, citations and discussion, editable together.",
"what": "Wiki spaces with page trees, revision history, citations and discussion, editable together.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 9,
+ "position": 10,
"faq": [
"faq": [
{
{
"question": "Can I start my own wiki?",
"question": "Can I start my own wiki?",
@@ -84,7 +84,7 @@
@@ -84,7 +84,7 @@
"tagline": "Find work, with an agent on your side",
"tagline": "Find work, with an agent on your side",
"what": "Job listings from open job boards in one search, saved searches that tell you what is new, and an application tracker where your agent helps you prepare.",
"what": "Job listings from open job boards in one search, saved searches that tell you what is new, and an application tracker where your agent helps you prepare.",
"legalProfile": "info",
"legalProfile": "info",
- "position": 26,
+ "position": 27,
"neighbourhood": "shop"
"neighbourhood": "shop"
}
}
}
}
@@ -91,7 +91,7 @@
@@ -91,7 +91,7 @@
"tagline": "Private S3-compatible storage for your projects",
"tagline": "Private S3-compatible storage for your projects",
"what": "Named storage zones for each project and environment: buckets that the AWS SDKs, rclone and backup tools reach over S3, with access keys you scope to a zone and quotas you set.",
"what": "Named storage zones for each project and environment: buckets that the AWS SDKs, rclone and backup tools reach over S3, with access keys you scope to a zone and quotas you set.",
"legalProfile": "ugc",
"legalProfile": "ugc",
- "position": 36,
+ "position": 37,
"neighbourhood": "build"
"neighbourhood": "build"
}
}
}
}
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.329.0",
+ "version": "0.330.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.329.0",
+ "version": "0.330.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.329.0",
+ "version": "0.330.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",