REST API
上传和共享文件
这份教程会把本地的 demo.mp4 转换成一个可以打开的分享 URL。请按顺序完成;每一步响应里的值都会在下一步使用。
1
创建并保存 API 密钥
打开开发者设置,勾选 uploads:write、files:read、shares:write 和 shares:read,然后创建密钥。请立即复制——完整密钥只显示一次。
可用权限范围:uploads:write、files:read、shares:write 和 shares:read。
预期结果:你已经得到一段以 Video2URL 密钥前缀开头的秘密字符串。不要分享给任何人。
2
准备终端
把密钥放入环境变量,避免每条命令都出现密钥,也避免它进入终端历史记录。按回车前先替换占位符。
read -s VIDEO2URL_API_KEY
echo "key loaded"预期结果:命令只输出“key loaded”,不会显示真正的密钥。
3
创建上传任务
告诉 Video2URL 准确的文件名、MIME 类型和字节数。响应会返回一个临时 R2 上传地址;这一步还没有上传视频。
POST /api/v1/uploads
curl -sS -X POST https://video2url.com/api/v1/uploads \
-H "Authorization: Bearer $VIDEO2URL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"filename":"demo.mp4","mimeType":"video/mp4","sizeBytes":1048576}'预期结果:JSON 响应包含 data.uploadId 和 data.upload.url。保存这两个值,下一步会用到。
export UPLOAD_ID="paste data.uploadId here"
export UPLOAD_URL="paste data.upload.url here"4
发送视频文件内容
把 demo.mp4 直接上传到临时 URL。这个 PUT 请求不要携带 Video2URL API 密钥,并使用创建上传任务时返回的 Content-Type。 使用返回的内容类型,将原始文件上传到上传前生成的预签名 URL。
curl --fail-with-body -X PUT "$UPLOAD_URL" \
-H "Content-Type: video/mp4" \
-H "If-None-Match: *" \
--data-binary @demo.mp4预期结果:上传服务器返回 HTTP 200。响应正文为空是正常情况。
5
完成并验证上传
PUT 成功后,通知 Video2URL 校验存储对象并创建文件记录。不要在 PUT 完成前调用这一步。
POST /api/v1/uploads/{uploadId}/complete · GET /api/v1/uploads/{uploadId}
curl -sS -X POST "https://video2url.com/api/v1/uploads/$UPLOAD_ID/complete" \
-H "Authorization: Bearer $VIDEO2URL_API_KEY"预期结果:响应包含 data.file.fileId。保存 FILE_ID,它代表已经完成上传的文件。
export FILE_ID="paste data.file.fileId here"JavaScript & Python
仅创建所需的最小权限密钥。轮换时先创建并部署新密钥,再撤销旧密钥。付费资格结束后密钥会保留但调用暂停;重新购买符合条件的套餐即可恢复。
const response = await fetch('https://video2url.com/api/v1/uploads', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.VIDEO2URL_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ filename: 'demo.mp4', mimeType: 'video/mp4', sizeBytes: file.size }),
});
const created = await response.json();
if (created.data.upload.contractVersion !== 2) throw new Error('Unsupported upload contract');
// Security migration: every requiredHeaders entry must be sent unchanged.
await fetch(created.data.upload.url, { method: 'PUT', headers: { ...created.data.upload.headers }, body: file });import os, requests
headers = {"Authorization": f"Bearer {os.environ['VIDEO2URL_API_KEY']}"}
created = requests.post("https://video2url.com/api/v1/uploads", headers=headers, json={"filename": "demo.mp4", "mimeType": "video/mp4", "sizeBytes": 1048576})
created.raise_for_status()
with open("demo.mp4", "rb") as video:
upload = created.json()["data"]["upload"]
requests.put(upload["url"], headers=upload["headers"], data=video).raise_for_status()