VipPlan vip.plan@1

Generated at from openvibe-contracts v0.53.0 and openvibe-sdk v0.11.0.

Version
1.0.0
Owner
vip
Visibility
first-party
Status
active
Compatibility
backward
Schema
https://openvibe.network/contracts/vip/plan.v1.json

vip.plan@1: a membership plan on OpenVibe.VIP (server/domain/plans.js present). status draft (not offered), published (what new members buy) or archived (no new members; existing members keep their terms until Billing ends their membership). current_version is the published terms; draft_version is a newer unpublished version, if any. purchasable: published and sold through a Billing product (billing_kind). The API adds creator to a single plan it answers about.

Fields

FieldTypeRequiredDescriptionConstraints
idstringyes
  • pattern ^vpl_[0-9A-HJKMNP-TV-Z]{26}$
creator_idstringyes
  • pattern ^(vcr_[0-9A-HJKMNP-TV-Z]{26}|network)$
slugstringyes
  • pattern ^[a-z0-9][a-z0-9-]{0,47}$
statusenumyes
  • one of "draft", "published", "archived"
billing_kindenumyesThe Billing product that sells it; null for a plan Billing does not sell (network plans).
  • one of "channel_subscription", null
purchasablebooleanyes
current_versionone ofyes
draft_versionone ofyes
created_atstringyes
  • format date-time
updated_atstringyes
  • format date-time
archived_atstring | nullyes
  • format date-time
creatorvip.creatorPresent when the API answers about one plan (GET/POST/PATCH /api/v1/plans…).

Examples

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

Valid: draft
{
  "id": "vpl_01JAB2C3D4E5F6G7H8J9K0MNPW",
  "creator_id": "vcr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "slug": "supporter",
  "status": "draft",
  "billing_kind": "channel_subscription",
  "purchasable": false,
  "current_version": null,
  "draft_version": {
    "id": "vpv_01JAB2C3D4E5F6G7H8J9K0MNPT",
    "version": 1,
    "name": "Supporter",
    "description": "Back the stream every month.",
    "benefits": [
      "Supporter badge in chat",
      "Members-only VOD chapters"
    ],
    "perks": [
      {
        "id": "vpk_01JAB2C3D4E5F6G7H8J9K0MNPV",
        "key": "chat-badge",
        "name": "Chat badge"
      }
    ],
    "terms": {
      "name": "Supporter",
      "description": "Back the stream every month.",
      "benefits": [
        "Supporter badge in chat",
        "Members-only VOD chapters"
      ],
      "perks": [
        {
          "key": "chat-badge",
          "name": "Chat badge",
          "kind": "badge",
          "scope": "creator"
        }
      ],
      "billing_kind": "channel_subscription",
      "price": "set and charged by OpenVibe.Billing",
      "digest": "3fa9c0d27e5b8814"
    },
    "change_note": "created",
    "created_at": "2026-09-20T18:04:11.402Z",
    "published_at": null
  },
  "created_at": "2026-09-20T18:04:11.402Z",
  "updated_at": "2026-09-20T18:04:11.402Z",
  "archived_at": null
}
Valid: published
{
  "id": "vpl_01JAB2C3D4E5F6G7H8J9K0MNPW",
  "creator_id": "vcr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "slug": "supporter",
  "status": "published",
  "billing_kind": "channel_subscription",
  "purchasable": true,
  "current_version": {
    "id": "vpv_01JAB2C3D4E5F6G7H8J9K0MNPT",
    "version": 2,
    "name": "Supporter",
    "description": "Back the stream every month.",
    "benefits": [
      "Supporter badge in chat",
      "Members-only VOD chapters"
    ],
    "perks": [
      {
        "id": "vpk_01JAB2C3D4E5F6G7H8J9K0MNPV",
        "key": "chat-badge",
        "name": "Chat badge"
      }
    ],
    "terms": {
      "name": "Supporter",
      "description": "Back the stream every month.",
      "benefits": [
        "Supporter badge in chat",
        "Members-only VOD chapters"
      ],
      "perks": [
        {
          "key": "chat-badge",
          "name": "Chat badge",
          "kind": "badge",
          "scope": "creator"
        }
      ],
      "billing_kind": "channel_subscription",
      "price": "set and charged by OpenVibe.Billing",
      "digest": "3fa9c0d27e5b8814"
    },
    "change_note": "added VOD chapters",
    "created_at": "2026-09-20T18:04:11.402Z",
    "published_at": "2026-09-20T18:04:11.402Z"
  },
  "draft_version": null,
  "created_at": "2026-09-20T18:04:11.402Z",
  "updated_at": "2026-09-20T18:04:11.402Z",
  "archived_at": null,
  "creator": {
    "id": "vcr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
    "kind": "creator",
    "subject": {
      "type": "user",
      "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
    },
    "username": "moosefan",
    "display_name": "Moose Fan",
    "bio": "Late-night builds and chill.",
    "status": "active"
  }
}
Rejected: bad-status
{
  "id": "vpl_01JAB2C3D4E5F6G7H8J9K0MNPW",
  "creator_id": "vcr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "slug": "supporter",
  "status": "live",
  "billing_kind": "channel_subscription",
  "purchasable": true,
  "current_version": {
    "id": "vpv_01JAB2C3D4E5F6G7H8J9K0MNPT",
    "version": 2,
    "name": "Supporter",
    "description": "Back the stream every month.",
    "benefits": [
      "Supporter badge in chat",
      "Members-only VOD chapters"
    ],
    "perks": [
      {
        "id": "vpk_01JAB2C3D4E5F6G7H8J9K0MNPV",
        "key": "chat-badge",
        "name": "Chat badge"
      }
    ],
    "terms": {
      "name": "Supporter",
      "description": "Back the stream every month.",
      "benefits": [
        "Supporter badge in chat",
        "Members-only VOD chapters"
      ],
      "perks": [
        {
          "key": "chat-badge",
          "name": "Chat badge",
          "kind": "badge",
          "scope": "creator"
        }
      ],
      "billing_kind": "channel_subscription",
      "price": "set and charged by OpenVibe.Billing",
      "digest": "3fa9c0d27e5b8814"
    },
    "change_note": "added VOD chapters",
    "created_at": "2026-09-20T18:04:11.402Z",
    "published_at": "2026-09-20T18:04:11.402Z"
  },
  "draft_version": null,
  "created_at": "2026-09-20T18:04:11.402Z",
  "updated_at": "2026-09-20T18:04:11.402Z",
  "archived_at": null
}

Validate

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