---
title: "network.link.revoked@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/network.link.revoked"
updated: null
---

# network.link.revoked@1 · OpenVibe.Services

HTML: [network.link.revoked@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/network.link.revoked)

# NetworkLinkRevokedPayload `network.link.revoked@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: network
- Visibility: first-party
- Status: active
- Compatibility: backward
- Decision: [ADR-034](/docs/adr/ADR-034)
- Schema: [`https://openvibe.network/contracts/events/payloads/network.link.revoked.v1.json`](/docs/contracts/network.link.revoked.json)

network.link.revoked v1 (OpenVibe.Network; plan T2, docs/t2-cells-and-node-principal.md section 10, migrations/0014\_node\_pairing.sql). A node principal (lnk\_…), a person's paired machine, was revoked: through POST /internal/link-principals/:id/revoke (network.link.manage, the service that paired it), through POST /api/v1/me/nodes/:id/revoke (the owner's session), or with the owner's account. Network revokes the row and clears the credential and its grace window; a machine holding a live node token is refused at its next use (≤ 300 s), and until this event only learned of the revoke at its next reauth (≤ 330 s). A consumer stops the machine at once; a second revoke changes nothing and emits nothing. The credential and its hash are never carried. Envelope: subject { type: node\_principal, id: <lnk\_…> }, visibility internal, actor the service (svc:<service>) or the owner ({ type: user }) that revoked.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `node_id` | string | yes | The machine's node id (platform\_node\_principals.node\_id), minted with the principal and unique among principals. | - `pattern ^n-[a-z0-9]{26}$` |
| `principal_id` | string | yes | The revoked node principal. Also the envelope subject id. | - `pattern ^lnk_[0-9A-HJKMNP-TV-Z]{26}$` |
| `owner` | one of | yes | Who the machine belongs to, as GET /api/v1/me/nodes and the operator list show it: the person who paired it, the project it is paired into, or the platform for a Host-reported machine. |  |
| `reason` | string |  | Why it was revoked, when the caller gave one (the owner's text or the service's); absent otherwise. | - `minLength 1`<br>- `maxLength 500` |
| `at` | string | yes | When the revoke was applied (platform\_node\_principals.revoked\_at). | - `format date-time` |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

 Valid: project-owned

~~~~
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnpt",
  "principal_id": "lnk_01JAB2C3D4E5F6G7H8J9K0MNPT",
  "owner": {
    "kind": "project",
    "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
~~~~

Valid: revoked-by-owner

~~~~
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "principal_id": "lnk_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
~~~~

Valid: revoked-by-service

~~~~
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "principal_id": "lnk_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "reason": "the owner disconnected the machine from Bot",
  "at": "2026-10-04T18:00:00.000Z"
}
~~~~

Rejected: bad-node-id

~~~~
{
  "node_id": "node-1",
  "principal_id": "lnk_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
~~~~

Rejected: missing-principal

~~~~
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
~~~~

Rejected: owner-mixed

~~~~
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "principal_id": "lnk_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR",
    "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('network.link.revoked@1', value);   // { valid, errors: [{ path, message }] }
~~~~
