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

# network.me-consent-result@1 · OpenVibe.Services

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

# NetworkMeConsentResult `network.me-consent-result@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: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/network/me-consent-result.v1.json`](/docs/contracts/network.me-consent-result.json)

network.me-consent-result@1 (L24): "Your data choices" for the signed-in person. GET /api/v1/me/consent (and the answer to PUT /api/v1/me/consent/:purpose and DELETE /api/v1/me/consent/:purpose/:client) on OpenVibe.Network. Every purpose is listed with the words the account page shows, whether the person has turned it on, and the history of their changes. Off is the default for every purpose.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `purposes` | array of object | yes |  | - `maxItems 16`<br>- `items: no other fields` |
| `purposes[].id` | enum | yes |  | - `one of "ai.train", "data.public", "face.recognize", "ai.looks", "app.data"` |
| `purposes[].title` | string | yes |  | - `minLength 1`<br>- `maxLength 80` |
| `purposes[].allows` | string | yes | What turning it on allows, in one plain line. | - `minLength 1`<br>- `maxLength 300` |
| `purposes[].off` | string | yes | What turning it off does. | - `minLength 1`<br>- `maxLength 300` |
| `purposes[].cannot_undo` | string | yes | What turning it off cannot undo (empty when nothing). | - `maxLength 300` |
| `purposes[].adults_only` | boolean | yes | Turning it on asks the person to confirm they are 18 or older. |  |
| `purposes[].kinds` | array of enum | yes | The kinds of content the person may narrow it to (empty: the purpose takes none). | - `maxItems 8`<br>- `unique items`<br>- `items: one of "streams", "vods", "clips", "voice", "chat", "posts", "pictures", "code"` |
| `purposes[].text_version` | string | yes |  | - `pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}\.[0-9]{1,3}$` |
| `consents` | [network.consent](/docs/contracts/network.consent) | yes | The person's active choices (network.consent@1), one per purpose and app. | - `maxItems 200` |
| `history` | array of object | yes | The newest changes first. | - `maxItems 200`<br>- `items: no other fields` |
| `history[].consent_id` | string | yes |  | - `pattern ^cns_[0-9A-HJKMNP-TV-Z]{26}$` |
| `history[].purpose` | enum | yes |  | - `one of "ai.train", "data.public", "face.recognize", "ai.looks", "app.data"` |
| `history[].client` | string \| null |  |  | - `pattern ^[A-Za-z0-9][A-Za-z0-9_.:-]{0,79}$` |
| `history[].action` | enum | yes |  | - `one of "granted", "revoked", "expired"` |
| `history[].at` | string | yes |  | - `format date-time` |
| `history[].by` | enum | yes | Who made the change: the person, the app being revoked, an account merge, an account deletion, or the move of an older record. | - `one of "person", "app_revoked", "merge", "deletion", "import"` |
| `history[].text_version` | string | yes |  | - `pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}\.[0-9]{1,3}$` |

## Examples

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

 Valid: one-choice

~~~~
{
  "purposes": [
    {
      "id": "ai.train",
      "title": "Train AI on my content",
      "allows": "OpenVibe may train or fine-tune its models on the content you pick.",
      "off": "Off: nothing new of yours is used for training.",
      "cannot_undo": "A model already trained keeps what it learned.",
      "adults_only": true,
      "kinds": [
        "streams",
        "vods",
        "clips",
        "voice",
        "chat",
        "posts",
        "pictures",
        "code"
      ],
      "text_version": "2026-10-31.1"
    }
  ],
  "consents": [
    {
      "id": "cns_01K6R3A1B2C3D4E5F6G7H8J9KA",
      "subject": "usr_01K6R2Z8C4V7M9Q3T5W1X2Y3Z4",
      "purpose": "ai.train",
      "on": true,
      "kinds": [
        "streams",
        "vods"
      ],
      "client": null,
      "options": {},
      "text_version": "2026-10-31.1",
      "source": "account",
      "granted_at": "2026-10-31T05:00:00.000Z",
      "revoked_at": null,
      "expires_at": null
    }
  ],
  "history": [
    {
      "consent_id": "cns_01K6R3A1B2C3D4E5F6G7H8J9KA",
      "purpose": "ai.train",
      "client": null,
      "action": "granted",
      "at": "2026-10-31T05:00:00.000Z",
      "by": "person",
      "text_version": "2026-10-31.1"
    }
  ]
}
~~~~

Rejected: unknown-action

~~~~
{
  "purposes": [],
  "consents": [],
  "history": [
    {
      "consent_id": "cns_01K6R3A1B2C3D4E5F6G7H8J9KA",
      "purpose": "ai.train",
      "action": "sold",
      "at": "2026-10-31T05:00:00.000Z",
      "by": "person",
      "text_version": "2026-10-31.1"
    }
  ]
}
~~~~

## Validate

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