강력한 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/talking-avatar이미지 + 오디오 + 프롬프트 -> 표정과 움직임을 제어하는 말하는 아바타
/api/v1/lipsync-image-multi이미지 + 2개 오디오 → 다중 화자 아바타(대화/대사)
/api/v1/jobs/{requestId}작업 상태 조회 및 결과 가져오기
입력, 개인정보, 모델 범위 및 프로덕션 참고 사항
공개 API는 현재 JSON의 미디어 URL을 받습니다. 직접 multipart 파일 업로드와 asset-upload 엔드포인트는 아직 제공되지 않습니다. 작업 실행 중 worker와 생성 제공자가 가져올 수 있다면 서명된 URL 또는 임시 URL을 사용할 수 있습니다.
API 작업은 비공개 표시 상태로 저장됩니다. 웹의 Public 토글은 API 요청에 적용되지 않으며, 현재 생성 결과를 공개하는 API 파라미터는 없습니다.
엔드포인트로 워크플로를 선택하세요: lipsync-image, lipsync-video 또는 lipsync-image-multi. 표정 및 모션 제어 이미지 모델은 talking-avatar를 사용하세요.
이 페이지가 현재 API 레퍼런스입니다. 기계가 읽을 수 있는 OpenAPI/Swagger 사양은 아직 공개되지 않았습니다.
현재 lip-sync 엔드포인트에서는 화면비, guidance scale, audio guidance가 API 파라미터로 제공되지 않습니다.
생성마다 API 요청을 하나씩 제출하세요. 대규모 프로덕션 배치에서는 완료 전까지 입력 URL을 유효하게 유지하고, 매우 높은 동시성을 실행하기 전에 지원팀에 문의하세요.
완전한 엔드포인트 사양
모든 엔드포인트는 공통 구조(webhook 옵션, 모델별 formState 파라미터)를 공유합니다.
립싱크를 유지하면서 기존 영상의 오디오를 새 오디오로 교체
webhook선택콜백 URL(HTTPS). 완료 시 결과를 POST합니다.
formState필수모든 생성 파라미터를 담은 객체(아래 참조).
video필수소스 비디오 공개 URL(MP4, MOV 등)
audio필수오디오 공개 URL(MP3, WAV 등)
resolution필수"360p", "480p", "720p", "1080p", "2k" 또는 "4k"
mask_image선택마스크 이미지 공개 URL(립싱크 영역 제한)
prompt선택스타일 가이던스 텍스트
seed선택재현성을 위한 정수 시드
결과를 받는 방법 선택
모든 API 호출은 비동기입니다. 결과를 가져오는 방법은 두 가지입니다:
1080p, 2k, 4k 작업의 경우 webhook 및 polling 응답은 최종 업스케일된 비디오 결과만 반환합니다.
JSON 본문에 webhook URL을 제공하세요. 완료 시 결과를 엔드포인트로 POST합니다.
Webhook URL은 공개 HTTPS URL이어야 합니다. 전송에 실패하면 지수 백오프로 최대 5회 재시도합니다.
webhook을 생략하고 반환된 requestId로 5–10초마다 GET /api/v1/jobs/{requestId}를 폴링하여 "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:
{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"message": "Task submitted successfully. Use requestId to query job status."
}
// 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
}POST /api/v1/talking-avatar
Authorization: Bearer sk_XXXX_YYYY
Content-Type: application/json
{
"webhook": "https://your-app.example.com/webhooks/lipsync",
"formState": {
"image": "https://.../character.png",
"audio": "https://.../speech.mp3",
"prompt": "Warm presentation style, natural facial expression, subtle head motion",
"resolution": "1080p"
}
}
// Completed webhook or polling response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"model": "talking-avatar",
"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:
{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"message": "Task submitted successfully. Use requestId to query job status."
}
// 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-image",
"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": "Generation failed. Please try again later.",
"executionTime": null,
"timings": null
}바로 사용할 수 있는 통합 예시
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.requestId);
console.log('Waiting for webhook callback...');
// You don't need to poll! The result will be POSTed to your webhook.
}
submitJobWithWebhook();