Everything starts
with a project.
Your timeline, your vector geometry, your source. Read and write the native document.
Projects and media belong to the key’s account. Identical ids in separate accounts do not grant access to each other. List responses are capped at 100 projects, the current per-account limit.
List projects
/api/v1/projectsRequires projects:read. Returns your projects, most recently updated first.
curl https://vunoblade.com/api/v1/projects \
-H "Authorization: Bearer $VUNOBLADE_API_KEY"const response = await fetch(
"https://vunoblade.com/api/v1/projects",
{ headers: {
Authorization: `Bearer ${process.env.VUNOBLADE_API_KEY}`
}}
);
if (!response.ok) throw new Error(await response.text());
const { projects } = await response.json();Create a project
/api/v1/projectsRequires projects:write. Omitting id creates a new project. Pass a native data object to save an editable timeline. Starter templates afterimage, chromatic, and signal create editable copies of the showcase.
curl https://vunoblade.com/api/v1/projects \
-H "Authorization: Bearer $VUNOBLADE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"First contact","ratio":"landscape","template":"afterimage"}'| Field | Type / behavior |
|---|---|
| name | String · up to 100 characters |
| ratio | landscape, portrait, or square |
| template | Optional showcase starter id · only on creation |
| id | Optional · letters, numbers, underscore, hyphen · max 100 |
| data | Optional native document with tracks, clips, and assets arrays |
| expectedRevision | Required by integrations when updating an existing project to detect conflicts |
Read or update a project
/api/v1/projects/{id}Returns { project, revision, assets }. To update, POST /projects with the same id, updated data, and the revision you just read as expectedRevision. A stale revision returns 409. Legacy writes without expectedRevision are accepted; new integrations should always send it.
{
"id": "your-project-id",
"name": "First contact — v2",
"ratio": "landscape",
"expectedRevision": 1,
"data": {
"tracks": [
{
"id": "picture",
"name": "Picture",
"kind": "video"
}
],
"clips": [],
"assets": []
}
}Delete a project
/api/v1/projects/{id}Requires projects:write. Permanently deletes this account’s server copy and uploaded sources for the project. Export a native backup before deletion. Device-local copies are separate.
Upload original media
PUT /projects/{id}/assets/{assetId}/meta with name, kind, mime, size, duration, chunkCount, and SHA-256 digest. Then PUT binary chunks to /projects/{id}/assets/{assetId}/chunks/{part}. Each chunk is 786432 bytes, except the final one. Chunk indexes start at zero. A complete upload is verified against its SHA-256; mismatched chunks are discarded and return 422.
| Constraint | Value |
|---|---|
| Account media storage | 350 MB |
| Metadata body | 25 KB maximum |
| kind | video, image, or audio |
| Supported mime prefixes | video/, image/, audio/ |
| GET chunk | projects:read · application/octet-stream |
| Retry | Upload the same chunk index again; it replaces that chunk |