---
title: "Sign Video Upload"
method: POST
path: "/api/upload/video/sign"
tags: ["upload", "upload"]
---

# Sign Video Upload

`POST /api/upload/video/sign`

Mint a short-lived signed PUT URL for a coursework video.

Plain `def`: it holds a sync Session and calls GCS, so it runs on the
threadpool rather than blocking the loop.

`{content_type, size, filename?, org_id?}`. The browser PUTs the file
straight to the bucket with the returned headers, then calls
`/upload/video/complete` with `object_path`. Nothing passes through the
pod. Returns `{"mode": "multipart"}` when USE_GCS_STORAGE is off, and the
client uses `/upload/assignment-file` instead.

## Headers

- `authorization` string, nullable

## Request body

- object

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

## Changes

> 20 revisions in range; 1 not diffed.

- **2026-09-13** `3c5400a294e1` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored/changes/api/upload/video/sign/post.md)

---

[API](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored.md) · [All operations](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored/llms.txt) · [OpenAPI document](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored/revisions/ee945980cf00?raw)
