개발자 API

Lipsync API 플랫폼

강력한 REST API로 립싱크 영상을 프로그래밍 방식으로 생성

API 키

API 인증 키 관리

기억하기 쉬운 이름을 지정하세요(선택 사항)

로그인이 필요합니다

API 키를 생성·관리하려면 로그인하세요.

당신을 위한 요금제

유연하고 경쟁력 있는 가격으로 시작하세요

API 요금

종량제

참고: API 크레딧과 사용자 크레딧은 독립적으로 운영되며 상호 교환할 수 없습니다.

가격
크레딧
크레딧당

참고:

최소 부과: 생성당 5초
480p: 초당 2 크레딧
720p: 초당 4 크레딧
lipsync-video: 영상이 오디오보다 길면 자르고, 오디오가 더 길면 자동 연장합니다. 과금은 자를 때 오디오 길이, 연장 시 영상 길이를 기준으로 합니다.
lipsync-image-multi: order가 "meanwhile"이면 두 오디오 중 최대 길이, 아니면 "left_audio"와 "right_audio"의 합으로 과금합니다.
예시 1:
3초 오디오, 720p = 5초 × 4 = 20 크레딧
(최소 부과 적용)
예시 2:
10초 오디오, 480p = 10 × 2 = 20 크레딧

인증

API 요청을 안전하게 보호

모든 요청에 Authorization 헤더로 API 키를 포함하세요:

Authorization: Bearer sk_XXXX_YYYY

사용 가능한 엔드포인트

RESTful API 엔드포인트

POST/api/v1/lipsync-video

기존 영상의 오디오를 교체(립싱크 유지)

POST/api/v1/lipsync-image

이미지 + 오디오 → 단일 화자 아바타

POST/api/v1/lipsync-image-multi

이미지 + 2개 오디오 → 다중 화자 아바타(대화/대사)

GET/api/v1/jobs/{requestId}

작업 상태 조회 및 결과 가져오기

상세 파라미터

완전한 엔드포인트 사양

모든 엔드포인트는 공통 구조(webhook 옵션, 모델별 formState 파라미터)를 공유합니다.

POST /api/v1/lipsync-video

립싱크를 유지하면서 기존 영상의 오디오를 새 오디오로 교체

최상위 파라미터:
webhook선택

콜백 URL(HTTPS). 완료 시 결과를 POST합니다.

formState필수

모든 생성 파라미터를 담은 객체(아래 참조).

formState 파라미터:
video필수

소스 비디오 공개 URL(MP4, MOV 등)

audio필수

오디오 공개 URL(MP3, WAV 등)

resolution선택

"480p" 또는 "720p"(기본값: 480p)

mask_image선택

마스크 이미지 공개 URL(립싱크 영역 제한)

prompt선택

스타일 가이던스 텍스트

seed선택

재현성을 위한 정수 시드

Async Workflow

Choose how to receive your results

All API calls are asynchronous. You have two options to retrieve results:

Option 1: Webhook (Recommended)

Provide a webhook URL in the JSON body. We will POST the result to your endpoint when the job completes.

Benefits:
  • No need to poll repeatedly
  • Instant notification when job completes
  • More efficient for long-running jobs (30-120 seconds typical)

Option 2: Polling

Omit the webhook parameter and use the returned requestId to poll GET /api/v1/jobs/{requestId} every 5-10 seconds until status is "completed".

Use when:
  • You cannot expose a public webhook endpoint
  • Testing or debugging

Example with Webhook:

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
}

Example without Webhook (Polling):

// 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
}

Complete Code Examples

Ready-to-use integration examples

Node.js with Webhook (Recommended)

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();