{"openapi":"3.1.0","info":{"title":"DCAST Partner API","version":"1.0.0","description":"REST API for partners building on the dcast platform — videos, live streams, multi-destination restreams, LiveKit rooms, monetization, analytics, and webhooks. Bearer pk_* authentication. Stripe-style idempotency on monetary POSTs. HMAC-signed outgoing webhooks. Monetization endpoints are origin-locked: a checkout / payment call only succeeds from a dcast platform host, your verified creator domain, or an integration domain you have DECLARED and VERIFIED for your account (see the bearerAuth notes and the OriginNotAllowed response). Full topic pages at https://dcast.pro/docs.","contact":{"name":"dcast support","url":"https://dcast.pro/support"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://api.dcast.pro/api/v1","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Account"},{"name":"Analytics"},{"name":"Auth"},{"name":"Booking"},{"name":"Bridges"},{"name":"Changelog"},{"name":"Channels"},{"name":"Health"},{"name":"Monetization"},{"name":"Notifications"},{"name":"Playlists"},{"name":"Purchases"},{"name":"Quota"},{"name":"Restreams"},{"name":"Rooms"},{"name":"Stats"},{"name":"Streams"},{"name":"Subscriptions"},{"name":"Summary"},{"name":"Support"},{"name":"Team"},{"name":"Tiers"},{"name":"Upload"},{"name":"Usage"},{"name":"Users"},{"name":"Videos"},{"name":"Webhooks"}],"paths":{"/account/analytics":{"get":{"tags":["Account"],"operationId":"get_account_analytics","summary":"GET /account/analytics","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/account":{"get":{"tags":["Analytics"],"operationId":"get_analytics_account","summary":"GET /analytics/account","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/geography":{"get":{"tags":["Analytics"],"operationId":"get_analytics_geography","summary":"GET /analytics/geography","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/stats":{"get":{"tags":["Analytics"],"operationId":"get_analytics_stats","summary":"GET /analytics/stats","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/streams":{"get":{"tags":["Analytics"],"operationId":"get_analytics_streams","summary":"GET /analytics/streams","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/streams/{id}":{"get":{"tags":["Analytics"],"operationId":"get_analytics_streams_id","summary":"GET /analytics/streams/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/summary":{"get":{"tags":["Analytics"],"operationId":"get_analytics_summary","summary":"GET /analytics/summary","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/videos":{"get":{"tags":["Analytics"],"operationId":"get_analytics_videos","summary":"GET /analytics/videos","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/analytics/videos/{id}":{"get":{"tags":["Analytics"],"operationId":"get_analytics_videos_id","summary":"GET /analytics/videos/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/auth/login":{"post":{"tags":["Auth"],"operationId":"post_auth_login","summary":"POST /auth/login","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Signed in. NOTE the non-standard body: `tokens` and `user` sit at the TOP LEVEL, there is no `data` envelope.","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRelease"},"examples":{"signedIn":{"summary":"Signed in — `tokens` and `user` are TOP-LEVEL. Reading response.data here yields undefined","value":{"success":true,"tokens":{"accessToken":"<jwt>","expiresIn":86400},"user":{"id":"cmuser000000000000000000u1","email":"creator@example.com","name":"Alex Rivera","role":"USER"}}}}}}},"400":{"description":"HTTP 400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"missingField":{"summary":"Either field absent or not a string","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"email and password are required"}}}}}}},"401":{"description":"HTTP 401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"rejected":{"summary":"ONE body for unknown address, wrong password and suspended account alike — deliberately indistinguishable, so do not word your UI as \"no such user\"","value":{"success":false,"error":{"code":"INVALID_CREDENTIALS","message":"Invalid credentials"}}},"secondFactorRequired":{"summary":"Password was correct. A 401 that is NOT a failure: carry challengeId to POST /api/auth/login/2fa with the code","value":{"success":false,"twoFactorRequired":true,"challengeId":"QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZn","expiresIn":300,"error":{"code":"SECOND_FACTOR_REQUIRED","message":"Complete sign-in at POST /api/auth/login/2fa with this challengeId and your code"}}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"description":"SECOND_FACTOR_UNAVAILABLE — the password was accepted but the second-factor step could not be started. Retry."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"description":"Sign one of YOUR end-users into their dcast account. Sent with your pk_ key: the rate limit is applied per key as well as per address.","properties":{"email":{"type":"string","description":"Lower-cased before lookup."},"password":{"type":"string"}}},"examples":{"default":{"summary":"Both fields are required; either one missing or non-string is 400 BAD_REQUEST","value":{"email":"creator@example.com","password":"the-end-user-password"}}}}}}}},"/auth/register":{"post":{"tags":["Auth"],"operationId":"post_auth_register","summary":"POST /auth/register","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Account created. NOTE the non-standard body: `tokens` and `user` sit at the TOP LEVEL, there is no `data` envelope.","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRelease"},"examples":{"created":{"summary":"Created — same top-level `tokens`/`user` shape as login, and 201 rather than 200","value":{"success":true,"tokens":{"accessToken":"<jwt>","expiresIn":86400},"user":{"id":"cmuser000000000000000000u1","email":"creator@example.com","name":"Alex Rivera","role":"USER"}}}}}}},"400":{"description":"HTTP 400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"weakPassword":{"summary":"Length is the only password rule enforced here","value":{"success":false,"error":{"code":"WEAK_PASSWORD","message":"Password must be at least 12 characters"}}},"invalidEmail":{"summary":"Distinct code from the missing-field 400 — branch on error.code, not on the message","value":{"success":false,"error":{"code":"INVALID_EMAIL","message":"Email format is invalid"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"EMAIL_EXISTS — that address already has an account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"emailExists":{"summary":"Already registered. The same body is returned when two registrations race, so treat it as idempotent-ish and sign in instead","value":{"success":false,"error":{"code":"EMAIL_EXISTS","message":"Email already registered"}}}}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","maxLength":254,"description":"Trimmed + lower-cased; a malformed address is 400 INVALID_EMAIL."},"password":{"type":"string","minLength":12,"description":"Shorter than 12 characters is 400 WEAK_PASSWORD."},"name":{"type":["string","null"],"description":"Optional. Trimmed and truncated to 120 characters. A non-string is 400."}}},"examples":{"minimal":{"summary":"name omitted — the account is created without a display name","value":{"email":"new-creator@example.com","password":"a-long-enough-passphrase"}},"withName":{"summary":"With a display name, which is trimmed and cut to 120 characters","value":{"email":"new-creator@example.com","password":"a-long-enough-passphrase","name":"Alex Rivera"}}}}}}}},"/booking/availability":{"get":{"tags":["Booking"],"operationId":"get_booking_availability","summary":"GET /booking/availability","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"put":{"tags":["Booking"],"operationId":"put_booking_availability","summary":"PUT /booking/availability","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["weeklyJson"],"properties":{"weeklyJson":{"type":"object","description":"Object keyed by day-of-week (mon..sun) → array of {start,end} HH:MM windows"},"timezone":{"type":"string"},"blackoutsJson":{"type":"array"},"minNoticeMin":{"type":"integer","minimum":0},"maxAdvanceDays":{"type":"integer","minimum":0}}}}}}}},"/booking/bookings":{"get":{"tags":["Booking"],"operationId":"get_booking_bookings","summary":"GET /booking/bookings","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/bookings/{id}":{"get":{"tags":["Booking"],"operationId":"get_booking_bookings_id","summary":"GET /booking/bookings/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/cohorts/{cohortId}":{"delete":{"tags":["Booking"],"operationId":"delete_booking_cohorts_cohortId","summary":"DELETE /booking/cohorts/:cohortId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"cohortId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Booking"],"operationId":"get_booking_cohorts_cohortId","summary":"GET /booking/cohorts/:cohortId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"cohortId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Booking"],"operationId":"patch_booking_cohorts_cohortId","summary":"PATCH /booking/cohorts/:cohortId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"cohortId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/cohorts/{cohortId}/videos":{"post":{"tags":["Booking"],"operationId":"post_booking_cohorts_cohortId_videos","summary":"POST /booking/cohorts/:cohortId/videos","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"cohortId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/cohorts/{cohortId}/videos/{cvId}":{"delete":{"tags":["Booking"],"operationId":"delete_booking_cohorts_cohortId_videos_cvId","summary":"DELETE /booking/cohorts/:cohortId/videos/:cvId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"cohortId","in":"path","required":true,"schema":{"type":"string"}},{"name":"cvId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/discount-codes":{"get":{"tags":["Booking"],"operationId":"get_booking_discount_codes","summary":"GET /booking/discount-codes","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Booking"],"operationId":"post_booking_discount_codes","summary":"POST /booking/discount-codes","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"description":"Either percentOff (1..100) OR amountCentsOff (≥1), exactly one of them. productId optional (creator-scope code if null).","properties":{"code":{"type":"string","minLength":1,"maxLength":64,"description":"Normalized to uppercase server-side. Unique per creator."},"productId":{"type":["string","null"]},"percentOff":{"type":["integer","null"],"minimum":1,"maximum":100},"amountCentsOff":{"type":["integer","null"],"minimum":1},"maxUses":{"type":["integer","null"],"minimum":1},"expiresAt":{"type":["string","null"],"format":"date-time"},"notes":{"type":["string","null"],"maxLength":500}}}}}}}},"/booking/discount-codes/{id}":{"delete":{"tags":["Booking"],"operationId":"delete_booking_discount_codes_id","summary":"DELETE /booking/discount-codes/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Booking"],"operationId":"patch_booking_discount_codes_id","summary":"PATCH /booking/discount-codes/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/products":{"get":{"tags":["Booking"],"operationId":"get_booking_products","summary":"GET /booking/products","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Booking"],"operationId":"post_booking_products","summary":"POST /booking/products","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","type","priceCents"],"properties":{"title":{"type":"string","minLength":1,"maxLength":200},"type":{"type":"string","enum":["ONE_TO_ONE","LIVE_CLASS","COHORT"]},"priceCents":{"type":"integer","minimum":0},"description":{"type":["string","null"],"maxLength":2000},"thumbnailUrl":{"type":["string","null"]},"durationMin":{"type":"integer","minimum":1,"maximum":600},"bufferMin":{"type":"integer","minimum":0},"capacity":{"type":"integer","minimum":1},"currency":{"type":"string","enum":["USD"]},"recordable":{"type":"boolean"},"replayAccessDays":{"type":"integer","minimum":0},"refundPolicyDays":{"type":"integer","minimum":0},"intakeFields":{"type":["array","null"]},"slug":{"type":["string","null"],"pattern":"^[a-z0-9-]+$"}}}}}}}},"/booking/products/{id}":{"delete":{"tags":["Booking"],"operationId":"delete_booking_products_id","summary":"DELETE /booking/products/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Booking"],"operationId":"get_booking_products_id","summary":"GET /booking/products/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Booking"],"operationId":"patch_booking_products_id","summary":"PATCH /booking/products/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/products/{id}/publish":{"post":{"tags":["Booking"],"operationId":"post_booking_products_id_publish","summary":"POST /booking/products/:id/publish","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/products/{id}/unpublish":{"post":{"tags":["Booking"],"operationId":"post_booking_products_id_unpublish","summary":"POST /booking/products/:id/unpublish","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/products/{productId}/cohorts":{"get":{"tags":["Booking"],"operationId":"get_booking_products_productId_cohorts","summary":"GET /booking/products/:productId/cohorts","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"productId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Booking"],"operationId":"post_booking_products_productId_cohorts","summary":"POST /booking/products/:productId/cohorts","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"productId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/booking/waitlist":{"get":{"tags":["Booking"],"operationId":"get_booking_waitlist","summary":"GET /booking/waitlist","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges":{"get":{"tags":["Bridges"],"operationId":"get_bridges","summary":"GET /bridges","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Bridges"],"operationId":"post_bridges","summary":"POST /bridges","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}":{"delete":{"tags":["Bridges"],"operationId":"delete_bridges_id","summary":"DELETE /bridges/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Bridges"],"operationId":"get_bridges_id","summary":"GET /bridges/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Bridges"],"operationId":"patch_bridges_id","summary":"PATCH /bridges/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/destinations":{"get":{"tags":["Bridges"],"operationId":"get_bridges_id_destinations","summary":"GET /bridges/:id/destinations","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Bridges"],"operationId":"post_bridges_id_destinations","summary":"POST /bridges/:id/destinations","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/events":{"get":{"tags":["Bridges"],"operationId":"get_bridges_id_events","summary":"GET /bridges/:id/events","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/recording/download":{"get":{"tags":["Bridges"],"operationId":"get_bridges_id_recording_download","summary":"GET /bridges/:id/recording/download","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/recording/qualities":{"get":{"tags":["Bridges"],"operationId":"get_bridges_id_recording_qualities","summary":"GET /bridges/:id/recording/qualities","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/return-pgm/start":{"post":{"tags":["Bridges"],"operationId":"post_bridges_id_return_pgm_start","summary":"POST /bridges/:id/return-pgm/start","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/return-pgm/stop":{"post":{"tags":["Bridges"],"operationId":"post_bridges_id_return_pgm_stop","summary":"POST /bridges/:id/return-pgm/stop","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/rotate-key":{"post":{"tags":["Bridges"],"operationId":"post_bridges_id_rotate_key","summary":"POST /bridges/:id/rotate-key","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/sources":{"get":{"tags":["Bridges"],"operationId":"get_bridges_id_sources","summary":"GET /bridges/:id/sources","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/start":{"post":{"tags":["Bridges"],"operationId":"post_bridges_id_start","summary":"POST /bridges/:id/start","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/stop":{"post":{"tags":["Bridges"],"operationId":"post_bridges_id_stop","summary":"POST /bridges/:id/stop","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/{id}/tally-endpoints":{"patch":{"tags":["Bridges"],"operationId":"patch_bridges_id_tally_endpoints","summary":"PATCH /bridges/:id/tally-endpoints","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/destinations/{destId}":{"delete":{"tags":["Bridges"],"operationId":"delete_bridges_destinations_destId","summary":"DELETE /bridges/destinations/:destId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"destId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Bridges"],"operationId":"patch_bridges_destinations_destId","summary":"PATCH /bridges/destinations/:destId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"destId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/sources":{"get":{"tags":["Bridges"],"operationId":"get_bridges_sources","summary":"GET /bridges/sources","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Bridges"],"operationId":"post_bridges_sources","summary":"POST /bridges/sources","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/bridges/sources/{sourceId}":{"delete":{"tags":["Bridges"],"operationId":"delete_bridges_sources_sourceId","summary":"DELETE /bridges/sources/:sourceId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/changelog":{"get":{"tags":["Changelog"],"operationId":"get_changelog","summary":"GET /changelog","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/channel/{username}":{"get":{"tags":["Channels"],"operationId":"get_channel_username","summary":"GET /channel/:username","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"description":"Public channel profile. Shape documented at /docs/channels.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Channel not found."}}}},"/channel/{username}/playlists":{"get":{"tags":["Channels"],"operationId":"get_channel_username_playlists","summary":"GET /channel/:username/playlists","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"description":"Channel playlists.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Channel not found."}}}},"/channel/{username}/videos":{"get":{"tags":["Channels"],"operationId":"get_channel_username_videos","summary":"GET /channel/:username/videos","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"description":"Channel public videos.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Channel not found."}}}},"/checkout/subscription":{"post":{"tags":["Monetization"],"operationId":"post_checkout_subscription","summary":"Start a Stripe Checkout for a paid tier — the buyer is the key owner","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CheckoutSession"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/OriginNotAllowed"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSubscriptionRequest"}}}}}},"/checkout/video":{"post":{"tags":["Monetization"],"operationId":"post_checkout_video","summary":"Start a Stripe Checkout for one paid video — the buyer is the key owner","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CheckoutSession"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/OriginNotAllowed"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutVideoRequest"}}}}}},"/health":{"get":{"tags":["Health"],"operationId":"get_health","summary":"Liveness of the API and its dependencies — the endpoint to point monitoring at","description":"Unauthenticated, cheap, and safe to poll. The status code is the signal: 200 when every dependency answered, 503 the moment one did not. The body is the SAME report shape at both codes, and this is the trap worth reading twice — a 503 here carries `success:false` but NO `error` object, so a monitor that reads `error.code` finds undefined on exactly the response it was watching for. Branch on the HTTP status, or on `data.status` (healthy | degraded) and `data.dependencies`. Do not treat this endpoint as a check on your own key — it does not look at one.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"description":"Every dependency answered.","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthReport"},"examples":{"healthy":{"summary":"All dependencies answered","value":{"success":true,"data":{"status":"healthy","version":"1.0.0","timestamp":"2026-08-14T03:27:19.142Z","uptimeSec":11267,"dependencies":{"postgres":"healthy","redis":"healthy"},"probeDurationMs":1}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"description":"At least one dependency did not answer. Note the body: `success` is false but there is NO `error` object — branch on data.status / data.dependencies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthReport"},"examples":{"degraded":{"summary":"A dependency is down — note success:false and the 503, not a 200 with a flag","value":{"success":false,"data":{"status":"degraded","version":"1.0.0","timestamp":"2026-08-14T03:27:19.142Z","uptimeSec":11267,"dependencies":{"postgres":"healthy","redis":"disconnected"},"probeDurationMs":2}}}}}}}}}},"/me":{"get":{"tags":["Account"],"operationId":"get_me","summary":"Identify the calling key: its scope, limits, and the account behind it","description":"The first call to make with a new key — it answers \"whose key is this, and what may it do\" without touching any resource. `permissions` is the part to read carefully: for a FULL_ACCESS key it is an EMPTY ARRAY, which means all permissions, not none. Only READ_ONLY and STANDARD keys enumerate entries such as `videos:write`. `mode` distinguishes a pk_test_ key from a live one. `rateLimit` is your per-minute ceiling, the same number the X-RateLimit-Limit response header carries. The account profile is nested under `user`, while `avatar`, `plan` and `balance` are also mirrored at the top level as aliases for older clients. `balance` is always 0 here and is not a wallet.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"fullAccessKey":{"summary":"A FULL_ACCESS key. `permissions` is EMPTY and that means everything — do not read it as \"no rights\"","value":{"success":true,"data":{"keyId":"cmkey0000000000000000000k1","keyName":"Production integration","scope":"FULL_ACCESS","mode":"live","permissions":[],"rateLimit":1000,"usageCount":48213,"lastUsedAt":"2026-08-14T03:20:11.004Z","createdAt":"2026-06-02T09:14:00.000Z","embedAllowlist":[],"balance":0,"avatar":null,"plan":"PRO","subscribersCount":1842,"totalVideosCount":96,"totalLiveStreamsCount":14,"user":{"id":"cmuser000000000000000000u1","username":"alexrivera","email":"creator@example.com","displayName":"Alex Rivera"}}}},"scopedTestKey":{"summary":"A STANDARD key in test mode — here `permissions` really is the list, and it is short","value":{"success":true,"data":{"keyId":"cmkey0000000000000000000k2","keyName":"Staging read/write","scope":"STANDARD","mode":"test","permissions":["videos:read","videos:write","streams:read"],"rateLimit":120,"usageCount":311,"lastUsedAt":"2026-08-14T01:02:55.771Z","createdAt":"2026-07-19T16:40:00.000Z","embedAllowlist":["player.example.com"],"balance":0,"avatar":null,"plan":"FREE","subscribersCount":0,"totalVideosCount":3,"totalLiveStreamsCount":0,"user":{"id":"cmuser000000000000000000u1","username":"alexrivera","email":"creator@example.com","displayName":"Alex Rivera"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Account"],"operationId":"patch_me","summary":"PATCH /me","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/api-keys":{"get":{"tags":["Account"],"operationId":"get_me_api_keys","summary":"GET /me/api-keys","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_api_keys","summary":"POST /me/api-keys","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/api-keys/{id}":{"delete":{"tags":["Account"],"operationId":"delete_me_api_keys_id","summary":"DELETE /me/api-keys/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/avatar":{"delete":{"tags":["Account"],"operationId":"delete_me_avatar","summary":"DELETE /me/avatar","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_avatar","summary":"POST /me/avatar","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/bookings":{"get":{"tags":["Account"],"operationId":"get_me_bookings","summary":"GET /me/bookings","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/cover":{"delete":{"tags":["Account"],"operationId":"delete_me_cover","summary":"DELETE /me/cover","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_cover","summary":"POST /me/cover","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/custom-domain":{"delete":{"tags":["Account"],"operationId":"delete_me_custom_domain","summary":"DELETE /me/custom-domain","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Account"],"operationId":"get_me_custom_domain","summary":"GET /me/custom-domain","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_custom_domain","summary":"POST /me/custom-domain","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/custom-domain/nameservers":{"get":{"tags":["Account"],"operationId":"get_me_custom_domain_nameservers","summary":"GET /me/custom-domain/nameservers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/custom-domain/verify":{"get":{"tags":["Account"],"operationId":"get_me_custom_domain_verify","summary":"GET /me/custom-domain/verify","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/embed-allowlist":{"patch":{"tags":["Account"],"operationId":"patch_me_embed_allowlist","summary":"PATCH /me/embed-allowlist","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/export":{"get":{"tags":["Account"],"operationId":"get_me_export","summary":"GET /me/export","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_export","summary":"POST /me/export","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/hero":{"delete":{"tags":["Account"],"operationId":"delete_me_hero","summary":"DELETE /me/hero","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_hero","summary":"POST /me/hero","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/hero-video":{"delete":{"tags":["Account"],"operationId":"delete_me_hero_video","summary":"DELETE /me/hero-video","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_hero_video","summary":"POST /me/hero-video","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/navigation-logo":{"delete":{"tags":["Account"],"operationId":"delete_me_navigation_logo","summary":"DELETE /me/navigation-logo","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_navigation_logo","summary":"POST /me/navigation-logo","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/notifications":{"get":{"tags":["Account"],"operationId":"get_me_notifications","summary":"GET /me/notifications","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/og-image":{"delete":{"tags":["Account"],"operationId":"delete_me_og_image","summary":"DELETE /me/og-image","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_og_image","summary":"POST /me/og-image","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/payouts":{"get":{"tags":["Account"],"operationId":"get_me_payouts","summary":"GET /me/payouts","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/playlists":{"get":{"tags":["Account"],"operationId":"get_me_playlists","summary":"GET /me/playlists","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/restream-accounts":{"get":{"tags":["Account"],"operationId":"get_me_restream_accounts","summary":"GET /me/restream-accounts","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/site/activate":{"post":{"tags":["Account"],"operationId":"post_me_site_activate","summary":"POST /me/site/activate","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/site/apply-template":{"post":{"tags":["Account"],"operationId":"post_me_site_apply_template","summary":"POST /me/site/apply-template","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/site/status":{"get":{"tags":["Account"],"operationId":"get_me_site_status","summary":"GET /me/site/status","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/site/templates":{"get":{"tags":["Account"],"operationId":"get_me_site_templates","summary":"GET /me/site/templates","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/slider-images":{"delete":{"tags":["Account"],"operationId":"delete_me_slider_images","summary":"DELETE /me/slider-images","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_slider_images","summary":"POST /me/slider-images","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/subdomain":{"delete":{"tags":["Account"],"operationId":"delete_me_subdomain","summary":"DELETE /me/subdomain","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Account"],"operationId":"get_me_subdomain","summary":"GET /me/subdomain","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Account"],"operationId":"post_me_subdomain","summary":"POST /me/subdomain","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/subscribers":{"get":{"tags":["Subscriptions"],"operationId":"get_me_subscribers","summary":"GET /me/subscribers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/subscriptions":{"get":{"tags":["Subscriptions"],"operationId":"get_me_subscriptions","summary":"GET /me/subscriptions","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/tiers":{"get":{"tags":["Account"],"operationId":"get_me_tiers","summary":"GET /me/tiers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks":{"get":{"tags":["Webhooks"],"operationId":"get_me_webhooks","summary":"GET /me/webhooks","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Webhooks"],"operationId":"post_me_webhooks","summary":"POST /me/webhooks","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpointCreated"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateRequest"}}}}}},"/me/webhooks/{id}":{"delete":{"tags":["Webhooks"],"operationId":"delete_me_webhooks_id","summary":"DELETE /me/webhooks/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Webhooks"],"operationId":"get_me_webhooks_id","summary":"GET /me/webhooks/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Webhooks"],"operationId":"patch_me_webhooks_id","summary":"PATCH /me/webhooks/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookEndpoint"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"operationId":"get_me_webhooks_id_deliveries","summary":"GET /me/webhooks/:id/deliveries","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks/{id}/deliveries/{deliveryId}/replay":{"post":{"tags":["Webhooks"],"operationId":"post_me_webhooks_id_deliveries_deliveryId_replay","summary":"POST /me/webhooks/:id/deliveries/:deliveryId/replay","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks/{id}/rotate-secret":{"post":{"tags":["Webhooks"],"operationId":"post_me_webhooks_id_rotate_secret","summary":"POST /me/webhooks/:id/rotate-secret","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks/{id}/simulate":{"post":{"tags":["Webhooks"],"operationId":"post_me_webhooks_id_simulate","summary":"POST /me/webhooks/:id/simulate","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"operationId":"post_me_webhooks_id_test","summary":"POST /me/webhooks/:id/test","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks/event-types":{"get":{"tags":["Webhooks"],"operationId":"get_me_webhooks_event_types","summary":"GET /me/webhooks/event-types","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/me/webhooks/events":{"get":{"tags":["Webhooks"],"operationId":"get_me_webhooks_events","summary":"GET /me/webhooks/events","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/monetization/connect-status":{"get":{"tags":["Monetization"],"operationId":"get_monetization_connect_status","summary":"GET /monetization/connect-status","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/monetization/payments":{"get":{"tags":["Monetization"],"operationId":"get_monetization_payments","summary":"GET /monetization/payments","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/monetization/revenue":{"get":{"tags":["Monetization"],"operationId":"get_monetization_revenue","summary":"GET /monetization/revenue","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/notifications":{"delete":{"tags":["Notifications"],"operationId":"delete_notifications","summary":"DELETE /notifications","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Notifications"],"operationId":"get_notifications","summary":"GET /notifications","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/notifications/{id}":{"delete":{"tags":["Notifications"],"operationId":"delete_notifications_id","summary":"DELETE /notifications/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/notifications/{id}/read":{"put":{"tags":["Notifications"],"operationId":"put_notifications_id_read","summary":"PUT /notifications/:id/read","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/notifications/preferences":{"get":{"tags":["Notifications"],"operationId":"get_notifications_preferences","summary":"GET /notifications/preferences","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"put":{"tags":["Notifications"],"operationId":"put_notifications_preferences","summary":"PUT /notifications/preferences","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/notifications/read-all":{"put":{"tags":["Notifications"],"operationId":"put_notifications_read_all","summary":"PUT /notifications/read-all","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/notifications/unread-count":{"get":{"tags":["Notifications"],"operationId":"get_notifications_unread_count","summary":"GET /notifications/unread-count","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/playlists":{"post":{"tags":["Playlists"],"operationId":"post_playlists","summary":"POST /playlists","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/playlists/{id}":{"delete":{"tags":["Playlists"],"operationId":"delete_playlists_id","summary":"DELETE /playlists/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Playlists"],"operationId":"get_playlists_id","summary":"GET /playlists/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Playlists"],"operationId":"patch_playlists_id","summary":"PATCH /playlists/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/playlists/{id}/videos":{"post":{"tags":["Playlists"],"operationId":"post_playlists_id_videos","summary":"POST /playlists/:id/videos","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/playlists/{id}/videos/{videoId}":{"delete":{"tags":["Playlists"],"operationId":"delete_playlists_id_videos_videoId","summary":"DELETE /playlists/:id/videos/:videoId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"videoId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/purchases":{"get":{"tags":["Purchases"],"operationId":"get_purchases","summary":"GET /purchases","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/quota":{"get":{"tags":["Quota"],"operationId":"get_quota","summary":"How much storage the account has used, and what happens when it runs out","description":"Storage usage and headroom for the key's account. Read `quotaStatus` rather than doing your own arithmetic: OK, NEAR_LIMIT (from 80 percent), CRITICAL (from 90 percent), EXCEEDED_GRACE, EXCEEDED_HARD. Running out is not instant — there is a 14-day grace period, and `gracePeriodDaysRemaining` counts it down, staying null while `isExceeded` is false. The older `daysRemaining` field means the same countdown and is only present once you are over, which is why it should not be read as \"days until reset\". Uploads refused for space answer 403 QUOTA_EXCEEDED at POST /videos/upload.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"withinQuota":{"summary":"Under quota — `daysRemaining` is ABSENT and gracePeriodDaysRemaining is null","value":{"success":true,"data":{"used":10751589855,"limit":2199023255552,"available":2188271665697,"usedPercent":0,"isExceeded":false,"inGracePeriod":false,"daysSinceExceeded":0,"quotaExceededSince":null,"baseBytes":2199023255552,"extraBytes":0,"formatted":{"used":"10 GiB","limit":"2 TiB","available":"2 TiB"},"warnings":{"nearLimit":false,"critical":false,"exceeded":false},"quotaStatus":"OK","gracePeriodDaysRemaining":null}}},"inGracePeriod":{"summary":"Over quota — `daysRemaining` now appears, and it counts down the 14-day grace period, not a reset","value":{"success":true,"data":{"used":2306739871744,"limit":2199023255552,"available":0,"usedPercent":105,"isExceeded":true,"inGracePeriod":true,"daysSinceExceeded":3,"quotaExceededSince":"2026-08-11T09:14:02.000Z","baseBytes":2199023255552,"extraBytes":0,"formatted":{"used":"2.1 TiB","limit":"2 TiB","available":"0 B"},"warnings":{"nearLimit":true,"critical":true,"exceeded":true},"quotaStatus":"EXCEEDED_GRACE","daysRemaining":11,"gracePeriodDaysRemaining":11}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams":{"get":{"tags":["Restreams"],"operationId":"get_restreams","summary":"GET /restreams","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Restreams"],"operationId":"post_restreams","summary":"POST /restreams","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"},{"$ref":"#/components/parameters/IdempotencyKey"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}":{"delete":{"tags":["Restreams"],"operationId":"delete_restreams_id","summary":"DELETE /restreams/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Restreams"],"operationId":"get_restreams_id","summary":"GET /restreams/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"put":{"tags":["Restreams"],"operationId":"put_restreams_id","summary":"PUT /restreams/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/destinations/{destId}":{"patch":{"tags":["Restreams"],"operationId":"patch_restreams_id_destinations_destId","summary":"PATCH /restreams/:id/destinations/:destId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"destId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/destinations/{destId}/rotate-key":{"post":{"tags":["Restreams"],"operationId":"post_restreams_id_destinations_destId_rotate_key","summary":"POST /restreams/:id/destinations/:destId/rotate-key","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"destId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/encoder-urls":{"get":{"tags":["Restreams"],"operationId":"get_restreams_id_encoder_urls","summary":"GET /restreams/:id/encoder-urls","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/preview-url":{"get":{"tags":["Restreams"],"operationId":"get_restreams_id_preview_url","summary":"GET /restreams/:id/preview-url","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/preview.flv":{"get":{"tags":["Restreams"],"operationId":"get_restreams_id_preview_flv","summary":"GET /restreams/:id/preview.flv","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":16,"maxLength":512}}],"security":[{"previewToken":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/record/start":{"post":{"tags":["Restreams"],"operationId":"post_restreams_id_record_start","summary":"POST /restreams/:id/record/start","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/record/status":{"get":{"tags":["Restreams"],"operationId":"get_restreams_id_record_status","summary":"GET /restreams/:id/record/status","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/record/stop":{"post":{"tags":["Restreams"],"operationId":"post_restreams_id_record_stop","summary":"POST /restreams/:id/record/stop","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/recording/download":{"get":{"tags":["Restreams"],"operationId":"get_restreams_id_recording_download","summary":"GET /restreams/:id/recording/download","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/recording/qualities":{"get":{"tags":["Restreams"],"operationId":"get_restreams_id_recording_qualities","summary":"GET /restreams/:id/recording/qualities","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/start":{"post":{"tags":["Restreams"],"operationId":"post_restreams_id_start","summary":"POST /restreams/:id/start","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/restreams/{id}/stop":{"post":{"tags":["Restreams"],"operationId":"post_restreams_id_stop","summary":"POST /restreams/:id/stop","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms":{"get":{"tags":["Rooms"],"operationId":"get_rooms","summary":"List your rooms, newest first","description":"A page of the rooms hosted by the key's account, newest first, with a `pagination` block. Cancelled rooms are excluded from this list — including rooms that were \"deleted\" while holding recordings, since that path cancels rather than removes (see DELETE /rooms/{id}). One field to ignore: `currentParticipants` is always 0 in this list, it is not live presence; for who is actually in a room call GET /rooms/{id}/participants. `joinUrl` is the ready-made page a guest can open; a programmatic client joins with a token from POST /rooms/{id}/token instead.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"page":{"summary":"A live room and a scheduled one. currentParticipants is 0 on BOTH rows because the field is a constant here, not live presence","value":{"success":true,"data":{"rooms":[{"id":"c4d5e6f708192a3b4c5d6e7f80912a3b","title":"Office hours","slug":"k7m2p9x4t6qz","type":"INSTANT","status":"LIVE","maxParticipants":10,"currentParticipants":0,"recordingEnabled":false,"joinUrl":"https://dcast.tv/rooms/k7m2p9x4t6qz","createdAt":"2026-08-14T03:30:00.000Z","scheduledStart":null},{"id":"3b2a1908f7e6d5c4b3a2918070f6e5d4","title":"Product launch","slug":"w3n8b5v1r7hd","type":"BROADCAST","status":"SCHEDULED","maxParticipants":100,"currentParticipants":0,"recordingEnabled":true,"joinUrl":"https://dcast.tv/rooms/w3n8b5v1r7hd","createdAt":"2026-08-14T03:31:12.006Z","scheduledStart":"2026-08-20T17:00:00.000Z"}],"pagination":{"page":1,"limit":20,"total":2,"pages":1}}}},"empty":{"summary":"No rooms — and cancelled ones never appear here, so a room \"deleted\" while holding recordings drops out of this list too","value":{"success":true,"data":{"rooms":[],"pagination":{"page":1,"limit":20,"total":0,"pages":1}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Rooms"],"operationId":"post_rooms","summary":"Create a video room and get its join URL","description":"Creates a LiveKit-backed room and answers 201. Note what `type` decides: an INSTANT room (the default) is created already LIVE, while every other type is created SCHEDULED and needs POST /rooms/{id}/start. The room is a database record at this point — the actual conference is materialised lazily on the first POST /rooms/{id}/token call, which is also what binds the room to a server, so a recording started before anyone has taken a token is refused. `hostToken` in this response is ALWAYS null by design; tokens come from POST /rooms/{id}/token. Set `allowParticipantVideo` and `allowParticipantAudio` to false to mint a broadcast-style room where guests watch but cannot publish. `maxParticipants` is capped at 100 silently rather than refused. Send an `Idempotency-Key` header so a retry returns the first room instead of creating a second one.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"},{"$ref":"#/components/parameters/IdempotencyKey"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Room created. An INSTANT room is already LIVE; every other type is SCHEDULED until POST /rooms/{id}/start. `hostToken` is null here — take participant tokens from POST /rooms/{id}/token, which is also what materialises the room on a server.","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"instant":{"summary":"The default INSTANT room — created already LIVE. hostToken is null by design; take one from POST /rooms/{id}/token","value":{"success":true,"data":{"id":"c4d5e6f708192a3b4c5d6e7f80912a3b","title":"Office hours","slug":"k7m2p9x4t6qz","type":"INSTANT","status":"LIVE","maxParticipants":10,"recordingEnabled":false,"chatEnabled":true,"screenShareEnabled":true,"allowParticipantVideo":true,"allowParticipantAudio":true,"joinUrl":"https://dcast.tv/rooms/k7m2p9x4t6qz","hostToken":null,"livekitRoomName":"procast-k7m2p9x4t6qz","actualStartAt":"2026-08-14T03:30:00.000Z","createdAt":"2026-08-14T03:30:00.000Z"}}},"broadcastViewersOnly":{"summary":"A BROADCAST room with publishing switched off for guests, and SCHEDULED rather than LIVE — note actualStartAt is null until POST /rooms/{id}/start","value":{"success":true,"data":{"id":"3b2a1908f7e6d5c4b3a2918070f6e5d4","title":"Product launch","slug":"w3n8b5v1r7hd","type":"BROADCAST","status":"SCHEDULED","maxParticipants":100,"recordingEnabled":true,"chatEnabled":true,"screenShareEnabled":false,"allowParticipantVideo":false,"allowParticipantAudio":false,"joinUrl":"https://dcast.tv/rooms/w3n8b5v1r7hd","hostToken":null,"livekitRoomName":"procast-w3n8b5v1r7hd","actualStartAt":null,"createdAt":"2026-08-14T03:31:12.006Z"}}}}}}},"400":{"description":"HTTP 400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"noTitle":{"summary":"title is the only required field","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"title is required"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","minLength":1,"description":"Required; a missing or empty title is 400 BAD_REQUEST."},"type":{"type":"string","enum":["INSTANT","SCHEDULED","RECURRING","WEBINAR","BREAKOUT","TRANSLATION","BROADCAST"],"default":"INSTANT","description":"An unrecognised value falls back to INSTANT rather than being refused. Only INSTANT is created LIVE."},"maxParticipants":{"type":"integer","minimum":1,"default":10,"description":"Values above 100 are clamped to 100, not rejected."},"scheduledStart":{"type":["string","null"],"format":"date-time"},"enableRecording":{"type":"boolean","default":false,"description":"POST /rooms/{id}/record/start turns this on by itself if it is off."},"enableChat":{"type":"boolean","default":true},"allowParticipantVideo":{"type":"boolean","default":true,"description":"false mints a room where guests cannot publish video."},"allowParticipantAudio":{"type":"boolean","default":true,"description":"false mints a room where guests cannot publish audio."},"allowParticipantScreenShare":{"type":"boolean","default":true,"description":"Canonical name; `enableScreenShare` is accepted as an alias and loses to this one when both are sent."}}},"examples":{"instant":{"summary":"The whole first call — type defaults to INSTANT, which is the one type created already LIVE","value":{"title":"Weekly standup"}},"broadcast":{"summary":"Guests watch but cannot publish, and recording is on from creation","value":{"title":"Product launch","type":"BROADCAST","maxParticipants":100,"enableRecording":true,"allowParticipantVideo":false,"allowParticipantAudio":false}}}}}}},"put":{"tags":["Rooms"],"operationId":"put_rooms","summary":"PUT /rooms","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Room created. An INSTANT room is already LIVE; every other type is SCHEDULED until POST /rooms/{id}/start. `hostToken` is null here — take participant tokens from POST /rooms/{id}/token, which is also what materialises the room on a server.","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}":{"delete":{"tags":["Rooms"],"operationId":"delete_rooms_id","summary":"Delete a room — or cancel it, when it holds recordings","description":"Two different outcomes share the 200, and `data.type` is what tells them apart. `complete-deletion` means the room had no recordings and is gone. `soft-delete` means it HAD recordings, so nothing was removed: the room was set to CANCELLED and its recordings kept, and `recordingsCount` says how many. Read that field before reporting \"deleted\" to anyone — a room that comes back cancelled is retained, not erased, though it does drop out of GET /rooms either way. Deleting a room that is already gone is 404. The key needs the `rooms:delete` permission.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"completeDeletion":{"summary":"No recordings, so the room is really gone","value":{"success":true,"data":{"id":"c4d5e6f708192a3b4c5d6e7f80912a3b","type":"complete-deletion","deletedAt":"2026-08-14T03:44:07.512Z"}}},"softDeleteKeptRecordings":{"summary":"It had recordings, so NOTHING was removed — the room is CANCELLED and the recordings kept. Read data.type before telling anyone it was deleted","value":{"success":true,"data":{"id":"3b2a1908f7e6d5c4b3a2918070f6e5d4","type":"soft-delete","status":"CANCELLED","deletedAt":"2026-08-14T03:45:19.880Z","hasRecordings":true,"recordingsCount":3}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Rooms"],"operationId":"get_rooms_id","summary":"GET /rooms/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Rooms"],"operationId":"patch_rooms_id","summary":"PATCH /rooms/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"put":{"tags":["Rooms"],"operationId":"put_rooms_id","summary":"PUT /rooms/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/end":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_end","summary":"POST /rooms/:id/end","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/participants":{"get":{"tags":["Rooms"],"operationId":"get_rooms_id_participants","summary":"GET /rooms/:id/participants","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/participants/{participantId}/admit":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_participants_participantId_admit","summary":"POST /rooms/:id/participants/:participantId/admit","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/participants/{participantId}/kick":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_participants_participantId_kick","summary":"POST /rooms/:id/participants/:participantId/kick","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/participants/{participantId}/mute":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_participants_participantId_mute","summary":"POST /rooms/:id/participants/:participantId/mute","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"participantId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/polls":{"get":{"tags":["Rooms"],"operationId":"get_rooms_id_polls","summary":"GET /rooms/:id/polls","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Rooms"],"operationId":"post_rooms_id_polls","summary":"POST /rooms/:id/polls","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/polls/{pollId}/close":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_polls_pollId_close","summary":"POST /rooms/:id/polls/:pollId/close","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"pollId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/polls/{pollId}/vote":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_polls_pollId_vote","summary":"POST /rooms/:id/polls/:pollId/vote","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"pollId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/quizzes":{"get":{"tags":["Rooms"],"operationId":"get_rooms_id_quizzes","summary":"GET /rooms/:id/quizzes","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Rooms"],"operationId":"post_rooms_id_quizzes","summary":"POST /rooms/:id/quizzes","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/quizzes/{quizId}/answer":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_quizzes_quizId_answer","summary":"POST /rooms/:id/quizzes/:quizId/answer","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"quizId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/quizzes/{quizId}/close":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_quizzes_quizId_close","summary":"POST /rooms/:id/quizzes/:quizId/close","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"quizId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/reactions":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_reactions","summary":"POST /rooms/:id/reactions","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/record/start":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_record_start","summary":"Start recording a live room","description":"Begins a composite recording of the room and answers 200 with the recording id. Three preconditions have to hold, and each fails with its own status rather than a generic error. The room must be LIVE (400 if not). It must already be bound to a server, which happens on the first POST /rooms/{id}/token — a room nobody has taken a token for yet is 422 PRECONDITION_FAILED, and the fix is to mint a token and retry. And at least one participant must actually be PUBLISHING, not merely connected: a room full of silent viewers is also 422. Recording being switched off is not an obstacle — this endpoint enables it. Read the 422 apart from the 503: 422 is a precondition you can fix, while 503 RECORDING_UNAVAILABLE means our recorder failed and the right response is to retry and report it. Stop with POST /rooms/{id}/record/stop; poll GET /rooms/{id}/record/status meanwhile.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"started":{"summary":"Recording is running. Stop it with POST /rooms/{id}/record/stop","value":{"success":true,"data":{"id":"rec_room_c4d5e6f708192a3b4c5d6e7f80912a3b_1755140444120","status":"recording","startedAt":"2026-08-14T03:50:44.120Z"}}}}}}},"400":{"description":"HTTP 400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"notLive":{"summary":"The room is not LIVE. A SCHEDULED room needs POST /rooms/{id}/start first","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"Room is not live"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"422":{"description":"PRECONDITION_FAILED — something about the room has to change before it can be recorded: nobody is publishing yet, or the room is not bound to a server because no token has been minted for it. The message names which. Fix it and retry; this is not a fleet fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"nobodyPublishing":{"summary":"Connected is not the same as publishing — a room of silent viewers cannot be composited","value":{"success":false,"error":{"code":"PRECONDITION_FAILED","message":"Room composite recording requires at least one connected participant. LiveKit reports 2 connected and 0 publishing. Wait for a publisher to join the room (POST /rooms/:id/token then connect) and retry."}}},"notBoundToAnEdge":{"summary":"Nobody has taken a token yet, so the room exists only in the database. Call POST /rooms/{id}/token, then retry","value":{"success":false,"error":{"code":"PRECONDITION_FAILED","message":"Room is not bound to a LiveKit edge yet (no routing). Call POST /rooms/:id/token so the room is assigned to a worker, then retry."}}}}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"description":"RECORDING_UNAVAILABLE — the preconditions held and our recorder still would not take the job. Distinct from the 422 on purpose: nothing you send differently will change it. Retry, and report it if it persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"recorderFailed":{"summary":"Our side, not yours: participants were there and the recorder still refused. Retry, and report it if it persists","value":{"success":false,"error":{"code":"RECORDING_UNAVAILABLE","message":"Recording could not be started: LiveKit had 1 publishing participant(s) of 3 connected (asked LiveKit), and the recording egress on the room worker did not accept the job (unreachable). This is a recording-service failure on that worker, not a missing participant. Retry, and report it if it persists."}}}}}}}}}},"/rooms/{id}/record/status":{"get":{"tags":["Rooms"],"operationId":"get_rooms_id_record_status","summary":"GET /rooms/:id/record/status","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/record/stop":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_record_stop","summary":"Stop the room recording and get the file name","description":"Ends the recording started by POST /rooms/{id}/record/start and answers 200 with `status: completed` and the recording's file name in `mkvPath` — which for a room is an .mp4 file despite the field name, so do not filter on the extension. Completed here means the capture has stopped, not that a downloadable file is ready — transcoding continues afterwards, so poll GET /rooms/{id}/record/status and take the download from there once it appears. Calling stop on a room that is not recording is 400 BAD_REQUEST, which makes it safe to call defensively as long as you do not read that 400 as a lost recording.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"stopped":{"summary":"Capture stopped. \"completed\" does NOT mean downloadable — transcoding follows, so poll GET /rooms/{id}/record/status for the download","value":{"success":true,"data":{"id":"rec_room_c4d5e6f708192a3b4c5d6e7f80912a3b_1755140444120","mkvPath":"rec_room_c4d5e6f708192a3b4c5d6e7f80912a3b_1755140444120.mp4","status":"completed"}}}}}}},"400":{"description":"HTTP 400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"notRecording":{"summary":"Nothing was running. Safe to call defensively — just do not read this as a lost recording","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"Room is not currently recording"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/recording/download":{"get":{"tags":["Rooms"],"operationId":"get_rooms_id_recording_download","summary":"GET /rooms/:id/recording/download","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/recording/qualities":{"get":{"tags":["Rooms"],"operationId":"get_rooms_id_recording_qualities","summary":"GET /rooms/:id/recording/qualities","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/start":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_start","summary":"POST /rooms/:id/start","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/rooms/{id}/token":{"post":{"tags":["Rooms"],"operationId":"post_rooms_id_token","summary":"Mint a join token for one participant","description":"Returns the credential a client needs to connect to the room, together with the `wsUrl` to connect to and the `roomName` to pass along. Mint one token per participant — the token names that person, and `isHost` decides whether they get moderator rights. Tokens last four hours (`expiresIn`, in seconds). This call does more than issue a credential: it is what materialises the room on a server and binds it there, which is why a recording started before any token has ever been minted is refused with \"not bound to an edge yet\". So call this at least once before POST /rooms/{id}/record/start, even for a room you created as INSTANT. `participantName` is required and is limited to 1-64 printable characters (`name` is accepted as an alias, as is `identity` for `participantId`).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"guest":{"summary":"A viewer token. Mint one PER participant — and note this call is also what binds the room to a server, which recording later depends on","value":{"success":true,"data":{"token":"<livekit-access-jwt>","roomName":"procast-k7m2p9x4t6qz","identity":"guest-7f3a91","participantName":"Sam Okafor","wsUrl":"wss://rtc.dcast.pro","expiresIn":14400}}},"host":{"summary":"Same call with isHost:true — the difference is inside the token, so the body looks the same","value":{"success":true,"data":{"token":"<livekit-access-jwt>","roomName":"procast-k7m2p9x4t6qz","identity":"host-alexrivera","participantName":"Alex Rivera","wsUrl":"wss://rtc.dcast.pro","expiresIn":14400}}}}}}},"400":{"description":"HTTP 400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"missingName":{"summary":"participantName is required (alias: name)","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"participantName is required (alias: name)"}}},"unusableName":{"summary":"Rejected on content, not length alone — control bytes, angle brackets and backticks are refused","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"participantName must be 1-64 characters and contain only printable letters/numbers/punctuation (no control bytes, no < > or backticks)","field":"participantName"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["participantName"],"properties":{"participantName":{"type":"string","minLength":1,"maxLength":64,"description":"Display name. Alias: `name`. Control bytes, angle brackets and backticks are refused 400."},"participantId":{"type":"string","description":"Your own stable identifier for this person. Alias: `identity`. Generated when omitted."},"isHost":{"type":"boolean","default":false,"description":"true grants moderator rights in the room."}}},"examples":{"guest":{"summary":"The minimum — participantId is generated when you do not send one","value":{"participantName":"Alex Rivera"}},"host":{"summary":"Your own stable identifier for this person, with moderator rights","value":{"participantName":"Dana Cole","participantId":"your-own-user-8842","isHost":true}}}}}}}},"/stats":{"get":{"tags":["Stats"],"operationId":"get_stats","summary":"GET /stats","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams":{"get":{"tags":["Streams"],"operationId":"get_streams","summary":"List your stream cards, newest first","description":"A page of the stream cards owned by the key's account, newest first, with a `pagination` block, optionally filtered by `status`. A card exists independently of whether anything is on air: `isLive` tells you which of them are actually broadcasting right now, and `viewersCount` is read live rather than from a stored snapshot. Every row carries its `streamKey`, which is the ingest credential — treat this response as secret material and do not put it in front of viewers. An account with no cards gets an empty array, never a 404.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"noStreams":{"summary":"No stream cards — an empty list with a valid pagination block","value":{"success":true,"data":{"streams":[],"pagination":{"page":1,"limit":20,"total":0,"pages":1}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Streams"],"operationId":"post_streams","summary":"Create a live stream card and receive its ingest URLs","description":"Returns 201 with the ingest URLs to point an encoder at, and the playback URLs to give viewers. Creating the card does not put anything on air: publish to the ingest URL, then call POST /streams/{id}/start to open the broadcast. `streamKey` is the credential for the ingest URL — it is embedded in every one of them, so treat the whole URL as a secret. Send an `Idempotency-Key` header to make a retry return the first response instead of a second card.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"},{"$ref":"#/components/parameters/IdempotencyKey"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Stream card created. A retry carrying the same `Idempotency-Key` re-answers this same body for 24 hours instead of creating a second card. `ingest` is absent for the HTTP and FILE protocols, which pull from a source instead of being published to.","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/StreamCreated"}}},"examples":{"rtmp":{"summary":"The default. Three ingest URLs are returned for one card — publish to ONE of them; the key inside is the credential","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","title":"Season 3 opener","status":"IDLE","streamKey":"sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","protocol":"RTMP","ingest":{"rtmp":"rtmp://a.dcast.pro/live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","srt":"srt://a.dcast.pro:10080?streamid=#!::r=live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0,m=publish&mode=caller&latency=500000","whip":"https://w720845.a.dcast.pro/rtc/v1/whip/?app=live&stream=sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0"},"playback":{"hls":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/master","embed":"https://dcast.tv/embed/b7c8d9e0f1a2b3c4d5e6f708192a3b4c"},"createdAt":"2026-08-16T17:29:37.490Z"}}},"srt":{"summary":"protocol SRT — note the key prefix changed with it, and `srtConfig` + a top-level `srtUrl` are added","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","title":"Season 3 opener","status":"IDLE","streamKey":"sk_srt_2c3d4e5f60718293a4b5c6d7e8f90a1b","protocol":"SRT","ingest":{"rtmp":"rtmp://a.dcast.pro/live/sk_srt_2c3d4e5f60718293a4b5c6d7e8f90a1b","srt":"srt://a.dcast.pro:10080?streamid=#!::r=live/sk_srt_2c3d4e5f60718293a4b5c6d7e8f90a1b,m=publish&mode=caller&latency=500000","whip":"https://w720845.a.dcast.pro/rtc/v1/whip/?app=live&stream=sk_srt_2c3d4e5f60718293a4b5c6d7e8f90a1b"},"playback":{"hls":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/master","embed":"https://dcast.tv/embed/b7c8d9e0f1a2b3c4d5e6f708192a3b4c"},"createdAt":"2026-08-16T17:29:37.490Z","srtConfig":{"mode":"caller","latency":500,"passphrase":null},"srtUrl":"srt://a.dcast.pro:10080?streamid=#!::r=live/sk_srt_2c3d4e5f60718293a4b5c6d7e8f90a1b,m=publish&mode=caller&latency=500000"}}},"http":{"summary":"protocol HTTP pulls from your source, so there is nothing to publish TO — `ingest` is absent entirely and httpSourceConfig replaces it","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","title":"Season 3 opener","status":"IDLE","streamKey":"sk_http_4d5e6f708192a3b4c5d6e7f80912a3b4","protocol":"HTTP","playback":{"hls":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/master","embed":"https://dcast.tv/embed/b7c8d9e0f1a2b3c4d5e6f708192a3b4c"},"createdAt":"2026-08-16T17:29:37.490Z","httpSourceConfig":{"sourceUrl":"https://source.example.com/live/index.m3u8","protocol":"hls","autoReconnect":true}}}}}}}},"400":{"description":"HTTP 400","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"titleMissing":{"summary":"Neither title nor name was sent, or one of them was blank","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"title is required (or send name as an alias)"}}},"rtmpsRejected":{"summary":"RTMPS is refused rather than quietly downgraded to RTMP — the one 400 here that also names the offending `field`","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"RTMPS ingest is not supported. Use protocol: RTMP, SRT, WEBRTC, HTTP, or FILE. For TLS-protected push, use SRT or WEBRTC.","field":"protocol"}}},"httpSourceMissing":{"summary":"protocol HTTP without httpSourceUrl. protocol FILE without fileSourceUrl answers the same way","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"httpSourceUrl is required when protocol is HTTP"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"description":"`name` is accepted as an alias for `title`; one of the two must be present and non-blank. Fields outside the protocol you chose are ignored (srtConfig is read only for SRT, isCamera only for WEBRTC).","properties":{"title":{"type":"string","minLength":1,"description":"Card title. Send this or `name`."},"name":{"type":"string","minLength":1,"description":"Alias for `title`, applied when `title` is absent."},"description":{"type":"string","description":"Stored as an empty string when omitted."},"visibility":{"type":"string","enum":["public","unlisted","private","bykey","registered","PUBLIC","LINK_ONLY","PRIVATE","ACCESS_KEY","REGISTERED"],"default":"public","description":"Case-insensitive. unlisted is stored as LINK_ONLY and bykey as ACCESS_KEY; responses carry the stored name. Any other value is refused 400 INVALID_VISIBILITY. bykey also needs `accessKey`, or the call is refused 400 INVALID_ACCESS_KEY."},"accessKey":{"type":"string","description":"The passphrase viewers enter. Required when visibility is bykey / ACCESS_KEY."},"protocol":{"type":"string","enum":["RTMP","SRT","WEBRTC","HTTP","FILE"],"default":"RTMP","description":"Chooses the ingest form. RTMPS is rejected 400 rather than downgraded — for TLS-protected push use SRT or WEBRTC. An unrecognised value falls back to RTMP."},"httpSourceUrl":{"type":"string","format":"uri","description":"Required when protocol is HTTP: the HLS source we pull from."},"fileSourceUrl":{"type":"string","format":"uri","description":"Required when protocol is FILE: a public http(s) URL of a media file that the broadcast plays out. Checked when the stream starts (public unicast hosts only; failures answer FILE_SOURCE_INVALID). Not a DCAST video id and not a local path."},"srtConfig":{"type":"object","description":"Read only when protocol is SRT.","properties":{"mode":{"type":"string","default":"caller"},"latency":{"type":"integer","default":500,"minimum":0,"maximum":7000,"description":"Milliseconds, brought into [500, 7000] before the card is created: below 500 is raised to it, above 7000 is lowered to it, and a value outside that band is answered 201 like any other rather than turned into an error. 500 is where the low end sits because that is what the receiving side declares and the connection settles on the larger of the two — a smaller number would be printed back to you without acting. So read `srtConfig.latency` off the response instead of assuming the value you sent: the two differ whenever the band moved it, and the response field is the one the ingest URL announces."},"passphrase":{"type":["string","null"],"default":null}}},"isCamera":{"type":"boolean","default":false,"description":"Read only when protocol is WEBRTC; echoed back as `cameraEnabled`."}}},"examples":{"minimal":{"summary":"Everything else defaults — an RTMP, PUBLIC card. This is the whole first call","value":{"title":"Season 3 opener"}},"srt":{"summary":"SRT with a passphrase. srtConfig is read only because protocol says SRT","value":{"title":"Season 3 opener","description":"Weekly show","visibility":"PRIVATE","protocol":"SRT","srtConfig":{"mode":"caller","latency":2000,"passphrase":"choose-your-own-passphrase"}}},"httpPull":{"summary":"We pull from your HLS source instead of you publishing to us — httpSourceUrl is required for this protocol","value":{"title":"Rebroadcast","protocol":"HTTP","httpSourceUrl":"https://source.example.com/live/index.m3u8"}}}}}}}},"/streams/{id}":{"delete":{"tags":["Streams"],"operationId":"delete_streams_id","summary":"Delete a stream card","description":"Answers 200 when the card and its artifacts are gone, and 202 when the card is gone from the account while the storage purge continues in the background. Both are success — a client that treats anything other than 200 as a failure will retry a deletion that already happened. Owner-scoped: another account's id answers 404.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"complete":{"summary":"The card had no recordings, so nothing survives it","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","type":"complete-deletion","deletedAt":"2026-08-16T17:30:38.226Z"}}},"softDelete":{"summary":"The card had recordings — it leaves your account, and the count of files kept is reported","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","type":"soft-delete","deletedAt":"2026-08-16T17:30:38.226Z","hasVideoFiles":true,"videoFilesCount":2}}}}}}},"202":{"description":"Accepted: the card is gone from the account and the storage purge continues in the background. A success — treat 200 and 202 alike; `retainedCanonical` names what is still being cleaned.","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"accepted":{"summary":"Deleted from your account; storage purge still running. This is SUCCESS — retrying it deletes nothing twice, it just repeats the 404","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","type":"accepted","deletedAt":"2026-08-16T17:30:38.226Z","canonicalCleanup":"in_progress","retainedCanonical":["worker:<edge-id>"]}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Streams"],"operationId":"get_streams_id","summary":"Read one stream card — its live state, ingest URLs and playback URLs","description":"Owner-scoped: an id belonging to another account answers 404, not 403. `status` is derived from `isLive` (LIVE / OFFLINE) and is not a stored field; `hasSignal` reports whether an encoder is currently publishing, which is what distinguishes \"nothing connected\" from \"connected, not yet on air\". A READ_ONLY key receives `streamKey` as `***` and every ingest URL as null, because those URLs carry the key.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Stream"}}},"examples":{"offline":{"summary":"Created, nothing publishing yet: isLive AND hasSignal false, health null, both thumbnails null, startedAt null","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","title":"Season 3 opener","description":"","status":"OFFLINE","isLive":false,"hasSignal":false,"visibility":"PUBLIC","isPaid":false,"price":null,"streamKey":"sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","protocol":"RTMP","viewersCount":0,"peakViewers":0,"duration":0,"health":null,"thumbnails":{"live":null,"latest":null},"playback":{"hls":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/master","embed":"https://dcast.tv/embed/b7c8d9e0f1a2b3c4d5e6f708192a3b4c"},"assignment":{"assigned":true,"assignedAt":"2026-08-16T17:29:38.141Z"},"createdAt":"2026-08-16T17:29:37.490Z","startedAt":null,"endedAt":null,"ingest":{"rtmp":"rtmp://a.dcast.pro/live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","srt":"srt://a.dcast.pro:10080?streamid=#!::r=live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0,m=publish&mode=caller&latency=500000","whip":"https://w720845.a.dcast.pro/rtc/v1/whip/?app=live&stream=sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","srtDisplay":"srt://a.dcast.pro:10080?streamid=#!::r=live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0,m=publish&mode=caller&latency=500000"}}}},"onAir":{"summary":"On air — `health` is an object only while isLive, and thumbnails.live is set only while isLive. Poll this shape rather than assuming the fields exist","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","title":"Season 3 opener","description":"","status":"LIVE","isLive":true,"hasSignal":true,"visibility":"PUBLIC","isPaid":false,"price":null,"streamKey":"sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","protocol":"RTMP","viewersCount":42,"peakViewers":57,"duration":0,"health":{"bitrate":4500,"fps":30,"resolution":"1920x1080","quality":"good"},"thumbnails":{"live":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/thumbnail","latest":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/thumbnail"},"playback":{"hls":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/master","embed":"https://dcast.tv/embed/b7c8d9e0f1a2b3c4d5e6f708192a3b4c"},"assignment":{"assigned":true,"assignedAt":"2026-08-16T17:29:38.141Z"},"createdAt":"2026-08-16T17:29:37.490Z","startedAt":"2026-08-16T18:02:11.004Z","endedAt":null,"ingest":{"rtmp":"rtmp://a.dcast.pro/live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","srt":"srt://a.dcast.pro:10080?streamid=#!::r=live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0,m=publish&mode=caller&latency=500000","whip":"https://w720845.a.dcast.pro/rtc/v1/whip/?app=live&stream=sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0","srtDisplay":"srt://a.dcast.pro:10080?streamid=#!::r=live/sk_rtmp_9f8e7d6c5b4a39281706f5e4d3c2b1a0,m=publish&mode=caller&latency=500000"}}}},"readOnlyKey":{"summary":"Same card read with a READ_ONLY key: streamKey is masked and every ingest URL is null, because each of those URLs contains the key","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","title":"Season 3 opener","description":"","status":"OFFLINE","isLive":false,"hasSignal":false,"visibility":"PUBLIC","isPaid":false,"price":null,"streamKey":"***","protocol":"RTMP","viewersCount":0,"peakViewers":0,"duration":0,"health":null,"thumbnails":{"live":null,"latest":null},"playback":{"hls":"https://api.dcast.pro/api/streams/b7c8d9e0f1a2b3c4d5e6f708192a3b4c/master","embed":"https://dcast.tv/embed/b7c8d9e0f1a2b3c4d5e6f708192a3b4c"},"assignment":{"assigned":true,"assignedAt":"2026-08-16T17:29:38.141Z"},"createdAt":"2026-08-16T17:29:37.490Z","startedAt":null,"endedAt":null,"ingest":{"rtmp":null,"srt":null,"srtDisplay":null,"whip":null}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"HTTP 404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"notYours":{"summary":"Unknown id AND another account's id answer identically — ownership is not disclosed","value":{"success":false,"error":{"code":"NOT_FOUND","message":"Stream not found"}}}}}}},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Streams"],"operationId":"patch_streams_id","summary":"PATCH /streams/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/chat":{"get":{"tags":["Streams"],"operationId":"get_streams_id_chat","summary":"GET /streams/:id/chat","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Streams"],"operationId":"post_streams_id_chat","summary":"POST /streams/:id/chat","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/chat/{messageId}":{"delete":{"tags":["Streams"],"operationId":"delete_streams_id_chat_messageId","summary":"DELETE /streams/:id/chat/:messageId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/chat/moderation/{messageId}/approve":{"post":{"tags":["Streams"],"operationId":"post_streams_id_chat_moderation_messageId_approve","summary":"POST /streams/:id/chat/moderation/:messageId/approve","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/chat/moderation/{messageId}/reject":{"post":{"tags":["Streams"],"operationId":"post_streams_id_chat_moderation_messageId_reject","summary":"POST /streams/:id/chat/moderation/:messageId/reject","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/chat/moderation/queue":{"get":{"tags":["Streams"],"operationId":"get_streams_id_chat_moderation_queue","summary":"GET /streams/:id/chat/moderation/queue","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/chat/stream":{"get":{"tags":["Streams"],"operationId":"get_streams_id_chat_stream","summary":"GET /streams/:id/chat/stream","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/end":{"post":{"tags":["Streams"],"operationId":"post_streams_id_end","summary":"Close the broadcast (alias of POST /streams/{id}/stop)","description":"Same handler, same request and same response as POST /streams/{id}/stop.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"stopped":{"summary":"Stopped after a real broadcast — `endedAt` is present because the card had started","value":{"success":true,"data":{"message":"Broadcast stopped","isLive":false,"hasSignal":true,"endedAt":"2026-08-16T18:44:52.310Z"}}},"stoppedNeverStarted":{"summary":"Stopping a card that never started is accepted, and `endedAt` is ABSENT — do not read it unconditionally","value":{"success":true,"data":{"message":"Broadcast stopped","isLive":false,"hasSignal":false}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/preview-url":{"get":{"tags":["Streams"],"operationId":"get_streams_id_preview_url","summary":"GET /streams/:id/preview-url","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/preview.flv":{"get":{"tags":["Streams"],"operationId":"get_streams_id_preview_flv","summary":"GET /streams/:id/preview.flv","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":16,"maxLength":512}}],"security":[{"previewToken":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/record/start":{"post":{"tags":["Streams"],"operationId":"post_streams_id_record_start","summary":"POST /streams/:id/record/start","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/record/status":{"get":{"tags":["Streams"],"operationId":"get_streams_id_record_status","summary":"GET /streams/:id/record/status","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/record/stop":{"post":{"tags":["Streams"],"operationId":"post_streams_id_record_stop","summary":"POST /streams/:id/record/stop","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/recording/download":{"get":{"tags":["Streams"],"operationId":"get_streams_id_recording_download","summary":"GET /streams/:id/recording/download","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/recording/qualities":{"get":{"tags":["Streams"],"operationId":"get_streams_id_recording_qualities","summary":"GET /streams/:id/recording/qualities","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/start":{"post":{"tags":["Streams"],"operationId":"post_streams_id_start","summary":"Open the broadcast — viewers can now play it","description":"Takes no body. Point an encoder at the ingest URL first: this call starts the viewer-facing ladder for whatever is arriving, and answers 502 TRANSCODER_START_FAILED if that could not be started. Calling it again on an already started card is accepted and re-answers the same shape.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"started":{"summary":"On air. hasSignal stays true and isLive flips — that pair is the go-live button state","value":{"success":true,"data":{"id":"b7c8d9e0f1a2b3c4d5e6f708192a3b4c","isLive":true,"hasSignal":true,"status":"ACTIVE","startedAt":"2026-08-16T18:02:11.004Z","message":"Broadcast started"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"HTTP 403","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"quotaExceeded":{"summary":"The monthly stream-hours allowance is spent. `quota` carries the counters this was decided from","value":{"success":false,"error":{"code":"QUOTA_EXCEEDED","message":"Monthly stream-hours allowance exceeded for your plan. Upgrade your plan or wait for the next billing period.","dimension":"streams","quota":{"used":100,"limit":100,"isExceeded":true}}}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/status":{"get":{"tags":["Streams"],"operationId":"get_streams_id_status","summary":"GET /streams/:id/status","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/status/stream":{"get":{"tags":["Streams"],"operationId":"get_streams_id_status_stream","summary":"GET /streams/:id/status/stream","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/stop":{"post":{"tags":["Streams"],"operationId":"post_streams_id_stop","summary":"Close the broadcast (alias: POST /streams/{id}/end)","description":"Takes no body. Ends the viewer-facing broadcast; the card and its key survive, so the same card can go live again. `hasSignal` may still be true afterwards when the encoder keeps publishing — that is the card back in the \"connected, not on air\" state, not a failed stop. `endedAt` is present only when the card had actually started.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"stopped":{"summary":"Stopped after a real broadcast — `endedAt` is present because the card had started","value":{"success":true,"data":{"message":"Broadcast stopped","isLive":false,"hasSignal":true,"endedAt":"2026-08-16T18:44:52.310Z"}}},"stoppedNeverStarted":{"summary":"Stopping a card that never started is accepted, and `endedAt` is ABSENT — do not read it unconditionally","value":{"success":true,"data":{"message":"Broadcast stopped","isLive":false,"hasSignal":false}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/thumbnail":{"get":{"tags":["Streams"],"operationId":"get_streams_id_thumbnail","summary":"GET /streams/:id/thumbnail","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/viewers":{"get":{"tags":["Streams"],"operationId":"get_streams_id_viewers","summary":"GET /streams/:id/viewers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/streams/{id}/viewers/stream":{"get":{"tags":["Streams"],"operationId":"get_streams_id_viewers_stream","summary":"GET /streams/:id/viewers/stream","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/subscribers":{"get":{"tags":["Subscriptions"],"operationId":"get_subscribers","summary":"GET /subscribers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Subscriptions"],"operationId":"post_subscribers","summary":"POST /subscribers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/subscribers/{subscriberUserId}":{"delete":{"tags":["Subscriptions"],"operationId":"delete_subscribers_subscriberUserId","summary":"DELETE /subscribers/:subscriberUserId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"subscriberUserId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/subscribers/count":{"get":{"tags":["Subscriptions"],"operationId":"get_subscribers_count","summary":"GET /subscribers/count","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/summary":{"get":{"tags":["Summary"],"operationId":"get_summary","summary":"GET /summary","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/support/tickets":{"get":{"tags":["Support"],"operationId":"get_support_tickets","summary":"GET /support/tickets","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Support"],"operationId":"post_support_tickets","summary":"POST /support/tickets","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/support/tickets/{id}":{"get":{"tags":["Support"],"operationId":"get_support_tickets_id","summary":"GET /support/tickets/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/support/tickets/{id}/replies":{"post":{"tags":["Support"],"operationId":"post_support_tickets_id_replies","summary":"POST /support/tickets/:id/replies","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/team":{"get":{"tags":["Team"],"operationId":"get_team","summary":"GET /team","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Team"],"operationId":"patch_team","summary":"PATCH /team","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/team/chat":{"get":{"tags":["Team"],"operationId":"get_team_chat","summary":"GET /team/chat","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Team"],"operationId":"post_team_chat","summary":"POST /team/chat","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/team/chat/{messageId}":{"delete":{"tags":["Team"],"operationId":"delete_team_chat_messageId","summary":"DELETE /team/chat/:messageId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Team"],"operationId":"patch_team_chat_messageId","summary":"PATCH /team/chat/:messageId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"messageId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/team/members":{"get":{"tags":["Team"],"operationId":"get_team_members","summary":"GET /team/members","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Team"],"operationId":"post_team_members","summary":"POST /team/members","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/team/members/{memberId}":{"delete":{"tags":["Team"],"operationId":"delete_team_members_memberId","summary":"DELETE /team/members/:memberId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Team"],"operationId":"patch_team_members_memberId","summary":"PATCH /team/members/:memberId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"memberId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/team/tasks":{"get":{"tags":["Team"],"operationId":"get_team_tasks","summary":"GET /team/tasks","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Team"],"operationId":"post_team_tasks","summary":"POST /team/tasks","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/team/tasks/{taskId}":{"delete":{"tags":["Team"],"operationId":"delete_team_tasks_taskId","summary":"DELETE /team/tasks/:taskId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Team"],"operationId":"patch_team_tasks_taskId","summary":"PATCH /team/tasks/:taskId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/tiers":{"get":{"tags":["Tiers"],"operationId":"get_tiers","summary":"GET /tiers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Tiers"],"operationId":"post_tiers","summary":"POST /tiers","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/tiers/{id}":{"delete":{"tags":["Tiers"],"operationId":"delete_tiers_id","summary":"DELETE /tiers/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"get":{"tags":["Tiers"],"operationId":"get_tiers_id","summary":"GET /tiers/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Tiers"],"operationId":"patch_tiers_id","summary":"PATCH /tiers/:id","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/upload/{token}":{"post":{"tags":["Upload"],"operationId":"post_upload_token","summary":"POST /upload/:token","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"410":{"description":"Always returned. This endpoint was withdrawn 2026-05-28 in favour of the canonical 2-step upload (POST /videos/upload, then PUT the bytes to the returned URL). See /docs/upload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"gone":{"summary":"The only response this route produces","value":{"success":false,"error":{"code":"ENDPOINT_DEPRECATED","message":"POST /v1/upload/:token has been removed. Use the canonical 2-step upload: POST /v1/videos/upload to obtain upload.url, then PUT the bytes to that URL (chunked Content-Range supported).","canonical":{"step1":"POST /v1/videos/upload","step2":"PUT  <data.upload.url>","docs":"https://app.dcast.pro/site-pro/docs/upload"}}}}}}}}},"deprecated":true}},"/uploads/{token}":{"head":{"tags":["Upload"],"operationId":"head_uploads_token","summary":"Ask where the bytes go, without sending them","description":"Step two of the upload. The URL for this call comes from `data.upload.url` on POST /videos/upload — do not construct it. The token in the path IS the credential: it is signed, single-use and expiring, and this endpoint never reads the Authorization header, so a pk_ key neither helps nor is required. Success is a 307 redirect with no body, carrying the storage destination in `Location`; 307 preserves the method and the body, so a client that follows redirects on PUT needs no special handling, and one that cannot should HEAD this same URL first and read `Location` without sending anything. Treat that destination as opaque and single-use — do not parse it, store it or send a second body to it. The four 401s are worth telling apart from each other rather than retrying blindly: a truncated URL, an edited payload, an expired token and an owner mismatch each say so, and only the expired one is fixed by minting a fresh token for the same video.","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"uploadToken":[]}],"responses":{"307":{"description":"Bytes accepted for forwarding. The Location header carries the storage URL to send them to; 307 preserves method and body, so a client that follows redirects on PUT needs no special handling. A client that cannot follow a PUT redirect should HEAD this same URL first and read Location without sending a body. Treat the value as opaque and single-use: do not parse, store or re-use it.","headers":{"Location":{"description":"Opaque, short-lived destination for the bytes. Follow it; do not cache it.","schema":{"type":"string","format":"uri"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"description":"NO_CAPABLE_WORKER / NO_UPLOAD_WORKERS — no storage could be assigned for these bytes. See the example bodies: `retryable` says whether waiting helps."}}},"put":{"tags":["Upload"],"operationId":"put_uploads_token","summary":"Send the video bytes","description":"Step two of the upload. The URL for this call comes from `data.upload.url` on POST /videos/upload — do not construct it. The token in the path IS the credential: it is signed, single-use and expiring, and this endpoint never reads the Authorization header, so a pk_ key neither helps nor is required. Success is a 307 redirect with no body, carrying the storage destination in `Location`; 307 preserves the method and the body, so a client that follows redirects on PUT needs no special handling, and one that cannot should HEAD this same URL first and read `Location` without sending anything. Treat that destination as opaque and single-use — do not parse it, store it or send a second body to it. The four 401s are worth telling apart from each other rather than retrying blindly: a truncated URL, an edited payload, an expired token and an owner mismatch each say so, and only the expired one is fixed by minting a fresh token for the same video.","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"uploadToken":[]}],"responses":{"307":{"description":"Bytes accepted for forwarding. The Location header carries the storage URL to send them to; 307 preserves method and body, so a client that follows redirects on PUT needs no special handling. A client that cannot follow a PUT redirect should HEAD this same URL first and read Location without sending a body. Treat the value as opaque and single-use: do not parse, store or re-use it.","headers":{"Location":{"description":"Opaque, short-lived destination for the bytes. Follow it; do not cache it.","schema":{"type":"string","format":"uri"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"description":"HTTP 401","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"malformed":{"summary":"Not `<payload>.<signature>` — the URL was truncated or re-encoded in transit","value":{"success":false,"error":{"code":"INVALID_TOKEN","message":"Malformed upload token"}}},"badSignature":{"summary":"Well-formed but not signed by us — an edited payload lands here","value":{"success":false,"error":{"code":"INVALID_TOKEN","message":"Bad signature"}}},"expired":{"summary":"The token outlived its hour. Mint a fresh one with POST /videos/upload — the video row is still there","value":{"success":false,"error":{"code":"TOKEN_EXPIRED","message":"Upload token expired"}}},"ownerMismatch":{"summary":"The token names one owner and the video now has another — refused rather than accepted on your behalf","value":{"success":false,"error":{"code":"INVALID_TOKEN","message":"Upload token / video owner mismatch"}}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"HTTP 404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"videoGone":{"summary":"The token is valid but its video row no longer exists (deleted, or rolled back after a failed init)","value":{"success":false,"error":{"code":"NOT_FOUND","message":"Video not found"}}}}}}},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"description":"NO_CAPABLE_WORKER / NO_UPLOAD_WORKERS — no storage could be assigned for these bytes. See the example bodies: `retryable` says whether waiting helps.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"noWorker":{"summary":"No storage could be assigned for these bytes right now","value":{"success":false,"error":{"code":"NO_UPLOAD_WORKERS","message":"No worker available — retry shortly"}}}}}}}}}},"/usage":{"get":{"tags":["Usage"],"operationId":"get_usage","summary":"GET /usage","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/users/{username}/subscribe":{"delete":{"tags":["Users"],"operationId":"delete_users_username_subscribe","summary":"DELETE /users/:username/subscribe","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Users"],"operationId":"post_users_username_subscribe","summary":"POST /users/:username/subscribe","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos":{"get":{"tags":["Videos"],"operationId":"get_videos","summary":"List your videos, newest first","description":"A page of the videos owned by the key's account, newest first, with a `pagination` block. Videos that are still encoding appear in this list immediately — they are not withheld until READY — so the page mixes finished and unfinished rows, and on an unfinished row `playback`, `duration`, `resolution`, `fileSize` and `thumbnails.default` are all null. Treat a null `playback` as \"not playable yet\", never as an error. An account with no videos gets an empty array and a valid pagination block, never a 404. Use `limit` up to 100 and `page` to walk; for one video in full detail, including the playback discovery block, call GET /videos/{id}.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/VideoList"}}},"examples":{"mixedPage":{"summary":"A page mixing a READY video with one still PROCESSING — the shape difference IS the lesson","value":{"success":true,"data":{"videos":[{"id":"a1b2c3d4e5f60718293a4b5c6d7e8f90","title":"Season 3 opener","description":null,"visibility":"PUBLIC","isPaid":false,"price":null,"requiredTierId":null,"paidAccess":false,"paidAccessPrice":null,"duration":2567,"resolution":"1080p","fileSize":1762243589,"status":"READY","thumbnails":{"default":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/thumbnail"},"playback":{"hls":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/master","embed":"https://dcast.tv/embed/a1b2c3d4e5f60718293a4b5c6d7e8f90"},"createdAt":"2026-08-13T22:52:16.988Z","updatedAt":"2026-08-14T00:20:51.393Z"},{"id":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","title":"Backstage cut","description":"Members only","visibility":"TIER_EXCLUSIVE","isPaid":true,"price":4.99,"requiredTierId":"cmtier00000000000000000t1","paidAccess":true,"paidAccessPrice":4.99,"duration":null,"resolution":null,"fileSize":null,"status":"PROCESSING","thumbnails":{"default":null},"playback":null,"createdAt":"2026-08-14T02:10:04.001Z","updatedAt":"2026-08-14T02:10:44.512Z"}],"pagination":{"page":1,"limit":20,"total":2,"pages":1}}}},"emptyLibrary":{"summary":"No videos yet — an empty list, never a 404","value":{"success":true,"data":{"videos":[],"pagination":{"page":1,"limit":20,"total":0,"pages":1}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Videos"],"operationId":"post_videos","summary":"Start a video upload and get the URL to send the bytes to","description":"Step one of two. This call creates the video row and hands back a single-use, signed upload URL in `data.upload.url`; the bytes themselves go to that URL in step two (PUT /uploads/{token}), NOT to this endpoint. Read `data.upload.chunked` before sending: false means one PUT of the whole body, true means send `chunkSize` slices with a Content-Range header. The URL carries its own credential and its own expiry — a pk_ key is neither used nor needed on it. Then poll `data.statusUrl`. The refusals are worth handling separately rather than as one failure: QUOTA_EXCEEDED means you are out of space, while QUOTA_CHECK_UNAVAILABLE and the retryable NO_CAPABLE_WORKER mean nothing was started and a retry is right — see the examples, and note that the quota sizes arrive in two different shapes.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"singlePut":{"summary":"A 20 MB file — chunked:false, so one PUT of the whole body is correct","value":{"success":true,"data":{"video":{"id":"a1b2c3d4e5f60718293a4b5c6d7e8f90","title":"Season 3 opener","description":"","visibility":"PRIVATE","status":"PREPARING"},"upload":{"url":"https://api.dcast.pro/api/v1/uploads/<opaque-signed-upload-token>","method":"PUT","expiresAt":"2026-08-14T04:27:19.142Z","maxFileSize":22000000,"chunkSize":99614720,"chunked":false,"instructions":"Single PUT request for small files"},"statusUrl":"/api/v1/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/status"}}},"chunked":{"summary":"A 1 GB file — chunked:true and the instructions change; send Content-Range in chunkSize slices","value":{"success":true,"data":{"video":{"id":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","title":"Backstage cut","description":"Members only","visibility":"PRIVATE","status":"PREPARING"},"upload":{"url":"https://api.dcast.pro/api/v1/uploads/<opaque-signed-upload-token>","method":"PUT","expiresAt":"2026-08-14T04:27:19.142Z","maxFileSize":1100000000,"chunkSize":99614720,"chunked":true,"instructions":"Use Content-Range header for chunked upload: bytes START-END/TOTAL"},"statusUrl":"/api/v1/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/status"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"HTTP 403","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"quotaExceededPreCheck":{"summary":"Out of space, caught before the asset row — the sizes arrive NESTED under error.quota","value":{"success":false,"error":{"code":"QUOTA_EXCEEDED","message":"Storage quota exceeded","quota":{"used":"2.1 TiB","limit":"2 TiB","available":"0 B"}}}},"quotaExceededOnHold":{"summary":"Same code, FLAT fields: two uploads raced for the last of the space and the hold refused this one (partner-api-v1.js:5037). Read error.code, not the shape","value":{"success":false,"error":{"code":"QUOTA_EXCEEDED","message":"Storage quota exceeded","used":"2 TiB","limit":"2 TiB","available":"0 B"}}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"description":"The upload could not be started. `error.code` distinguishes the causes; `retryable` (or its absence) says whether a retry is advised — see the examples.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"noCapableWorker":{"summary":"Retryable: storage is momentarily unreachable. Retry-After carries the measured wait; nothing was sent, so simply start again","value":{"success":false,"error":{"code":"NO_CAPABLE_WORKER","cause":"NO_WORKER_SERVING_UPLOADS","retryable":true,"retryAfterSeconds":30,"message":"The upload server is not answering right now. Nothing has been sent yet — start the upload again shortly."}}},"noCapableWorkerPermanent":{"summary":"Same code, retryable:false — waiting will not clear it. Surface it and stop; do not build a retry loop on the code alone","value":{"success":false,"error":{"code":"NO_CAPABLE_WORKER","cause":"NO_FREE_STORAGE","retryable":false,"retryAfterSeconds":null,"message":"Our upload servers have no free space right now. We have been alerted — please contact support."}}},"quotaCheckUnavailable":{"summary":"We could not read your usage, so nothing was started. Distinct from QUOTA_EXCEEDED on purpose: this one IS worth retrying","value":{"success":false,"error":{"code":"QUOTA_CHECK_UNAVAILABLE","message":"Storage usage could not be read; upload not started","retryable":true}}}}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"Step 1 of 2: reserve the asset and mint an upload URL. No bytes are sent here — PUT them to data.upload.url next. Every field is optional, but fileSize should be the real byte count: it is what the quota check and the storage hold are taken against, and it sizes the token (maxFileSize = fileSize x 1.1).","properties":{"title":{"type":"string","description":"Falls back to fileName, then to \"Untitled Video\"."},"fileName":{"type":"string","description":"Defaults to \"video.mp4\". Also the title fallback."},"description":{"type":"string","description":"Defaults to an empty string."},"visibility":{"type":"string","description":"Upper-cased before use; defaults to PRIVATE when omitted.","enum":["PUBLIC","LINK_ONLY","PRIVATE","SUBSCRIBERS","TIER_EXCLUSIVE"]},"fileSize":{"type":"integer","minimum":0,"description":"Byte count of the file you are about to send. Omitted or unparseable counts as 0, which asks for no space and mints a 100 GiB ceiling."}}},"examples":{"singlePut":{"summary":"The call that produces the singlePut response below: a 20 MB file, title given, everything else left to default (visibility PRIVATE, description empty)","value":{"title":"Season 3 opener","fileName":"season-3-opener.mp4","fileSize":20000000}},"chunked":{"summary":"The call that produces the chunked response below: 1 GB is over the threshold, so `chunked` comes back true and the bytes go in Content-Range slices","value":{"title":"Backstage cut","fileName":"backstage-cut.mp4","description":"Members only","fileSize":1000000000}}}}}}}},"/videos/{id}":{"delete":{"tags":["Videos"],"operationId":"delete_videos_id","summary":"Delete a video and its files","description":"Removes the video row and the encoded files behind it. Unlike DELETE /streams/{id}, which answers 202 and finishes cleaning in the background, this one runs the deletion inline and answers 200 only once it has succeeded — `data.filesDeleted` reports how many stored files went with it. A failure part-way through is a 500 DELETION_FAILED, and it means the video may still be there, so a 500 here is worth retrying where a 500 usually is not. Deleting something already gone is 404, not a silent success, so a retry after a timeout is safe to distinguish that way. The key needs the `videos:delete` permission; without it the answer is 403 and nothing is touched. This is not reversible through the API.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"deleted":{"summary":"Gone, files and all. Note the 200: unlike DELETE /streams/{id} this path does not defer the purge, so there is no 202 here","value":{"success":true,"data":{"deleted":true,"videoId":"a1b2c3d4e5f60718293a4b5c6d7e8f90","filesDeleted":7}}},"deletedNothingStored":{"summary":"Same success for a video that never finished encoding — filesDeleted is 0, which is not a failure","value":{"success":true,"data":{"deleted":true,"videoId":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","filesDeleted":0}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"HTTP 404","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"alreadyGone":{"summary":"Not yours, or already deleted — the two are deliberately indistinguishable, so a retry after a timeout lands here rather than reporting a fresh delete","value":{"success":false,"error":{"code":"NOT_FOUND","message":"Video not found"}}}}}}},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"HTTP 500","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"deletionFailed":{"summary":"Part-way failure: the video may still exist. The one 500 on this API that IS worth retrying","value":{"success":false,"error":{"code":"DELETION_FAILED","message":"Failed to delete video"}}}}}}}}},"get":{"tags":["Videos"],"operationId":"get_videos_id","summary":"Read one video in full, including how to play it","description":"Everything the list returns for one video plus the technical metadata (fps, bitrate, codec), the counters, and the `playback` discovery block that tells you how to play it. `playback` is null for any video that is not READY. When it is present, read `playback.requiresToken`: false means the `hls` URL plays as-is; true means that URL answers 403 until you mint a viewer token at `playback.accessTokenUrl` — a gated video is READY and playable, it simply needs the token, which is the distinction most first integrations miss. The flat `hlsUrl` / `playbackUrl` / `thumbnailUrl` fields are aliases kept for older clients and go null together with `playback`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Video"}}},"examples":{"ready":{"summary":"READY — playback discovery is populated","value":{"success":true,"data":{"id":"a1b2c3d4e5f60718293a4b5c6d7e8f90","title":"Season 3 opener","description":null,"visibility":"PUBLIC","isPaid":false,"price":null,"requiredTierId":null,"paidAccess":false,"paidAccessPrice":null,"duration":2567,"resolution":"1080p","fps":23.976,"bitrate":5493,"codec":"h264","fileSize":1762243589,"status":"READY","views":1284,"likes":37,"thumbnails":{"default":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/thumbnail"},"hlsUrl":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/master","playbackUrl":"https://dcast.tv/embed/a1b2c3d4e5f60718293a4b5c6d7e8f90","thumbnailUrl":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/thumbnail","playback":{"playable":true,"hls":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/master","embed":"https://dcast.tv/embed/a1b2c3d4e5f60718293a4b5c6d7e8f90","playUrl":"https://api.dcast.pro/api/v1/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/play","accessTokenUrl":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/access-token","thumbnail":"https://api.dcast.pro/api/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/thumbnail","requiresToken":false},"quality":"HD_1080P","createdAt":"2026-08-13T22:52:16.988Z","updatedAt":"2026-08-14T00:20:51.393Z"}}},"stillProcessing":{"summary":"Same endpoint, same video, mid-pipeline — every playback field is null","value":{"success":true,"data":{"id":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","title":"Backstage cut","description":"Members only","visibility":"TIER_EXCLUSIVE","isPaid":true,"price":4.99,"requiredTierId":"cmtier00000000000000000t1","paidAccess":true,"paidAccessPrice":4.99,"duration":null,"resolution":null,"fps":null,"bitrate":null,"codec":null,"fileSize":null,"status":"PROCESSING","views":0,"likes":0,"thumbnails":{"default":null},"hlsUrl":null,"playbackUrl":null,"thumbnailUrl":null,"playback":null,"quality":null,"createdAt":"2026-08-14T02:10:04.001Z","updatedAt":"2026-08-14T02:10:44.512Z"}}},"gatedButReady":{"summary":"READY and requiresToken:true — the master URL 403s until the caller mints a token at accessTokenUrl","value":{"success":true,"data":{"id":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","title":"Backstage cut","description":"Members only","visibility":"TIER_EXCLUSIVE","isPaid":true,"price":4.99,"requiredTierId":"cmtier00000000000000000t1","paidAccess":true,"paidAccessPrice":4.99,"duration":903,"resolution":"1080p","fps":30,"bitrate":4800,"codec":"h264","fileSize":541203998,"status":"READY","views":12,"likes":3,"thumbnails":{"default":"https://api.dcast.pro/api/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/thumbnail"},"hlsUrl":"https://api.dcast.pro/api/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/master","playbackUrl":"https://dcast.tv/embed/0f1e2d3c4b5a69788796a5b4c3d2e1f0","thumbnailUrl":"https://api.dcast.pro/api/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/thumbnail","playback":{"playable":true,"hls":"https://api.dcast.pro/api/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/master","embed":"https://dcast.tv/embed/0f1e2d3c4b5a69788796a5b4c3d2e1f0","playUrl":"https://api.dcast.pro/api/v1/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/play","accessTokenUrl":"https://api.dcast.pro/api/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/access-token","thumbnail":"https://api.dcast.pro/api/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/thumbnail","requiresToken":true},"quality":"HD_1080P","createdAt":"2026-08-14T02:10:04.001Z","updatedAt":"2026-08-14T02:41:09.220Z"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Videos"],"operationId":"patch_videos_id","summary":"Change a video's title, description, visibility or paid access","description":"Partial update — send only the fields you are changing. `visibility` accepts either case and maps the friendly words onto the stored values: `unlisted` is stored as LINK_ONLY and `tier` as TIER_EXCLUSIVE. Paid access is `isPaid` plus `price` (the older `paidAccess` / `paidAccessPrice` names still work); a positive price with no `isPaid` infers isPaid=true, and isPaid=false clears the price. Two behaviours to plan for. First, `currency` and `donationsEnabled` are REJECTED with 400 UNSUPPORTED_FIELD rather than ignored, deliberately, so you never believe a setting took effect that did not; other unknown keys are tolerated and do nothing. Second, tightening access takes effect on people who are already watching — making a public video paid, or narrowing its visibility, cuts off viewers in flight instead of waiting for a cache to expire. Loosening access does not disconnect anyone. The response echoes only the fields this endpoint owns; call GET /videos/{id} for the full row.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"renamed":{"summary":"A title change — the response carries this endpoint's fields only, so call GET /videos/{id} if you need the full row back","value":{"success":true,"data":{"id":"a1b2c3d4e5f60718293a4b5c6d7e8f90","title":"Season 3 opener (remastered)","description":null,"visibility":"PUBLIC","isPaid":false,"price":null,"requiredTierId":null,"publishedAt":"2026-08-13T22:52:16.988Z","updatedAt":"2026-08-14T03:11:02.417Z"}}},"goneBehindAPaywall":{"summary":"Turning on paid access. This is a TIGHTENING, so anyone watching right now is cut off — it does not wait for a cache to expire","value":{"success":true,"data":{"id":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","title":"Backstage cut","description":"Members only","visibility":"LINK_ONLY","isPaid":true,"price":4.99,"requiredTierId":null,"publishedAt":"2026-08-14T02:10:04.001Z","updatedAt":"2026-08-14T03:12:44.980Z"}}}}}}},"400":{"description":"Validation error: isPaid not boolean, price out of [0,9999], or an unsupported field (currency / donationsEnabled).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"unsupportedField":{"summary":"Refused rather than ignored: `currency` and `donationsEnabled` would have done nothing, so they are not accepted quietly","value":{"success":false,"error":{"code":"UNSUPPORTED_FIELD","message":"Field \"currency\" is not supported on PATCH /videos/:id. Videos are billed in your Stripe Connect default currency.","field":"currency"}}}}}}},"404":{"description":"Video not found or not owned by this key."}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"Partial update. All fields optional. Pricing: set isPaid=true with a positive price to gate playback behind a one-time (PPV) purchase; set requiredTierId to gate behind a subscription tier. Sending a positive price without isPaid infers isPaid=true; setting isPaid=false clears price.","properties":{"title":{"type":"string","minLength":1,"maxLength":300},"description":{"type":["string","null"]},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE","LINK_ONLY","REGISTERED","SUBSCRIBERS","TIER_EXCLUSIVE","unlisted","bykey","tier"],"description":"Case-insensitive. Aliases: unlisted and bykey are stored as LINK_ONLY, tier as TIER_EXCLUSIVE. Anything else is refused 400 INVALID_VISIBILITY. Meaning of each value: /docs/video-api#visibility."},"tags":{"type":"array","items":{"type":"string"}},"isPaid":{"type":"boolean","description":"Enable per-video pay-per-view gating. false clears price."},"price":{"type":["number","null"],"minimum":0,"maximum":9999,"description":"PPV price in USD dollars (e.g. 4.99). null/empty clears it. A positive value infers isPaid=true when isPaid is omitted."},"requiredTierId":{"type":["string","null"],"description":"Subscription tier the viewer must hold to watch. null clears the tier gate."},"paidAccess":{"type":"boolean","deprecated":true,"description":"Legacy alias for isPaid (kept for back-compat)."},"paidAccessPrice":{"type":["number","null"],"deprecated":true,"description":"Legacy alias for price (USD dollars)."}}},"examples":{"rename":{"summary":"Partial update — the fields you do not send are left alone","value":{"title":"Season 3 opener (remastered)"}},"payPerView":{"summary":"Gate playback behind a one-time purchase. A positive price on its own would have inferred isPaid=true","value":{"isPaid":true,"price":4.99}},"unlisted":{"summary":"The friendly lowercase form; `unlisted` is stored as LINK_ONLY","value":{"visibility":"unlisted"}}}}}}}},"/videos/{id}/comments":{"get":{"tags":["Videos"],"operationId":"get_videos_id_comments","summary":"GET /videos/:id/comments","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Videos"],"operationId":"post_videos_id_comments","summary":"POST /videos/:id/comments","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/comments/{commentId}":{"delete":{"tags":["Videos"],"operationId":"delete_videos_id_comments_commentId","summary":"DELETE /videos/:id/comments/:commentId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"patch":{"tags":["Videos"],"operationId":"patch_videos_id_comments_commentId","summary":"PATCH /videos/:id/comments/:commentId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"put":{"tags":["Videos"],"operationId":"put_videos_id_comments_commentId","summary":"PUT /videos/:id/comments/:commentId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"commentId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/download":{"get":{"tags":["Videos"],"operationId":"get_videos_id_download","summary":"GET /videos/:id/download","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/editor/export":{"post":{"tags":["Videos"],"operationId":"post_videos_id_editor_export","summary":"POST /videos/:id/editor/export","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/editor/export/{jobId}":{"get":{"tags":["Videos"],"operationId":"get_videos_id_editor_export_jobId","summary":"GET /videos/:id/editor/export/:jobId","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/editor/metadata":{"get":{"tags":["Videos"],"operationId":"get_videos_id_editor_metadata","summary":"GET /videos/:id/editor/metadata","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/embed":{"get":{"tags":["Videos"],"operationId":"get_videos_id_embed","summary":"GET /videos/:id/embed","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/like":{"delete":{"tags":["Videos"],"operationId":"delete_videos_id_like","summary":"DELETE /videos/:id/like","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"post":{"tags":["Videos"],"operationId":"post_videos_id_like","summary":"POST /videos/:id/like","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/play":{"get":{"tags":["Videos"],"operationId":"get_videos_id_play","summary":"GET /videos/:id/play","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/progress":{"get":{"tags":["Videos"],"operationId":"get_videos_id_progress","summary":"GET /videos/:id/progress","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/related":{"get":{"tags":["Videos"],"operationId":"get_videos_id_related","summary":"GET /videos/:id/related","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50}}],"security":[],"responses":{"200":{"description":"Related videos. Shape documented at /docs/video-api.","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Source video not found."}}}},"/videos/{id}/status":{"get":{"tags":["Videos"],"operationId":"get_videos_id_status","summary":"Poll one video through upload, encoding and thumbnails","description":"The progress endpoint for a video you have uploaded — the most-called operation on this API, because it is the one you loop on. `data.status` is the canonical field: READY and FAILED are terminal, so stop polling when you see either. `progress` is 0-100 across the whole pipeline, and `stages` breaks it into upload / processing / thumbnails. Two things routinely surprise a first integration: `processing.eta` is null until the encoder has enough samples to estimate one, so never render it unconditionally; and `stages._raw` carries our internal enum names, which are what the canonical status is mapped FROM — branch on `status`, not on `_raw`. A video that is still uploading is not an error and not a 404: it is this endpoint answering 200 with an early stage.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"done":{"summary":"Terminal — poll can stop","value":{"success":true,"data":{"videoId":"a1b2c3d4e5f60718293a4b5c6d7e8f90","status":"READY","progress":100,"stages":{"upload":"DONE","processing":"DONE","thumbnails":"DONE","_raw":{"upload":"UPLOADED","processing":"COMPLETED"}},"results":{"phase":"completed","recoveredFromError":false},"upload":{"progress":100,"bytesUploaded":1762243589,"bytesTotal":1762243589,"formatted":{"uploaded":"1.64 GB","total":"1.64 GB"}},"processing":{"progress":100,"eta":null,"etaConfidence":null}}}},"inFlight":{"summary":"Mid-encode — note eta is null until it can be estimated, so never render it unconditionally","value":{"success":true,"data":{"videoId":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","status":"PROCESSING","progress":41,"stages":{"upload":"DONE","processing":"RUNNING","thumbnails":"PENDING","_raw":{"upload":"UPLOADED","processing":"PROCESSING"}},"results":{"phase":"encoding","recoveredFromError":false},"upload":{"progress":100,"bytesUploaded":541203998,"bytesTotal":541203998,"formatted":{"uploaded":"516 MB","total":"516 MB"}},"processing":{"progress":41,"eta":null,"etaConfidence":null}}}},"failed":{"summary":"Terminal failure — status FAILED is reached from several internal enums (see stages._raw)","value":{"success":true,"data":{"videoId":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","status":"FAILED","progress":0,"stages":{"upload":"DONE","processing":"FAILED","thumbnails":"PENDING","_raw":{"upload":"UPLOADED","processing":"FAILED"}},"results":{"phase":"failed","recoveredFromError":false},"upload":{"progress":100,"bytesUploaded":541203998,"bytesTotal":541203998,"formatted":{"uploaded":"516 MB","total":"516 MB"}},"processing":{"progress":0,"eta":null,"etaConfidence":null}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/upload":{"post":{"tags":["Videos"],"operationId":"post_videos_id_upload","summary":"POST /videos/:id/upload","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/{id}/views":{"post":{"tags":["Videos"],"operationId":"post_videos_id_views","summary":"POST /videos/:id/views","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"duration":{"type":["integer","null"],"minimum":0},"sessionId":{"type":["string","null"]}}},"examples":{"beacon":{"summary":"Seconds watched, plus your own opaque session id so repeat beacons collapse into one view","value":{"duration":128,"sessionId":"your-own-opaque-session-id"}}}}}}}},"/videos/{videoId}/purchases":{"get":{"tags":["Videos"],"operationId":"get_videos_videoId_purchases","summary":"GET /videos/:videoId/purchases","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"name":"videoId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"$ref":"#/components/responses/Success"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/videos/upload":{"post":{"tags":["Videos"],"operationId":"post_videos_upload","summary":"Start a video upload and get the URL to send the bytes to","description":"Step one of two. This call creates the video row and hands back a single-use, signed upload URL in `data.upload.url`; the bytes themselves go to that URL in step two (PUT /uploads/{token}), NOT to this endpoint. Read `data.upload.chunked` before sending: false means one PUT of the whole body, true means send `chunkSize` slices with a Content-Range header. The URL carries its own credential and its own expiry — a pk_ key is neither used nor needed on it. Then poll `data.statusUrl`. The refusals are worth handling separately rather than as one failure: QUOTA_EXCEEDED means you are out of space, while QUOTA_CHECK_UNAVAILABLE and the retryable NO_CAPABLE_WORKER mean nothing was started and a retry is right — see the examples, and note that the quota sizes arrive in two different shapes.","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"singlePut":{"summary":"A 20 MB file — chunked:false, so one PUT of the whole body is correct","value":{"success":true,"data":{"video":{"id":"a1b2c3d4e5f60718293a4b5c6d7e8f90","title":"Season 3 opener","description":"","visibility":"PRIVATE","status":"PREPARING"},"upload":{"url":"https://api.dcast.pro/api/v1/uploads/<opaque-signed-upload-token>","method":"PUT","expiresAt":"2026-08-14T04:27:19.142Z","maxFileSize":22000000,"chunkSize":99614720,"chunked":false,"instructions":"Single PUT request for small files"},"statusUrl":"/api/v1/videos/a1b2c3d4e5f60718293a4b5c6d7e8f90/status"}}},"chunked":{"summary":"A 1 GB file — chunked:true and the instructions change; send Content-Range in chunkSize slices","value":{"success":true,"data":{"video":{"id":"0f1e2d3c4b5a69788796a5b4c3d2e1f0","title":"Backstage cut","description":"Members only","visibility":"PRIVATE","status":"PREPARING"},"upload":{"url":"https://api.dcast.pro/api/v1/uploads/<opaque-signed-upload-token>","method":"PUT","expiresAt":"2026-08-14T04:27:19.142Z","maxFileSize":1100000000,"chunkSize":99614720,"chunked":true,"instructions":"Use Content-Range header for chunked upload: bytes START-END/TOTAL"},"statusUrl":"/api/v1/videos/0f1e2d3c4b5a69788796a5b4c3d2e1f0/status"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"HTTP 403","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"quotaExceededPreCheck":{"summary":"Out of space, caught before the asset row — the sizes arrive NESTED under error.quota","value":{"success":false,"error":{"code":"QUOTA_EXCEEDED","message":"Storage quota exceeded","quota":{"used":"2.1 TiB","limit":"2 TiB","available":"0 B"}}}},"quotaExceededOnHold":{"summary":"Same code, FLAT fields: two uploads raced for the last of the space and the hold refused this one (partner-api-v1.js:5037). Read error.code, not the shape","value":{"success":false,"error":{"code":"QUOTA_EXCEEDED","message":"Storage quota exceeded","used":"2 TiB","limit":"2 TiB","available":"0 B"}}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"description":"The upload could not be started. `error.code` distinguishes the causes; `retryable` (or its absence) says whether a retry is advised — see the examples.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"noCapableWorker":{"summary":"Retryable: storage is momentarily unreachable. Retry-After carries the measured wait; nothing was sent, so simply start again","value":{"success":false,"error":{"code":"NO_CAPABLE_WORKER","cause":"NO_WORKER_SERVING_UPLOADS","retryable":true,"retryAfterSeconds":30,"message":"The upload server is not answering right now. Nothing has been sent yet — start the upload again shortly."}}},"noCapableWorkerPermanent":{"summary":"Same code, retryable:false — waiting will not clear it. Surface it and stop; do not build a retry loop on the code alone","value":{"success":false,"error":{"code":"NO_CAPABLE_WORKER","cause":"NO_FREE_STORAGE","retryable":false,"retryAfterSeconds":null,"message":"Our upload servers have no free space right now. We have been alerted — please contact support."}}},"quotaCheckUnavailable":{"summary":"We could not read your usage, so nothing was started. Distinct from QUOTA_EXCEEDED on purpose: this one IS worth retrying","value":{"success":false,"error":{"code":"QUOTA_CHECK_UNAVAILABLE","message":"Storage usage could not be read; upload not started","retryable":true}}}}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"Step 1 of 2: reserve the asset and mint an upload URL. No bytes are sent here — PUT them to data.upload.url next. Every field is optional, but fileSize should be the real byte count: it is what the quota check and the storage hold are taken against, and it sizes the token (maxFileSize = fileSize x 1.1).","properties":{"title":{"type":"string","description":"Falls back to fileName, then to \"Untitled Video\"."},"fileName":{"type":"string","description":"Defaults to \"video.mp4\". Also the title fallback."},"description":{"type":"string","description":"Defaults to an empty string."},"visibility":{"type":"string","description":"Upper-cased before use; defaults to PRIVATE when omitted.","enum":["PUBLIC","LINK_ONLY","PRIVATE","SUBSCRIBERS","TIER_EXCLUSIVE"]},"fileSize":{"type":"integer","minimum":0,"description":"Byte count of the file you are about to send. Omitted or unparseable counts as 0, which asks for no space and mints a 100 GiB ceiling."}}},"examples":{"singlePut":{"summary":"The call that produces the singlePut response below: a 20 MB file, title given, everything else left to default (visibility PRIVATE, description empty)","value":{"title":"Season 3 opener","fileName":"season-3-opener.mp4","fileSize":20000000}},"chunked":{"summary":"The call that produces the chunked response below: 1 GB is over the threshold, so `chunked` comes back true and the bytes go in Content-Range slices","value":{"title":"Backstage cut","fileName":"backstage-cut.mp4","description":"Members only","fileSize":1000000000}}}}}}}},"/webhooks/ips":{"get":{"tags":["Webhooks"],"operationId":"get_webhooks_ips","summary":"GET /webhooks/ips","description":"Full request/response shape on the topic page; envelope shapes under components.schemas. (Per-route schemas are populated incrementally as routes graduate from stub to JSDoc-annotated definitions.)","parameters":[{"$ref":"#/components/parameters/XDCASTRequestId"},{"$ref":"#/components/parameters/DcastAPIVersion"}],"security":[],"responses":{"200":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"advertised":{"summary":"Allowlist source — the addresses shown here are RFC 5737 placeholders; call the endpoint for the live values","value":{"success":true,"data":{"ips":["203.0.113.10/32"],"note":"Current egress IP(s) for partner-webhook deliveries from api.dcast.pro. Allowlist for debugging; for production-grade firewall pinning, contact support for a static-IP arrangement (today the egress is shared with the backend host and may change on ISP DHCP renewal).","lastUpdated":"2026-05-28"}}},"noneConfigured":{"summary":"Nothing configured — an empty list and a note, never a 500","value":{"success":true,"data":{"ips":[],"note":"Outbound IP list not configured. Contact support.","lastUpdated":"2026-05-28"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"description":"Method not allowed on this path. See `Allow` response header for the supported methods."},"409":{"description":"Idempotent-replay or conflict (e.g. unique-constraint hit). Body shape matches Error envelope."},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"pk_<40 hex chars>","description":"Partner API key: `pk_` followed by 40 lowercase hex characters. Create it in the dashboard (Settings → API keys). Keys are creator-scoped — they cannot touch other creators' resources and cannot manage admin/payout state. Key management over the API: any key may list the account's keys (GET /me/api-keys, key material redacted) and revoke itself; minting (POST /me/api-keys) and revoking other keys need a FULL_ACCESS key or an X-User-Token (403 OWNER_SCOPE_REQUIRED otherwise). Monetization (checkout / payment / embedded donation forms) is additionally ORIGIN-LOCKED: the request Origin/Referer must be a dcast platform host, your verified creator domain, or an integration domain you have declared AND verified for your account. A key with NO declared integration domain is rejected 403 `integration_domain_required` when monetizing off-platform; a request from an undeclared origin is rejected 403 `origin_not_allowed`. Declare + verify your integration domains (DNS TXT record) in the dashboard: Site customization → Domain → Integration domains. The embed allowlist does not take part in this check. Walkthrough: https://dcast.pro/docs/monetization#domain-verification."},"uploadToken":{"type":"apiKey","in":"path","name":"token","description":"Single-use upload token (NOT a pk_* key), returned as data.upload.url by POST /videos/upload. It is HMAC-signed and carries its own expiry; a malformed, forged or expired token is rejected 401 (INVALID_TOKEN / TOKEN_EXPIRED) before any bytes are accepted. Send the bytes to the returned URL as-is — this endpoint does not read the Authorization header, so a pk_* key neither helps nor is required here. HEAD the same URL first if your client cannot follow a 307 on PUT."},"previewToken":{"type":"apiKey","in":"query","name":"token","description":"Per-resource preview JWT (NOT a pk_* key). Mint via GET /streams/{id}/preview-url (or /restreams/{id}/preview-url) with your bearer key; the returned token is owner-bound, short-lived and revocable, and scopes playback to that one stream/restream preview. A missing or forged token yields 0 bytes — the preview.flv byte path is never anonymous despite not taking the pk_* bearer header."}},"parameters":{"XDCASTRequestId":{"name":"X-DCAST-Request-Id","in":"header","required":false,"schema":{"type":"string"},"description":"Optional client-side correlation ID. Preferred format is UUIDv4; any other value is silently replaced with a fresh UUIDv4 (no 400). The response header always echoes a canonical UUIDv4 — quote that in support tickets."},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8,255}$"},"description":"Opaque dedup key — 24h replay window on monetary + state-creating POSTs."},"DcastAPIVersion":{"name":"Dcast-API-Version","in":"header","required":false,"schema":{"type":"string","enum":["v1"]},"description":"Optional version pin. See /docs/versioning."}},"headers":{"XDCASTRequestIdResponse":{"description":"Per-request UUIDv4 — quote in support tickets.","schema":{"type":"string","format":"uuid"}},"XRateLimitLimit":{"description":"Max requests in the current 60s window for your pk_* key.","schema":{"type":"integer"}},"XRateLimitRemaining":{"description":"Requests left in the current window. -1 = backend storage unavailable.","schema":{"type":"integer"}},"XRateLimitReset":{"description":"Unix-epoch seconds when the current window closes.","schema":{"type":"integer"}},"DcastAPIVersionResponse":{"description":"API version that served this request.","schema":{"type":"string","enum":["v1"]}},"XDCASTIdempotentReplay":{"description":"Present and \"true\" when the response was replayed from the Idempotency-Key cache.","schema":{"type":"string","enum":["true"]}},"XDCASTIdempotency":{"description":"Present when an Idempotency-Key was supplied but NOT applied: \"bypassed-storage-unavailable\" means dedup storage was down and this call was executed without replay protection.","schema":{"type":"string","enum":["bypassed-storage-unavailable"]}},"RetryAfter":{"description":"On 429: seconds to wait before retrying.","schema":{"type":"integer"}}},"schemas":{"SuccessEnvelope":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"ErrorEnvelope":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"$ref":"#/components/schemas/Error"}}},"Error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code. See /docs/limits for the canonical list."},"message":{"type":"string","description":"Human-readable description."},"field":{"type":"string","description":"Offending input field for 4xx, when applicable."}}},"Pagination":{"type":"object","properties":{"limit":{"type":"integer"},"hasMore":{"type":"boolean"},"nextCursor":{"type":["string","null"]}}},"HealthReport":{"type":"object","description":"The body of GET /health at BOTH 200 and 503. `success` mirrors the status code, but a degraded probe carries no `error` object — the detail is in data.dependencies.","required":["success","data"],"properties":{"success":{"type":"boolean"},"data":{"type":"object","required":["status","dependencies"],"properties":{"status":{"type":"string","enum":["healthy","degraded"]},"version":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"uptimeSec":{"type":"integer"},"dependencies":{"type":"object","additionalProperties":{"type":"string","enum":["healthy","unhealthy","disconnected","unknown"]}},"probeDurationMs":{"type":"integer"}}}}},"AuthRelease":{"type":"object","description":"What POST /auth/login and POST /auth/register return on success. It is NOT the {success, data} envelope the rest of the API uses: `tokens` and `user` sit at the top level, so a client that unwraps `data` everywhere reads undefined here.","required":["success","tokens","user"],"properties":{"success":{"type":"boolean","enum":[true]},"tokens":{"type":"object","required":["accessToken","expiresIn"],"properties":{"accessToken":{"type":"string","description":"JWT for the end-user, scope `partner-api-user`. Send as X-User-Token on calls you make on their behalf."},"expiresIn":{"type":"integer","description":"Lifetime in seconds."}}},"user":{"type":"object","required":["id","email","role"],"properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":"string"}}}}},"VideoVisibility":{"type":"string","enum":["PUBLIC","LINK_ONLY","PRIVATE","SUBSCRIBERS","TIER_EXCLUSIVE","REGISTERED"],"description":"Stored video visibility. Meaning of each value: https://dcast.pro/docs/video-api#visibility."},"PartnerVideoStatus":{"type":"string","enum":["READY","UPLOADING","PROCESSING","FAILED","PENDING"],"description":"READY and FAILED are terminal."},"Thumbnails":{"type":"object","properties":{"default":{"type":["string","null"]}}},"VideoPlayback":{"type":["object","null"],"description":"Null until the video is READY. requiresToken=true means GET {hls} answers 403 until a viewer pass is minted at accessTokenUrl (GET, outside /api/v1): paid (isPaid), tier-gated (requiredTierId), SUBSCRIBERS, TIER_EXCLUSIVE, REGISTERED, PRIVATE, and LINK_ONLY with a passphrase. See https://dcast.pro/docs/paid-catalog.","properties":{"playable":{"type":"boolean","description":"False while the HLS output is not yet in place."},"hls":{"type":"string","format":"uri"},"embed":{"type":"string","format":"uri","description":"Embeddable player (iframe src). Handles paywall, sign-in and access-key entry itself."},"playUrl":{"type":"string","format":"uri"},"accessTokenUrl":{"type":"string","format":"uri"},"thumbnail":{"type":["string","null"]},"requiresToken":{"type":"boolean"}}},"VideoListItem":{"type":"object","required":["id","title","visibility","isPaid","status"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"visibility":{"$ref":"#/components/schemas/VideoVisibility"},"isPaid":{"type":"boolean"},"price":{"type":["number","null"],"description":"Per-video price. The Video row has no currency column."},"requiredTierId":{"type":["string","null"]},"paidAccess":{"type":"boolean","description":"Legacy alias of isPaid."},"paidAccessPrice":{"type":["number","null"],"description":"Legacy alias of price."},"duration":{"type":["number","null"]},"resolution":{"type":["string","null"]},"fileSize":{"type":["integer","null"]},"status":{"$ref":"#/components/schemas/PartnerVideoStatus"},"thumbnails":{"$ref":"#/components/schemas/Thumbnails"},"playback":{"type":["object","null"],"description":"List rows carry only hls + embed (null until an HLS output exists). The full block with requiresToken is on GET /videos/{id}.","properties":{"hls":{"type":"string","format":"uri"},"embed":{"type":"string","format":"uri"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"VideoList":{"type":"object","required":["videos","pagination"],"properties":{"videos":{"type":"array","items":{"type":"object","required":["id","title","visibility","isPaid","status"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"visibility":{"$ref":"#/components/schemas/VideoVisibility"},"isPaid":{"type":"boolean"},"price":{"type":["number","null"],"description":"Per-video price. The Video row has no currency column."},"requiredTierId":{"type":["string","null"]},"paidAccess":{"type":"boolean","description":"Legacy alias of isPaid."},"paidAccessPrice":{"type":["number","null"],"description":"Legacy alias of price."},"duration":{"type":["number","null"]},"resolution":{"type":["string","null"]},"fileSize":{"type":["integer","null"]},"status":{"$ref":"#/components/schemas/PartnerVideoStatus"},"thumbnails":{"$ref":"#/components/schemas/Thumbnails"},"playback":{"type":["object","null"],"description":"List rows carry only hls + embed (null until an HLS output exists). The full block with requiresToken is on GET /videos/{id}.","properties":{"hls":{"type":"string","format":"uri"},"embed":{"type":"string","format":"uri"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"pagination":{"$ref":"#/components/schemas/PagePagination"}}},"PagePagination":{"type":"object","description":"Page-number pagination used by list endpoints that take ?page=&limit=.","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"pages":{"type":"integer"}}},"Video":{"type":"object","required":["id","title","visibility","isPaid","status"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"visibility":{"type":"string","enum":["PUBLIC","LINK_ONLY","PRIVATE","SUBSCRIBERS","TIER_EXCLUSIVE","REGISTERED"],"description":"Stored video visibility. Meaning of each value: https://dcast.pro/docs/video-api#visibility."},"isPaid":{"type":"boolean"},"price":{"type":["number","null"]},"requiredTierId":{"type":["string","null"]},"paidAccess":{"type":"boolean","description":"Legacy alias of isPaid."},"paidAccessPrice":{"type":["number","null"],"description":"Legacy alias of price."},"duration":{"type":["number","null"]},"resolution":{"type":["string","null"]},"fps":{"type":["number","null"]},"bitrate":{"type":["number","null"]},"codec":{"type":["string","null"]},"fileSize":{"type":["integer","null"]},"status":{"type":"string","enum":["READY","UPLOADING","PROCESSING","FAILED","PENDING"],"description":"READY and FAILED are terminal."},"views":{"type":"integer"},"likes":{"type":"integer"},"thumbnails":{"type":"object","properties":{"default":{"type":["string","null"]}}},"hlsUrl":{"type":["string","null"],"description":"Alias of playback.hls."},"playbackUrl":{"type":["string","null"],"description":"Alias of playback.embed."},"thumbnailUrl":{"type":["string","null"]},"playback":{"$ref":"#/components/schemas/VideoPlayback"},"quality":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"StreamVisibility":{"type":"string","enum":["PUBLIC","LINK_ONLY","PRIVATE","REGISTERED","ACCESS_KEY"]},"StreamIngest":{"type":"object","description":"Publish to ONE of these. Each URL embeds the stream key, so treat it as a secret.","properties":{"rtmp":{"type":["string","null"]},"srt":{"type":["string","null"]},"whip":{"type":["string","null"]}},"additionalProperties":{"type":["string","null"]}},"StreamPlayback":{"type":"object","properties":{"hls":{"type":"string","format":"uri"},"embed":{"type":"string","format":"uri"}}},"StreamCreated":{"type":"object","required":["id","title","status","streamKey","protocol","playback"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["IDLE"]},"visibility":{"type":"string","enum":["PUBLIC","LINK_ONLY","PRIVATE","REGISTERED","ACCESS_KEY"]},"streamKey":{"type":"string"},"protocol":{"type":"string","enum":["RTMP","SRT","WEBRTC","HTTP","FILE"]},"ingest":{"$ref":"#/components/schemas/StreamIngest"},"playback":{"$ref":"#/components/schemas/StreamPlayback"},"createdAt":{"type":"string","format":"date-time"},"srtConfig":{"type":"object","description":"SRT cards only."},"srtUrl":{"type":"string","description":"SRT cards only."},"httpSourceConfig":{"type":"object","description":"HTTP (pull) cards only."},"fileSourceUrl":{"type":"string","description":"FILE cards only."}}},"Stream":{"type":"object","required":["id","title","status","isLive","protocol","playback"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"status":{"type":"string","enum":["LIVE","OFFLINE"]},"isLive":{"type":"boolean","description":"On air for viewers (after POST /streams/{id}/start)."},"hasSignal":{"type":"boolean","description":"An encoder is publishing to the ingest."},"visibility":{"type":"string","enum":["PUBLIC","LINK_ONLY","PRIVATE","REGISTERED","ACCESS_KEY"]},"isPaid":{"type":"boolean"},"price":{"type":["number","null"]},"streamKey":{"type":"string","description":"Masked for READ_ONLY keys."},"protocol":{"type":"string","enum":["RTMP","SRT","WEBRTC","HTTP","FILE"]},"viewersCount":{"type":"integer"},"peakViewers":{"type":"integer"},"duration":{"type":"number"},"health":{"type":["object","null"],"properties":{"bitrate":{},"fps":{},"resolution":{},"quality":{"type":"string"}}},"thumbnails":{"type":"object","properties":{"live":{"type":["string","null"]},"latest":{"type":["string","null"]}}},"playback":{"$ref":"#/components/schemas/StreamPlayback"},"assignment":{"type":["object","null"]},"ingest":{"$ref":"#/components/schemas/StreamIngest"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"endedAt":{"type":["string","null"],"format":"date-time"}}},"CheckoutSubscriptionRequest":{"type":"object","required":["tierId","creatorUsername"],"description":"The subscriber is the owner of the API key making the call. There is no field for a different buyer (no customerEmail, no userId).","properties":{"tierId":{"type":"string"},"creatorUsername":{"type":"string","description":"Must be the username of the tier owner."},"interval":{"type":"string","enum":["monthly","annual"],"default":"monthly","description":"annual uses the tier priceAnnual when it is set."},"successUrl":{"type":"string","format":"uri"},"cancelUrl":{"type":"string","format":"uri"}}},"CheckoutVideoRequest":{"type":"object","required":["videoId"],"description":"The buyer is the owner of the API key making the call, and that account must already have a Stripe customer record (400 \"Customer not found. Complete a platform purchase first.\" otherwise).","properties":{"videoId":{"type":"string"},"successUrl":{"type":"string","format":"uri"},"cancelUrl":{"type":"string","format":"uri"}}},"CheckoutSession":{"type":"object","required":["sessionId","checkoutUrl"],"properties":{"sessionId":{"type":"string","description":"Stripe Checkout Session id (cs_...)."},"checkoutUrl":{"type":"string","format":"uri","description":"Hosted Stripe Checkout page to redirect the buyer to."}}},"WebhookEndpoint":{"type":"object","required":["id","url","events","isActive"],"properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string"},"description":"Empty array = all events."},"description":{"type":["string","null"]},"isActive":{"type":"boolean"},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastDeliveryOk":{"type":["boolean","null"]},"lastDeliveryError":{"type":["string","null"]},"totalDeliveries":{"type":"integer"},"totalFailures":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"WebhookEndpointCreated":{"allOf":[{"$ref":"#/components/schemas/WebhookEndpoint"},{"type":"object","required":["signingSecret"],"properties":{"signingSecret":{"type":"string","description":"Shown only in this response. Store it; rotate with POST /me/webhooks/{id}/rotate-secret."},"signingSecretNote":{"type":"string"}}}]},"WebhookCreateRequest":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"https only; must resolve to a public address."},"events":{"type":"array","items":{"type":"string"},"description":"Event names from x-dcast-event-types, or \"*\" / \"prefix.*\". Omit or [] for all."},"description":{"type":"string","maxLength":500}}},"WebhookEventEnvelope":{"type":"object","description":"Shape of every outgoing webhook POST body. The wire format is identical across all event types; only data varies.","required":["id","type","created","data"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable per-event ID, also in Dcast-Event-Id header."},"type":{"type":"string","example":"video.processing.completed"},"created":{"type":"integer","description":"Unix-epoch (seconds) when the event was generated."},"livemode":{"type":"boolean"},"data":{"type":"object","description":"Event-specific payload."}}}},"responses":{"Success":{"description":"Successful response","headers":{"X-DCAST-Request-Id":{"$ref":"#/components/headers/XDCASTRequestIdResponse"},"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/XRateLimitReset"},"Dcast-API-Version":{"$ref":"#/components/headers/DcastAPIVersionResponse"},"X-DCAST-Idempotent-Replay":{"$ref":"#/components/headers/XDCASTIdempotentReplay"},"X-DCAST-Idempotency":{"$ref":"#/components/headers/XDCASTIdempotency"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"examples":{"singleResource":{"summary":"One resource — `data` is the object","value":{"success":true,"data":{"id":"a1b2c3d4e5f60718293a4b5c6d7e8f90","title":"Season 3 opener","status":"READY"}}},"emptyCollection":{"summary":"A collection with nothing in it — an empty array plus pagination, never a 404","value":{"success":true,"data":[],"pagination":{"limit":20,"hasMore":false,"nextCursor":null}}},"acknowledgement":{"summary":"A state change with nothing to return — `data` may be absent entirely","value":{"success":true}}}}}},"BadRequest":{"description":"Validation failed; see error.code + error.field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"constraintViolated":{"summary":"A supplied value is outside the accepted range","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"q must be at least 2 characters"}}},"wrongType":{"summary":"Right field, wrong shape — note the `field` key, present only on some 400s","value":{"success":false,"error":{"code":"BAD_REQUEST","message":"events must be an array of event-name strings (empty = subscribe-all)","field":"events"}}}}}}},"Unauthorized":{"description":"Missing / invalid / expired key, or X-User-Token failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"noKey":{"summary":"No credential presented at all","value":{"success":false,"error":{"code":"UNAUTHORIZED","message":"API key is required. Send it as \"Authorization: Bearer pk_...\" or the X-API-Key header."}}}}}}},"Forbidden":{"description":"The key authenticated but may not perform this operation. `error.code` is one of: `PERMISSION_DENIED` (key lacks the required scope, e.g. videos:write), `FINANCIAL_SCOPE_REQUIRED` (money surfaces need an owner-class key), `FORBIDDEN` (authenticated but not the owner/host of this resource), `FORBIDDEN_FIELD` (the body carried a field this endpoint refuses to mutate). Checkout / payment paths return their own origin-lock 403 instead — see OriginNotAllowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"permissionDenied":{"summary":"Key scope does not cover the operation","value":{"success":false,"error":{"code":"PERMISSION_DENIED","message":"Permission 'videos:write' is required for this operation"}}},"financialScopeRequired":{"summary":"Money surface reached with a non-owner key","value":{"success":false,"error":{"code":"FINANCIAL_SCOPE_REQUIRED","message":"This endpoint requires an owner-class key with finance authorization."}}},"notOwner":{"summary":"Authenticated, but not the owner/host of the resource","value":{"success":false,"error":{"code":"FORBIDDEN","message":"Only host can kick"}}}}}}},"OriginNotAllowed":{"description":"Monetization origin-lock rejected the request. Returned by checkout / payment endpoints when the request Origin/Referer is not a dcast platform host, your verified creator domain, or a declared+verified integration domain — OR when the key has no declared integration domain at all (off-platform monetization is disabled until you declare + verify one). Resolve by declaring + verifying your domain (DNS-TXT) in the dashboard. NOTE: the origin-lock body is a bare-string error `{ \"success\": false, \"error\": \"<code>\" }`, NOT the standard {code,message} envelope. (A scope-insufficient key on the same path also yields 403, but with the standard Error envelope.)","content":{"application/json":{"schema":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string","enum":["origin_not_allowed","integration_domain_required"],"description":"origin_not_allowed = the calling Origin is not declared/verified for this account; integration_domain_required = the key has zero declared integration domains, so off-platform monetization is blocked until you declare + verify one."}}}}}},"NotFound":{"description":"Resource not found, or foreign-resource access denied (we never leak existence). An id belonging to another creator returns exactly this body — do not read 404 as \"deleted\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"missing":{"summary":"Unknown id — and the identical body a foreign id returns","value":{"success":false,"error":{"code":"NOT_FOUND","message":"Video not found"}}}}}}},"RateLimited":{"description":"Per-key 60s rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"keyWindowExhausted":{"summary":"The per-key 60-second window is spent; back off until X-RateLimit-Reset","value":{"success":false,"error":{"code":"RATE_LIMITED","message":"Rate limit of 1000 requests/minute exceeded for this API key. Retry in 37s. See X-RateLimit-Reset for the exact unix-epoch when the window resets."}}},"perEndpointCap":{"summary":"Some endpoints carry their own tighter cap on top of the key limit","value":{"success":false,"error":{"code":"RATE_LIMITED","message":"Chat post rate limit exceeded (60/min per key/stream)"}}}}}}},"InternalError":{"description":"Server error. The X-DCAST-Request-Id identifies it in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"examples":{"unhandled":{"summary":"Message is a fixed per-endpoint string — never parse it, quote the request id","value":{"success":false,"error":{"code":"INTERNAL_ERROR","message":"Failed to list videos"}}}}}}}}},"x-dcast-docs":{"landing":"https://dcast.pro/docs","topics":[{"slug":"account","url":"https://dcast.pro/docs/account"},{"slug":"analytics","url":"https://dcast.pro/docs/analytics"},{"slug":"auth","url":"https://dcast.pro/docs/auth"},{"slug":"channels","url":"https://dcast.pro/docs/channels"},{"slug":"limits","url":"https://dcast.pro/docs/limits"},{"slug":"monetization","url":"https://dcast.pro/docs/monetization"},{"slug":"notifications","url":"https://dcast.pro/docs/notifications"},{"slug":"paid-catalog","url":"https://dcast.pro/docs/paid-catalog"},{"slug":"playlists","url":"https://dcast.pro/docs/playlists"},{"slug":"quickstart","url":"https://dcast.pro/docs/quickstart"},{"slug":"recording","url":"https://dcast.pro/docs/recording"},{"slug":"restreams","url":"https://dcast.pro/docs/restreams"},{"slug":"roadmap","url":"https://dcast.pro/docs/roadmap"},{"slug":"rooms","url":"https://dcast.pro/docs/rooms"},{"slug":"streams","url":"https://dcast.pro/docs/streams"},{"slug":"team-api","url":"https://dcast.pro/docs/team-api"},{"slug":"test-mode","url":"https://dcast.pro/docs/test-mode"},{"slug":"upload","url":"https://dcast.pro/docs/upload"},{"slug":"versioning","url":"https://dcast.pro/docs/versioning"},{"slug":"video-api","url":"https://dcast.pro/docs/video-api"},{"slug":"video-editor","url":"https://dcast.pro/docs/video-editor"},{"slug":"webhooks","url":"https://dcast.pro/docs/webhooks"}]},"x-dcast-changelog":[{"date":"2026-09-27","summary":"GET /v1/videos/:id playback.requiresToken now follows the same rule as the HLS master door: true also for PUBLIC videos that are paid (isPaid) or tier-gated (requiredTierId) and for LINK_ONLY videos with a passphrase; false for LINK_ONLY without one. Previously it was simply visibility !== PUBLIC."},{"date":"2026-09-27","summary":"OpenAPI: typed response schemas for GET /videos, GET /videos/:id, POST /streams, GET /streams/:id, POST /checkout/subscription, POST /checkout/video and the /me/webhooks endpoints; request-body schemas for both checkout endpoints; bearerFormat corrected to pk_<40 hex chars>."},{"date":"2026-08-22","summary":"GET /v1/search, /v1/trending and /v1/feed withdrawn: they answer 410 CATALOG_DISABLED. Reach content by its direct link or through one creator's channel (GET /v1/channel/:username/videos, /v1/channel/:username/playlists)."},{"date":"2026-06-30","summary":"Documented monetization origin-lock + integration-domain declaration requirement (checkout 403 origin_not_allowed / integration_domain_required)."},{"date":"2026-05-28","summary":"QA-2 within-surface gap closed: Stream chat moderation queue. GET /v1/streams/:id/chat/moderation/queue (FIFO list of pending msgs), POST /v1/streams/:id/chat/moderation/:msgId/approve (FIFO-enforced; 409 QUEUE_ORDER if older pending), POST /v1/streams/:id/chat/moderation/:msgId/reject (with optional reason). Stream banned-word management deliberately NOT exposed — BannedWord is platform-wide single shared list, admin-only, out of canon."},{"date":"2026-05-28","summary":"DRIFT-FIX batch (per partner-qa monetization-audit): explicit 400 UNSUPPORTED_FIELD on PATCH /videos|streams with currency/donationsEnabled (was silent-dropping). New GET /v1/me/payouts (Stripe Connect readiness: chargesEnabled / payoutsEnabled / detailsSubmitted / requirements). 5 /me/* list aliases for partner discoverability: /me/api-keys (key material redacted), /me/tiers, /me/restream-accounts (tokens redacted), /me/bookings (caller as customer), /me/notifications. POST /v1/me/webhooks/:id/simulate — DRY-FIRE renders payload + Dcast-Signature inline without outbound delivery."},{"date":"2026-05-28","summary":"SUB §2.F final: custom-domain + subdomain self-service. POST/GET/DELETE /v1/me/custom-domain + GET /v1/me/custom-domain/nameservers + GET /v1/me/custom-domain/verify (CF zone create + NS resolve check; plan-gated to PRO/VIP via hasFeature). POST/GET/DELETE /v1/me/subdomain (regex-validated, reserved-list blocked, uniqueness-checked). DNS pool provisioning runs out-of-band; partners poll /v1/me/site/status."},{"date":"2026-05-28","summary":"SUB-tasks batch: §2.D Team chat (GET/POST/PATCH/DELETE /v1/team/chat with WS mirror to team:chat:<channelId>). §2.B DHUB: POST /v1/bridges/:id/rotate-key, GET /v1/bridges/:id/events, PATCH /v1/bridges/:id/tally-endpoints (SSRF-guarded), POST /v1/bridges/:id/return-pgm/start + /stop. §2.F: POST/DELETE /v1/me/hero-video (video/mp4|webm|quicktime, 100MB cap), POST /v1/me/slider-images (multi-file up to 10), DELETE /v1/me/slider-images?image=<url>. §2.C: POST/GET/PATCH/DELETE /v1/booking/products/:productId/cohorts, GET /v1/booking/cohorts/:id, POST /v1/booking/cohorts/:id/videos (drip), DELETE /v1/booking/cohorts/:id/videos/:cvId, GET /v1/booking/waitlist (read-only)."},{"date":"2026-05-28","summary":"GAP §2.C headline: Booking workflow (products + availability + bookings read-only + discount codes). POST/GET/GET-by-id/PATCH/DELETE /v1/booking/products (+ /publish + /unpublish), GET/PUT /v1/booking/availability, GET/GET-by-id /v1/booking/bookings (read-only — bookings created via /api/booking-checkout customer flow), POST/GET/PATCH/DELETE /v1/booking/discount-codes (percent-off OR amount-off; unique per creator; product-scope optional). Cohort + Waitlist + EmailSequence sub-surfaces deferred."},{"date":"2026-05-28","summary":"GAP §2.B headline: DHUB bridges CRUD. GET/POST/GET-by-id/PATCH/DELETE /v1/bridges, POST /v1/bridges/:id/start, POST /v1/bridges/:id/stop, GET/POST /v1/bridges/sources, DELETE /v1/bridges/sources/:id, GET/POST /v1/bridges/:id/destinations, PATCH/DELETE /v1/bridges/destinations/:id. SSRF guard on destination targetUrl. Director-mode / WHEP-URLs / tally / SRTLA / policies / slates / network-probe sub-surfaces deferred."},{"date":"2026-05-28","summary":"GAP §2.D headline: Team API (channelTeam meta + members + tasks). GET/PATCH /v1/team, GET /v1/team/members, POST/PATCH/DELETE /v1/team/members (CONTENT_MANAGER/STREAM_TECHNICIAN/MODERATOR/VIEWER — OWNER+ADMIN excluded by no-admin canon), GET/POST/PATCH/DELETE /v1/team/tasks (TODO/IN_PROGRESS/COMPLETED/CANCELLED). Chat sub-surface deferred."},{"date":"2026-05-28","summary":"GAP §2.F partial: site customization. POST/DELETE /v1/me/og-image, POST/DELETE /v1/me/navigation-logo (mirrors /me/hero), GET /v1/me/site/templates, POST /v1/me/site/apply-template (slug or id), POST /v1/me/site/activate ({active: bool}), GET /v1/me/site/status. hero-video + slider-images + custom-domain CF integration + subdomain DNS setup remain as sub-tasks."},{"date":"2026-05-28","summary":"GAP §2.E closed: Support tickets CRUD (creator-side). POST /v1/support/tickets, GET list + by-id, POST /v1/support/tickets/:id/replies. Owner-scoped; internal staff notes filtered out. Admin status/assign/priority/tags surfaces NOT exposed per no-admin-on-partner-API canon."},{"date":"2026-05-28","summary":"GAP §3 closed: Room polls + quizzes write surface. POST /v1/rooms/:id/polls (+ /vote / /close), POST /v1/rooms/:id/quizzes (+ /answer / /close), GET list. Host-only create/close; participant-permissive vote/answer with idempotent re-vote (poll) and 409 ALREADY_ANSWERED (quiz)."},{"date":"2026-05-28","summary":"GAP §2.A closed: Creator Tiers CRUD (POST /v1/tiers / PATCH /v1/tiers/:id / DELETE /v1/tiers/:id). Plan-based tier-count limit, isMostPopular exclusivity, price-locked-with-subscribers gate, delete-blocked-with-subscribers gate, best-effort Stripe sync."},{"date":"2026-05-28","summary":"GDPR Art. 20 portability only (POST/GET /v1/me/export + account.export.ready webhook). §17 right-to-erasure REMOVED from partner-API surface per security canon: a stolen pk_ must not be able to schedule account erasure or fire webhooks announcing account-level state. §17 lives on session-auth UI + internal admin tool."},{"date":"2026-05-28","summary":"Upload flow collapsed to one canonical method: POST /v1/videos/upload → PUT data.upload.url (chunked Content-Range supported). REMOVED: POST /v1/videos/:id/upload + POST /v1/upload/:token — both now return 410 Gone. See docs/upload."},{"date":"2026-05-28","summary":"Idempotency-Key coverage expanded: /me/{avatar,cover,hero}, /playlists, /playlists/:id/videos, /videos/:id/{comments,like} now also dedup via Idempotency-Key (12 routes total)."},{"date":"2026-05-28","summary":"pk_test_ mode foundation: Dcast-Key-Mode header + /me.mode field. Phase B (Stripe test routing, sandbox workers, webhook livemode tie-in) deferred."},{"date":"2026-05-28","summary":"Webhook replay endpoint: POST /v1/me/webhooks/:id/deliveries/:deliveryId/replay."},{"date":"2026-05-28","summary":"video.upload.completed webhook event wired (9/11 catalogue events live)."},{"date":"2026-05-28","summary":"OpenAPI 3.1 spec at /docs/openapi.json — components.{schemas,parameters,headers,responses} populated; per-path stubs with security + standard headers."},{"date":"2026-05-28","summary":"Webhook retry queue (Bull, exponential backoff 1m→12h, 7 attempts max, attempts survive backend restart)."},{"date":"2026-05-28","summary":"Partner-webhooks foundation: HMAC-SHA256 signed POSTs with 5-min tolerance window + CRUD + delivery log."},{"date":"2026-05-28","summary":"Idempotency-Key on monetary + state-creating POSTs (5 routes); same-key+different-body → 422 IDEMPOTENCY_KEY_REUSE."},{"date":"2026-05-28","summary":"X-DCAST-Request-Id on every response; UUIDv4 echo-back if caller supplies a valid one."},{"date":"2026-05-28","summary":"Per-key rate-limit X-RateLimit-{Limit,Remaining,Reset} headers + 429 RATE_LIMITED. Dcast-API-Version: v1 advertised on every authenticated response."},{"date":"2026-05-28","summary":"Versioning policy: /v1 stays online ≥6mo after v2; ≥90d EOL notice. See /docs/versioning."}],"x-dcast-event-types":["webhook.test","video.upload.completed","video.processing.completed","video.processing.failed","stream.live","stream.ended","stream.broadcast_started","stream.broadcast_stopped","restream.started","restream.ended","restream.failed","subscription.created","subscription.cancelled","subscription.renewed","purchase.completed","purchase.refunded","account.export.ready"]}