Quick Start
clipapi is a multi-modal video intelligence API. Send a video URL, get back 60+ dimensions of analysis — transcript, scenes, entities, music, hook scoring, retention predictions, and more.
1. Get an API key
Sign up at /signup to get your free API key. The free plan includes 50 analyses per month.
2. Analyze a video
"color:#A78BFA">curl "color:#F59E0B">-X POST https://api.clipapi.dev/v1/analyses \
"color:#F59E0B">-H "Authorization: Bearer YOUR_API_KEY" \
"color:#F59E0B">-H "Content">-Type: application/json" \
"color:#F59E0B">-d '{"video_url": "https://www.tiktok.com/@creator/video/7234567890"}'3. Poll for results
The response includes an analysis_id. Poll the status endpoint or use SSE streaming for real-time progress.
"color:#A78BFA">curl https://api.clipapi.dev/v1/analyses/job_a1b2c3d4e5f6 \
"color:#F59E0B">-H "Authorization: Bearer YOUR_API_KEY"Authentication
All API requests require an API key passed via the Authorization header or X-API-Key header.
# Option 1: Bearer token
Authorization: Bearer ve_live_abc123...
# Option 2: X"color:#F59E0B">-API-Key header
X"color:#F59E0B">-API-Key: ve_live_abc123...API keys use the format ve_live_<32-char-random>. Keys are hashed with SHA-256 before storage — we never store your key in plaintext.
Managing keys
Create, list, and revoke keys from the dashboard or via the API.
ve_live_*) are for API access. Dashboard login uses JWT tokens issued by the auth endpoints.Analyze a Video
/v1/analysesSubmit a video URL for asynchronous analysis. Supports TikTok, Instagram Reels, YouTube Shorts, and direct video file URLs.
Request body
video_urlstorage_paths3://bucket/keypipeline_preset"full" (default), "meta_only", "audio_only"external_idwebhook_urlResponse
{
"analysis_id": "job_a1b2c3d4e5f6",
"status": "queued",
"stream_url": "/api/v1/analyses/job_a1b2c3d4e5f6/stream"
}Upload a File
/v1/analyses/uploadUpload a video file directly instead of providing a URL. Use multipart/form-data encoding.
"color:#A78BFA">curl "color:#F59E0B">-X POST https://api.clipapi.dev/v1/analyses/upload \
"color:#F59E0B">-H "Authorization: Bearer YOUR_API_KEY" \
"color:#F59E0B">-F "file=@video.mp4" \
"color:#F59E0B">-F "pipeline_preset=full"Parameters
filepipeline_presetexternal_idwebhook_urlGet Results
/v1/analyses/{analysis_id}Poll this endpoint to check analysis status. Returns the full result when complete.
In progress
{
"analysis_id": "job_a1b2c3d4e5f6",
"status": "processing",
"current_step": "visual_analysis"
}Completed
Returns the full AnalysisResult object with all extracted data. See Response Schema.
Real-time Streaming
/v1/analyses/{analysis_id}/streamSSESubscribe to Server-Sent Events for real-time pipeline progress. Each pipeline step emits events as it starts and completes.
event: step_start
data: {"event": "step_start", "step": "ingest", "job_id": "job_a1b2c3d4e5f6"}
event: step_done
data: {"event": "step_done", "step": "ingest", "duration_ms": 2340}
event: step_start
data: {"event": "step_start", "step": "audio_analysis"}
event: step_done
data: {"event": "step_done", "step": "audio_analysis", "duration_ms": 4120}
event: pipeline_done
data: {"event": "pipeline_done", "analysis_id": "job_a1b2c3d4e5f6"}JavaScript example
const es = new EventSource(
"https://api.clipapi.dev/v1/analyses/job_a1b2c3d4e5f6/stream"
);
es.addEventListener("step_done", (e) => {
const data = JSON.parse(e.data);
console.log(`✓ ${data.step} completed in ${data.duration_ms}ms`);
});
es.addEventListener("pipeline_done", (e) => {
console.log("Analysis complete!");
es.close();
// Fetch full results
fetch("/v1/analyses/job_a1b2c3d4e5f6", { headers });
});Response Schema
The full analysis result is a deeply structured JSON object organized into three layers: media understanding (extraction), creator intelligence (analysis), and growth intelligence (prediction).
Top-level fields
analysis_idstatuscompleted | failedsourcemediascoresmedia_understandingcreator_intelligencegrowth_intelligenceprocessingLayer 1: Media Understanding
Raw content extraction from the video — structured signals across vision, audio, and text.
{
"content_overview": {
"title": "How I Grew 100K in 30 Days",
"summary": "Creator shares a step-by-step growth strategy...",
"category": "Educational",
"format": "talking_head_with_broll"
},
"transcript": {
"full_text": "So today I want to show you...",
"segments": [
{"start": 0.0, "end": 3.2, "speaker": "A", "text": "...", "confidence": 0.97}
],
"language": "en",
"word_count": 342
},
"visual_analysis": {
"keyframes": [
{"frame_index": 0, "t": 0.0, "image_url": "https://..."}
],
"cinematography": "handheld, close-up dominant",
"motifs": ["face-to-camera", "text-overlay"]
},
"audio_analysis": {
"speech": {"language": "en", "speech_rate_wpm_est": 162},
"music": {"track_title": "Aesthetic — Tollan Kim", "present": true, "bpm_estimate": 124}
},
"entities": {
"people": ["@creator_handle"],
"brands": ["Nike"],
"topics": ["social media growth", "content strategy"],
"hashtags": ["#growthhack", "#tiktoktips"]
}
}Layer 2: Creator Intelligence
Strategic analysis of the creator's execution — hooks, retention, storytelling.
{
"hook_analysis": {
"score": 82,
"hook_type": "curiosity_gap",
"primary_hook": "Opens with a 'what if' question...",
"suggestions": ["Add pattern interrupt in first 0.5s"]
},
"retention_analysis": {
"retention_score": 74,
"drop_risk_moments": [
{"timestamp": 6.1, "severity": "minor", "reason": "Scene transition"}
],
"pacing": "fast"
},
"story_structure": {
"logline": "Creator reveals an algorithm hack...",
"beats": ["hook", "problem", "solution", "proof", "cta"]
}
}Layer 3: Growth Intelligence
Viral potential, platform fit, trend alignment, and audience predictions.
{
"virality_model": {
"score": 67,
"predicted_view_range": {"low": 5000, "expected": 15000, "high": 80000},
"factors": ["strong hook", "trending topic"],
"completion_pressure": 0.72
},
"platform_fit": {
"platform": "tiktok",
"algorithm_alignment": 0.81,
"share_probability": 0.34,
"loopability": 0.45
},
"trend_alignment": {
"uses_trending_audio": true,
"trend_category": "creator_economy",
"cycle_stage": "growth"
},
"predicted_retention_curve": [
{"t": 0, "retention": 1.0},
{"t": 5, "retention": 0.82},
{"t": 15, "retention": 0.61},
{"t": 30, "retention": 0.48}
]
}Scores & Signals
The scores object contains aggregate metrics on a 0-100 scale.
hook_strengthretention_designvisual_clarityaudio_claritycta_effectivenesseducational_valueoverall_creator_clarityconfidence_overallErrors
The API uses standard HTTP status codes. Error responses include a JSON body with a detail field.
{
"detail": "Invalid or expired API key"
}400Bad RequestInvalid parameters or missing required fields401UnauthorizedMissing or invalid API key / JWT token402Payment RequiredMonthly quota exceeded403ForbiddenAccount disabled or insufficient permissions404Not FoundResource not found409ConflictEmail already registered (signup)429Too Many RequestsRate limit exceeded. Check Retry-After header500Internal ErrorServer error. Contact support if persistent504TimeoutAnalysis timed out (demo: 90s limit)Rate Limits
Rate limits are enforced per API key with a sliding window. Current limits by plan:
| Plan | Analyses/mo | Max duration | RPM |
|---|---|---|---|
| Free | 50 | 120s | 5 |
| Pro | 500 | 300s | 60 |
| Enterprise | Unlimited | Unlimited | 200 |
Rate limit headers
Every response includes rate limit information:
X"color:#F59E0B">-RateLimit-Limit: 5
X"color:#F59E0B">-RateLimit-Remaining: 3
X"color:#F59E0B">-RateLimit-Reset: 1710180000When rate limited, the API returns 429 Too Many Requests with a Retry-After header (seconds).