Kolbo Review
Frame.io-style client review over the API — upload media, create review assets with versions, comment with timecodes, set status, and mint guest share links.
Kolbo Review is the in-app Frame.io-style review layer: versioned assets, status workflow, timestamped comments, collections (folders), and guest share links. The Developer API exposes the same surface under /api/v1/review/* so API clients and @kolbo/mcp agents can drive review without opening the app.
Upload first with the Media Library (POST /v1/media/upload, upload ticket, or MCP upload_media / create_upload_ticket / media_upload_widget), then pass the returned media_id into Review. There is no separate Review uploader.
Endpoint map
GET /api/v1/review/storage-usage
POST /api/v1/review/assets
GET /api/v1/review/assets
GET /api/v1/review/assets/:id
PATCH /api/v1/review/assets/:id
POST /api/v1/review/assets/:id/versions
POST /api/v1/review/assets/:id/status
DELETE /api/v1/review/assets/:id
GET /api/v1/review/assets/:id/comments
POST /api/v1/review/assets/:id/comments
POST /api/v1/review/collections
GET /api/v1/review/collections
PATCH /api/v1/review/collections/:id
DELETE /api/v1/review/collections/:id
POST /api/v1/review/assets/:id/share-links
POST /api/v1/review/collections/:id/share-links
GET /api/v1/review/share-links
POST /api/v1/review/share-links/:linkId/revoke
POST /api/v1/review/comments/:noteId/reply
PATCH /api/v1/review/comments/:noteId
DELETE /api/v1/review/comments/:noteId
POST /api/v1/review/comments/:noteId/resolve
POST /api/v1/review/comments/:noteId/unresolveAll Review routes share the 120/min media-library rate-limit bucket (keyed by authenticated user — see Errors & Limits).
Permissions & limits
| Action | Required access |
|---|---|
| List / get assets & collections, list/create comments, reply, resolve | Project view+ |
| Create / update / delete assets & collections, add versions, set status, share links | Project edit+ |
| Delete someone else's comment | Project full+, or author of the comment |
Additional product limits (same as the app):
| Limit | Detail |
|---|---|
| Free plan | Max 3 live review assets per owner (403 REVIEW_FREE_LIMIT) |
| Storage | 5 GB of Review version media per owner (413 REVIEW_STORAGE_LIMIT) |
| Per-file upload | Media upload rules still apply (Review versions reuse Media Library items) |
Guest share-link visitors use the public /review-link/:token app page — they are not authenticated via API key. The SDK only manages links as the project editor.
Typical flow
1. POST /v1/media/upload → media_id
2. POST /v1/review/assets { name, media_id, project_id } → asset (+ v1)
3. POST /v1/review/assets/:id/comments { body, time_start? }
4. POST /v1/review/assets/:id/status { review_status: "needs_review" }
5. POST /v1/review/assets/:id/share-links → share_url for the clientStorage usage
GET /api/v1/review/storage-usage{
"success": true,
"used_bytes": 118845242,
"cap_bytes": 5368709120
}Scoped to the API-key owner (the same cap that gates create / add-version).
Assets
Create (asset + v1 in one call)
POST /api/v1/review/assets| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name (trimmed, max 500). |
media_id | string | Yes | MediaLibraryItem id from upload / list media. Must be owned by you or live in the same project_id. |
project_id | string | No | Target project (edit+). Omitted → auto-created "API Generations" project. |
collection_id | string | No | Optional Review collection folder in that project. |
version_note | string | No | Note on v1 (max 1000 chars). |
curl -X POST https://api.kolbo.ai/api/v1/review/assets \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Hero cut v1",
"media_id": "6a7b42c150af38464a4ff468",
"project_id": "6a098ebadfe025fd179a074a"
}'Response (201):
{
"success": true,
"asset": {
"id": "6a7b463b2e9279d87f9ba2e2",
"name": "Hero cut v1",
"project_id": "6a098ebadfe025fd179a074a",
"collection_id": null,
"review_status": "in_progress",
"current_version_index": 0,
"versions": [
{
"id": "…",
"label": "v1",
"media_id": "6a7b42c150af38464a4ff468",
"url": "https://media.kolbo.ai/…",
"media_type": "video",
"thumbnail_url": "https://media.kolbo.ai/…",
"note": null,
"uploaded_at": "2026-08-11T15:56:00.000Z"
}
],
"created_at": "2026-08-11T15:56:00.000Z",
"updated_at": "2026-08-11T15:56:00.000Z"
}
}List
GET /api/v1/review/assets| Parameter | Type | Required | Description |
|---|---|---|---|
project_id | string | No | Project to list. Omitted → your default "API Generations" project (not every accessible project). |
collection_id | string | No | Filter to one collection. |
status | string | No | in_progress | needs_review | approved | changes_requested. Also accepted as review_status. |
page | number | No | 1-indexed. Default 1. |
limit | number | No | Default 20, max 100. |
{
"success": true,
"assets": [ /* asset shapes */ ],
"pagination": { "page": 1, "limit": 20, "total": 3, "pages": 1 }
}Get / update / delete
GET /api/v1/review/assets/:id
PATCH /api/v1/review/assets/:id
DELETE /api/v1/review/assets/:idPATCH body (all optional):
| Field | Type | Description |
|---|---|---|
name | string | Rename. |
collection_id | string | null | Move into a collection, or null to uncollect. |
current_version_index | number | Switch the active version (0-based). |
DELETE soft-deletes the asset (and frees its contribution toward the free-tier count / storage aggregation once versions are cleaned up by the existing Review delete path).
Add a version
POST /api/v1/review/assets/:id/versions| Field | Type | Required | Description |
|---|---|---|---|
media_id | string | Yes | New MediaLibraryItem to append as v{n+1}. |
version_note | string | No | Optional note (max 1000). |
Becomes the current version automatically.
Set status
POST /api/v1/review/assets/:id/status| Field | Type | Required | Description |
|---|---|---|---|
review_status | string | Yes | in_progress | needs_review | approved | changes_requested. Also accepted as status. |
Notifies the asset owner when the changer is someone else (same as the app).
Collections
Folders that group review assets inside a project.
POST /api/v1/review/collections
GET /api/v1/review/collections
PATCH /api/v1/review/collections/:id
DELETE /api/v1/review/collections/:idCreate body: { "name": string, "project_id"?: string } — edit+ required.
List query: project_id optional (defaults to API Generations, same as assets).
Patch body: { "name": string }.
Delete: soft-delete; assets in that folder become uncollected (collection_id: null).
Comments
Text comments (optional video timecodes) on a review asset's media. Drawing annotations and voice notes stay app-only for now.
List / create on an asset
GET /api/v1/review/assets/:id/comments
POST /api/v1/review/assets/:id/commentsList query: optional version_media_id (defaults to the asset's current version media).
Create body:
| Field | Type | Required | Description |
|---|---|---|---|
body | string | Yes | Plain-text comment. |
time_start | number | No | Seconds on the timeline. |
time_end | number | No | Optional end of a range. |
version_media_id | string | No | Comment on a non-current version's media. |
curl -X POST https://api.kolbo.ai/api/v1/review/assets/6a7b463b2e9279d87f9ba2e2/comments \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "Cut the logo sting shorter", "time_start": 3.2 }'Reply / edit / delete / resolve
POST /api/v1/review/comments/:noteId/reply
PATCH /api/v1/review/comments/:noteId
DELETE /api/v1/review/comments/:noteId
POST /api/v1/review/comments/:noteId/resolve
POST /api/v1/review/comments/:noteId/unresolveReply body: { "body": string } (one level of threading).
Edit body: optional body, time_start, time_end (author only).
Delete: author, or full+ on the project.
Share links
Mint a guest URL the client opens without a Kolbo account.
POST /api/v1/review/assets/:id/share-links
POST /api/v1/review/collections/:id/share-links
GET /api/v1/review/share-links?target_type=asset|collection&target_id=…
POST /api/v1/review/share-links/:linkId/revokeCreate body (all optional except you need edit+ on the project):
| Field | Type | Description |
|---|---|---|
role_label | string | Label shown to guests (e.g. "Client"). |
permissions | object | Booleans: canComment, canDownload, canViewOtherComments, canResolveOwn, canSwitchVersions, canSetStatus. |
require_email | boolean | Ask guests for an email before commenting. |
password | string | Optional password gate. |
allowed_emails | string[] | Optional allow-list. |
expires_at | string | ISO-8601 expiry. |
{
"success": true,
"share_link": {
"id": "6a7b4797a51cce019cae9685",
"share_url": "https://app.kolbo.ai/review-link/76642589a6c554d156e16f33b8108ba0…",
"target_type": "asset",
"target_id": "6a7b463b2e9279d87f9ba2e2",
"role_label": "Client",
"permissions": { "canComment": true },
"created_at": "2026-08-11T15:58:00.000Z"
}
}Treat share_url as a credential. Only editors can list or revoke links. Revoking immediately
invalidates the guest page.
Errors
| Status | Code | Cause |
|---|---|---|
| 400 | VALIDATION | Missing name / media_id, bad ids, invalid status, no media version on the asset. |
| 403 | FORBIDDEN | Insufficient project permission. |
| 403 | REVIEW_FREE_LIMIT | Free plan already has 3 live review assets. |
| 404 | NOT_FOUND | Asset, collection, media, or link not found / not accessible. |
| 413 | REVIEW_STORAGE_LIMIT | Owner would exceed the 5 GB Review storage cap. |
Envelope: { "success": false, "error": "…", "code": "…" }.
MCP tools
Matching @kolbo/mcp tools (v1.66.0+):
| Tool | Maps to |
|---|---|
get_review_storage_usage | GET /v1/review/storage-usage |
list_review_assets / get_review_asset / create_review_asset / update_review_asset / add_review_version / set_review_status / delete_review_asset | Assets |
list_review_collections / create_review_collection / update_review_collection / delete_review_collection | Collections |
list_review_comments / create_review_comment / reply_review_comment / edit_review_comment / delete_review_comment / resolve_review_comment / unresolve_review_comment | Comments |
create_review_share_link / list_review_share_links / revoke_review_share_link | Share links |
Intended agent flow:
1. upload_media | create_upload_ticket | media_upload_widget → media_id
2. (user named a project?) list_projects → project_id
3. create_review_asset { name, media_id, project_id }
4. create_review_comment / set_review_status / create_review_share_link as neededOut of scope (v1)
Drawing annotations / pins, voice-note comments, storyboard share links, live cursors, and guest-token auth for MCP. Use the Kolbo app for those.