VipMembersResult vip.members-result@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/members-result.v1.json

vip.members-result@1: the answer of vip.creator.members.list on OpenVibe.VIP. GET /api/v1/creators/:ref/members → { creator, source, note?, members }: the creator's active members with the membership VIP filed for each (the plan version they joined under; null when VIP has none). source billing: Billing's active subscriptions to the creator; source projection: Billing did not answer and the list is VIP's fresh projection rows, possibly incomplete (note says so). For the creator, staff or a service holding the capability; 404 vip.creator_not_found.

Fields

FieldTypeRequiredDescriptionConstraints
creatorvip.creatoryes
sourceenumyes
  • one of "billing", "projection"
notestring
membersarray of objectyes
members[].memberidentity.subject-refyes
members[].current_period_endstring | nullyes
members[].cancel_at_period_endbooleanyes
members[].subscription_idstring | nullyesThe Billing subscription (sub_…).
members[].membershipone ofyes

Examples

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

Valid: billing
{
  "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"
  },
  "source": "billing",
  "members": [
    {
      "member": {
        "type": "user",
        "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
      },
      "current_period_end": "2026-10-20T18:04:11.000Z",
      "cancel_at_period_end": false,
      "subscription_id": "sub_01JAB2C3D4E5F6G7H8J9K0MNQ3",
      "membership": {
        "id": "vms_01JAB2C3D4E5F6G7H8J9K0MNPX",
        "member": {
          "type": "user",
          "id": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
        },
        "creator_id": "vcr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
        "plan_id": "vpl_01JAB2C3D4E5F6G7H8J9K0MNPW",
        "plan_version": {
          "id": "vpv_01JAB2C3D4E5F6G7H8J9K0MNPT",
          "version": 2,
          "name": "Supporter",
          "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"
          }
        },
        "perks": [
          "chat-badge"
        ],
        "origin": "checkout",
        "joined_at": "2026-09-20T18:04:11.402Z",
        "terms_since": "2026-09-20T18:04:11.402Z"
      }
    }
  ]
}
Valid: projection
{
  "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"
  },
  "source": "projection",
  "note": "Billing did not answer; this list is VIP's projection (fresh rows only) and may be incomplete",
  "members": []
}
Rejected: bad-source
{
  "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"
  },
  "source": "cache",
  "members": []
}

Validate

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