Overview

Base URL: https://app.videco.io

Who can use it: Pro and Business (and AppSumo LTD with API access). Free 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

StatusBodyWhen
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.
409Folder name collisionConflicting folder name in the same parent.

Pagination

Used by GET /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"

Need plan limits for API access? See pricing.