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

Notes :

Facturation minimale : 5 secondes par génération
480p : 2 crédits par seconde
720p : 4 crédits par seconde
lipsync-image/video/multi 1080p : 6 crédits par seconde, minimum 30 crédits
lipsync-image/video/multi 2k : 7 crédits par seconde, minimum 35 crédits
lipsync-image/video/multi 4k : 8 crédits par seconde, minimum 40 crédits
talking-avatar : 720p/1080p/2k/4k coûte 4/6/8/9 crédits par seconde audio arrondie à la hausse
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/talking-avatar

Image + audio + prompt -> avatar parlant avec expression et mouvement contrôlés

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

Périmètre actuel de l’API

Entrées, confidentialité, couverture des modèles et notes de production

Les entrées sont basées sur des URL

L’API publique accepte actuellement des URL de médias dans le JSON. Le téléversement direct multipart et les endpoints de téléversement d’assets ne sont pas encore disponibles. Les URL signées ou temporaires sont prises en charge tant que nos workers et le fournisseur de génération peuvent les récupérer pendant l’exécution du job.

Les sorties API sont privées

Les jobs API sont stockés en visibilité privée. Le bouton Public du web ne s’applique pas aux requêtes API et aucun paramètre API ne permet actuellement de publier une génération.

Sélection du modèle

Sélectionnez le flux par endpoint : lipsync-image, lipsync-video ou lipsync-image-multi. Utilisez talking-avatar pour le modèle image avec contrôle de l’expression et du mouvement.

Pas encore de fichier OpenAPI

Cette page est la référence API actuelle. Aucune spécification OpenAPI/Swagger lisible par machine n’est actuellement publiée.

Contrôles non pris en charge

Le ratio d’aspect, guidance scale et audio guidance ne sont pas exposés comme paramètres API pour les endpoints lip-sync actuels.

Jobs par lot

Envoyez une requête API par génération. Pour les grands lots de production, gardez les URL d’entrée valides jusqu’à la fin et contactez le support avant une très forte concurrence.

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.)

resolutionrequis

"360p", "480p", "720p", "1080p", "2k" ou "4k"

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é

Flux asynchrone

Choisissez comment recevoir vos résultats

Tous les appels API sont asynchrones. Vous avez deux options pour récupérer les résultats :

Pour les jobs 1080p, 2k et 4k, les réponses webhook et polling renvoient uniquement le résultat vidéo final upscalé.

Option 1 : Webhook (Recommandé)

Fournissez une URL de webhook dans le JSON. Nous enverrons le résultat en POST une fois terminé.

Les URL de webhook doivent être des URL HTTPS publiques. En cas d’échec, nous réessayons jusqu’à 5 fois avec backoff exponentiel.

Avantages :
  • Pas besoin de sonder en boucle
  • Notification instantanée à la fin
  • Plus efficace pour les tâches longues (30–120 s typiques)

Option 2 : Sondage (Polling)

Omettez le webhook et utilisez le requestId renvoyé pour sonder GET /api/v1/jobs/{requestId} toutes les 5–10 s jusqu’à l’état "completed".

À utiliser quand :
  • Vous ne pouvez pas exposer un endpoint de webhook public
  • Tests ou débogage

Exemple avec 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:
{
  "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
}

Exemple de requête Talking Avatar :

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
}

Exemple sans 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:
{
  "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
}

Exemples de code complets

Exemples d’intégration prêts à l’emploi

01Node.js avec Webhook (Recommandé)

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