type: object
description: |
    A purchasable bundle of one or more `MediaItem`s. Mirrors
    `Schemas.MediaProduct` (LegacySchemas.ts). Carries marketing copy, pricing
    integrations (Stripe / Oculus IAP), entitlement class, and synchronization
    interval for rooms.
required: [id, bigMediaId, status, title, mediaItemIds, entitlementClass]
properties:
    id: { type: string, description: Internal UUID. }
    createdAt: { type: string, format: date-time }
    bigMediaId:
        type: string
        description: Public identifier — anyone can use this to request the product.
    status:
        type: string
        description: "`ProductStatus` value — typically `DRAFT`, `PUBLISHED`, or `RETIRED`."
    title:
        type: string
        description: Display title (also used as the Stripe product name).
    description:
        type: string
    url:
        type: string
        description: Human-readable URL slug.
    mediaItemIds:
        type: array
        items: { type: string }
        description: Media items bundled in this product.
    startingMediaItemId:
        type: [string, "null"]
        description: For movie nights — the media item to play first.
    featuredMediaItemId:
        type: [string, "null"]
        description: For movie nights — the featured "main feature" item.
    duration:
        type: integer
        description: Combined duration of all media items, in milliseconds.
    loops:
        type: boolean
        description: Whether the media loops on playback.
    is3D:
        type: boolean
        description: Indicates the main feature is stereoscopic.
    marketingData:
        type: object
        additionalProperties: true
        description: |
            Per-locale marketing payload. Keyed by locale (e.g. `en-US`); values are
            `ProductMarketing` records (titles, descriptions, image / texture URLs).
    locationCodes:
        type: array
        items: { type: string }
    deviceCode:
        type: string
    stripeProductData:
        type: object
        additionalProperties: true
        description: Cached Stripe product object (https://stripe.com/docs/api/products/object).
    oculusProductData:
        type: object
        additionalProperties: true
        description: Cached Oculus IAP product info.
    entitlementClass:
        type: string
        description: "Maps to what's shown on the purchase page (e.g. `TWO_DAY_RENTAL`, `OWNERSHIP`)."
    synchronizationInterval:
        type: integer
        description: |
            Interval (minutes, 0–30) used to generate showing time slots. `0` means the
            sync timestamp is set when the first person joins the room.
    roomSettings:
        type: object
        additionalProperties: true
example:
    id: "01HXKV8QRSTU9VWXYZABCDEFGH"
    createdAt: "2026-04-15T11:09:31.000Z"
    bigMediaId: "bbb-2008"
    status: "PUBLISHED"
    title: "Big Buck Bunny"
    description: "Open-source animated short."
    url: "big-buck-bunny"
    mediaItemIds: ["01HXKV7N8PQRSTU9VWXYZABCDE"]
    startingMediaItemId: null
    featuredMediaItemId: "01HXKV7N8PQRSTU9VWXYZABCDE"
    duration: 596000
    loops: false
    is3D: false
    locationCodes: ["us", "de", "fr", "jp", "ca"]
    deviceCode: "Unrestricted"
    entitlementClass: "TWO_DAY_RENTAL"
    synchronizationInterval: 15
