강력한 REST API로 립싱크 영상을 프로그래밍 방식으로 생성
API 인증 키 관리
기억하기 쉬운 이름을 지정하세요(선택 사항)
로그인이 필요합니다
API 키를 생성·관리하려면 로그인하세요.
유연하고 경쟁력 있는 가격으로 시작하세요
참고: API 크레딧과 사용자 크레딧은 독립적으로 운영되며 상호 교환할 수 없습니다.
API 요청을 안전하게 보호
모든 요청에 Authorization 헤더로 API 키를 포함하세요:
Authorization: Bearer sk_XXXX_YYYY
RESTful API 엔드포인트
/api/v1/lipsync-video기존 영상의 오디오를 교체(립싱크 유지)
/api/v1/lipsync-image이미지 + 오디오 → 단일 화자 아바타
/api/v1/lipsync-image-multi이미지 + 2개 오디오 → 다중 화자 아바타(대화/대사)
/api/v1/jobs/{requestId}작업 상태 조회 및 결과 가져오기
완전한 엔드포인트 사양
모든 엔드포인트는 공통 구조(webhook 옵션, 모델별 formState 파라미터)를 공유합니다.
립싱크를 유지하면서 기존 영상의 오디오를 새 오디오로 교체
webhook선택콜백 URL(HTTPS). 완료 시 결과를 POST합니다.
formState필수모든 생성 파라미터를 담은 객체(아래 참조).
video필수소스 비디오 공개 URL(MP4, MOV 등)
audio필수오디오 공개 URL(MP3, WAV 등)
resolution선택"480p" 또는 "720p"(기본값: 480p)
mask_image선택마스크 이미지 공개 URL(립싱크 영역 제한)
prompt선택스타일 가이던스 텍스트
seed선택재현성을 위한 정수 시드
Choose how to receive your results
All API calls are asynchronous. You have two options to retrieve results:
Provide a webhook URL in the JSON body. We will POST the result to your endpoint when the job completes.
Omit the webhook parameter and use the returned requestId to poll GET /api/v1/jobs/{requestId} every 5-10 seconds until status is "completed".
POST /api/v1/lipsync-image
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"webhook": "https://your-app.example.com/webhooks/lipsync",
"formState": {
"image": "https://.../face.png",
"audio": "https://.../voice.mp3",
"resolution": "720p",
"seed": 42
}
}
// Immediate Response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing"
}
// Later, when job completes, we POST to your webhook:
POST https://your-app.example.com/webhooks/lipsync
Content-Type: application/json
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}// Step 1: Submit job (no webhook parameter)
POST /api/v1/lipsync-image
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"formState": {
"image": "https://.../face.png",
"audio": "https://.../voice.mp3",
"resolution": "720p"
}
}
// Immediate Response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing"
}
// Step 2: Poll for status (repeat every 5-10 seconds)
GET /api/v1/jobs/550e8400-e29b-41d4-a716-446655440000
Authorization: Bearer sk_XXXX_YYYY
// Response while processing:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync",
"status": "processing",
"output": null,
"error": "",
"executionTime": null,
"timings": null
}
// Response when completed:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "completed",
"output": "https://.../result.mp4",
"error": "",
"executionTime": 12345,
"timings": null
}
// Response if failed:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "lipsync-image",
"status": "failed",
"output": null,
"error": "Invalid audio format",
"executionTime": null,
"timings": null
}Ready-to-use integration examples
import fetch from 'node-fetch';
import express from 'express';
const API_KEY = 'Bearer sk_XXXX_YYYY';
const BASE_URL = 'https://lipsync.studio/api/v1';
// Set up webhook server to receive results
const app = express();
app.use(express.json());
app.post('/webhooks/lipsync', (req, res) => {
const { id, status, output, error, model } = req.body;
console.log('✅ Job update received!');
console.log('Job ID:', id);
console.log('Model:', model);
console.log('Status:', status);
if (status === 'completed') {
console.log('Video URL:', output);
} else if (status === 'failed') {
console.error('Error:', error);
}
// TODO: Save output URL to your database, send notification, etc.
res.status(200).json({ received: true });
});
app.listen(3000, () => {
console.log('Webhook server listening on port 3000');
});
// Submit job with webhook
async function submitJobWithWebhook() {
const webhookUrl = 'https://your-public-domain.com/webhooks/lipsync';
const res = await fetch(`${BASE_URL}/lipsync-image`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': API_KEY
},
body: JSON.stringify({
webhook: webhookUrl,
formState: {
image: 'https://example.com/portrait.jpg',
audio: 'https://example.com/speech.mp3',
resolution: '720p'
}
})
});
const data = await res.json();
console.log('Job submitted:', data.id);
console.log('Waiting for webhook callback...');
// You don't need to poll! The result will be POSTed to your webhook.
}
submitJobWithWebhook();