{"openapi":"3.1.0","info":{"title":"WeCloud Server API","version":"1.0.0","description":"One Project-scoped Server API. API Secrets are created in the member Dashboard and must remain on Customer backends. WeCloud-specific mutations require Idempotency-Key; VdoCipher-compatible mutations, including video rename and OTP, accept it optionally. Reads and individual multipart part uploads do not require it. An identical keyed retry within 24 hours returns the original status and body. After expiry the key can be reused. Upload is the WeCloud multipart exception: no VdoCipher signed-form or remote URL/S3 import. Sessions live 24 hours, parts are 16 MiB except the final part, and Project limits default to 20 GB with approved configuration up to 100 GB. Initiation returns a scoped Upload Session credential so an untrusted browser can resume, authorize parts, complete, and abort without the API Secret. Browser CORS is limited to configured origins. Playback OTPs default to six hours if ttl is omitted; WeCloud examples and Dashboard helpers explicitly request ttl=300. PLAYBACK_OTP_MAX_TTL_SECONDS is at least 21600. A pair is single-use at POST /api/playback/initialize. Viewer routes use an opaque session credential and configured browser origins; API Secrets have no browser CORS. Published entitlements are 600 management reads/minute/Secret, 120 management writes/minute/Secret, and 3000 OTP generations/minute/Project with 300 extra burst tokens. RateLimit-Limit shows token bucket capacity, RateLimit-Remaining shows whole tokens available, and RateLimit-Reset is seconds to refill the bucket. 429 responses include Retry-After in seconds. Operators may tune enforcement without changing these published entitlements. Nonbreaking additions use this rolling v1 API; breaking changes require a new major version with at least 12 months of overlap. Public request metadata is retained for 30 days without sensitive headers, query values, bodies, Secrets, OTPs, Playback Info, DRM challenges, or licence payloads."},"servers":[{"url":"https://api.wecloud.biz"}],"security":[{"ApiSecret":[]}],"paths":{"/api/demo/api-keys":{"servers":[{"url":"https://wecloud.biz"}],"security":[{"DashboardSession":[]}],"get":{"operationId":"listProjectApiSecrets","summary":"List metadata for the active Project's Secrets (Organisation administrators)","responses":{"200":{"description":"Secret metadata; plaintext is never returned","content":{"application/json":{"schema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiSecretMetadata"}}}}}}},"401":{"$ref":"#/components/responses/DashboardError"},"403":{"$ref":"#/components/responses/DashboardError"}}},"post":{"operationId":"createProjectApiSecret","summary":"Create a named Secret for the active Project (Organisation administrators)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":80}}}}}},"responses":{"201":{"description":"Plaintext returned on this response only","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiSecretMetadata"},{"type":"object","required":["secret"],"properties":{"secret":{"type":"string","pattern":"^wc_sk_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$"}}}]}}}},"400":{"$ref":"#/components/responses/DashboardError"},"401":{"$ref":"#/components/responses/DashboardError"},"403":{"$ref":"#/components/responses/DashboardError"}}}},"/api/demo/api-keys/{visibleKeyId}":{"servers":[{"url":"https://wecloud.biz"}],"security":[{"DashboardSession":[]}],"delete":{"operationId":"revokeProjectApiSecret","summary":"Revoke one Secret in the active Project (Organisation administrators)","parameters":[{"name":"visibleKeyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Revoked Secret metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSecretMetadata"}}}},"401":{"$ref":"#/components/responses/DashboardError"},"403":{"$ref":"#/components/responses/DashboardError"},"404":{"$ref":"#/components/responses/DashboardError"}}}},"/api/videos":{"get":{"operationId":"listVideos","summary":"List videos in the Secret's Project","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":40,"default":20}},{"name":"q","in":"query","description":"Case insensitive substring of title or videoId","schema":{"type":"string","maxLength":160}},{"name":"tags","in":"query","description":"Comma separated case sensitive intersection","schema":{"type":"string"}},{"name":"folderId","in":"query","description":"Stable folder ID or root","schema":{"type":"string","pattern":"^(folder_[0-9a-f-]{36}|root)$"}}],"responses":{"200":{"description":"Newest videos first. count is the total matching filters.","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["count","rows"],"properties":{"count":{"type":"integer","minimum":0},"rows":{"type":"array","items":{"$ref":"#/components/schemas/Video"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"delete":{"operationId":"deleteVideos","summary":"Delete Project videos using the compatible videos query parameter","description":"Pass one or more comma-separated video IDs (at most 100). Deletion is atomic for the supplied IDs. Idempotency-Key is required. The default keeps the seven-day recovery window. Permanent deletion requires exactly one video and a confirmationText matching its current title. An identical keyed retry within 24 hours returns the original response.","parameters":[{"name":"videos","in":"query","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/RequiredIdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"permanent":{"type":"boolean","const":true},"confirmationText":{"type":"string"}}}}}},"responses":{"200":{"description":"One result for a single video, or videos array for a multi-video request","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/DeleteVideoResult"},{"type":"object","required":["videos"],"properties":{"videos":{"type":"array","items":{"$ref":"#/components/schemas/DeleteVideoResult"}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/{videoId}":{"get":{"operationId":"getVideo","summary":"Retrieve a video in the Secret's Project","parameters":[{"$ref":"#/components/parameters/VideoID"}],"responses":{"200":{"description":"Video detail","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Video"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"post":{"operationId":"renameVideo","summary":"Rename a video in the Secret's Project","description":"VdoCipher-compatible rename. The key is optional. With a key, identical requests replay the original status and response for 24 hours, including across application instances. Reusing a key for another request returns idempotency_key_reused. An unresolved concurrent duplicate returns request_in_progress. Failed authentication and authorization are never cached as successful results.","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"additionalProperties":false,"properties":{"title":{"type":"string","maxLength":160}}}}}},"responses":{"200":{"description":"Video renamed; a keyed replay returns this original response","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","const":"Successfully updated"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"},"delete":{"operationId":"deleteVideo","summary":"Delete a Project video and revoke playback immediately","description":"Idempotency-Key is required. The default deletion retains media for the seven-day recovery window. To skip recovery and request permanent purge, send permanent: true and confirmationText equal to the current video title. An identical keyed retry within 24 hours returns the original response.","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/RequiredIdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"permanent":{"type":"boolean","const":true},"confirmationText":{"type":"string"}}}}}},"responses":{"200":{"description":"Video deleted; permanent deletion has no recovery deadline","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["videoId","status","recoverUntil"],"properties":{"videoId":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"},"status":{"type":"string","const":"deleted"},"recoverUntil":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/{videoId}/poster":{"get":{"operationId":"getVideoPoster","summary":"Retrieve a custom poster with the same API Secret","parameters":[{"$ref":"#/components/parameters/VideoID"}],"responses":{"200":{"description":"Poster bytes","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"image/jpeg":{},"image/png":{},"image/webp":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"}},"/api/videos/folders":{"get":{"operationId":"listRootFolders","summary":"List the Project root folders","responses":{"200":{"description":"Root folder listing","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderListing"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"post":{"operationId":"createFolder","summary":"Create a Project folder at root or in another folder","parameters":[{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":120},"parent":{"type":"string","pattern":"^(folder_[0-9a-f-]{36}|root)$"}}}}}},"responses":{"201":{"description":"Created folder; parent is null at root","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/folders/{folderId}":{"get":{"operationId":"getFolder","summary":"Get a folder and list its direct children; root is supported","parameters":[{"$ref":"#/components/parameters/FolderID"}],"responses":{"200":{"description":"Current folder, parent, and child folders","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderListing"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"put":{"operationId":"renameFolder","summary":"Rename a Project folder","parameters":[{"$ref":"#/components/parameters/FolderID"},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":120}}}}}},"responses":{"200":{"description":"Folder renamed","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["message"],"additionalProperties":false,"properties":{"message":{"type":"string","const":"Folder has been updated"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"},"delete":{"operationId":"deleteFolder","summary":"Delete a folder; videos and children move to its parent","parameters":[{"$ref":"#/components/parameters/FolderID"},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"responses":{"200":{"description":"Folder deleted; videos are retained","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["message"],"additionalProperties":false,"properties":{"message":{"type":"string","const":"Folder Deleted"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/tags":{"get":{"operationId":"listTags","summary":"List case-sensitive tags applied to visible Project videos","responses":{"200":{"description":"Applied tag names","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["tags"],"additionalProperties":false,"properties":{"tags":{"type":"array","items":{"type":"string"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"post":{"operationId":"addTags","summary":"Add case-sensitive tags to one or more Project videos","parameters":[{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagMutation"}}}},"responses":{"200":{"description":"Tags added","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["message"],"additionalProperties":false,"properties":{"message":{"type":"string","const":"Successfully updated"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"},"put":{"operationId":"replaceTags","summary":"Replace all tags on one or more Project videos; empty tags clears them","parameters":[{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagMutation"}}}},"responses":{"200":{"description":"Tags replaced","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["message"],"additionalProperties":false,"properties":{"message":{"type":"string","const":"Successfully updated"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/{videoId}/folder":{"put":{"operationId":"placeVideo","summary":"Place a video in one Project folder or the root","description":"WeCloud-specific placement operation; a durable Idempotency-Key is required.","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/RequiredIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["folderId"],"additionalProperties":false,"properties":{"folderId":{"type":"string","pattern":"^(folder_[0-9a-f-]{36}|root)$"}}}}}},"responses":{"200":{"description":"Current video placement","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","required":["videoId","folderId"],"additionalProperties":false,"properties":{"videoId":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"},"folderId":{"type":"string","pattern":"^(folder_[0-9a-f-]{36}|root)$"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/{videoId}/files":{"get":{"operationId":"listVideoFiles","summary":"List original, poster, and Caption Track files by stable public ID","parameters":[{"$ref":"#/components/parameters/VideoID"}],"responses":{"200":{"description":"List original, poster, and Caption Track files by stable public ID","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssociatedFile"}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"post":{"operationId":"uploadVideoFile","summary":"Upload a custom poster or WebVTT Caption Track; language query selects a Caption Track","parameters":[{"$ref":"#/components/parameters/VideoID"},{"name":"language","in":"query","schema":{"type":"string","pattern":"^[a-z]{2}$"}},{"name":"label","in":"query","schema":{"type":"string","maxLength":80}},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"additionalProperties":false,"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"201":{"description":"Upload a custom poster or WebVTT Caption Track; language query selects a Caption Track","content":{"application/json":{"schema":{"type":"object","required":["file"],"additionalProperties":false,"properties":{"file":{"$ref":"#/components/schemas/AssociatedFile"}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/{videoId}/files/{fileId}":{"delete":{"operationId":"deleteVideoFile","summary":"Delete a custom poster or Caption Track; generated posters and originals cannot be deleted here","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/FileID"},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"responses":{"200":{"description":"Delete a custom poster or Caption Track; generated posters and originals cannot be deleted here","content":{"application/json":{"schema":{"type":"object","required":["message"],"additionalProperties":false,"properties":{"message":{"type":"string"}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/{videoId}/files/{fileId}/download":{"get":{"operationId":"authorizeSourceDownload","summary":"Authorize a retained original with a short-lived signed URL","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/FileID"}],"responses":{"200":{"description":"Authorize a retained original with a short-lived signed URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceDownload"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"}},"/api/videos/{videoId}/chapters":{"get":{"operationId":"listVideoChapters","summary":"List Chapters ordered by start time","parameters":[{"$ref":"#/components/parameters/VideoID"}],"responses":{"200":{"description":"List Chapters ordered by start time","content":{"application/json":{"schema":{"type":"object","required":["chapters"],"additionalProperties":false,"properties":{"chapters":{"type":"array","items":{"$ref":"#/components/schemas/Chapter"}}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"post":{"operationId":"createVideoChapter","summary":"Create a Chapter within the known video duration","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/RequiredIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterInput"}}}},"responses":{"201":{"description":"Create a Chapter within the known video duration","content":{"application/json":{"schema":{"type":"object","required":["chapter"],"additionalProperties":false,"properties":{"chapter":{"$ref":"#/components/schemas/Chapter"}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/videos/{videoId}/chapters/{chapterId}":{"patch":{"operationId":"updateVideoChapter","summary":"Update a Chapter","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/ChapterID"},{"$ref":"#/components/parameters/RequiredIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterInput"}}}},"responses":{"200":{"description":"Update a Chapter","content":{"application/json":{"schema":{"type":"object","required":["chapter"],"additionalProperties":false,"properties":{"chapter":{"$ref":"#/components/schemas/Chapter"}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"},"delete":{"operationId":"deleteVideoChapter","summary":"Delete a Chapter","parameters":[{"$ref":"#/components/parameters/VideoID"},{"$ref":"#/components/parameters/ChapterID"},{"$ref":"#/components/parameters/RequiredIdempotencyKey"}],"responses":{"200":{"description":"Delete a Chapter","content":{"application/json":{"schema":{"type":"object","required":["message"],"additionalProperties":false,"properties":{"message":{"type":"string"}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/uploads":{"post":{"operationId":"initiateUpload","summary":"Initiate a 24-hour WeCloud multipart upload and reserve videoId","parameters":[{"$ref":"#/components/parameters/RequiredIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadInitiation"}}}},"responses":{"201":{"description":"Stable video identity and upload session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadInitiationResult","required":["videoId","uploadSession"]}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-write"}},"/api/uploads/{uploadSessionId}":{"get":{"operationId":"getUploadStatus","summary":"Read session status and uploaded parts","parameters":[{"$ref":"#/components/parameters/UploadSessionID"}],"responses":{"200":{"description":"Upload progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSessionResult"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"description":"Session expired","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"delete":{"operationId":"abortUpload","summary":"Abort a pending upload","parameters":[{"$ref":"#/components/parameters/UploadSessionID"},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"responses":{"200":{"description":"Current session status after abort request","content":{"application/json":{"schema":{"type":"object","required":["uploadSessionId","status"],"properties":{"uploadSessionId":{"type":"string"},"status":{"type":"string","enum":["aborted","completed","expired"]}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"description":"Idempotency-Key is required with an API Secret. The scoped Upload Session credential uses the session operation and durable completion claim directly; it does not require a key.","x-rate-limit-bucket":"secret-management-write"},"security":[{"ApiSecret":[]},{"UploadSessionToken":[]}],"description":"Customer backends may use their Project API Secret. Untrusted browsers may use the scoped Upload Session credential returned at initiation. The browser credential cannot access another session or Project; credentialed browser CORS is never granted for API Secrets."},"/api/uploads/{uploadSessionId}/resume":{"get":{"operationId":"resumeUpload","summary":"Verify file fingerprint and list completed parts","parameters":[{"$ref":"#/components/parameters/UploadSessionID"},{"$ref":"#/components/parameters/FileFingerprint"}],"responses":{"200":{"description":"Resumable session progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSessionResult"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"410":{"description":"Session expired or aborted","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"x-rate-limit-bucket":"secret-management-read"},"security":[{"ApiSecret":[]},{"UploadSessionToken":[]}],"description":"Customer backends may use their Project API Secret. Untrusted browsers may use the scoped Upload Session credential returned at initiation. The browser credential cannot access another session or Project; credentialed browser CORS is never granted for API Secrets."},"/api/uploads/{uploadSessionId}/parts/{partNumber}":{"post":{"operationId":"authorizeUploadPart","summary":"Issue a scoped browser URL for one checksummed part","parameters":[{"$ref":"#/components/parameters/UploadSessionID"},{"$ref":"#/components/parameters/PartNumber"},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartAuthorization"}}}},"responses":{"200":{"description":"Scoped part target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartUploadTarget"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"description":"Idempotency-Key is required with an API Secret. The scoped Upload Session credential uses the session operation and durable completion claim directly; it does not require a key.","x-rate-limit-bucket":"secret-management-write"},"security":[{"ApiSecret":[]},{"UploadSessionToken":[]}],"description":"Customer backends may use their Project API Secret. Untrusted browsers may use the scoped Upload Session credential returned at initiation. The browser credential cannot access another session or Project; credentialed browser CORS is never granted for API Secrets."},"/api/uploads/{uploadSessionId}/parts/{partNumber}/content":{"security":[],"description":"Fake storage and local-test scoped transfer endpoint. Production uploadURL points at object storage. No API Secret or Idempotency-Key is sent. Browser CORS permits only configured UPLOAD_BROWSER_ORIGINS; the object storage CORS policy must permit those same required origins. Individual transfers do not consume Server API rate-limit buckets.","parameters":[{"$ref":"#/components/parameters/UploadSessionID"},{"$ref":"#/components/parameters/PartNumber"}],"options":{"operationId":"preflightScopedUploadPart","responses":{"204":{"description":"Allowed browser origin and headers"},"403":{"description":"Origin or scope rejected"}}},"put":{"operationId":"uploadScopedPart","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string"}},{"name":"x-amz-checksum-sha256","in":"header","required":true,"schema":{"type":"string","contentEncoding":"base64"}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","contentEncoding":"binary"}}}},"responses":{"200":{"description":"Accepted part","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletedUploadPart"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"description":"Session expired or aborted"},"413":{"description":"Part exceeds 16 MiB"}}}},"/api/uploads/{uploadSessionId}/complete":{"post":{"operationId":"completeUpload","summary":"Complete parts and queue processing exactly once","parameters":[{"$ref":"#/components/parameters/UploadSessionID"},{"$ref":"#/components/parameters/OptionalIdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["parts"],"additionalProperties":false,"properties":{"parts":{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/CompletedUploadPart"}}}}}}},"responses":{"200":{"description":"Stable video identity and queued status","content":{"application/json":{"schema":{"type":"object","required":["videoId","status"],"properties":{"videoId":{"type":"string"},"status":{"type":"string"}}}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/IdempotencyConflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/ServerError"}},"description":"Idempotency-Key is required with an API Secret. The scoped Upload Session credential uses the session operation and durable completion claim directly; it does not require a key.","x-rate-limit-bucket":"secret-management-write"},"security":[{"ApiSecret":[]},{"UploadSessionToken":[]}],"description":"Customer backends may use their Project API Secret. Untrusted browsers may use the scoped Upload Session credential returned at initiation. The browser credential cannot access another session or Project; credentialed browser CORS is never granted for API Secrets."},"/api/videos/{videoId}/otp":{"post":{"operationId":"issuePlaybackOtp","summary":"Issue a single-use OTP and Playback Info pair for a ready Project video","description":"Omitted ttl is 21600 seconds (six hours). Explicit ttl=300 is recommended for WeCloud integrations. An optional Idempotency-Key replays the original pair for 24 hours; an expired or consumed pair stays unusable.","parameters":[{"$ref":"#/components/parameters/VideoID"},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"ttl":{"type":"integer","minimum":1,"default":21600,"description":"Maximum configured by PLAYBACK_OTP_MAX_TTL_SECONDS, at least 21600."},"annotate":{"type":"string","description":"JSON-encoded rotating text annotation rules."},"whitelisthref":{"type":"string","maxLength":256,"description":"Bounded safe regular expression matched against the Viewer URL."},"ipGeo":{"type":"object","description":"Provider-neutral allow or block list with optional except. Entries are IP addresses or ISO 3166-1 alpha-2 country codes."},"userId":{"type":"string","maxLength":255,"description":"Opaque Customer Viewer Reference; independent of Member identity."}}}}}},"responses":{"201":{"description":"Opaque single-use pair","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaybackPair"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"400":{"description":"Invalid policy or TTL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"401":{"description":"Invalid API Secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"404":{"description":"Video outside the Project or deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"409":{"description":"Video is not ready or idempotency key conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"410":{"description":"Video has expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-rate-limit-bucket":"project-otp"}},"/api/playback/initialize":{"post":{"operationId":"initializeViewerPlayback","summary":"Atomically consume a pair and create one Viewer playback session","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["otp","playbackInfo"],"properties":{"otp":{"type":"string"},"playbackInfo":{"type":"string"},"keySystem":{"type":["string","null"],"enum":["com.widevine.alpha","com.apple.fps","com.microsoft.playready",null]},"embedContext":{"type":"string","description":"Short-lived signed embed referrer supplied by the hosted player."}}}}}},"responses":{"201":{"description":"Opaque Viewer playback session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaybackSession"}}}},"400":{"description":"Malformed pair","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid pair","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Playback policy rejected","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Video deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Pair consumed or video not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Pair or video expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/playback/resources/{path}":{"get":{"operationId":"readViewerPlaybackResource","summary":"Read a session-scoped playback resource","security":[],"parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"}},{"name":"token","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Manifest or media resource"},"206":{"description":"Partial media resource"},"401":{"description":"Session invalid or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/playback/licence":{"post":{"operationId":"acquireViewerPlaybackLicence","summary":"Acquire a temporary DRM licence for a Viewer session","security":[],"parameters":[{"name":"X-Playback-Session","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Opaque licence bytes"},"401":{"description":"Session invalid or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Licence unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/playback/watermark":{"get":{"operationId":"getViewerWatermark","summary":"Read or rotate the persisted Leak ID watermark","security":[],"parameters":[{"name":"X-Playback-Session","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Watermark"},"401":{"description":"Session invalid or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/hooks":{"get":{"operationId":"listProjectHttpHooks","summary":"List HTTP hooks for the API Secret’s Project","responses":{"200":{"description":"Project hooks, without signing secrets","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HttpHook"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"operationId":"createProjectHttpHook","summary":"Create one active HTTP hook for one lifecycle event","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpHookCreate"}}}},"responses":{"201":{"description":"Signing secret is shown exactly once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpHookCreated"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}},"delete":{"operationId":"deleteProjectHttpHook","summary":"Delete one hook belonging to the API Secret’s Project","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["uuid"],"properties":{"uuid":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Hook deleted","content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/hooks/deliveries":{"get":{"operationId":"listProjectHookDeliveries","summary":"List the latest 100 webhook deliveries and safe attempt histories for the API Secret's Project","description":"See WEBHOOKS.md for the signed video:ready, video:readyall, and video:failed payloads and delivery contract.","responses":{"200":{"description":"Project delivery outcomes without URLs, secrets, or payloads","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","required":["eventId","hookId","event","timestamp","status","attempts"],"properties":{"eventId":{"type":"string","format":"uuid"},"hookId":{"type":["string","null"],"format":"uuid"},"event":{"type":"string","enum":["video:ready","video:readyall","video:failed"]},"timestamp":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["pending","delivered","exhausted","cancelled","unsubscribed"]},"attempts":{"type":"integer"},"lastOutcome":{"type":["string","null"]},"responseStatus":{"type":["integer","null"]},"lastAttemptAt":{"type":["string","null"],"format":"date-time"},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"attemptsHistory":{"type":"array","items":{"type":"object","required":["attemptId","timestamp","durationMs","outcome"],"properties":{"attemptId":{"type":"string","format":"uuid"},"timestamp":{"type":"string","format":"date-time"},"durationMs":{"type":"integer","minimum":0},"responseStatus":{"type":["integer","null"]},"outcome":{"type":"string","enum":["delivered","http_error","network_error","timeout"]},"failure":{"type":["string","null"],"enum":["http_error","network_error","timeout",null]}}}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"securitySchemes":{"DashboardSession":{"type":"apiKey","in":"cookie","name":"wecloud-member-token","description":"Member browser session; these routes require same-origin requests."},"ApiSecret":{"type":"apiKey","in":"header","name":"Authorization","description":"Exactly: Apisecret wc_sk_<visible-key-id>_<random-secret>. Never send from a browser."},"UploadSessionToken":{"type":"http","scheme":"Upload","description":"Scoped to one Upload Session for up to 24 hours. Only the session browser operations accept this credential. Browser CORS is limited to UPLOAD_BROWSER_ORIGINS."}},"headers":{"RequestID":{"description":"Opaque request identifier for support and audit correlation","schema":{"type":"string","format":"uuid"}},"RateLimit-Limit":{"description":"Current token bucket capacity; OTP includes 300 burst tokens.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Whole tokens available after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Seconds until the bucket is full.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Seconds until one token is available after a 429.","schema":{"type":"integer","minimum":0}}},"parameters":{"OptionalIdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional for VdoCipher-compatible mutations. Printable ASCII, 1–255 characters. Scope: Project, API Secret, method, and route. Same key and request within 24 hours replays the original status and body; changed request returns 409 idempotency_key_reused; unresolved concurrent duplicate returns 409 request_in_progress. Reusable after 24 hours.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x21-\\x7e]+$"}},"RequiredIdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"description":"Required for mutating WeCloud-specific operations. Uses the same 24-hour Project, API Secret, method, and route scope and replay rules as the optional key.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x21-\\x7e]+$"}},"VideoID":{"name":"videoId","in":"path","required":true,"schema":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"}},"FolderID":{"name":"folderId","in":"path","required":true,"schema":{"type":"string","pattern":"^(folder_[0-9a-f-]{36}|root)$"},"description":"Stable Project folder ID; root denotes the Project root."},"FileID":{"name":"fileId","in":"path","required":true,"schema":{"type":"string","pattern":"^file_[0-9a-f-]{36}$"}},"ChapterID":{"name":"chapterId","in":"path","required":true,"schema":{"type":"string","pattern":"^chapter_[0-9a-f-]{36}$"}},"UploadSessionID":{"name":"uploadSessionId","in":"path","required":true,"schema":{"type":"string","pattern":"^upload_[0-9a-f-]{36}$"}},"PartNumber":{"name":"partNumber","in":"path","required":true,"schema":{"type":"integer","minimum":1}},"FileFingerprint":{"name":"fileFingerprint","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500}}},"schemas":{"DeleteVideoResult":{"type":"object","required":["videoId","status","recoverUntil"],"properties":{"videoId":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"},"status":{"type":"string","const":"deleted"},"recoverUntil":{"type":["string","null"],"format":"date-time"}}},"ApiSecretMetadata":{"type":"object","required":["visibleKeyId","name","status","createdAt","lastUsedAt","revokedAt"],"properties":{"visibleKeyId":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["active","revoked"]},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"}}},"Poster":{"type":"object","required":["posterUrl"],"properties":{"fileId":{"type":"string","pattern":"^file_[0-9a-f-]{36}$"},"posterUrl":{"type":"string","format":"uri","description":"Requires API Secret authorization"}}},"Video":{"type":"object","required":["id","videoId","title","description","upload_time","length","status","posters","tags","folderId","size","createdAt","updatedAt"],"properties":{"id":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"},"videoId":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"},"title":{"type":"string"},"description":{"type":"string"},"upload_time":{"type":"integer","description":"Unix seconds"},"length":{"type":["number","null"],"description":"Duration in seconds"},"status":{"type":"string","enum":["pre-upload","queued","ready","failed","expired"]},"posters":{"type":"array","items":{"$ref":"#/components/schemas/Poster"}},"tags":{"type":"array","items":{"type":"string"}},"folderId":{"type":"string","pattern":"^(folder_[0-9a-f-]{36}|root)$"},"size":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","requestId","retryable"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"retryable":{"type":"boolean"},"details":{"type":"object","additionalProperties":true}}}}},"Folder":{"type":"object","required":["id","name","parent","videosCount","foldersCount"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^folder_[0-9a-f-]{36}$"},"name":{"type":"string","minLength":1,"maxLength":120},"parent":{"type":["string","null"],"pattern":"^folder_[0-9a-f-]{36}$"},"videosCount":{"type":"integer","minimum":0},"foldersCount":{"type":"integer","minimum":0}}},"FolderLocation":{"type":"object","required":["id","name","parent"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^(folder_[0-9a-f-]{36}|root)$"},"name":{"type":"string"},"parent":{"type":["string","null"],"pattern":"^folder_[0-9a-f-]{36}$"}}},"FolderListing":{"type":"object","required":["folderList","current","parent"],"additionalProperties":false,"properties":{"folderList":{"type":"array","items":{"$ref":"#/components/schemas/Folder"}},"current":{"$ref":"#/components/schemas/FolderLocation"},"parent":{"anyOf":[{"$ref":"#/components/schemas/FolderLocation"},{"type":"null"}]}}},"TagMutation":{"type":"object","required":["videos","tags"],"additionalProperties":false,"properties":{"videos":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"}},"tags":{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":120}}}},"AssociatedFile":{"type":"object","required":["id","fileId","type","encryption_type","name","isDownloadable","isDeletable"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^file_[0-9a-f-]{36}$"},"fileId":{"type":"string","pattern":"^file_[0-9a-f-]{36}$"},"type":{"type":"string","enum":["original","poster","caption"]},"encryption_type":{"type":"string","enum":["original","poster","subtitle"]},"name":{"type":"string"},"size":{"type":"number"},"time":{"type":"string","format":"date-time"},"lang":{"type":"string","pattern":"^[a-z]{2}$"},"enabled":{"type":"integer","enum":[0,1]},"isDownloadable":{"type":"boolean"},"isDeletable":{"type":"boolean"}}},"Chapter":{"type":"object","required":["chapterId","title","startSeconds"],"additionalProperties":false,"properties":{"chapterId":{"type":"string","pattern":"^chapter_[0-9a-f-]{36}$"},"title":{"type":"string","minLength":1,"maxLength":160},"startSeconds":{"type":"number","minimum":0}}},"ChapterInput":{"type":"object","required":["title","startSeconds"],"additionalProperties":false,"properties":{"title":{"type":"string","minLength":1,"maxLength":160},"startSeconds":{"type":"number","minimum":0}}},"SourceDownload":{"type":"object","required":["fileId","url","expiresAt"],"additionalProperties":false,"properties":{"fileId":{"type":"string","pattern":"^file_[0-9a-f-]{36}$"},"url":{"type":"string","format":"uri","description":"Short-lived private storage URL; never log or cache"},"expiresAt":{"type":"string","format":"date-time"}}},"CompletedUploadPart":{"type":"object","required":["partNumber","size","etag","checksumSHA256"],"additionalProperties":false,"properties":{"partNumber":{"type":"integer","minimum":1},"size":{"type":"integer","minimum":1,"maximum":16777216},"etag":{"type":"string","maxLength":128},"checksumSHA256":{"type":"string","pattern":"^[0-9a-f]{64}$"}}},"UploadSession":{"type":"object","required":["id","status","expiresAt","partSize","completedParts","partTargetUrl"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^upload_[0-9a-f-]{36}$"},"status":{"type":"string","enum":["pending","completed","aborted","expired"]},"expiresAt":{"type":"string","format":"date-time"},"partSize":{"type":"integer","const":16777216},"completedParts":{"type":"array","items":{"$ref":"#/components/schemas/CompletedUploadPart"}},"partTargetUrl":{"type":"string"},"uploadToken":{"type":"string","pattern":"^wc_ut_[A-Za-z0-9_-]{43}$","description":"Scoped 24-hour credential returned only at initiation. Give it to the browser, never the API Secret. Send Authorization: Upload <uploadToken> for progress, resume, part authorization, completion, or abort."}}},"UploadSessionResult":{"type":"object","required":["videoId","uploadSession"],"additionalProperties":false,"properties":{"videoId":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"},"uploadSession":{"$ref":"#/components/schemas/UploadSession"}}},"UploadInitiation":{"type":"object","required":["fileName","fileFingerprint","size"],"additionalProperties":false,"properties":{"fileName":{"type":"string","minLength":1,"maxLength":255},"fileFingerprint":{"type":"string","minLength":1,"maxLength":500},"size":{"type":"integer","minimum":1,"maximum":107374182400},"retentionDays":{"type":"integer","minimum":0},"mediaProtectionPolicy":{"type":"string","enum":["standard","protected"]}}},"PartAuthorization":{"type":"object","required":["size","checksumSHA256"],"additionalProperties":false,"properties":{"size":{"type":"integer","minimum":1,"maximum":16777216},"checksumSHA256":{"type":"string","pattern":"^[0-9a-f]{64}$"}}},"PartUploadTarget":{"type":"object","required":["uploadURL","headers"],"additionalProperties":false,"properties":{"uploadURL":{"type":"string","description":"Scoped browser PUT URL; expires according to storage signing policy and grants only this part."},"headers":{"type":"object","additionalProperties":{"type":"string"}}}},"UploadInitiationResult":{"type":"object","required":["videoId","uploadSession"],"properties":{"videoId":{"type":"string","pattern":"^asset_[0-9a-f-]{36}$"},"uploadSession":{"allOf":[{"$ref":"#/components/schemas/UploadSession"},{"required":["uploadToken"]}]}}},"PlaybackPair":{"type":"object","required":["otp","playbackInfo"],"additionalProperties":false,"properties":{"otp":{"type":"string"},"playbackInfo":{"type":"string"}}},"PlaybackSession":{"type":"object","required":["browser","mediaAssetId","sessionToken","expiresAt","manifestURL","metadata","watermark"],"properties":{"browser":{"type":"object"},"mediaAssetId":{"type":"string"},"sessionToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"manifestURL":{"type":"string"},"licenceURL":{"type":"string"},"fairPlayCertificateURL":{"type":"string"},"metadata":{"type":"object","additionalProperties":false,"required":["mediaAssetId","title","durationSeconds","chapters"],"properties":{"mediaAssetId":{"type":"string"},"title":{"type":"string"},"durationSeconds":{"type":["number","null"]},"chapters":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["chapterId","title","startSeconds"],"properties":{"chapterId":{"type":"string"},"title":{"type":"string"},"startSeconds":{"type":"number"}}}}}},"watermark":{"type":"object"}}},"HttpHook":{"type":"object","additionalProperties":false,"required":["uuid","type","value","event","status","createdAt"],"properties":{"uuid":{"type":"string","format":"uuid"},"type":{"const":"http"},"value":{"type":"string","format":"uri","maxLength":2048},"event":{"type":"string","enum":["video:ready","video:readyall","video:failed"]},"status":{"const":1},"createdAt":{"type":"string","format":"date-time"}}},"HttpHookCreate":{"type":"object","additionalProperties":false,"required":["type","value","event"],"properties":{"type":{"const":"http"},"value":{"type":"string","format":"uri","maxLength":2048,"description":"Public HTTPS endpoint. Credentials, IP literals, private DNS results, and fragments are rejected."},"event":{"type":"string","enum":["video:ready","video:readyall","video:failed"]},"status":{"const":1,"description":"Optional; only active hooks can be created."}}},"HttpHookCreated":{"type":"object","additionalProperties":false,"required":["uuid","type","value","event","status","createdAt","secret"],"properties":{"uuid":{"type":"string","format":"uuid"},"type":{"const":"http"},"value":{"type":"string","format":"uri","maxLength":2048},"event":{"type":"string","enum":["video:ready","video:readyall","video:failed"]},"status":{"const":1},"createdAt":{"type":"string","format":"date-time"},"secret":{"type":"string","readOnly":true,"description":"Outbound signing secret. Returned only on creation; store it now."}}}},"responses":{"IdempotencyConflict":{"description":"idempotency_key_reused for a changed request, or retryable request_in_progress for a concurrent duplicate","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"changedRequest":{"value":{"error":{"code":"idempotency_key_reused","message":"Idempotency-Key was used for another request.","requestId":"00000000-0000-4000-8000-000000000001","retryable":false}}},"inProgress":{"value":{"error":{"code":"request_in_progress","message":"Request is still in progress.","requestId":"00000000-0000-4000-8000-000000000002","retryable":true}}}}}}},"DashboardError":{"description":"Dashboard request denied or invalid","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"BadRequest":{"description":"Invalid input, pagination, filter, or missing required Idempotency-Key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"Unauthorized":{"description":"Missing, malformed, invalid, or revoked API Secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"Forbidden":{"description":"Organisation disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"NotFound":{"description":"Video, folder, or poster absent from the Secret's Project, or deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"ServerError":{"description":"Unexpected failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"}}},"RateLimited":{"description":"Rate limit exceeded; no operation was performed.","headers":{"X-Request-ID":{"$ref":"#/components/headers/RequestID"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"rate_limit_exceeded","message":"Rate limit exceeded. Retry later.","requestId":"00000000-0000-4000-8000-000000000001","retryable":true}}}}}}},"x-published-rate-limits":{"managementReadsPerMinutePerSecret":600,"managementWritesPerMinutePerSecret":120,"otpGenerationsPerMinutePerProject":3000,"otpBurstTokens":300,"multipartObjectStorageRequests":"exempt"},"x-version-policy":{"stableMajor":1,"breakingChangeOverlapMonths":12,"nonbreakingAdditions":"rolling"}}