For Agents · Videco
Overview
Base URL:https://app.videco.io
Who can use it: Pro and Business (and AppSumo LTD with API access). Free trial accounts cannot generate API keys.
projectId: Query or body projectId is an optional UUID. If omitted, Videco uses the user’s current project. API keys have no email; current project still resolves from membership.
In-app OpenAPI also lives at https://app.videco.io/openapi.yaml. Prefer this page when they differ (for example around projectId).
Authentication
Recommended
API key
API key from the in-app Developers page. Keys use the vd_live_ prefix.
Authorization: Bearer vd_live_…
Alternative
Session cookie
Session cookie works for logged-in browser / same-origin app requests.
Errors
| Status | Body | When |
|---|---|---|
| 401 | { "error": "Unauthorized" } | Missing or invalid auth. |
| 400 | { "error": "…" } | Bad request (validation, empty folder delete, and similar). |
| 404 | { "error": "Not found" } | Missing or not accessible. Responses do not leak existence. |
| 402 | { "error": "…", "code": "storage" | "duration" | "feature" } | Upload or plan feature blocked by limits. |
| 409 | Folder name collision | Conflicting folder name in the same parent. |
Pagination
Used byGET /api/videos.
- limit: 1–100, default 50
- offset: default 0
- response:
{ videos, pagination: { limit, offset, total, hasMore } }
Endpoints
Public API only. Create keys in the app on Pro or Business.
GET/api/videos
List videos in a project library.
- Query: folderId (UUID, or the string "null" for root), status, visibility, limit, offset, projectId
- status enum: created | uploading | processing | ready | failed
- visibility enum: private | unlisted | public
Response:{ videos, pagination }
POST/api/videos
Create a video record and receive TUS upload credentials.
- JSON: title (required), fileSizeBytes (required, exact bytes of the file to upload), description?, folderId?, projectId?
- Client then TUS-uploads the file to Bunny using the returned credentials (not a multipart POST to Videco).
Body
{
"title": "Product demo",
"fileSizeBytes": 10485760,
"description": "Optional",
"folderId": null,
"projectId": null
}
Response:{ video, upload: { libraryId, videoId, expirationTime, signature, endpoint: "https://video.bunnycdn.com/tusupload" } }
GET/api/videos/{id}
Get a single video by id.
- Returns the video object for an accessible id.
PATCH/api/videos/{id}
Update video metadata or player options.
- JSON any of: title, description, visibility, folderId, status (uploading|processing|ready|failed), playerResponsive, playerAutoplay, playerPreload, playerLoop, playerMuted
Body
{
"title": "Updated title",
"visibility": "unlisted"
}
DELETE/api/videos/{id}
Delete a video.
- Returns { ok: true } on success.
Response:{ "ok": true }
POST/api/folders
Create a folder.
- JSON: name (required), parentId?, projectId?
Body
{
"name": "Demos",
"parentId": null
}
PATCH/api/folders/{id}
Rename or move a folder.
- JSON: name?, parentId?
Body
{
"name": "Launch demos"
}
DELETE/api/folders/{id}
Delete an empty folder.
- Empty folders only. Returns 400 if the folder is not empty.
Objects
Video
durationSeconds / storageBytes may be numeric strings.
id, userId, projectId, folderId, bunnyVideoId, title, description, status, visibility, shareSlug, durationSeconds, storageBytes, thumbnailUrl, playerResponsive, playerAutoplay, playerPreload, playerLoop, playerMuted, createdAt, updatedAt
Folder
id, userId, projectId, parentId, name, createdAt, updatedAt
Not public API
Session-only or internal routes are not documented here:
/api/projects* · /api/invites/* · /api/videos/{id}/comments* · /api/videos/{id}/captions* · /api/videos/{id}/transcribe · /api/branding* · /api/billing* · /api/api-keys* · /api/webhooks/* · /api/cron/* · /api/appsumo* · /api/support/*
Examples
Create a folder
curl -H "Authorization: Bearer vd_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Demos"}' \
https://app.videco.io/api/folders
List videos
curl -H "Authorization: Bearer vd_live_YOUR_KEY" \
"https://app.videco.io/api/videos?limit=20"