{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/easy2257-com/json-schema/easy2257-com-create-collab-scene-body-schema.json",
  "title": "CreateCollabSceneBody",
  "description": "Identify the uploader with exactly one of `uploaderAccountId` or `uploaderExternalUserId`: zero is `400` / `missing_field`, more than one is `400` / `invalid_field`. Both are values you already hold; no endpoint ever returns an Easy2257 user id, so there is nothing else to send. (A legacy `uploaderUserId` field exists for Easy2257-internal callers only and is not usable by partners.)",
  "x-generated": "2026-11-06",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/easy2257-com-openapi.yml#/components/schemas/CreateCollabSceneBody",
  "type": "object",
  "properties": {
    "uploaderAccountId": {
      "type": "string",
      "description": "The `accountId` Easy2257 issued when you provisioned the uploader's solo account. Send exactly one of `uploaderAccountId` or `uploaderExternalUserId`. Either must resolve to an active solo account under your partner account, otherwise the call returns `400` with code `uploader_not_solo_active`."
    },
    "uploaderExternalUserId": {
      "type": "string",
      "description": "Your own user id for the uploader, exactly as you supplied it as `externalUserId` at provisioning. Alternative to `uploaderAccountId`; send one or the other, never both."
    },
    "title": {
      "type": "string",
      "maxLength": 500
    },
    "shootDate": {
      "type": "string",
      "format": "date-time"
    },
    "performers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          }
        },
        "required": [
          "email"
        ]
      },
      "minItems": 1,
      "maxItems": 10,
      "description": "1 to 10 performers, addresses unique within the request. Easy2257 emails each one a magic link. A performer who already has an active Easy2257 solo account signs and is done at no extra charge; so does returning collab talent whose approved ID check is from the last 12 months. Anyone else completes registration and ID verification inside the same link at 2500 cents, once per person. The response never says which path an individual performer is on."
    },
    "uploaderAttestation": {
      "type": "object",
      "properties": {
        "ip": {
          "type": "string",
          "description": "Uploader's IP at the moment they clicked."
        },
        "ua": {
          "type": "string"
        },
        "clickedAt": {
          "type": "string",
          "format": "date-time"
        },
        "attestationText": {
          "type": "string",
          "description": "The exact statement the uploader confirmed. Stored verbatim with IP and user agent as the 18 U.S.C. § 2257(b)(1) producer attestation."
        }
      },
      "required": [
        "ip",
        "ua",
        "clickedAt",
        "attestationText"
      ],
      "description": "All four fields required. Capture them from a real click event in your UI: this is the producer attestation, and a synthesized one is worth nothing in an inspection."
    },
    "callbackUrl": {
      "type": "string",
      "format": "uri",
      "description": "Required, and stored for your reference only. Scene events go to the endpoints registered in the partner portal."
    }
  },
  "required": [
    "title",
    "performers",
    "uploaderAttestation",
    "callbackUrl"
  ]
}