API Reference
Authentication
All API requests require authentication using an API Key. You can obtain an API key from Settings > API Keys.
Authentication Methods
| Method | Format | Example |
|---|---|---|
| Bearer Token (Recommended) | Authorization: Bearer sk-xxx | Authorization: Bearer sk-your-api-key |
| Token Header | Authorization: Token sk-xxx | Authorization: Token sk-your-api-key |
| X-API-Key Header | X-API-Key: sk-xxx | X-API-Key: sk-your-api-key |
| Query Parameter | ?api_key=sk-xxx | /api/v1/video?api_key=sk-your-api-key |
Security Note
Never expose your API key in client-side code. Always make API calls from your server.
Endpoints Overview
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/video | Create a video task |
| GET | /api/v1/video | List video tasks |
| GET | /api/v1/video/:taskId | Get task details |
| DELETE | /api/v1/video/:taskId | Delete a video task |
| POST | /api/v1/video/:taskId/render | Trigger rendering |
| POST | /api/v1/upload | Upload files |
| GET | /api/v1/files | List uploaded files |
| DELETE | /api/v1/files/:fileId | Delete a file |
| GET | /api/v1/credits | Get credit balance |
| POST | /api/v1/preview | Create preview link |
| GET | /api/v1/preview/:tempId | Get preview config |
| DELETE | /api/v1/preview/:tempId | Delete preview link |
| POST | /api/v1/preview/:tempId/convert | Convert preview to permanent task |
POST /api/v1/video
Create a permanent video task from your video configuration. This does not start rendering.
Request
POST /api/v1/video
Authorization: Bearer sk-your-api-key
Content-Type: application/jsonRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
config | object | Yes | Video configuration following JSON Schema |
metadata | object | No | Custom metadata to attach to the task |
Example Request
{
"config": {
"meta": {
"version": "2.0.0",
"width": 1920,
"height": 1080,
"fps": 30,
"background": "#000000"
},
"tracks": [
{
"clips": [
{
"type": "text",
"text": "Hello World",
"start": 0,
"duration": 5
}
]
}
]
},
"metadata": {
"project_id": "proj_123"
}
}Success Response (200)
{
"success": true,
"taskId": "abc123def456",
"videoTaskId": "vt_001",
"previewUrl": "https://video.renderingvideo.com/v/abc123def456",
"viewerUrl": "https://video.renderingvideo.com/watch/abc123def456",
"configUrl": "abc123def456.json",
"status": "created",
"quality": "1080p",
"width": 1920,
"height": 1080,
"duration": 10,
"message": "Task created successfully. Call POST /api/v1/video/:taskId/render to start rendering."
}Response Fields
| Field | Type | Description |
|---|---|---|
taskId | string | Unique task identifier |
videoTaskId | string | Internal video task ID |
previewUrl | string | Preview page URL |
viewerUrl | string | Viewer page URL |
configUrl | string | Config file URL |
status | string | Task status (created) |
quality | string | Video quality (720p, 1080p, 2k) |
width | number | Video width in pixels |
height | number | Video height in pixels |
duration | number | Video duration in seconds |
Error Responses
| Code | Status | Description |
|---|---|---|
INVALID_CONFIG | 400 | Invalid video configuration |
REMOTE_ERROR | Upstream status | Remote service error while creating the task |
INTERNAL_ERROR | 500 | Internal server error |
GET /api/v1/video
List all video tasks for your account.
Request
GET /api/v1/video?page=1&limit=20&status=completed
Authorization: Bearer sk-your-api-keyQuery Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
limit | integer | 20 | Items per page (max 100) |
status | string | - | Filter by the latest task status |
Success Response (200)
{
"success": true,
"tasks": [
{
"taskId": "abc123def456",
"videoTaskId": "vt_001",
"width": 1920,
"height": 1080,
"duration": 10,
"status": "completed",
"videoUrl": "https://storage.../videos/abc123.mp4",
"costCredits": 15,
"createdAt": "2026-03-19T10:00:00Z",
"completedAt": "2026-03-19T10:02:30Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 45
}
}GET /api/v1/video/:taskId
Get detailed information about a specific video task.
Request
GET /api/v1/video/abc123def456
Authorization: Bearer sk-your-api-keyPath Parameters
| Parameter | Type | Description |
|---|---|---|
taskId | string | The task ID returned from creation |
Success Response (200)
{
"success": true,
"taskId": "abc123def456",
"videoTaskId": "vt_001",
"width": 1920,
"height": 1080,
"duration": 10,
"status": "completed",
"videoUrl": "https://storage.../videos/abc123.mp4",
"previewUrl": "https://video.renderingvideo.com/v/abc123def456",
"viewerUrl": "https://video.renderingvideo.com/watch/abc123def456",
"configUrl": "abc123def456.json",
"costCredits": 15,
"createdAt": "2026-03-19T10:00:00Z",
"completedAt": "2026-03-19T10:02:30Z",
"metadata": {
"project_id": "proj_123"
}
}Task Status Values
| Status | Description |
|---|---|
created | Task created, not yet rendering |
rendering | Currently rendering |
completed | Rendering finished successfully |
failed | Rendering failed |
DELETE /api/v1/video/:taskId
Permanently delete a video task and its associated render records.
This physically deletes the local task and local render history. The API also attempts to delete the upstream remote task. If upstream deletion fails, the response still succeeds and returns remoteDeleted: false.
Request
DELETE /api/v1/video/abc123def456
Authorization: Bearer sk-your-api-keyPath Parameters
| Parameter | Type | Description |
|---|---|---|
taskId | string | The task ID returned from creation |
Success Response (200)
{
"success": true,
"taskId": "abc123def456",
"videoTaskId": "vt_001",
"deleted": true,
"remoteDeleted": true,
"message": "Video task deleted successfully"
}Response Fields
| Field | Type | Description |
|---|---|---|
taskId | string | Remote task ID |
videoTaskId | string | Internal video task ID |
deleted | boolean | Whether the local task was permanently deleted |
remoteDeleted | boolean | Whether the upstream remote task was deleted |
message | string | Result message |
Error Responses
| Code | Status | Description |
|---|---|---|
NOT_FOUND | 404 | Task not found |
INTERNAL_ERROR | 500 | Internal server error |
POST /api/v1/video/:taskId/render
Trigger or re-trigger rendering for a video task.
If you need completion notifications, pass webhook_url. It is only used for render requests. Creating a task with POST /api/v1/video does not accept a public webhook because that endpoint does not start rendering.
Request
POST /api/v1/video/abc123def456/render
Authorization: Bearer sk-your-api-key
Content-Type: application/jsonRequest Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
webhook_url | string | No | - | URL for completion notification |
num_workers | integer | No | 5 | Number of render workers |
Success Response (200) - New Render
{
"success": true,
"taskId": "abc123def456",
"renderTaskId": "rt_002",
"status": "rendering",
"quality": "1080p",
"width": 1920,
"height": 1080,
"cost": 15,
"remainingCredits": 970,
"message": "Rendering started",
"previewUrl": "https://video.renderingvideo.com/v/abc123def456",
"viewerUrl": "https://video.renderingvideo.com/watch/abc123def456"
}Success Response (200) - Already Completed
If the task is already completed with same dimensions:
{
"success": true,
"taskId": "abc123def456",
"renderTaskId": "rt_001",
"status": "completed",
"alreadyRendered": true,
"quality": "1080p",
"width": 1920,
"height": 1080,
"cost": 15,
"remainingCredits": 985,
"videoUrl": "https://storage.../videos/abc123.mp4",
"previewUrl": "https://video.renderingvideo.com/v/abc123def456",
"viewerUrl": "https://video.renderingvideo.com/watch/abc123def456"
}Error Responses
| Code | Status | Description |
|---|---|---|
NOT_FOUND | 404 | Task not found |
ALREADY_RENDERING | 400 | Task is already rendering |
INSUFFICIENT_CREDITS | 402 | Not enough credits |
RENDER_TRIGGER_FAILED | Upstream status | Failed to trigger render |
INTERNAL_ERROR | 500 | Internal server error |
Webhook Notifications
webhook_url is supported on render-start endpoints:
POST /api/v1/video/:taskId/renderPOST /api/v1/preview/:tempId/render
Behavior:
- The render request stores your
webhook_urltogether with the render task - When the upstream renderer reports
completedorfailed, this project first updates its own database - After the local render record is updated, the project forwards a
POSTrequest to yourwebhook_url
Forwarded payload shape:
{
"taskId": "abc123def456",
"renderTaskId": "rt_002",
"status": "completed",
"videoUrl": "https://storage.../videos/abc123.mp4",
"error": null,
"timestamp": "2026-03-23T10:00:00.000Z"
}Current implementation notes:
- Only
completedandfailedevents are forwarded webhook_urlmust be a valid absolute URL- The forward is asynchronous and does not block the upstream webhook response
- There is currently no webhook signature, retry queue, or delivery log in this project
POST /api/v1/upload
Upload image, video, or audio files for use in video configurations.
Request
POST /api/v1/upload
Authorization: Bearer sk-your-api-key
Content-Type: multipart/form-dataForm Data
| Field | Type | Required | Description |
|---|---|---|---|
file | File | No* | Single file to upload |
files | File[] | No* | Multiple files to upload |
*At least one of file or files is required.
Supported File Types
The upload API accepts any MIME type under these prefixes:
| Category | Accepted MIME Pattern | Common Examples |
|---|---|---|
| Image | image/* | image/jpeg, image/png, image/webp, image/gif, image/svg+xml, image/avif, image/heic, image/heif |
| Video | video/* | video/mp4, video/webm, video/ogg, video/quicktime |
| Audio | audio/* | audio/mpeg, audio/mp3, audio/wav, audio/ogg, audio/aac, audio/flac |
Storage Limits by Plan
| Plan | Storage Limit |
|---|---|
| Free | 512 MB |
| Starter | 10 GB |
| Standard | 20 GB |
| Pro | 50 GB |
Example Request (cURL)
curl -X POST 'https://renderingvideo.com/api/v1/upload' \
-H 'Authorization: Bearer sk-your-api-key' \
-F 'file=@/path/to/image.png' \
-F 'files=@/path/to/video.mp4'Success Response (200)
{
"success": true,
"message": "Successfully uploaded 2 file(s)",
"count": 2,
"assets": [
{
"id": "asset_001",
"name": "image.png",
"url": "https://storage.../images/2026/03/abc123.png",
"type": "image",
"mimeType": "image/png",
"size": 123456,
"createdAt": "2026-03-19T10:00:00Z"
},
{
"id": "asset_002",
"name": "video.mp4",
"url": "https://storage.../videos/2026/03/def456.mp4",
"type": "video",
"mimeType": "video/mp4",
"size": 5242880,
"createdAt": "2026-03-19T10:00:01Z"
}
]
}Error Responses
| Code | Status | Description |
|---|---|---|
NO_FILES | 400 | No files provided |
UNSUPPORTED_FILE_TYPE | 400 | File type not supported |
STORAGE_LIMIT_EXCEEDED | 402 | Storage quota exceeded |
UPLOAD_FAILED | 500 | Upload failed |
Related File Management Endpoints
GET /api/v1/fileslists uploaded files in your libraryDELETE /api/v1/files/:fileIdremoves a file from your library
GET /api/v1/files
List uploaded files for the current API key owner.
Request
GET /api/v1/files?page=1&limit=20&type=image
Authorization: Bearer sk-your-api-keyQuery Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
limit | integer | 20 | Items per page (max 100) |
type | string | - | Filter by file type: image, video, audio |
Success Response (200)
{
"success": true,
"files": [
{
"id": "asset_001",
"name": "image.png",
"url": "https://storage.../images/2026/03/abc123.png",
"type": "image",
"mimeType": "image/png",
"size": 123456,
"createdAt": "2026-03-19T10:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 12
}
}Error Responses
| Code | Status | Description |
|---|---|---|
INVALID_REQUEST | 400 | Invalid type, page, or limit parameter |
INTERNAL_ERROR | 500 | Internal server error |
DELETE /api/v1/files/:fileId
Permanently delete a file from your file library.
This deletes both the stored object and the file record for the current account.
Request
DELETE /api/v1/files/asset_001
Authorization: Bearer sk-your-api-keyPath Parameters
| Parameter | Type | Description |
|---|---|---|
fileId | string | File ID returned from upload or file listing |
Success Response (200)
{
"success": true,
"fileId": "asset_001",
"deleted": true,
"message": "File deleted successfully"
}Error Responses
| Code | Status | Description |
|---|---|---|
INVALID_REQUEST | 400 | Missing file ID |
NOT_FOUND | 404 | File not found |
INTERNAL_ERROR | 500 | Internal server error |
GET /api/v1/credits
Get your current credit balance.
Request
GET /api/v1/credits
Authorization: Bearer sk-your-api-keySuccess Response (200)
{
"success": true,
"credits": 985,
"currency": "credits"
}POST /api/v1/preview
Create a temporary preview link without consuming credits.
Request
POST /api/v1/preview
Authorization: Bearer sk-your-api-key
Content-Type: application/jsonRequest Body
Send the full video schema directly as the request body.
Example Request Body
{
"meta": {
"version": "2.0.0",
"width": 1920,
"height": 1080,
"fps": 30
},
"tracks": [
{
"clips": [
{
"type": "text",
"start": 0,
"duration": 3,
"text": "Temporary Preview"
}
]
}
]
}Success Response (200)
{
"success": true,
"tempId": "temp_abc123",
"previewUrl": "https://video.renderingvideo.com/t/temp_abc123",
"viewerUrl": "https://video.renderingvideo.com/preview/temp_abc123",
"expiresIn": "7d",
"note": "Preview links are temporary and expire in 7 days. Use /api/v1/video to create permanent tasks."
}Notes
- Preview links are valid for 7 days
- Does not consume credits
- Does not produce a downloadable video file
- Use for testing and previewing configurations
Related Preview Endpoints
GET /api/v1/preview/:tempIdreads the temp configDELETE /api/v1/preview/:tempIddeletes the temp linkPOST /api/v1/preview/:tempId/convertclones the temp preview into a permanent taskPOST /api/v1/preview/:tempId/renderclones the temp preview into a permanent task and immediately renders it
GET /api/v1/preview/:tempId
Get the config behind a temporary preview link.
Request
GET /api/v1/preview/temp_abc123
Authorization: Bearer sk-your-api-keySuccess Response (200)
{
"success": true,
"tempId": "temp_abc123",
"config": {
"meta": {
"version": "2.0.0",
"width": 1920,
"height": 1080,
"fps": 30
},
"tracks": []
}
}Error Responses
| Code | Status | Description |
|---|---|---|
NOT_FOUND | 404 | Temp preview not found |
REMOTE_ERROR | Upstream status | Failed to read temp preview |
INTERNAL_ERROR | 500 | Internal server error |
DELETE /api/v1/preview/:tempId
Delete a temporary preview link.
Request
DELETE /api/v1/preview/temp_abc123
Authorization: Bearer sk-your-api-keySuccess Response (200)
{
"success": true,
"tempId": "temp_abc123",
"deleted": true,
"message": "Temp preview deleted successfully"
}Error Responses
| Code | Status | Description |
|---|---|---|
NOT_FOUND | 404 | Temp preview not found |
REMOTE_ERROR | Upstream status | Failed to delete temp preview |
INTERNAL_ERROR | 500 | Internal server error |
POST /api/v1/preview/:tempId/convert
Clone a temporary preview into a permanent video task. The temporary link itself remains usable.
Request
POST /api/v1/preview/temp_abc123/convert
Authorization: Bearer sk-your-api-key
Content-Type: application/jsonRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
category | string | No | Category to use for the new permanent task |
Success Response (200)
{
"success": true,
"tempId": "temp_abc123",
"converted": true,
"taskId": "abc123def456",
"videoTaskId": "vt_001",
"previewUrl": "https://video.renderingvideo.com/v/abc123def456",
"viewerUrl": "https://video.renderingvideo.com/watch/abc123def456",
"configUrl": "abc123def456.json",
"message": "Temp preview cloned to a permanent task successfully"
}Error Responses
| Code | Status | Description |
|---|---|---|
NOT_FOUND | 404 | Temp preview not found |
INVALID_CONFIG | 400 | Temp preview config is invalid |
REMOTE_ERROR | Upstream status | Failed to convert temp preview |
INTERNAL_ERROR | 500 | Internal server error |
POST /api/v1/preview/:tempId/render
Clone a temporary preview into a permanent task and immediately start rendering it.
If you need completion notifications for this render, pass webhook_url.
Request
POST /api/v1/preview/temp_abc123/render
Authorization: Bearer sk-your-api-key
Content-Type: application/jsonRequest Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
category | string | No | api | Category to use for the cloned permanent task |
webhook_url | string | No | - | Completion webhook for the render |
num_workers | integer | No | 5 | Number of render workers |
Success Response (200)
{
"success": true,
"tempId": "temp_abc123",
"converted": true,
"convertMessage": "Temp preview cloned to a permanent task successfully",
"configUrl": "abc123def456.json",
"taskId": "abc123def456",
"renderTaskId": "rt_002",
"status": "rendering",
"quality": "1080p",
"width": 1920,
"height": 1080,
"cost": 15,
"remainingCredits": 970,
"message": "Rendering started",
"previewUrl": "https://video.renderingvideo.com/v/abc123def456",
"viewerUrl": "https://video.renderingvideo.com/watch/abc123def456"
}Error Responses
| Code | Status | Description |
|---|---|---|
NOT_FOUND | 404 | Temp preview not found |
INVALID_CONFIG | 400 | Temp preview config is invalid |
ALREADY_RENDERING | 400 | Target task is already rendering |
INSUFFICIENT_CREDITS | 402 | Not enough credits |
RENDER_TRIGGER_FAILED | Upstream status | Failed to trigger render |
REMOTE_ERROR | Upstream status | Failed to convert temp preview |
INTERNAL_ERROR | 500 | Internal server error |
Credit Calculation
- Cost = Video duration (seconds) × Quality multiplier
| Quality | Short Edge | Multiplier |
|---|---|---|
| 720p | ≥720px | 1.0 |
| 1080p | ≥1080px | 1.5 |
| 2K | ≥1440px | 2.0 |
Quality is automatically determined by the video's shorter dimension.
Error Response Format
All error responses follow this format:
{
"success": false,
"error": "Human-readable error message",
"code": "ERROR_CODE",
"details": {
"field": "additional context"
}
}Common Error Codes
| Code | HTTP Status | Description |
|---|---|---|
MISSING_API_KEY | 401 | No API key provided |
INVALID_API_KEY | 401 | Invalid or revoked API key |
INVALID_API_KEY_FORMAT | 401 | API key format is incorrect |
API_KEY_INACTIVE | 401 | API key is inactive or revoked |
USER_NOT_FOUND | 401 | API key owner was not found |
INVALID_REQUEST | 400 | Request parameters are invalid |
INVALID_CONFIG | 400 | Video configuration is invalid |
INSUFFICIENT_CREDITS | 402 | Not enough credits |
NOT_FOUND | 404 | Resource not found |
ALREADY_RENDERING | 400 | Task is already rendering |
REMOTE_ERROR | Upstream status | Upstream service returned an error |
RENDER_TRIGGER_FAILED | Upstream status | Render start request failed |
INTERNAL_ERROR | 500 | Server error |