Start an upload
Returns the generated video_id plus whatever the file's size requires to upload it directly to storage, then call POST /videos/upload/complete to register the upload and get the credit cost.
When mode is single, PUT the bytes to upload_url with the same Content-Type you declared here.
When mode is multipart the file is past the storage provider's single-PUT ceiling: split it into part_size-byte chunks and PUT each one to the matching entry of part_urls (index 0 is part 1, the last part may be shorter). Collect each response's ETag header and post them to POST /videos/upload/multipart/complete.
Max file size comes from your plan — a FILE_TOO_LARGE response reports the effective ceiling in max_size. Extensions: .mp4, .mov, .webm, .mkv.
Authorization
apiKey In: header
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl -X POST "https://example.com/videos/upload" \ -H "Content-Type: application/json" \ -d '{ "file_name": "string", "file_size": 0 }'{ "mode": "single", "video_id": "string", "upload_url": "string", "expires_in": 0}List plans and credit packs GET
Free. The plans and credit packs this workspace can buy, at the price cut.pro charges this user, each with a checkout link: a cut.pro page that opens the payment with that plan or pack already chosen, in this workspace. The user pays there; nothing is charged by this call. Offer it when a job needs more credits than the balance (`INSUFFICIENT_CREDITS`) or the user asks about plans, prices or more credits: a pack covers a one-off job (suggest the smallest one with at least the missing credits), and a plan suits someone who creates every month (`credits_per_month` renews monthly, and `highlights` says what else it includes). When `can_buy` is `false` only the workspace owner can buy, so tell the user to ask them. `SOLD_ON_SITE` means the app this key belongs to does not allow purchases: send the user to cut.pro.
Finalize a multipart upload POST
Assembles the uploaded parts into the final object. Only needed when `POST /videos/upload` answered with `mode: "multipart"`. After this succeeds, call `POST /videos/upload/complete` to register the video.