API для разработчиков

Платформа Lipsync API

Создавайте видео с синхронизацией губ через мощный REST 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-запросы

Всегда передавайте API-ключ в заголовке Authorization:

Authorization: Bearer sk_XXXX_YYYY

Доступные эндпоинты

RESTful эндпоинты

POST/api/v1/lipsync-video

Видео-видео с заменой аудио (сохранение синхронизации губ)

POST/api/v1/lipsync-image

Изображение + аудио → говорящий аватар (один спикер)

POST/api/v1/lipsync-image-multi

Изображение + два аудио → многоспикерный аватар (беседа/диалог)

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