API développeur

Plateforme API Lipsync

Générez des vidéos lipsync via notre puissante API REST

Clés API

Gérez vos clés d’authentification

Donnez un nom mémorisable (optionnel)

Connexion requise

Veuillez vous connecter pour créer et gérer des clés API.

Des tarifs qui vous conviennent

Démarrez avec des plans flexibles et compétitifs

Tarification API

Paiement à l’usage

Note : Les crédits API et utilisateur sont indépendants et non interchangeables.

Prix
Crédits
Par crédit

Notes :

Facturation minimale : 5 secondes par génération
480p : 2 crédits par seconde
720p : 4 crédits par seconde
lipsync-video : Si la vidéo est plus longue que l’audio, elle est tronquée ; si l’audio est plus long, il est automatiquement prolongé. Facturation selon la durée audio (tronquage) ou vidéo (prolongation).
lipsync-image-multi : Si order = « meanwhile », facturation sur la durée audio maximale ; sinon, sur la somme de « left_audio » + « right_audio ».
Exemple 1 :
Audio de 3 s en 720p = 5 s × 4 = 20 crédits
(facturation minimale appliquée)
Exemple 2 :
Audio de 10 s en 480p = 10 × 2 = 20 crédits

Authentification

Sécurisez vos requêtes API

Incluez votre clé API dans l’en-tête Authorization :

Authorization: Bearer sk_XXXX_YYYY

Endpoints disponibles

Endpoints RESTful

POST/api/v1/lipsync-video

Remplacement audio vidéo-à-vidéo (lipsync conservé)

POST/api/v1/lipsync-image

Image + audio → avatar parlant (un seul locuteur)

POST/api/v1/lipsync-image-multi

Image + double audio → avatar multi-locuteurs (conversation/dialogue)

GET/api/v1/jobs/{requestId}

Interroger l’état d’un job et récupérer le résultat

Paramètres détaillés

Spécifications complètes des endpoints

Tous les endpoints partagent une structure commune : webhook optionnel et paramètres spécifiques au modèle dans formState.

POST /api/v1/lipsync-video

Remplace la piste audio d’une vidéo existante en conservant la synchronisation labiale

Paramètres de haut niveau :
webhookoptionnel

Votre URL de callback (HTTPS). Résultat envoyé en POST à la fin.

formStaterequis

Objet contenant tous les paramètres de génération (voir ci-dessous).

Paramètres de formState :
videorequis

URL publique de la vidéo source (MP4, MOV, etc.)

audiorequis

URL publique de l’audio (MP3, WAV, etc.)

resolutionoptionnel

"480p" ou "720p" (par défaut : 480p)

mask_imageoptionnel

URL publique de l’image masque (limite la zone de lipsync)

promptoptionnel

Texte d’orientation de style

seedoptionnel

Graine entière pour la reproductibilité

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