API para desarrolladores

Plataforma de API de Lipsync

Genera videos de sincronización labial mediante nuestra potente API REST

Claves de API

Administra tus claves de autenticación

Ponle un nombre fácil de recordar (opcional)

Inicio de sesión requerido

Inicia sesión para crear y administrar claves de API.

Precios a tu medida

Empieza con planes flexibles y competitivos

Precios de la API

Pago por uso

Nota: Los créditos de API y de usuario son independientes y no intercambiables.

Precio
Créditos
Por crédito

Notas:

Cargo mínimo: 5 segundos por generación
Resolución 480p: 2 créditos por segundo
Resolución 720p: 4 créditos por segundo
lipsync-video: Si el video es más largo que el audio, se recorta; si el audio es más largo, se extiende automáticamente. La facturación usa la duración del audio en recorte y la del video en extensión.
lipsync-image-multi: Si order es "meanwhile", se usa la duración máxima de los audios; de lo contrario, la suma de "left_audio" y "right_audio".
Ejemplo 1:
Audio de 3 s a 720p = 5 s × 4 = 20 créditos
(aplica cargo mínimo)
Ejemplo 2:
Audio de 10 s a 480p = 10 × 2 = 20 créditos

Autenticación

Asegura tus solicitudes a la API

Incluye tu clave de API en el encabezado Authorization:

Authorization: Bearer sk_XXXX_YYYY

Endpoints disponibles

Endpoints RESTful

POST/api/v1/lipsync-video

Video a video con sustitución de audio (labios sincronizados)

POST/api/v1/lipsync-image

Imagen + audio → avatar de un hablante

POST/api/v1/lipsync-image-multi

Imagen + doble audio → avatar multi-hablante (conversación/diálogo)

GET/api/v1/jobs/{requestId}

Consulta el estado del trabajo y recupera el resultado

Parámetros detallados

Especificaciones completas del endpoint

Todos los endpoints comparten una estructura común: parámetro opcional webhook y parámetros específicos en formState.

POST /api/v1/lipsync-video

Sustituye el audio de un video existente manteniendo la sincronía labial

Parámetros de nivel superior:
webhookopcional

Tu URL de callback (HTTPS). Enviamos el resultado por POST al completar.

formStaterequerido

Objeto con todos los parámetros de generación (ver abajo).

Parámetros de formState:
videorequerido

URL pública del video fuente (MP4, MOV, etc.)

audiorequerido

URL pública del audio (MP3, WAV, etc.)

resolutionopcional

"480p" o "720p" (por defecto: 480p)

mask_imageopcional

URL pública de la imagen máscara (limita el área de sincronización labial)

promptopcional

Texto de guía de estilo

seedopcional

Semilla entera para reproducibilidad

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