curl -X POST \
-H "Authorization: Bearer reel25_sk_..." \
https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000/analyze
const response = await fetch(
'https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000/analyze',
{
method: 'POST',
headers: { 'Authorization': 'Bearer reel25_sk_...' }
}
);
const { data } = await response.json();
// data.status === 'pending' — start polling GET endpoint
import requests
import time
video_id = '550e8400-e29b-41d4-a716-446655440000'
headers = {'Authorization': 'Bearer reel25_sk_...'}
# Trigger analysis
response = requests.post(
f'https://api.reel25.com/api/v1/video-analysis/{video_id}/analyze',
headers=headers
)
print(response.json()) # {"data": {"status": "pending", ...}}
# Poll for results
while True:
result = requests.get(
f'https://api.reel25.com/api/v1/video-analysis/{video_id}',
headers=headers
).json()
status = result['data']['status'] if result['data'] else None
if status in ('completed', 'failed', None):
break
time.sleep(10)
print(result['data'])
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending"
},
"message": "Video analysis queued"
}
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed"
},
"message": "Analysis already completed"
}
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "analyzing"
},
"message": "Analysis in progress"
}
{
"statusCode": 400,
"message": "Not enough credits. Video analysis costs 5 credits, you have 2."
}
{
"code": "NOT_FOUND",
"message": "Video not found"
}
Video Analysis
Trigger Analysis
Start AI-powered video analysis
POST
/
api
/
v1
/
video-analysis
/
{videoId}
/
analyze
curl -X POST \
-H "Authorization: Bearer reel25_sk_..." \
https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000/analyze
const response = await fetch(
'https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000/analyze',
{
method: 'POST',
headers: { 'Authorization': 'Bearer reel25_sk_...' }
}
);
const { data } = await response.json();
// data.status === 'pending' — start polling GET endpoint
import requests
import time
video_id = '550e8400-e29b-41d4-a716-446655440000'
headers = {'Authorization': 'Bearer reel25_sk_...'}
# Trigger analysis
response = requests.post(
f'https://api.reel25.com/api/v1/video-analysis/{video_id}/analyze',
headers=headers
)
print(response.json()) # {"data": {"status": "pending", ...}}
# Poll for results
while True:
result = requests.get(
f'https://api.reel25.com/api/v1/video-analysis/{video_id}',
headers=headers
).json()
status = result['data']['status'] if result['data'] else None
if status in ('completed', 'failed', None):
break
time.sleep(10)
print(result['data'])
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending"
},
"message": "Video analysis queued"
}
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed"
},
"message": "Analysis already completed"
}
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "analyzing"
},
"message": "Analysis in progress"
}
{
"statusCode": 400,
"message": "Not enough credits. Video analysis costs 5 credits, you have 2."
}
{
"code": "NOT_FOUND",
"message": "Video not found"
}
Triggers an AI analysis for a video. The analysis runs asynchronously in the background and typically takes 15–30 seconds to complete.
Each analysis costs 5 credits. Credits are deducted only after successful completion — failed analyses are not charged.
Path parameters
string
required
The video UUID to analyze.
Query parameters
boolean
default:"false"
Force re-analysis even if a completed analysis already exists. Deletes the previous result and starts fresh.
Polling for results
After triggering, pollGET /video-analysis/{videoId} every 5-10 seconds until status is completed or failed. Average analysis time is 15–30 seconds.
The transcribed status indicates partial results are available — the transcript and segments are ready while visual analysis continues.
pending → downloading → transcribed → analyzing → completed
↘ failed
curl -X POST \
-H "Authorization: Bearer reel25_sk_..." \
https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000/analyze
const response = await fetch(
'https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000/analyze',
{
method: 'POST',
headers: { 'Authorization': 'Bearer reel25_sk_...' }
}
);
const { data } = await response.json();
// data.status === 'pending' — start polling GET endpoint
import requests
import time
video_id = '550e8400-e29b-41d4-a716-446655440000'
headers = {'Authorization': 'Bearer reel25_sk_...'}
# Trigger analysis
response = requests.post(
f'https://api.reel25.com/api/v1/video-analysis/{video_id}/analyze',
headers=headers
)
print(response.json()) # {"data": {"status": "pending", ...}}
# Poll for results
while True:
result = requests.get(
f'https://api.reel25.com/api/v1/video-analysis/{video_id}',
headers=headers
).json()
status = result['data']['status'] if result['data'] else None
if status in ('completed', 'failed', None):
break
time.sleep(10)
print(result['data'])
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending"
},
"message": "Video analysis queued"
}
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed"
},
"message": "Analysis already completed"
}
{
"data": {
"analysisId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"videoId": "550e8400-e29b-41d4-a716-446655440000",
"status": "analyzing"
},
"message": "Analysis in progress"
}
{
"statusCode": 400,
"message": "Not enough credits. Video analysis costs 5 credits, you have 2."
}
{
"code": "NOT_FOUND",
"message": "Video not found"
}
Full example: analyze and wait
Node.js
async function analyzeVideo(videoId, apiKey) {
const base = 'https://api.reel25.com/api/v1';
const headers = { 'Authorization': `Bearer ${apiKey}` };
// 1. Trigger analysis
await fetch(`${base}/video-analysis/${videoId}/analyze`, {
method: 'POST', headers
});
// 2. Poll until done
while (true) {
const res = await fetch(`${base}/video-analysis/${videoId}`, { headers });
const { data } = await res.json();
if (!data || data.status === 'failed') {
console.error('Analysis failed:', data?.error);
return null;
}
if (data.status === 'completed') {
return data;
}
// Show partial results when transcribed
if (data.status === 'transcribed') {
console.log('Transcript ready:', data.transcript?.slice(0, 100));
}
await new Promise(r => setTimeout(r, 10000));
}
}
const analysis = await analyzeVideo('550e8400-...', 'reel25_sk_...');
console.log('Hook:', analysis.hookStyle, '-', analysis.hookPhrase);
console.log('UGC:', analysis.ugcFit, `(${analysis.ugcConfidence}%)`);
console.log('CTA:', analysis.ctaType, analysis.ctaDestinationUrl);
Was this page helpful?