WebsiteShare website.share@1
Generated at from
openvibe-contracts v0.419.0 and
openvibe-sdk v0.161.0.
- Version
- 1.0.0
- Owner
- connect
- Visibility
- public
- Status
- active
- Compatibility
- backward
- Schema
https://openvibe.network/contracts/website/share.v1.json
website.share@1: one Share on OpenVibe.Website Connect, a local port published at a stable hostname through the edge relay. The record says who owns it, which project scopes it, which Link tunnel serves it, which local target it may reach, which policy version the edge enforces and where it is in its life (draft, review, active, paused, revoked). The tunnel token, the request bodies the inspector captures and the policy's password hash are never part of this document.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
id | string | yes |
| |
owner | any | yes | The person who owns the share. A project share is still owned by a person; project_id says which project it belongs to. | |
project_id | string | null | The project scope when the share belongs to one; null for a personal share. The token's project scope, never a caller-supplied body field, decides access. |
| |
node_id | string | null | The Network node principal expected to serve the tunnel; null until one is bound. |
| |
name | string | yes | One DNS label under openvibe.website. The first proof uses the single label agents-<owner> because Universal SSL covers one label only. |
|
hostname | string | yes | The fully qualified public host, lowercased; the default is name.openvibe.website, and a verified custom domain may replace it. |
|
protocol | enum | yes | What the share carries. http and https are HTTP/WS/SSE shares; tcp and udp are port shares. |
|
local_target | string | yes | The local target the Link may forward to, e.g. 127.0.0.1:3000, tcp://127.0.0.1:25565 or udp://127.0.0.1:19132. Loopback by default; a LAN target is allowed only when the owner enabled it locally. |
|
status | enum | yes | review holds a public share for the abuse screen; revoked is terminal and closes the route and tunnel. |
|
policy_id | string | yes |
| |
policy_version | integer | yes | The signed policy version the edge enforces. A request is checked against this version; revocation bumps it and closes the tunnel. |
|
region | string | null | The edge region the share is pinned to, e.g. eu or us-east; null before placement. |
| |
edge_id | string | null | The edge instance serving the active tunnel; null while the share is offline. |
| |
expires_at | string | null | When the share revokes itself; null for no expiry. |
| |
last_seen_at | string | null | The last successful Link liveness check; null until the first tunnel. |
| |
created_at | string | yes |
| |
updated_at | string | yes |
| |
revoked_at | string | null |
| ||
href | string |
|
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: agents-portal
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"project_id": null,
"node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
"name": "agents-alice",
"hostname": "agents-alice.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"region": "eu",
"edge_id": "edge-eu-1",
"expires_at": null,
"last_seen_at": "2026-10-29T09:00:00.000Z",
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z",
"revoked_at": null,
"href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}Valid: max-label
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"project_id": null,
"node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
"name": "a-------------------------------------------------------------z",
"hostname": "a-------------------------------------------------------------z.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"region": "eu",
"edge_id": "edge-eu-1",
"expires_at": null,
"last_seen_at": "2026-10-29T09:00:00.000Z",
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z",
"revoked_at": null,
"href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}Valid: one-char
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"project_id": null,
"node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
"name": "a",
"hostname": "a.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"region": "eu",
"edge_id": "edge-eu-1",
"expires_at": null,
"last_seen_at": "2026-10-29T09:00:00.000Z",
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z",
"revoked_at": null,
"href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}Valid: two-char
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"project_id": null,
"node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
"name": "ab",
"hostname": "ab.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"region": "eu",
"edge_id": "edge-eu-1",
"expires_at": null,
"last_seen_at": "2026-10-29T09:00:00.000Z",
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z",
"revoked_at": null,
"href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}Rejected: deleted-status
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"name": "agents-alice",
"hostname": "agents-alice.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "deleted",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z"
}Rejected: leading-hyphen
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"project_id": null,
"node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
"name": "-ab",
"hostname": "-ab.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"region": "eu",
"edge_id": "edge-eu-1",
"expires_at": null,
"last_seen_at": "2026-10-29T09:00:00.000Z",
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z",
"revoked_at": null,
"href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}Rejected: too-long
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"project_id": null,
"node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
"name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"hostname": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"region": "eu",
"edge_id": "edge-eu-1",
"expires_at": null,
"last_seen_at": "2026-10-29T09:00:00.000Z",
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z",
"revoked_at": null,
"href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}Rejected: trailing-hyphen
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"project_id": null,
"node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
"name": "ab-",
"hostname": "ab-.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 3,
"region": "eu",
"edge_id": "edge-eu-1",
"expires_at": null,
"last_seen_at": "2026-10-29T09:00:00.000Z",
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z",
"revoked_at": null,
"href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}Rejected: uppercase-name
{
"id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
"owner": {
"type": "user",
"id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
},
"name": "Agents-Alice",
"hostname": "agents-alice.openvibe.website",
"protocol": "http",
"local_target": "127.0.0.1:3000",
"status": "active",
"policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
"policy_version": 1,
"created_at": "2026-10-29T08:00:00.000Z",
"updated_at": "2026-10-29T09:00:00.000Z"
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('website.share@1', value); // { valid, errors: [{ path, message }] }