{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/easy2257-com/json-schema/easy2257-com-collab-scene-detail-response-schema.json",
  "title": "CollabSceneDetailResponse",
  "x-generated": "2026-11-06",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/easy2257-com-openapi.yml#/components/schemas/CollabSceneDetailResponse",
  "type": "object",
  "properties": {
    "sceneId": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending_signatures",
        "greenlit",
        "blocked",
        "cancelled"
      ],
      "description": "`pending_signatures`: waiting on performers. `greenlit`: everyone signed and every new performer passed ID verification. This is the only status that permits publication. `blocked`: a performer refused, or the 14-day window lapsed. `cancelled`: cancelled through the API. No refund."
    },
    "performerCount": {
      "type": "integer"
    },
    "consentedCount": {
      "type": "integer"
    },
    "releaseSignedCount": {
      "type": "integer",
      "description": "Same field POST /extend returns, so release progress reads the same way on both endpoints."
    },
    "refusedCount": {
      "type": "integer"
    },
    "performers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending_consent",
              "consented",
              "refused"
            ],
            "description": "`pending_consent`: invited, has not yet signed. This one value covers every unsigned performer, whether or not the address already had an Easy2257 account: registration and ID verification, when needed, happen inside the magic-link flow and are never visible here, so performer status cannot be used to probe whether an email is already on Easy2257. `consented`: release signed and consent recorded. `refused`: performer declined, which blocks the scene. When the signing window lapses, the scene flips to `blocked` while unsigned performers stay `pending_consent`."
          }
        },
        "required": [
          "email",
          "status"
        ],
        "description": "Email and status, nothing else. There is deliberately no per-performer flag saying whether the address already had an Easy2257 account: that would be an account-existence oracle on arbitrary emails."
      },
      "description": "Present only for the partner that CREATED the scene, which is the partner that supplied these addresses. A partner holding only a publication on somebody else's scene receives the counts above and no roster."
    },
    "fees": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "sceneFeeCents": {
          "type": "integer",
          "description": "Base scene record fee, 500 cents."
        },
        "onboardingFeeCents": {
          "type": "integer",
          "description": "2500 cents for each performer who did not already have an active Easy2257 solo account or an approved ID check from a collab scene in the last 12 months. Performers who hold either add nothing: the fee is once per person, not once per scene. The split is an aggregate for the whole scene; it is not itemized per performer."
        },
        "totalCents": {
          "type": "integer"
        },
        "charged": {
          "type": "boolean",
          "description": "true once a Stripe charge id is on the record. The scene is created either way: a billing failure does not block consent collection, so check this rather than assuming payment succeeded. On `billedTo: platform_invoice` it stays false: the fees are collected with your monthly platform invoice."
        },
        "stripeChargeId": {
          "type": [
            "string",
            "null"
          ],
          "description": "Despite the field name this holds the Stripe PaymentIntent id, charged off-session against the uploader's saved payment method. null when `billedTo` is `platform_invoice`."
        },
        "billedTo": {
          "type": "string",
          "enum": [
            "uploader_card",
            "platform_invoice"
          ],
          "description": "Who pays the fees. `uploader_card`: charged off-session to the uploading creator's saved card. `platform_invoice`: a platform-funded account with collab scenes switched on; the fees are added to your platform's next monthly invoice, so `charged` stays false and `stripeChargeId` null."
        }
      },
      "required": [
        "sceneFeeCents",
        "onboardingFeeCents",
        "totalCents",
        "charged",
        "stripeChargeId",
        "billedTo"
      ],
      "description": "The creating partner's charge for the scene; null when no fee row exists. Absent entirely for a partner holding only a publication, since it is another partner's billing record."
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    },
    "publications": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "contentUrl": {
            "type": "string",
            "format": "uri"
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "contentUrl",
          "publishedAt",
          "removedAt"
        ]
      },
      "description": "Only the publications you registered. Other platforms' URLs for the same scene are never visible to you, and yours are never visible to them."
    }
  },
  "required": [
    "sceneId",
    "status",
    "performerCount",
    "consentedCount",
    "releaseSignedCount",
    "refusedCount",
    "expiresAt",
    "publications"
  ]
}