Server API · v1
Server API reference
This reference is rendered from the same OpenAPI 3.1 contract used by the API checks. Download the OpenAPI JSON for Swagger or code generation.
Base URL: https://api.wecloud.biz · Contract version: 1.0.0
Authenticate Server API operations with Authorization: Apisecret <secret> from your backend.
Public errors
Error responses retain HTTP status and include a stable code, safe message, request ID, retryability, and optional details.
Error schema and reusable responses
{
"schema": {
"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
}
}
}
}
},
"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
}
}
}
}
}
}
},
"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
}
}
}
}
}
}
}GET /api/videos
List videos in the Secret's Project
Responses: 200, 400, 401, 403, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos
Delete Project videos using the compatible videos query parameter
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/videos/{videoId}
Retrieve a video in the Secret's Project
Responses: 200, 401, 403, 404, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/{videoId}
Rename a video in the Secret's Project
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/{videoId}
Delete a Project video and revoke playback immediately
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/videos/{videoId}/poster
Retrieve a custom poster with the same API Secret
Responses: 200, 401, 403, 404, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/videos/folders
List the Project root folders
Responses: 200, 400, 401, 403, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/folders
Create a Project folder at root or in another folder
Responses: 201, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/videos/folders/{folderId}
Get a folder and list its direct children; root is supported
Responses: 200, 400, 401, 403, 404, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/folders/{folderId}
Rename a Project folder
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/folders/{folderId}
Delete a folder; videos and children move to its parent
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/videos/tags
List case-sensitive tags applied to visible Project videos
Responses: 200, 400, 401, 403, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/tags
Add case-sensitive tags to one or more Project videos
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/tags
Replace all tags on one or more Project videos; empty tags clears them
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}PUT /api/videos/{videoId}/folder
Place a video in one Project folder or the root
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/videos/{videoId}/files
List original, poster, and Caption Track files by stable public ID
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/{videoId}/files
Upload a custom poster or WebVTT Caption Track; language query selects a Caption Track
Responses: 201, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}DELETE /api/videos/{videoId}/files/{fileId}
Delete a custom poster or Caption Track; generated posters and originals cannot be deleted here
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/videos/{videoId}/chapters
List Chapters ordered by start time
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/{videoId}/chapters
Create a Chapter within the known video duration
Responses: 201, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}PATCH /api/videos/{videoId}/chapters/{chapterId}
Update a Chapter
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/videos/{videoId}/chapters/{chapterId}
Delete a Chapter
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}POST /api/uploads
Initiate a 24-hour WeCloud multipart upload and reserve videoId
Responses: 201, 400, 401, 403, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/uploads/{uploadSessionId}
Read session status and uploaded parts
Responses: 200, 401, 403, 404, 410, 429, 500
Parameters, request body, responses, and schemas
{
"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 /api/uploads/{uploadSessionId}
Abort a pending upload
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}GET /api/uploads/{uploadSessionId}/resume
Verify file fingerprint and list completed parts
Responses: 200, 400, 401, 403, 404, 409, 410, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}PUT /api/uploads/{uploadSessionId}/parts/{partNumber}/content
Responses: 200, 400, 403, 404, 410, 413
Parameters, request body, responses, and schemas
{
"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"
}
}
}POST /api/uploads/{uploadSessionId}/complete
Complete parts and queue processing exactly once
Responses: 200, 400, 401, 403, 404, 409, 429, 500
Parameters, request body, responses, and schemas
{
"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"
}POST /api/videos/{videoId}/otp
Issue a single-use OTP and Playback Info pair for a ready Project video
Responses: 201, 400, 401, 404, 409, 410, 429
Parameters, request body, responses, and schemas
{
"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"
}POST /api/playback/initialize
Atomically consume a pair and create one Viewer playback session
Responses: 201, 400, 401, 403, 404, 409, 410
Parameters, request body, responses, and schemas
{
"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"
}
}
}
}
}
}GET /api/playback/resources/{path}
Read a session-scoped playback resource
Responses: 200, 206, 401, 404
Parameters, request body, responses, and schemas
{
"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"
}
}
}
}
}
}POST /api/playback/licence
Acquire a temporary DRM licence for a Viewer session
Responses: 200, 401, 403
Parameters, request body, responses, and schemas
{
"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"
}
}
}
}
}
}GET /api/playback/watermark
Read or rotate the persisted Leak ID watermark
Responses: 200, 401
Parameters, request body, responses, and schemas
{
"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"
}
}
}
}
}
}GET /api/hooks
List HTTP hooks for the API Secret’s Project
Responses: 200, 401, 429
Parameters, request body, responses, and schemas
{
"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 /api/hooks
Create one active HTTP hook for one lifecycle event
Responses: 201, 400, 401, 429
Parameters, request body, responses, and schemas
{
"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 /api/hooks
Delete one hook belonging to the API Secret’s Project
Responses: 200, 400, 401, 404, 429
Parameters, request body, responses, and schemas
{
"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"
}
}
}GET /api/hooks/deliveries
List the latest 100 webhook deliveries and safe attempt histories for the API Secret's Project
Responses: 200, 401, 429
Parameters, request body, responses, and schemas
{
"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"
}
}
}