Social — video uploads
Media assets now take video: declare a clip up to 512 MB, upload it straight to storage with a presigned PUT, and get back a streaming-ready MP4 plus a poster frame — attachable to posts, comments, and DMs like any image.
The media asset primitive now handles video end-to-end. Create the asset with kind: "video" and its declared size, PUT the bytes directly to the returned presigned URL (nothing proxies through the API), then call POST /assets/:id/complete. Transcoding runs out-of-band: up to 3 minutes of H.264/HEVC or VP8/VP9 becomes one progressive MP4 (downscaled to 1080p when larger, never upscaled) plus a poster JPEG, served — like every rendition — via short-lived presigned URLs from private storage.
Track progress by polling the asset or via the existing asset.ready / asset.failed webhooks, which now carry kind (and a stable failure_reason on failure). Failures are explicit state: incomplete uploads stay retryable, oversize or non-video bytes and over-length clips fail with ASSET_TOO_LARGE, ASSET_INVALID_CONTAINER, or ASSET_DURATION_EXCEEDED. Ready videos attach to posts, comments, and DMs exactly like images — same assets array, same 20-item cap.