---
title: "Get a collab scene"
method: GET
path: "/api/v1/collab-scenes/{sceneId}"
tags: ["Collab Scenes"]
---

# Get a collab scene

`GET /api/v1/collab-scenes/{sceneId}`

## Request

- Base URL: `https://easy2257.com`
- URL: `https://easy2257.com/api/v1/collab-scenes/{sceneId}`
- Auth: HTTP bearer

Current scene status and consent progress. Prefer webhooks for real-time signals and use this for dashboards and reconciliation. Visible to the partner that created the scene and to any partner that has registered a publication on it. Publications in the response are scoped to you. The body depends on which of those you are: the creating partner gets the performer roster and the fee block as well as the counts, because it supplied those addresses and paid those fees; a partner holding only a publication gets the counts, matching what `POST /extend` returns.

## Path parameters

- `sceneId` string, required

## Response `200`

Scene found.

- object: Two shapes behind one endpoint, decided by whether you created the scene. Both carry the counts; only the creating partner also gets the performer roster and the fee block.
  - `sceneId` string, required
  - `status` 'pending_signatures' | 'greenlit' | 'blocked' | 'cancelled', required: `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` integer, required
  - `consentedCount` integer, required
  - `releaseSignedCount` integer, required: Same field POST /extend returns, so release progress reads the same way on both endpoints.
  - `refusedCount` integer, required
  - `performers` object[]: 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.
    - `email` string, email, required
    - `status` 'pending_consent' | 'consented' | 'refused', required: `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`.
  - `fees` object, nullable: 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.
    - `sceneFeeCents` integer, required: Base scene record fee, 500 cents.
    - `onboardingFeeCents` integer, required: 2500 cents for each performer who did not already have an active Easy2257 solo account. Performers who already hold one add nothing. The split is an aggregate for the whole scene; it is not itemized per performer.
    - `totalCents` integer, required
    - `charged` boolean, required: 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` string, nullable, required: 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` 'uploader_card' | 'platform_invoice', required: 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.
  - `expiresAt` string, date-time, required
  - `publications` object[], required: Only the publications you registered. Other platforms' URLs for the same scene are never visible to you, and yours are never visible to them.
    - `id` string, required
    - `contentUrl` string, uri, required
    - `publishedAt` string, date-time, required
    - `removedAt` string, date-time, nullable, required

## Other responses

- `400`: Invalid request: a required field is missing or malformed.
- `401`: No `Authorization: Bearer` header, or a key that is unknown, revoked, or expired. The body carries only `error`, never a `code`.
- `403`: Rejected before the handler: a test-mode key (`TEST_MODE_UNAVAILABLE`) or a partner account that is not ACTIVE. Never used for cross-partner access, which returns 404.
- `404`: No such scene, or one you neither created nor published.
- `429`: Rate limit exceeded: 300 requests per 60 seconds per API key, shared across all `/api/v1` endpoints (requests without a `Bearer` key fall back to 60 per 60 seconds per client IP, and a per-address flood ceiling of 1200 per 60 seconds also applies). Honor `Retry-After`.
- `500`: Server error. Retry with exponential backoff.

---

[API](https://skmtc.dev/easy2257/apis/easy2257-partner-api.md) · [All operations](https://skmtc.dev/easy2257/apis/easy2257-partner-api/llms.txt) · [OpenAPI document](https://skmtc.dev/easy2257/apis/easy2257-partner-api/revisions/f880026c1f04?raw)
