API Reference

Authentication

All API requests require authentication using an API Key. You can obtain an API key from Settings > API Keys.

Authentication Methods

MethodFormatExample
Bearer Token (Recommended)Authorization: Bearer sk-xxxAuthorization: Bearer sk-your-api-key
Token HeaderAuthorization: Token sk-xxxAuthorization: Token sk-your-api-key
X-API-Key HeaderX-API-Key: sk-xxxX-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

MethodEndpointDescription
POST/api/v1/videoCreate a video task
GET/api/v1/videoList video tasks
GET/api/v1/video/:taskIdGet task details
DELETE/api/v1/video/:taskIdDelete a video task
POST/api/v1/video/:taskId/renderTrigger rendering
POST/api/v1/uploadUpload files
GET/api/v1/filesList uploaded files
DELETE/api/v1/files/:fileIdDelete a file
GET/api/v1/creditsGet credit balance
POST/api/v1/previewCreate preview link
GET/api/v1/preview/:tempIdGet preview config
DELETE/api/v1/preview/:tempIdDelete preview link
POST/api/v1/preview/:tempId/convertConvert 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/json

Request Body

FieldTypeRequiredDescription
configobjectYesVideo configuration following JSON Schema
metadataobjectNoCustom 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

FieldTypeDescription
taskIdstringUnique task identifier
videoTaskIdstringInternal video task ID
previewUrlstringPreview page URL
viewerUrlstringViewer page URL
configUrlstringConfig file URL
statusstringTask status (created)
qualitystringVideo quality (720p, 1080p, 2k)
widthnumberVideo width in pixels
heightnumberVideo height in pixels
durationnumberVideo duration in seconds

Error Responses

CodeStatusDescription
INVALID_CONFIG400Invalid video configuration
REMOTE_ERRORUpstream statusRemote service error while creating the task
INTERNAL_ERROR500Internal 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-key

Query Parameters

ParameterTypeDefaultDescription
pageinteger1Page number
limitinteger20Items per page (max 100)
statusstring-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-key

Path Parameters

ParameterTypeDescription
taskIdstringThe 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

StatusDescription
createdTask created, not yet rendering
renderingCurrently rendering
completedRendering finished successfully
failedRendering 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-key

Path Parameters

ParameterTypeDescription
taskIdstringThe 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

FieldTypeDescription
taskIdstringRemote task ID
videoTaskIdstringInternal video task ID
deletedbooleanWhether the local task was permanently deleted
remoteDeletedbooleanWhether the upstream remote task was deleted
messagestringResult message

Error Responses

CodeStatusDescription
NOT_FOUND404Task not found
INTERNAL_ERROR500Internal 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/json

Request Body

FieldTypeRequiredDefaultDescription
webhook_urlstringNo-URL for completion notification
num_workersintegerNo5Number 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

CodeStatusDescription
NOT_FOUND404Task not found
ALREADY_RENDERING400Task is already rendering
INSUFFICIENT_CREDITS402Not enough credits
RENDER_TRIGGER_FAILEDUpstream statusFailed to trigger render
INTERNAL_ERROR500Internal server error

Webhook Notifications

webhook_url is supported on render-start endpoints:

  • POST /api/v1/video/:taskId/render
  • POST /api/v1/preview/:tempId/render

Behavior:

  • The render request stores your webhook_url together with the render task
  • When the upstream renderer reports completed or failed, this project first updates its own database
  • After the local render record is updated, the project forwards a POST request to your webhook_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 completed and failed events are forwarded
  • webhook_url must 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-data

Form Data

FieldTypeRequiredDescription
fileFileNo*Single file to upload
filesFile[]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:

CategoryAccepted MIME PatternCommon Examples
Imageimage/*image/jpeg, image/png, image/webp, image/gif, image/svg+xml, image/avif, image/heic, image/heif
Videovideo/*video/mp4, video/webm, video/ogg, video/quicktime
Audioaudio/*audio/mpeg, audio/mp3, audio/wav, audio/ogg, audio/aac, audio/flac

Storage Limits by Plan

PlanStorage Limit
Free512 MB
Starter10 GB
Standard20 GB
Pro50 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

CodeStatusDescription
NO_FILES400No files provided
UNSUPPORTED_FILE_TYPE400File type not supported
STORAGE_LIMIT_EXCEEDED402Storage quota exceeded
UPLOAD_FAILED500Upload failed
  • GET /api/v1/files lists uploaded files in your library
  • DELETE /api/v1/files/:fileId removes 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-key

Query Parameters

ParameterTypeDefaultDescription
pageinteger1Page number
limitinteger20Items per page (max 100)
typestring-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

CodeStatusDescription
INVALID_REQUEST400Invalid type, page, or limit parameter
INTERNAL_ERROR500Internal 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-key

Path Parameters

ParameterTypeDescription
fileIdstringFile ID returned from upload or file listing

Success Response (200)

{
  "success": true,
  "fileId": "asset_001",
  "deleted": true,
  "message": "File deleted successfully"
}

Error Responses

CodeStatusDescription
INVALID_REQUEST400Missing file ID
NOT_FOUND404File not found
INTERNAL_ERROR500Internal server error

GET /api/v1/credits

Get your current credit balance.

Request

GET /api/v1/credits
Authorization: Bearer sk-your-api-key

Success 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/json

Request 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
  • GET /api/v1/preview/:tempId reads the temp config
  • DELETE /api/v1/preview/:tempId deletes the temp link
  • POST /api/v1/preview/:tempId/convert clones the temp preview into a permanent task
  • POST /api/v1/preview/:tempId/render clones 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-key

Success Response (200)

{
  "success": true,
  "tempId": "temp_abc123",
  "config": {
    "meta": {
      "version": "2.0.0",
      "width": 1920,
      "height": 1080,
      "fps": 30
    },
    "tracks": []
  }
}

Error Responses

CodeStatusDescription
NOT_FOUND404Temp preview not found
REMOTE_ERRORUpstream statusFailed to read temp preview
INTERNAL_ERROR500Internal server error

DELETE /api/v1/preview/:tempId

Delete a temporary preview link.

Request

DELETE /api/v1/preview/temp_abc123
Authorization: Bearer sk-your-api-key

Success Response (200)

{
  "success": true,
  "tempId": "temp_abc123",
  "deleted": true,
  "message": "Temp preview deleted successfully"
}

Error Responses

CodeStatusDescription
NOT_FOUND404Temp preview not found
REMOTE_ERRORUpstream statusFailed to delete temp preview
INTERNAL_ERROR500Internal 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/json

Request Body

FieldTypeRequiredDescription
categorystringNoCategory 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

CodeStatusDescription
NOT_FOUND404Temp preview not found
INVALID_CONFIG400Temp preview config is invalid
REMOTE_ERRORUpstream statusFailed to convert temp preview
INTERNAL_ERROR500Internal 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/json

Request Body

FieldTypeRequiredDefaultDescription
categorystringNoapiCategory to use for the cloned permanent task
webhook_urlstringNo-Completion webhook for the render
num_workersintegerNo5Number 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

CodeStatusDescription
NOT_FOUND404Temp preview not found
INVALID_CONFIG400Temp preview config is invalid
ALREADY_RENDERING400Target task is already rendering
INSUFFICIENT_CREDITS402Not enough credits
RENDER_TRIGGER_FAILEDUpstream statusFailed to trigger render
REMOTE_ERRORUpstream statusFailed to convert temp preview
INTERNAL_ERROR500Internal server error

Credit Calculation

  • Cost = Video duration (seconds) × Quality multiplier
QualityShort EdgeMultiplier
720p≥720px1.0
1080p≥1080px1.5
2K≥1440px2.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

CodeHTTP StatusDescription
MISSING_API_KEY401No API key provided
INVALID_API_KEY401Invalid or revoked API key
INVALID_API_KEY_FORMAT401API key format is incorrect
API_KEY_INACTIVE401API key is inactive or revoked
USER_NOT_FOUND401API key owner was not found
INVALID_REQUEST400Request parameters are invalid
INVALID_CONFIG400Video configuration is invalid
INSUFFICIENT_CREDITS402Not enough credits
NOT_FOUND404Resource not found
ALREADY_RENDERING400Task is already rendering
REMOTE_ERRORUpstream statusUpstream service returned an error
RENDER_TRIGGER_FAILEDUpstream statusRender start request failed
INTERNAL_ERROR500Server error