Move Videos between Projects

Endpoint: POST /v1/videos/change-project

This guide explains how integrations can move up to 1,000 videos per API call into a different project through the public API. The workflow mirrors the dashboard behaviour.


Prerequisites

  • Authentication: JWT token that satisfies policy (the same token used for other video‑management endpoints).

  • Project access: Team members are restricted to projects they already control; admins can move any videos within the account.

  • Video ownership: All video IDs must belong to the authenticated account.


Request

POST /v1/videos/change-project HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json

{
  "projectId": "proj_abc123",
  "videoIds": [
    "vid_0001",
    "vid_0002",
    "vid_0003"
  ]
}

Body Fields

Field
Type
Required
Description

projectId

string

Target project ID. Must belong to the authenticated account.

videoIds

array<string>

List of video IDs to move. Duplicates and blank entries are removed automatically. Limited to 1,000 per request.


Behaviour

  1. Validation

    • Rejects empty payloads and requests exceeding 1,000 IDs.

    • Managers must already have access to each source project; otherwise the call returns 403.


Response

{
  "ok": true
}
Field
Type
Description

ok

bool

Indicates whether every batch completed successfully. A false value means one or more videos failed; inspect server logs for details.


Error Codes

Status
When it Happens

400 Bad Request

Invalid JSON, missing projectId, no videoIds, more than 1,000 IDs, or the target project cannot be resolved.

403 Forbidden

Manager attempted to move videos from a project outside their access list.

500 Internal Server Error

Unexpected failure while updating.

Retries are safe: the operation is idempotent.


Best Practices

  • Chunk large migrations: If you need to move more than 1,000 videos, split the job into multiple requests.

  • Validate ahead of time: Fetch the destination project first if you want to confirm its id or ensure it exists before calling the endpoint


Last updated