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}/files/{fileId}/download

Authorize a retained original with a short-lived signed URL

Responses: 200, 400, 401, 403, 404, 409, 429, 500

Parameters, request body, responses, and schemas
{
  "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"
}

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"
}

POST /api/uploads/{uploadSessionId}/parts/{partNumber}

Issue a scoped browser URL for one checksummed part

Responses: 200, 400, 401, 403, 404, 409, 429, 500

Parameters, request body, responses, and schemas
{
  "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"
}

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"
    }
  }
}