Generate Videos with JSON

Powerful REST API for programmatic video creation. Compose scenes, add text, images, videos, subtitles, transitions, and animations — all from a simple JSON payload.

Start Free → 📖 Documentation
// Create a video with one API call
        curl -X POST /api/v1/movies \
          -H "X-API-Key: your_api_key" \
          -H "Content-Type: application/json" \
          -d '{
            "resolution": "hd",
            "scenes": [{
              "duration": 5,
              "elements": [{
                "type": "text",
                "text": "Hello World!"
              }]
            }]
          }'

Why JSON2Video?

🎬

Multiple Elements

Text, images, videos, audio, subtitles — compose complex scenes with multiple overlapping elements.

✨

Transitions & Animations

Fade, slide, zoom, dissolve, wipe transitions. 8 element animations with 4 easing functions.

📐

Custom Resolutions

1080×1920 (Reels), 1920×1080 (YouTube), or any custom resolution up to 4K.

📝

SRT Subtitles

Full SRT parser with timed subtitles. Each line appears at the correct timestamp.

🔔

Webhooks

Get notified when your video is ready. No polling needed — we'll call your endpoint.

📋

Templates

Save and reuse video templates with variable substitution. Render thousands of variations.

API Documentation

Everything you need to start creating videos programmatically.

🔐 Authentication

All API requests require authentication via the X-API-Key header. You receive an API key when you create an account.

curl -H "X-API-Key: j2v_abc123..." \
             -H "Accept: application/json" \
             http://168.231.108.200:2993/api/v1/movies

📡 Endpoints

POST /api/v1/movies Create a new video

Submit a JSON payload to queue a video rendering job.

REQUEST BODY:
{
          "resolution": "hd",           // sd, hd, full-hd, 2k, 4k, or custom
          "width": 1080,               // only with resolution: custom
          "height": 1920,              // only with resolution: custom
          "quality": "high",            // low, medium, high, ultra
          "fps": 30,                   // 24, 25, 30, 60
          "scenes": [
            {
              "comment": "My scene",
              "duration": 5,
              "background": "#000000",
              "transition": { "type": "fade", "duration": 1 },
              "elements": [ ... ]
            }
          ]
        }
RESPONSE (202):
{
          "job_id": "019cc532-251e-...",
          "status": "queued",
          "message": "Render job created"
        }
GET /api/v1/movies/{id} Get job status
{
          "job_id": "019cc532-...",
          "status": "done",
          "progress": 100,
          "url": "http://168.231.108.200:2993/storage/videos/019cc532.mp4",
          "duration": 5.0,
          "size_mb": 2.4
        }

🧩 Element Types

TEXT type: "text" Text overlay
{
          "type": "text",
          "text": "Hello World!",
          "font-size": 48,
          "color": "#ffffff",
          "background": "#000000",          // optional bg color
          "x": 100, "y": 200,                // position (optional)
          "start": 0, "duration": 5,          // timing (optional)
          "animation": { "type": "fade-in" } // optional
        }
VIDEO type: "video" Embed video clip
{
          "type": "video",
          "src": "https://example.com/clip.mp4",
          "mute": true,                    // mute audio
          "volume": 0.5,                   // volume (0-1)
          "start": 0, "duration": 10,
          "trim-start": 5,                 // trim from second 5
          "trim-end": 15                   // to second 15
        }

Tip: Without explicit width/height, video auto-fits canvas keeping aspect ratio and centers itself.

IMAGE type: "image" Image overlay
{
          "type": "image",
          "src": "https://example.com/logo.png",
          "width": 200, "height": 200,
          "x": 50, "y": 50,
          "start": 0, "duration": 5
        }
SUBTITLES type: "subtitles" SRT subtitles or inline text
// From SRT file (each line appears at its timestamp):
        {
          "type": "subtitles",
          "src": "https://example.com/subs.srt",
          "font-size": 32,
          "color": "#ffcc00"
        }

        // Or inline text:
        {
          "type": "subtitles",
          "text": "My subtitle text",
          "start": 2, "duration": 3
        }

🔀 Transitions

Add to a scene to transition from the previous scene:

"transition": {
          "type": "fade",     // fade, slide-left, slide-right, slide-up, slide-down, zoom-in, zoom-out, dissolve, wipe
          "duration": 1       // seconds
        }

💫 Animations

Add to any element for entrance/exit animations:

"animation": {
          "type": "fade-in",   // fade-in, fade-out, slide-in-left, slide-in-right, slide-in-top, slide-in-bottom, zoom-in, bounce
          "duration": 0.5,     // seconds
          "easing": "ease-out"  // linear, ease-in, ease-out, ease-in-out
        }

Pricing

Enterprise
$100/mo
✓ 45 min render
✓ 1000s max duration
✓ 4k resolution
✓ 15 days storage
Get Started