MakeAIClips API

Generate viral short-form clips from video files, YouTube URLs, or Twitch clips programmatically.

📋

Copy for your Agent

Copy this complete reference and paste it into your AI agent's context. Contains everything needed to use the MakeAIClips API.

# MakeAIClips API — Agent Reference ## ⚠️ IMPORTANT: How to Handle YouTube Videos DO NOT pass YouTube URLs directly to the API. Our server may get blocked by YouTube. Instead, follow this workflow: 1. Download the video YOURSELF using yt-dlp on YOUR machine: yt-dlp -f "bv[height<=1080]+ba/b" --merge-output-format mp4 -o "video.mp4" "YOUTUBE_URL" 2. Upload the downloaded file to our API (see below) 3. This works reliably because YOU download from YouTube with your own IP For Twitch clips, you can either: - Pass the URL directly to the API (works reliably), OR - Download with yt-dlp first and upload the file ## Quick Start Base URL: https://makeaiclips.live/api/v1 Auth: Authorization: Bearer mak_live_YOUR_KEY Get your API key at: https://makeaiclips.live/dashboard/api-key ## Endpoints ### Create Clips (File Upload — THE WAY TO DO IT) POST /api/v1/clips/upload Content-Type: multipart/form-data - video (file, required): MP4, MOV, or WebM video file - caption_style (string): karaoke-yellow | white-shadow | boxed | gradient-bold | subtitle-documentary | typewriter | cinematic | none - title_style (string): bold-center | top-bar | pill | gradient-bg | none - title_duration (string): 5 | 10 | 30 | half | full - clip_duration (string): short (15-30s) | medium (30-90s) | long (60-120s) - num_clips (number): 1-10 (default 3) - quality (string): high | medium | low ### Create Clips (URL — Twitch only, YouTube unreliable) POST /api/v1/clips Content-Type: application/json Body: { "youtube_url": "https://...", "caption_style": "karaoke-yellow", "num_clips": 3, ... } Supports: Twitch clip URLs (reliable), YouTube URLs (may fail — use file upload instead) ### Check Job Status GET /api/v1/clips/{job_id} Poll every 3-5 seconds. Status values: pending → processing → complete | failed When complete, clips array contains download URLs. ### Download Clip GET /api/v1/clips/{job_id}/download/{clip_index} Returns MP4 file (1080x1920, 9:16 vertical). ### Check Usage GET /api/v1/usage Returns: { plan, clips_used, clips_limit, clips_remaining, resets_at } ### Regenerate API Key POST /api/v1/keys/regenerate Old key immediately stops working. ## Plans - Free: 10 clips/month ($0) - Pro: 100 clips/month ($20) - Studio: 300 clips/month ($50) ## The Correct Workflow for YouTube Videos 1. pip install yt-dlp (if not installed) 2. yt-dlp -f "bv[height<=1080]+ba/b" --merge-output-format mp4 -o "video.mp4" "YOUTUBE_URL" 3. Upload video.mp4 to POST /api/v1/clips/upload 4. Poll GET /api/v1/clips/{job_id} until status=complete 5. Download clips from the download_url in each clip object 6. Clean up the local video file DO NOT try to pass YouTube URLs to the /api/v1/clips endpoint. DO NOT try to fix cookies or proxies. Just download locally and upload. ## Error Codes 400: Bad request (missing video/URL) 401: Invalid or missing API key 429: Clip limit reached (upgrade plan) 502: Backend unavailable (try again in 1 min) 503: Service temporarily overloaded ## Full Example (Python) — YouTube → Clips import subprocess, requests, time, os API_KEY = "mak_live_YOUR_KEY" BASE = "https://makeaiclips.live/api/v1" H = {"Authorization": f"Bearer {API_KEY}"} YOUTUBE_URL = "https://youtube.com/watch?v=VIDEO_ID" # Step 1: Download with yt-dlp (YOUR machine, YOUR IP — no blocks) subprocess.run(["yt-dlp", "-f", "bv[height<=1080]+ba/b", "--merge-output-format", "mp4", "-o", "video.mp4", YOUTUBE_URL], check=True) # Step 2: Upload to MakeAIClips with open("video.mp4", "rb") as f: job = requests.post(f"{BASE}/clips/upload", files={"video": f}, data={"num_clips": "3", "caption_style": "karaoke-yellow", "quality": "high"}, headers=H).json() print(f"Job started: {job['job_id']}") # Step 3: Poll until done while True: r = requests.get(f"{BASE}/clips/{job['job_id']}", headers=H).json() if r["status"] == "complete": for c in r["clips"]: print(f"Clip {c['clip_index']}: {c['hook_title']}") print(f"Download: https://makeaiclips.live{c['download_url']}") break if r["status"] == "failed": print(f"Error: {r.get('error')}") break time.sleep(3) # Step 4: Clean up os.remove("video.mp4") ## Chrome Extension For browser-based YouTube clipping, install the MakeAIClips Chrome extension: https://makeaiclips.live/extension The extension enables direct YouTube link processing from the dashboard.
🤖

For AI Agents

MakeAIClips is agent-compatible. File upload is the primary method. URL jobs support YouTube and Twitch clip links when upload is not available.

⚡ Quick Flow

  1. POST /api/v1/clips/upload with multipart form-data and a video file
  2. Fallback: use POST /api/v1/clips with a YouTube or Twitch clip URL
  3. Poll GET /api/v1/clips/:job_id every 3s until complete

🎨 Style Parameters

  • caption_style: karaoke-yellow, white-shadow, boxed, gradient-bold, subtitle-documentary, typewriter, cinematic, none
  • title_style: bold-center, top-bar, pill, gradient-bg, none
  • title_duration: 5, 10, 30, half, full
  • clip_duration: short, medium, long
  • num_clips: 1-10
  • quality: high, medium, low

Recommended: upload a video file directly

curl -X POST https://makeaiclips.live/api/v1/clips/upload \
  -H "Authorization: Bearer mak_live_YOUR_KEY" \
  -F "video=@my_video.mp4" \
  -F "caption_style=karaoke-yellow" \
  -F "title_style=pill" \
  -F "title_duration=10" \
  -F "clip_duration=medium" \
  -F "num_clips=3" \
  -F "quality=high"

💡 File upload is the recommended method. YouTube downloads may be intermittently blocked. If you hit extraction issues, upload the video directly or use the Chrome extension from the dashboard.

Auth: Bearer tokenInput: multipart or JSONRate: plan-basedOutput: MP4 (1080x1920)

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

Base URL

https://makeaiclips.live/api/v1

Create Clip Job

POST/api/v1/clips

Create a job from a supported URL. This endpoint accepts YouTube URLs and Twitch clip URLs. For highest reliability, prefer the file upload endpoint below.

URL support: send a YouTube video URL or a Twitch clip URL in the youtube_url field. You can also include source_title if you want a custom display name on the job.

JSON Body

FieldTypeRequiredDescription
youtube_urlstringYesYouTube URL or Twitch clip URL.
source_titlestringNoOptional source title to store with the job.
caption_stylestringNokaraoke-yellow (default), white-shadow, boxed, gradient-bold, subtitle-documentary, typewriter, cinematic, none
title_stylestringNobold-center (default), top-bar, pill, gradient-bg, none
title_durationstringNo5 (default), 10, 30, half, full
clip_durationstringNoshort (15-30s), medium (30-90s), long (60-120s)
num_clipsnumberNo1-10, default 3
qualitystringNohigh, medium, low

Response

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

File Upload (Recommended)

POST/api/v1/clips/upload

Submit a local video file as multipart form-data. This is the recommended endpoint because it avoids the extraction failures that can happen with third-party platforms.

Multipart form-data fields:

  • video (file, required)
  • caption_style, title_style, title_duration, clip_duration, num_clips, quality
curl -X POST https://makeaiclips.live/api/v1/clips/upload \
  -H "Authorization: Bearer mak_live_your_key" \
  -F "video=@my_video.mp4" \
  -F "caption_style=karaoke-yellow" \
  -F "num_clips=3"

Get Job Status

GET/api/v1/clips/:job_id

Poll this endpoint every 3 to 5 seconds until status is complete or failed.

{
  "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"
    }
  ]
}
GET/api/v1/clipsList recent jobs

Check Usage

GET/api/v1/usage
{
  "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

Error Handling

CodeMeaning
400Bad request — missing video or unsupported URL
401Unauthorized — missing or invalid API key
404Job not found
429Clip limit reached — upgrade your plan
502Backend unavailable — try again in 1 minute
503Service temporarily overloaded

Rate Limits & Plans

Free

10/mo

$0/month

Pro

100/mo

$20/month

Studio

300/mo

$50/month

Credits consumed equal num_clips on both POST /api/v1/clips and POST /api/v1/clips/upload. Credits reset monthly.

Python Example

import requests
import time

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

with open("my_video.mp4", "rb") as f:
    job = requests.post(
        f"{BASE}/clips/upload",
        files={"video": f},
        data={"caption_style": "karaoke-yellow", "num_clips": "3"},
        headers=HEADERS
    ).json()

while True:
    result = requests.get(f"{BASE}/clips/{job['job_id']}", headers=HEADERS).json()
    if result["status"] == "complete":
        break
    if result["status"] == "failed":
        raise RuntimeError(result.get("error"))
    time.sleep(3)

Node.js Example

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

const formData = new FormData();
formData.append("video", fs.createReadStream("my_video.mp4"));
formData.append("caption_style", "karaoke-yellow");
formData.append("num_clips", "3");

const { job_id } = await fetch(`${BASE}/clips/upload`, {
  method: "POST",
  headers: { Authorization: `Bearer ${API_KEY}` },
  body: formData
}).then((r) => r.json());

cURL Examples

Create a clip job (file upload)

curl -X POST https://makeaiclips.live/api/v1/clips/upload \
  -H "Authorization: Bearer mak_live_your_key" \
  -F "video=@my_video.mp4" \
  -F "caption_style=karaoke-yellow" \
  -F "num_clips=3"

Create a clip job (YouTube or Twitch URL)

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://clips.twitch.tv/FamousClipSlug", "source_title": "My stream highlight"}'

Check job status

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

Chrome Extension

The MakeAIClips Chrome extension enables direct YouTube link support inside the dashboard. It handles downloads through the user's browser session and IP, which helps bypass the server-side restrictions that can affect YouTube extraction.

Install it from /extension. Use it when you want dashboard-based YouTube clipping without downloading the source file manually.