Geliştirici API’si

Lipsync API Platformu

Güçlü REST API’mizle dudak senkronlu videoları programlı olarak üretin

API Anahtarları

API kimlik doğrulama anahtarlarınızı yönetin

Kolay hatırlanacak bir ad verin (isteğe bağlı)

Giriş gerekli

API anahtarları oluşturmak ve yönetmek için giriş yapın.

İhtiyacınıza Uygun Fiyatlandırma

Esnek ve rekabetçi planlarla başlayın

API Fiyatlandırması

Kullandıkça öde

Not: API kredileri ve kullanıcı kredileri bağımsızdır, birbirine dönüştürülemez.

Fiyat
Kredi
Kredi başına

Notlar:

Minimum ücret: işlem başına 5 saniye
480p: saniye başına 2 kredi
720p: saniye başına 4 kredi
lipsync-video: Video sesden uzunsa kırpılır; ses uzun ise otomatik uzatılır. Ücretlendirme kırpmada ses süresine, uzatmada video süresine göre yapılır.
lipsync-image-multi: order "meanwhile" ise maksimum ses süresi, aksi halde "left_audio" + "right_audio" toplamı üzerinden ücretlendirilir.
Örnek 1:
3 sn ses, 720p = 5 sn × 4 = 20 kredi
(minimum ücret geçerli)
Örnek 2:
10 sn ses, 480p = 10 × 2 = 20 kredi

Kimlik Doğrulama

API isteklerinizi güvene alın

Tüm isteklerde Authorization başlığında API anahtarınızı gönderin:

Authorization: Bearer sk_XXXX_YYYY

Mevcut Uç Noktalar

RESTful API uç noktaları

POST/api/v1/lipsync-video

Videodaki sesi yenisiyle değiştir (dudak senkronu korunur)

POST/api/v1/lipsync-image

Görüntü + ses → tek konuşmacılı avatar videosu

POST/api/v1/lipsync-image-multi

Görüntü + çift ses → çoklu konuşmacı avatarı (sohbet/diyalog)

GET/api/v1/jobs/{requestId}

İş durumunu sorgula ve sonucu al

Ayrıntılı Parametreler

Tam uç nokta özellikleri

Tüm uç noktalar ortak bir yapıyı paylaşır: isteğe bağlı webhook ve modele özgü formState parametreleri.

POST /api/v1/lipsync-video

Mevcut videodaki sesi, dudak senkronunu koruyarak yenisiyle değiştirir

Üst düzey Parametreler:
webhookisteğe bağlı

Callback URL’niz (HTTPS). Tamamlandığında sonucu buraya POST ederiz.

formStategerekli

Tüm üretim parametrelerini içeren nesne (aşağıya bakın).

formState Parametreleri:
videogerekli

Kaynak videonun genel URL’si (MP4, MOV, vb.)

audiogerekli

Sesin genel URL’si (MP3, WAV, vb.)

resolutionisteğe bağlı

"480p" veya "720p" (varsayılan: 480p)

mask_imageisteğe bağlı

Maske görselinin genel URL’si (lipsync alanını sınırlar)

promptisteğe bağlı

Stil rehberi metni

seedisteğe bağlı

Tekrarlanabilirlik için tam sayı tohum

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