editframe-api
JavaScript/TypeScript SDK for Editframe's video rendering API. Create renders, upload video and image files, manage assets, and sign URLs for playback.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
JavaScript/TypeScript SDK for Editframe's video rendering API. Create renders, upload video and image files, manage assets, and sign URLs for playback.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
Create video compositions with Editframe using HTML web components or React. Supports video, audio, images, text, captions, transitions, and cloud rendering.
Build video editing interfaces with Editframe's GUI components. Assemble timeline, scrubber, filmstrip, preview, playback controls, and transform handles into custom editing UIs. Use when building video editors, editing tools, or when working with timeline, scrubber, preview, playback controls, volume, mute, fullscreen, picture-in-picture, resolution, trim handles, hierarchy, or editor UIs.
Webhook notifications for render completion and file processing events. Configure endpoints, verify HMAC signatures, and handle real-time status payloads.
| name | editframe-api |
| description | JavaScript/TypeScript SDK for Editframe's video rendering API. Create renders, upload video and image files, manage assets, and sign URLs for playback. |
| license | MIT |
| metadata | {"author":"editframe","version":"2.0"} |
JavaScript/TypeScript client for Editframe's video rendering API. Render videos from HTML compositions, upload and process media files, and manage authenticated access to CDN resources.
import { Client, createRender, getRenderProgress, downloadRender } from "@editframe/api";
// Initialize client with API key
const client = new Client(process.env.EDITFRAME_API_KEY);
// Create a render from HTML composition
const render = await createRender(client, {
html: `<ef-timegroup mode="contain" class="w-[1920px] h-[1080px]">
<ef-video src="https://assets.editframe.com/bars-n-tone.mp4"></ef-video>
</ef-timegroup>`,
width: 1920,
height: 1080,
fps: 30,
});
// Poll for completion
for await (const event of await getRenderProgress(client, render.id)) {
console.log(`Progress: ${event.progress}%`);
}
// Download the result
const response = await downloadRender(client, render.id);
const buffer = await response.arrayBuffer();
createRender(client, payload) → CreateRenderResult — Create a render job from HTML compositionuploadRender(client, renderId, fileStream) → Promise<void> — Upload pre-rendered video filegetRenderProgress(client, id) → CompletionIterator — Stream render progress via SSEgetRenderInfo(client, id) → LookupRenderByMd5Result — Get render metadatalookupRenderByMd5(client, md5) → LookupRenderByMd5Result | null — Find existing render by hashdownloadRender(client, id) → Response — Download completed rendercreateFile(client, payload) → CreateFileResult — Register a file (video, image, or caption)uploadFile(client, uploadDetails, fileStream) → IteratorWithPromise<UploadChunkEvent> — Upload file content with progressgetFileDetail(client, id) → FileDetail — Get file metadata and trackslookupFileByMd5(client, md5) → LookupFileByMd5Result | null — Find existing file by hashdeleteFile(client, id) → { success: boolean } — Delete a filegetFileProcessingProgress(client, id) → ProgressIterator — Stream processing progress for video filestranscribeFile(client, id, options?) → TranscribeFileResult — Start audio transcriptiongetFileTranscription(client, id) → FileTranscriptionResult | null — Get transcription statusupload(client, filePath) → { file, uploadIterator } — Upload a file from disk (auto-detects type)createURLToken(client, url) → string — Generate signed JWT for browser access to media endpointsAll file types (video, image, caption) use a single set of endpoints:
| Endpoint | Method | Purpose |
|---|---|---|
| /api/v1/files | POST | Create file record |
| /api/v1/files/:id | GET | Get file detail |
| /api/v1/files/:id/upload | GET/POST | Check upload status or upload chunk |
| /api/v1/files/:id/delete | POST | Delete file |
| /api/v1/files/:id/index | GET | Get fragment index (video only) |
| /api/v1/files/:id/tracks/:trackId | GET | Get track data (video only) |
| /api/v1/files/:id/transcribe | POST | Start transcription (video only) |
| /api/v1/files/:id/transcription | GET | Get transcription status |
| /api/v1/files/:id/progress | GET | Stream processing progress (SSE) |
| /api/v1/files/md5/:md5 | GET | Lookup file by MD5 hash |
The file type field determines processing behavior:
"video" — uploaded files are automatically processed to ISOBMFF format"image" — uploaded files are immediately ready"caption" — uploaded files are immediately readyOptional expires_at on createFile (ISO 8601, max 30 days ahead) schedules automatic removal; omit for permanent retention. File webhooks and getFileDetail include expires_at (null when permanent).
Renders support the same optional expires_at retention field; deleteRender removes a render and all of its GCS output immediately.
Reference uploaded files using the file-id attribute:
<ef-configuration api-host="https://editframe.com">
<ef-timegroup mode="contain" class="w-[1920px] h-[1080px]">
<ef-video file-id="uuid-of-processed-video"></ef-video>
<ef-image file-id="uuid-of-uploaded-image" class="w-24 h-24"></ef-image>
</ef-timegroup>
</ef-configuration>
The file-id is a stable UUID assigned at file creation time and remains the same throughout upload, processing, and playback.
If your application renders Editframe compositions in a browser, you need URL signing. The browser needs authenticated access to transcode endpoints, but cannot hold your API key.
URL signing creates short-lived, scoped tokens that authorize the browser to access specific media URLs. Set up a server route that calls createURLToken, then configure <ef-configuration signingURL="/your-route"> in your frontend.
See references/url-signing.md for implementation details and integration with elements-composition and react-composition.