openvibers/openvibe.contracts Commits
Add verified account email contracts (#362)
Changes
@@@ -1,5 +1,9 @@# Changelog++## 0.349.0 — 2026-11-08++++- Add `identity.emails@1` and `identity.email-add-request@1` and the `identity.emails.read` capability for a person's verified, privacy-limited email addresses.++## 0.348.0 — 2026-11-08- Service manifests: `studio` (OpenVibe.Studio at openvibe.studio, live: Photo and Light in the browser), and@@@ -87,6 +87,51 @@"compatibility": "backward","status": "active"},++ {++ "id": "identity.emails",++ "version": "1.0.0",++ "owner": "network",++ "schema": "identity/emails.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "identity.emails-request",++ "version": "1.0.0",++ "owner": "network",++ "schema": "identity/emails-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "identity.email-add-request",++ "version": "1.0.0",++ "owner": "network",++ "schema": "identity/email-add-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "identity.email-verified-check-request",++ "version": "1.0.0",++ "owner": "network",++ "schema": "identity/email-verified-check-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "identity.email-verified-check-result",++ "version": "1.0.0",++ "owner": "network",++ "schema": "identity/email-verified-check-result.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "identity.subject-projection","version": "1.0.0",nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/email-add-request.v1.json",++ "title": "Add an email address to the authenticated person's account",++ "description": "A single email address the account owner wants to verify and attach to their own account.",++ "type": "object",++ "additionalProperties": false,++ "required": ["email"],++ "properties": { "email": { "type": "string", "format": "email", "maxLength": 254 } }++}nnew file mode 100644@@@ -0,0 +1,13 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/email-verified-check-request.v1.json",++ "title": "Check a person's verified email address",++ "description": "A service with identity.emails.read asks whether one supplied email address is verified for one Network subject. The response never reveals address lists or whether an unknown subject exists.",++ "type": "object",++ "additionalProperties": false,++ "required": ["subject", "email"],++ "properties": {++ "subject": { "type": "string", "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$" },++ "email": { "type": "string", "format": "email", "maxLength": 254 }++ }++}nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/email-verified-check-result.v1.json",++ "title": "Verified email check result",++ "description": "Whether the supplied email address is verified for the supplied subject. Unknown subjects and addresses both return false.",++ "type": "object",++ "additionalProperties": false,++ "required": ["verified"],++ "properties": { "verified": { "type": "boolean" } }++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/emails-request.v1.json",++ "title": "Read the authenticated person's shared verified email addresses",++ "description": "An empty request body for reading the authenticated person's verified email address.",++ "type": "object",++ "additionalProperties": false,++ "properties": {}++}nnew file mode 100644@@@ -0,0 +1,45 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/emails.v1.json",++ "title": "Verified email addresses for the authenticated person",++ "description": "The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.",++ "type": "object",++ "additionalProperties": false,++ "required": ["emails"],++ "properties": {++ "emails": {++ "type": "array",++ "items": { "$ref": "#/$defs/email" },++ "maxItems": 11++ }++ },++ "allOf": [++ {++ "if": { "properties": { "emails": { "type": "array", "minItems": 1 } }, "required": ["emails"] },++ "then": {++ "properties": {++ "emails": {++ "type": "array",++ "contains": { "type": "object", "properties": { "primary": { "const": true } }, "required": ["primary"] },++ "maxContains": 1++ }++ }++ }++ }++ ],++ "$defs": {++ "email": {++ "type": "object",++ "additionalProperties": false,++ "required": ["id", "email", "verified", "primary", "created_at"],++ "properties": {++ "id": { "type": "string", "minLength": 1 },++ "email": { "type": "string", "format": "email" },++ "verified": { "type": "boolean" },++ "primary": { "type": "boolean" },++ "created_at": { "type": "string" },++ "verified_at": { "type": ["string", "null"] }++ }++ }++ }++}nnew file mode 100644@@@ -0,0 +1 @@++{}nnew file mode 100644@@@ -0,0 +1 @@++{ "email": "[email protected]" }nnew file mode 100644@@@ -0,0 +1 @@++{ "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ" }nnew file mode 100644@@@ -0,0 +1 @@++{ "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ", "email": "[email protected]" }nnew file mode 100644@@@ -0,0 +1 @@++{ "verified": "yes" }nnew file mode 100644@@@ -0,0 +1 @@++{ "verified": true }nnew file mode 100644@@@ -0,0 +1 @@++{ "subject_id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ" }nnew file mode 100644@@@ -0,0 +1 @@++{}nnew file mode 100644@@@ -0,0 +1,5 @@++{++ "emails": [++ { "id": "01JAB2C3D4E5F6G7H9K0MNPQ", "email": "[email protected]", "verified": true, "primary": false, "created_at": "2026-11-08T10:00:00Z", "verified_at": null }++ ]++}nnew file mode 100644@@@ -0,0 +1 @@++{ "emails": [] }nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "emails": [++ { "id": "01JAB2C3D4E5F6G7H8J9K0MNPQ", "email": "[email protected]", "verified": true, "primary": true, "created_at": "2026-11-08T10:00:00Z", "verified_at": "2026-11-08T10:00:00Z" },++ { "id": "01JAB2C3D4E5F6G7H8J9K0MNPR", "email": "[email protected]", "verified": false, "primary": false, "created_at": "2026-11-08T10:05:00Z", "verified_at": null }++ ]++}@@@ -778,6 +778,189 @@]}},++ "identity.emails": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/emails.v1.json",++ "title": "Verified email addresses for the authenticated person",++ "description": "The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "emails"++ ],++ "properties": {++ "emails": {++ "type": "array",++ "items": {++ "$ref": "#/$defs/email"++ },++ "maxItems": 11++ }++ },++ "allOf": [++ {++ "if": {++ "properties": {++ "emails": {++ "type": "array",++ "minItems": 1++ }++ },++ "required": [++ "emails"++ ]++ },++ "then": {++ "properties": {++ "emails": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "primary": {++ "const": true++ }++ },++ "required": [++ "primary"++ ]++ },++ "maxContains": 1++ }++ }++ }++ }++ ],++ "$defs": {++ "email": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "email",++ "verified",++ "primary",++ "created_at"++ ],++ "properties": {++ "id": {++ "type": "string",++ "minLength": 1++ },++ "email": {++ "type": "string",++ "format": "email"++ },++ "verified": {++ "type": "boolean"++ },++ "primary": {++ "type": "boolean"++ },++ "created_at": {++ "type": "string"++ },++ "verified_at": {++ "type": [++ "string",++ "null"++ ]++ }++ }++ }++ }++ }++ },++ "identity.emails-request": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/emails-request.v1.json",++ "title": "Read the authenticated person's shared verified email addresses",++ "description": "An empty request body for reading the authenticated person's verified email address.",++ "type": "object",++ "additionalProperties": false,++ "properties": {}++ }++ },++ "identity.email-add-request": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/email-add-request.v1.json",++ "title": "Add an email address to the authenticated person's account",++ "description": "A single email address the account owner wants to verify and attach to their own account.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "email"++ ],++ "properties": {++ "email": {++ "type": "string",++ "format": "email",++ "maxLength": 254++ }++ }++ }++ },++ "identity.email-verified-check-request": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/email-verified-check-request.v1.json",++ "title": "Check a person's verified email address",++ "description": "A service with identity.emails.read asks whether one supplied email address is verified for one Network subject. The response never reveals address lists or whether an unknown subject exists.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "subject",++ "email"++ ],++ "properties": {++ "subject": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "email": {++ "type": "string",++ "format": "email",++ "maxLength": 254++ }++ }++ }++ },++ "identity.email-verified-check-result": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/identity/email-verified-check-result.v1.json",++ "title": "Verified email check result",++ "description": "Whether the supplied email address is verified for the supplied subject. Unknown subjects and addresses both return false.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "verified"++ ],++ "properties": {++ "verified": {++ "type": "boolean"++ }++ }++ }++ },"identity.subject-projection": {"version": "1.0.0","owner": "network",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.348.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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"@@@ -166,8 +166,8 @@"service": "network","name": "OpenVibe.Network","origin": "https://openvibe.network",-- "operations": 65,-- "capabilities": 37++ "operations": 67,++ "capabilities": 38},{"service": "news",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.348.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.Mail API",-- "version": "0.348.0",-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.348.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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"@@@ -136,6 +136,62 @@}}},++ "/api/v1/identity/emails/verified-check": {++ "post": {++ "operationId": "post_api_v1_identity_emails_verified_check",++ "summary": "Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject.",++ "description": "**identity.emails.read** (public): Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject. The full address list is only available to the person in their own account hub.",++ "tags": [++ "identity.emails"++ ],++ "x-openvibe-capabilities": [++ "identity.emails.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "identity-read",++ "security": [++ {++ "openvibeToken": [++ "identity.emails.read"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/identity.emails-request.v1"++ }++ }++ }++ },++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/identity.emails.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/api/v1/machines": {"get": {"operationId": "get_api_v1_machines",@@@ -1280,6 +1336,55 @@}}},++ "/api/v1/me/emails": {++ "get": {++ "operationId": "get_api_v1_me_emails",++ "summary": "Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject.",++ "description": "**identity.emails.read** (public): Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject. The full address list is only available to the person in their own account hub.",++ "tags": [++ "identity.emails"++ ],++ "x-openvibe-capabilities": [++ "identity.emails.read"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "identity-read",++ "security": [++ {++ "openvibeToken": [++ "identity.emails.read"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/identity.emails-request.v1"++ },++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/identity.emails.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/api/v1/me/trust": {"get": {"operationId": "get_api_v1_me_trust",@@@ -4412,6 +4517,103 @@}}},++ "identity.emails-request.v1": {++ "title": "Read the authenticated person's shared verified email addresses",++ "description": "An empty request body for reading the authenticated person's verified email address.",++ "type": "object",++ "additionalProperties": false,++ "properties": {}++ },++ "identity.emails.v1": {++ "title": "Verified email addresses for the authenticated person",++ "description": "The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "emails"++ ],++ "properties": {++ "emails": {++ "type": "array",++ "items": {++ "$ref": "#/components/schemas/identity.emails.v1/$defs/email"++ },++ "maxItems": 11++ }++ },++ "allOf": [++ {++ "if": {++ "properties": {++ "emails": {++ "type": "array",++ "minItems": 1++ }++ },++ "required": [++ "emails"++ ]++ },++ "then": {++ "properties": {++ "emails": {++ "type": "array",++ "contains": {++ "type": "object",++ "properties": {++ "primary": {++ "const": true++ }++ },++ "required": [++ "primary"++ ]++ },++ "maxContains": 1++ }++ }++ }++ }++ ],++ "$defs": {++ "email": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "id",++ "email",++ "verified",++ "primary",++ "created_at"++ ],++ "properties": {++ "id": {++ "type": "string",++ "minLength": 1++ },++ "email": {++ "type": "string",++ "format": "email"++ },++ "verified": {++ "type": "boolean"++ },++ "primary": {++ "type": "boolean"++ },++ "created_at": {++ "type": "string"++ },++ "verified_at": {++ "type": [++ "string",++ "null"++ ]++ }++ }++ }++ }++ },"identity.resolve-request.v1": {"title": "IdentityResolveRequest","description": "identity.resolve-request@1: the request of identity.subject.resolve on OpenVibe.Network. GET /internal/identity/resolve?subject_id= or ?system=&id=[&type=user] takes no body. POST /internal/identity/resolve-batch: { subject_ids } or { system, type?, ids } (at most 500; 413 beyond).",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.348.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.349.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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"@@@ -294,6 +294,601 @@ export type IdentityTrustRequest =}| NoBody;++/** [email protected] (owner: network) */++/**++ * The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.++ */++export type VerifiedEmailAddressesForTheAuthenticatedPerson = {++ [k: string]: unknown | undefined;++} & {++ /**++ * @maxItems 11++ */++ emails:++ | []++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ]++ | [++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ },++ {++ id: string;++ email: string;++ verified: boolean;++ primary: boolean;++ created_at: string;++ verified_at?: string | null;++ }++ ];++};++++/** [email protected] (owner: network) */++/**++ * An empty request body for reading the authenticated person's verified email address.++ */++export interface ReadTheAuthenticatedPersonSSharedVerifiedEmailAddresses {}++++/** [email protected] (owner: network) */++/**++ * A single email address the account owner wants to verify and attach to their own account.++ */++export interface AddAnEmailAddressToTheAuthenticatedPersonSAccount {++ email: string;++}++++/** [email protected] (owner: network) */++/**++ * A service with identity.emails.read asks whether one supplied email address is verified for one Network subject. The response never reveals address lists or whether an unknown subject exists.++ */++export interface CheckAPersonSVerifiedEmailAddress {++ subject: string;++ email: string;++}++++/** [email protected] (owner: network) */++/**++ * Whether the supplied email address is verified for the supplied subject. Unknown subjects and addresses both return false.++ */++export interface VerifiedEmailCheckResult {++ verified: boolean;++}++/** [email protected] (owner: network) *//*** identity.subject-projection@1: what OpenVibe.Network's identity resolver answers about a subject (server/identity/subjects.js resolve): the SubjectRef, the Network account behind it, its display fields, whether it is banned, and every legacy id mapped to it.nnew file mode 100644@@@ -0,0 +1,15 @@++{++ "id": "identity.emails.read",++ "version": "1.0",++ "owner": "network",++ "status": "active",++ "visibility": "public",++ "description": "Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject. The full address list is only available to the person in their own account hub.",++ "inputSchema": "identity.emails-request@1",++ "outputSchema": "identity.emails@1",++ "permissions": ["identity:read"],++ "resourceConstraints": ["none"],++ "quotaClass": "identity-read",++ "events": [],++ "implementedBy": ["GET /api/v1/me/emails", "POST /api/v1/identity/emails/verified-check"]++}@@@ -49,6 +49,7 @@"neighbourhood": "people"},"capabilities": [++ "identity.emails.read","identity.subject.resolve","identity.trust.read","mods.grant.manage",@@@ -1,12 +1,12 @@{"name": "openvibe-contracts",-- "version": "0.348.0",++ "version": "0.349.0","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-contracts",-- "version": "0.348.0",++ "version": "0.349.0","license": "AGPL-3.0-only","dependencies": {"ajv": "^8.17.1",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.348.0",++ "version": "0.349.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,9 @@
@@ -1,5 +1,9 @@
# Changelog
# Changelog
+## 0.349.0 — 2026-11-08
+
+- Add `identity.emails@1` and `identity.email-add-request@1` and the `identity.emails.read` capability for a person's verified, privacy-limited email addresses.
+
## 0.348.0 — 2026-11-08
## 0.348.0 — 2026-11-08
- Service manifests: `studio` (OpenVibe.Studio at openvibe.studio, live: Photo and Light in the browser), and
- Service manifests: `studio` (OpenVibe.Studio at openvibe.studio, live: Photo and Light in the browser), and
@@ -87,6 +87,51 @@
@@ -87,6 +87,51 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "identity.emails",
+ "version": "1.0.0",
+ "owner": "network",
+ "schema": "identity/emails.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "identity.emails-request",
+ "version": "1.0.0",
+ "owner": "network",
+ "schema": "identity/emails-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "identity.email-add-request",
+ "version": "1.0.0",
+ "owner": "network",
+ "schema": "identity/email-add-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "identity.email-verified-check-request",
+ "version": "1.0.0",
+ "owner": "network",
+ "schema": "identity/email-verified-check-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "identity.email-verified-check-result",
+ "version": "1.0.0",
+ "owner": "network",
+ "schema": "identity/email-verified-check-result.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "identity.subject-projection",
"id": "identity.subject-projection",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/email-add-request.v1.json",
+ "title": "Add an email address to the authenticated person's account",
+ "description": "A single email address the account owner wants to verify and attach to their own account.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["email"],
+ "properties": { "email": { "type": "string", "format": "email", "maxLength": 254 } }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/email-verified-check-request.v1.json",
+ "title": "Check a person's verified email address",
+ "description": "A service with identity.emails.read asks whether one supplied email address is verified for one Network subject. The response never reveals address lists or whether an unknown subject exists.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["subject", "email"],
+ "properties": {
+ "subject": { "type": "string", "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$" },
+ "email": { "type": "string", "format": "email", "maxLength": 254 }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/email-verified-check-result.v1.json",
+ "title": "Verified email check result",
+ "description": "Whether the supplied email address is verified for the supplied subject. Unknown subjects and addresses both return false.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["verified"],
+ "properties": { "verified": { "type": "boolean" } }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/emails-request.v1.json",
+ "title": "Read the authenticated person's shared verified email addresses",
+ "description": "An empty request body for reading the authenticated person's verified email address.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {}
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/emails.v1.json",
+ "title": "Verified email addresses for the authenticated person",
+ "description": "The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["emails"],
+ "properties": {
+ "emails": {
+ "type": "array",
+ "items": { "$ref": "#/$defs/email" },
+ "maxItems": 11
+ }
+ },
+ "allOf": [
+ {
+ "if": { "properties": { "emails": { "type": "array", "minItems": 1 } }, "required": ["emails"] },
+ "then": {
+ "properties": {
+ "emails": {
+ "type": "array",
+ "contains": { "type": "object", "properties": { "primary": { "const": true } }, "required": ["primary"] },
+ "maxContains": 1
+ }
+ }
+ }
+ }
+ ],
+ "$defs": {
+ "email": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "email", "verified", "primary", "created_at"],
+ "properties": {
+ "id": { "type": "string", "minLength": 1 },
+ "email": { "type": "string", "format": "email" },
+ "verified": { "type": "boolean" },
+ "primary": { "type": "boolean" },
+ "created_at": { "type": "string" },
+ "verified_at": { "type": ["string", "null"] }
+ }
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "email": "[email protected]" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ", "email": "[email protected]" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "verified": "yes" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "verified": true }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "subject_id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ" }
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{}
new file mode 100644
new file mode 100644
@@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
+{
+ "emails": [
+ { "id": "01JAB2C3D4E5F6G7H9K0MNPQ", "email": "[email protected]", "verified": true, "primary": false, "created_at": "2026-11-08T10:00:00Z", "verified_at": null }
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+{ "emails": [] }
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "emails": [
+ { "id": "01JAB2C3D4E5F6G7H8J9K0MNPQ", "email": "[email protected]", "verified": true, "primary": true, "created_at": "2026-11-08T10:00:00Z", "verified_at": "2026-11-08T10:00:00Z" },
+ { "id": "01JAB2C3D4E5F6G7H8J9K0MNPR", "email": "[email protected]", "verified": false, "primary": false, "created_at": "2026-11-08T10:05:00Z", "verified_at": null }
+ ]
+}
@@ -778,6 +778,189 @@
@@ -778,6 +778,189 @@
]
]
}
}
},
},
+ "identity.emails": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/emails.v1.json",
+ "title": "Verified email addresses for the authenticated person",
+ "description": "The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "emails"
+ ],
+ "properties": {
+ "emails": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/email"
+ },
+ "maxItems": 11
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "emails": {
+ "type": "array",
+ "minItems": 1
+ }
+ },
+ "required": [
+ "emails"
+ ]
+ },
+ "then": {
+ "properties": {
+ "emails": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "primary": {
+ "const": true
+ }
+ },
+ "required": [
+ "primary"
+ ]
+ },
+ "maxContains": 1
+ }
+ }
+ }
+ }
+ ],
+ "$defs": {
+ "email": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "email",
+ "verified",
+ "primary",
+ "created_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ },
+ "verified": {
+ "type": "boolean"
+ },
+ "primary": {
+ "type": "boolean"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "verified_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "identity.emails-request": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/emails-request.v1.json",
+ "title": "Read the authenticated person's shared verified email addresses",
+ "description": "An empty request body for reading the authenticated person's verified email address.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {}
+ }
+ },
+ "identity.email-add-request": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/email-add-request.v1.json",
+ "title": "Add an email address to the authenticated person's account",
+ "description": "A single email address the account owner wants to verify and attach to their own account.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "email"
+ ],
+ "properties": {
+ "email": {
+ "type": "string",
+ "format": "email",
+ "maxLength": 254
+ }
+ }
+ }
+ },
+ "identity.email-verified-check-request": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/email-verified-check-request.v1.json",
+ "title": "Check a person's verified email address",
+ "description": "A service with identity.emails.read asks whether one supplied email address is verified for one Network subject. The response never reveals address lists or whether an unknown subject exists.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "subject",
+ "email"
+ ],
+ "properties": {
+ "subject": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "maxLength": 254
+ }
+ }
+ }
+ },
+ "identity.email-verified-check-result": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/identity/email-verified-check-result.v1.json",
+ "title": "Verified email check result",
+ "description": "Whether the supplied email address is verified for the supplied subject. Unknown subjects and addresses both return false.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "verified"
+ ],
+ "properties": {
+ "verified": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
"identity.subject-projection": {
"identity.subject-projection": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "network",
"owner": "network",
@@ -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.348.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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"
@@ -166,8 +166,8 @@
@@ -166,8 +166,8 @@
"service": "network",
"service": "network",
"name": "OpenVibe.Network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
"origin": "https://openvibe.network",
- "operations": 65,
- "capabilities": 37
+ "operations": 67,
+ "capabilities": 38
},
},
{
{
"service": "news",
"service": "news",
@@ -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.348.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.Mail API",
"title": "OpenVibe.Mail API",
- "version": "0.348.0",
- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.348.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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"
@@ -136,6 +136,62 @@
@@ -136,6 +136,62 @@
}
}
}
}
},
},
+ "/api/v1/identity/emails/verified-check": {
+ "post": {
+ "operationId": "post_api_v1_identity_emails_verified_check",
+ "summary": "Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject.",
+ "description": "**identity.emails.read** (public): Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject. The full address list is only available to the person in their own account hub.",
+ "tags": [
+ "identity.emails"
+ ],
+ "x-openvibe-capabilities": [
+ "identity.emails.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "identity-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "identity.emails.read"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/identity.emails-request.v1"
+ }
+ }
+ }
+ },
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/identity.emails.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/api/v1/machines": {
"/api/v1/machines": {
"get": {
"get": {
"operationId": "get_api_v1_machines",
"operationId": "get_api_v1_machines",
@@ -1280,6 +1336,55 @@
@@ -1280,6 +1336,55 @@
}
}
}
}
},
},
+ "/api/v1/me/emails": {
+ "get": {
+ "operationId": "get_api_v1_me_emails",
+ "summary": "Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject.",
+ "description": "**identity.emails.read** (public): Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject. The full address list is only available to the person in their own account hub.",
+ "tags": [
+ "identity.emails"
+ ],
+ "x-openvibe-capabilities": [
+ "identity.emails.read"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "identity-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "identity.emails.read"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/identity.emails-request.v1"
+ },
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/identity.emails.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/api/v1/me/trust": {
"/api/v1/me/trust": {
"get": {
"get": {
"operationId": "get_api_v1_me_trust",
"operationId": "get_api_v1_me_trust",
@@ -4412,6 +4517,103 @@
@@ -4412,6 +4517,103 @@
}
}
}
}
},
},
+ "identity.emails-request.v1": {
+ "title": "Read the authenticated person's shared verified email addresses",
+ "description": "An empty request body for reading the authenticated person's verified email address.",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {}
+ },
+ "identity.emails.v1": {
+ "title": "Verified email addresses for the authenticated person",
+ "description": "The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "emails"
+ ],
+ "properties": {
+ "emails": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/identity.emails.v1/$defs/email"
+ },
+ "maxItems": 11
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "emails": {
+ "type": "array",
+ "minItems": 1
+ }
+ },
+ "required": [
+ "emails"
+ ]
+ },
+ "then": {
+ "properties": {
+ "emails": {
+ "type": "array",
+ "contains": {
+ "type": "object",
+ "properties": {
+ "primary": {
+ "const": true
+ }
+ },
+ "required": [
+ "primary"
+ ]
+ },
+ "maxContains": 1
+ }
+ }
+ }
+ }
+ ],
+ "$defs": {
+ "email": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "email",
+ "verified",
+ "primary",
+ "created_at"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ },
+ "verified": {
+ "type": "boolean"
+ },
+ "primary": {
+ "type": "boolean"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "verified_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+ }
+ }
+ },
"identity.resolve-request.v1": {
"identity.resolve-request.v1": {
"title": "IdentityResolveRequest",
"title": "IdentityResolveRequest",
"description": "identity.resolve-request@1: the request of identity.subject.resolve on OpenVibe.Network. GET /internal/identity/resolve?subject_id= or ?system=&id=[&type=user] takes no body. POST /internal/identity/resolve-batch: { subject_ids } or { system, type?, ids } (at most 500; 413 beyond).",
"description": "identity.resolve-request@1: the request of identity.subject.resolve on OpenVibe.Network. GET /internal/identity/resolve?subject_id= or ?system=&id=[&type=user] takes no body. POST /internal/identity/resolve-batch: { subject_ids } or { system, type?, ids } (at most 500; 413 beyond).",
@@ -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.348.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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.348.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.348.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.349.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.349.0): each operation lists the capabilities it performs; a token for the 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"
@@ -294,6 +294,601 @@ export type IdentityTrustRequest =
@@ -294,6 +294,601 @@ export type IdentityTrustRequest =
}
}
| NoBody;
| NoBody;
+/** [email protected] (owner: network) */
+/**
+ * The verified email addresses the authenticated person has shared. An app with identity.emails.read receives only the single address selected for that app; primary reflects whether it is the account's primary address.
+ */
+export type VerifiedEmailAddressesForTheAuthenticatedPerson = {
+ [k: string]: unknown | undefined;
+} & {
+ /**
+ * @maxItems 11
+ */
+ emails:
+ | []
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ]
+ | [
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ },
+ {
+ id: string;
+ email: string;
+ verified: boolean;
+ primary: boolean;
+ created_at: string;
+ verified_at?: string | null;
+ }
+ ];
+};
+
+/** [email protected] (owner: network) */
+/**
+ * An empty request body for reading the authenticated person's verified email address.
+ */
+export interface ReadTheAuthenticatedPersonSSharedVerifiedEmailAddresses {}
+
+/** [email protected] (owner: network) */
+/**
+ * A single email address the account owner wants to verify and attach to their own account.
+ */
+export interface AddAnEmailAddressToTheAuthenticatedPersonSAccount {
+ email: string;
+}
+
+/** [email protected] (owner: network) */
+/**
+ * A service with identity.emails.read asks whether one supplied email address is verified for one Network subject. The response never reveals address lists or whether an unknown subject exists.
+ */
+export interface CheckAPersonSVerifiedEmailAddress {
+ subject: string;
+ email: string;
+}
+
+/** [email protected] (owner: network) */
+/**
+ * Whether the supplied email address is verified for the supplied subject. Unknown subjects and addresses both return false.
+ */
+export interface VerifiedEmailCheckResult {
+ verified: boolean;
+}
+
/** [email protected] (owner: network) */
/** [email protected] (owner: network) */
/**
/**
* identity.subject-projection@1: what OpenVibe.Network's identity resolver answers about a subject (server/identity/subjects.js resolve): the SubjectRef, the Network account behind it, its display fields, whether it is banned, and every legacy id mapped to it.
* identity.subject-projection@1: what OpenVibe.Network's identity resolver answers about a subject (server/identity/subjects.js resolve): the SubjectRef, the Network account behind it, its display fields, whether it is banned, and every legacy id mapped to it.
new file mode 100644
new file mode 100644
@@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
+{
+ "id": "identity.emails.read",
+ "version": "1.0",
+ "owner": "network",
+ "status": "active",
+ "visibility": "public",
+ "description": "Read the one verified email address a person has shared with this app, or check whether one supplied address is verified for a supplied subject. The full address list is only available to the person in their own account hub.",
+ "inputSchema": "identity.emails-request@1",
+ "outputSchema": "identity.emails@1",
+ "permissions": ["identity:read"],
+ "resourceConstraints": ["none"],
+ "quotaClass": "identity-read",
+ "events": [],
+ "implementedBy": ["GET /api/v1/me/emails", "POST /api/v1/identity/emails/verified-check"]
+}
@@ -49,6 +49,7 @@
@@ -49,6 +49,7 @@
"neighbourhood": "people"
"neighbourhood": "people"
},
},
"capabilities": [
"capabilities": [
+ "identity.emails.read",
"identity.subject.resolve",
"identity.subject.resolve",
"identity.trust.read",
"identity.trust.read",
"mods.grant.manage",
"mods.grant.manage",
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.348.0",
+ "version": "0.349.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.348.0",
+ "version": "0.349.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.348.0",
+ "version": "0.349.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",