MakeAIClips API

Generate viral short-form clips from YouTube videos programmatically. Paste a URL, get clips with captions and hooks.

🤖

For AI Agents

MakeAIClips is fully agent-compatible. Your AI agent can generate viral clips from any YouTube video with a single API call. Here's everything you need:

⚡ Quick Flow

  1. POST /api/v1/clips with YouTube URL + style prefs
  2. Poll GET /api/v1/clips/:job_id every 3s
  3. When status=complete, download clips from download_url

🎨 Style Parameters

  • caption_style: yellow-highlight, white-shadow, boxed, neon-glow, gradient-bold
  • title_style: bold-center, top-bar, pill, outline, gradient-bg
  • title_duration: 5, 10, 30, half, full
  • clip_duration: short, medium, long
  • num_clips: 1–10

Complete agent example:

curl -X POST https://makeaiclips.live/api/v1/clips \
  -H "Authorization: Bearer mak_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "youtube_url": "https://youtube.com/watch?v=...",
    "caption_style": "yellow-highlight",
    "title_style": "pill",
    "title_duration": "10",
    "num_clips": 3
  }'
Auth: Bearer tokenFormat: JSONRate: plan-basedOutput: MP4 (1080p 9:16)

Authentication

Every request requires an API key. Get yours from the API Key page in your dashboard.

Add this header to every request:

Authorization: Bearer mak_live_your_api_key_here

⚠️ Keep your key secret. Don't expose it in client-side code. Use it server-side only.

Base URL

https://makeaiclips.live/api/v1

Create Clip Job

POST/api/v1/clips

Submit a YouTube URL to generate clips. The job runs in the background — poll the status endpoint to check progress.

Request Body

FieldTypeRequiredDescription
youtube_urlstringYesFull YouTube video URL

Response

{
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "status": "processing",
  "clips_remaining": 4
}

Get Job Status

GET/api/v1/clips/:job_id

Poll this endpoint every 2–5 seconds until status is complete or failed.

Status Values

pendingprocessingcompletefailed

Response (complete)

{
  "job_id": "a1b2c3d4-...",
  "status": "complete",
  "progress": "Done!",
  "clips": [
    {
      "clip_index": 1,
      "download_url": "/api/v1/clips/a1b2.../download/1",
      "duration_seconds": 45.2,
      "hook_title": "The Secret Nobody Talks About",
      "hook_variations": [
        "The Secret Nobody Talks About",
        "Why Everyone Gets This Wrong",
        "This Changes Everything"
      ],
      "transcript_segment": "..."
    }
  ]
}
GET/api/v1/clipsList all your clip jobs

Check Usage

GET/api/v1/usage

Check how many clips you have left this month.

{
  "plan": "pro",
  "clips_used": 23,
  "clips_limit": 100,
  "clips_remaining": 77,
  "resets_at": "2026-04-01T00:00:00.000Z"
}
POST/api/v1/keys/regenerateRegenerate your API key (old key stops working)

Error Handling

All errors return a JSON object with an error field.

CodeMeaning
400Bad request — missing or invalid youtube_url
401Unauthorized — missing or invalid API key
404Job not found
429Clip limit reached — upgrade your plan
502Backend unavailable — clip engine is down
// 429 example (clip limit reached)
{
  "error": "Clip limit reached",
  "message": "You've used all 5 clips on the free plan this month. Upgrade for more.",
  "clips_used": 5,
  "clips_limit": 5,
  "plan": "free",
  "upgrade_url": "/dashboard/subscription"
}

Rate Limits & Plans

Free

5/mo

$0/month

Pro

100/mo

$29/month

Studio

300/mo

$79/month

Each API call to POST /api/v1/clips uses 1 clip credit and generates up to 3 clips. Credits reset on the 1st of each month.

Python Example

import requests
import time

API_KEY = "mak_live_your_key"
BASE = "https://makeaiclips.live/api/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# 1. Check usage
usage = requests.get(f"{BASE}/usage", headers=HEADERS).json()
print(f"Plan: {usage['plan']} — {usage['clips_remaining']} clips remaining")

# 2. Create clip job
job = requests.post(
    f"{BASE}/clips",
    json={"youtube_url": "https://youtube.com/watch?v=dQw4w9WgXcQ"},
    headers=HEADERS
).json()

print(f"Job started: {job['job_id']}")

# 3. Poll until done
while True:
    result = requests.get(
        f"{BASE}/clips/{job['job_id']}",
        headers=HEADERS
    ).json()

    print(f"Status: {result['status']} — {result.get('progress', '')}")

    if result["status"] == "complete":
        for clip in result["clips"]:
            print(f"  Clip {clip['clip_index']}: {clip['hook_title']}")
            print(f"  Download: {BASE.replace('/api/v1','')}{clip['download_url']}")
        break

    if result["status"] == "failed":
        print(f"Failed: {result.get('error')}")
        break

    time.sleep(3)

Node.js Example

const API_KEY = "mak_live_your_key";
const BASE = "https://makeaiclips.live/api/v1";

const headers = {
  "Authorization": `Bearer ${API_KEY}`,
  "Content-Type": "application/json"
};

// Create job
const { job_id } = await fetch(`${BASE}/clips`, {
  method: "POST",
  headers,
  body: JSON.stringify({ youtube_url: "https://youtube.com/watch?v=..." })
}).then(r => r.json());

// Poll until done
while (true) {
  const result = await fetch(`${BASE}/clips/${job_id}`, { headers })
    .then(r => r.json());

  if (result.status === "complete") {
    result.clips.forEach(clip => {
      console.log(`Clip ${clip.clip_index}: ${clip.hook_title}`);
    });
    break;
  }

  if (result.status === "failed") throw new Error(result.error);
  await new Promise(r => setTimeout(r, 3000));
}

cURL Examples

Create a clip job

curl -X POST https://makeaiclips.live/api/v1/clips \
  -H "Authorization: Bearer mak_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"youtube_url": "https://youtube.com/watch?v=dQw4w9WgXcQ"}'

Check job status

curl https://makeaiclips.live/api/v1/clips/YOUR_JOB_ID \
  -H "Authorization: Bearer mak_live_your_key"

Check usage

curl https://makeaiclips.live/api/v1/usage \
  -H "Authorization: Bearer mak_live_your_key"