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
POST /api/v1/clipswith YouTube URL + style prefs- Poll
GET /api/v1/clips/:job_idevery 3s - When
status=complete, download clips fromdownload_url
🎨 Style Parameters
caption_style: yellow-highlight, white-shadow, boxed, neon-glow, gradient-boldtitle_style: bold-center, top-bar, pill, outline, gradient-bgtitle_duration: 5, 10, 30, half, fullclip_duration: short, medium, longnum_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
}'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
/api/v1/clipsSubmit a YouTube URL to generate clips. The job runs in the background — poll the status endpoint to check progress.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
youtube_url | string | Yes | Full YouTube video URL |
Response
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "processing",
"clips_remaining": 4
}Get Job Status
/api/v1/clips/:job_idPoll this endpoint every 2–5 seconds until status is complete or failed.
Status Values
pendingprocessingcompletefailedResponse (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": "..."
}
]
}/api/v1/clipsList all your clip jobsCheck Usage
/api/v1/usageCheck 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"
}/api/v1/keys/regenerateRegenerate your API key (old key stops working)Error Handling
All errors return a JSON object with an error field.
| Code | Meaning |
|---|---|
400 | Bad request — missing or invalid youtube_url |
401 | Unauthorized — missing or invalid API key |
404 | Job not found |
429 | Clip limit reached — upgrade your plan |
502 | Backend 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"