---
title: "website.share@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/website.share"
updated: null
---

# website.share@1 · OpenVibe.Services

HTML: [website.share@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/website.share)

# WebsiteShare `website.share@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

- Version: 1.0.0
- Owner: connect
- Visibility: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/website/share.v1.json`](/docs/contracts/website.share.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 |  | - `pattern ^shr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `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. | - `pattern ^prj_[0-9A-HJKMNP-TV-Z]{26}$` |
| `node_id` | string \| null |  | The Network node principal expected to serve the tunnel; null until one is bound. | - `pattern ^lnk_[0-9A-HJKMNP-TV-Z]{26}$` |
| `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. | - `pattern ^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$` |
| `hostname` | string | yes | The fully qualified public host, lowercased; the default is name.openvibe.website, and a verified custom domain may replace it. | - `minLength 4`<br>- `maxLength 253` |
| `protocol` | enum | yes | What the share carries. http and https are HTTP/WS/SSE shares; tcp and udp are port shares. | - `one of "http", "https", "tcp", "udp"` |
| `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. | - `minLength 3`<br>- `maxLength 300` |
| `status` | enum | yes | review holds a public share for the abuse screen; revoked is terminal and closes the route and tunnel. | - `one of "draft", "review", "active", "paused", "revoked"` |
| `policy_id` | string | yes |  | - `pattern ^pol_[0-9A-HJKMNP-TV-Z]{26}$` |
| `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. | - `minimum 1` |
| `region` | string \| null |  | The edge region the share is pinned to, e.g. eu or us-east; null before placement. | - `maxLength 40` |
| `edge_id` | string \| null |  | The edge instance serving the active tunnel; null while the share is offline. | - `maxLength 80` |
| `expires_at` | string \| null |  | When the share revokes itself; null for no expiry. | - `format date-time` |
| `last_seen_at` | string \| null |  | The last successful Link liveness check; null until the first tunnel. | - `format date-time` |
| `created_at` | string | yes |  | - `format date-time` |
| `updated_at` | string | yes |  | - `format date-time` |
| `revoked_at` | string \| null |  |  | - `format date-time` |
| `href` | string |  |  | - `pattern ^https://`<br>- `format uri` |

## 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 }] }
~~~~
