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

# network.consent.changed@1 · OpenVibe.Services

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

# NetworkConsentChangedPayload `network.consent.changed@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
- Schema: [`https://openvibe.network/contracts/events/payloads/network.consent.changed.v1.json`](/docs/contracts/network.consent.changed.json)

network.consent.changed v1 (OpenVibe.Network, L24): a person turned a purpose on or off, an app's grant was revoked, or a choice expired. A service that caches consent answers drops that subject's answers for the purpose at once; one that is running a use for the subject (a dataset build, a recognition, an AI text) checks again before it goes on. The payload names the change and never the content it covers.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `consent_id` | string | yes |  | - `pattern ^cns_[0-9A-HJKMNP-TV-Z]{26}$` |
| `subject` | string | yes |  | - `pattern ^usr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `purpose` | enum | yes |  | - `one of "ai.train", "data.public", "face.recognize", "ai.looks", "app.data"` |
| `client` | string \| null | yes |  | - `pattern ^[A-Za-z0-9][A-Za-z0-9_.:-]{0,79}$` |
| `on` | boolean | yes | Whether the purpose is allowed after the change. |  |
| `kinds` | array of enum | yes |  | - `maxItems 8`<br>- `unique items`<br>- `items: one of "streams", "vods", "clips", "voice", "chat", "posts", "pictures", "code"` |
| `text_version` | string | yes |  | - `pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}\.[0-9]{1,3}$` |
| `changed_at` | string | yes |  | - `format date-time` |

## Examples

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

 Valid: turned-on

~~~~
{
  "consent_id": "cns_01K6R3A1B2C3D4E5F6G7H8J9KA",
  "subject": "usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4",
  "purpose": "ai.train",
  "client": null,
  "on": true,
  "kinds": [
    "streams"
  ],
  "text_version": "2026-10-31.1",
  "changed_at": "2026-10-31T05:00:00.000Z"
}
~~~~

Rejected: carries-content

~~~~
{
  "consent_id": "cns_01K6R3A1B2C3D4E5F6G7H8J9KA",
  "subject": "usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4",
  "purpose": "ai.train",
  "client": null,
  "on": true,
  "kinds": [
    "chat"
  ],
  "text_version": "2026-10-31.1",
  "changed_at": "2026-10-31T05:00:00.000Z",
  "content": "hello"
}
~~~~

## Validate

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