Ontwikkelaars-API

Lipsync API-platform

Genereer lipsync-video’s programmatisch met onze krachtige REST-API

API-sleutels

Beheer je authenticatiesleutels

Geef een makkelijk te onthouden naam (optioneel)

Inloggen vereist

Log in om API-sleutels te maken en te beheren.

Prijzen die bij je passen

Start met flexibele en concurrerende tarieven

API-prijzen

Betalen naar gebruik

Opmerking: API-credits en gebruikerscredits zijn onafhankelijk en niet uitwisselbaar.

Prijs
Credits

Opmerkingen:

Minimale kosten: 5 seconden per generatie
480p: 2 credits per seconde
720p: 4 credits per seconde
lipsync-image/video/multi 1080p: 6 credits per seconde, minimaal 30 credits
lipsync-image/video/multi 2k: 7 credits per seconde, minimaal 35 credits
lipsync-image/video/multi 4k: 8 credits per seconde, minimaal 40 credits
talking-avatar: 720p/1080p/2k/4k kost 4/6/8/9 credits per naar boven afgeronde audioseconde
lipsync-video: Is de video langer dan de audio, dan wordt bijgesneden; is de audio langer, dan wordt automatisch verlengd. Facturatie: bijsnijden op audiolengte, verlengen op videolengte.
lipsync-image-multi: Als order "meanwhile" is, grootste audiolengte; anders som van "left_audio" + "right_audio".
Voorbeeld 1:
3 s audio op 720p = 5 s × 4 = 20 credits
(minimale kosten van toepassing)
Voorbeeld 2:
10 s audio op 480p = 10 × 2 = 20 credits

Authenticatie

Beveilig je API-verzoeken

Voeg je API-sleutel toe in de Authorization-header:

Authorization: Bearer sk_XXXX_YYYY

Beschikbare endpoints

RESTful API-endpoints

POST/api/v1/lipsync-video

Video-naar-video met audiowissel (lipsync behouden)

POST/api/v1/lipsync-image

Afbeelding + audio → avatar met één spreker

POST/api/v1/talking-avatar

Afbeelding + audio + prompt -> pratende avatar met expressie- en bewegingscontrole

POST/api/v1/lipsync-image-multi

Afbeelding + twee audios → avatar met meerdere sprekers (gesprek/dialoog)

GET/api/v1/jobs/{requestId}

Jobstatus opvragen en resultaat ophalen

Huidige API-scope

Input, privacy, modeldekking en productienotities

Inputs zijn URL-gebaseerd

De publieke API accepteert momenteel media-URL’s in JSON. Directe multipart bestandsupload en asset-upload endpoints zijn nog niet beschikbaar. Ondertekende of tijdelijke URL’s worden ondersteund zolang onze workers en de generatieprovider ze tijdens de job kunnen ophalen.

API-uitvoer is privé

API-jobs worden met private zichtbaarheid opgeslagen. De web Public-schakelaar geldt niet voor API-verzoeken en er is momenteel geen API-parameter om een generatie te publiceren.

Modelselectie

Selecteer de workflow via endpoint: lipsync-image, lipsync-video of lipsync-image-multi. Gebruik talking-avatar voor het afbeeldingsmodel met expressie- en bewegingscontrole.

Nog geen OpenAPI-bestand

Deze pagina is de huidige API-referentie. Een machineleesbare OpenAPI/Swagger-specificatie is momenteel niet gepubliceerd.

Niet-ondersteunde controles

Beeldverhouding, guidance scale en audio guidance zijn niet beschikbaar als API-parameters voor de huidige lip-sync endpoints.

Batchjobs

Dien één API-verzoek per generatie in. Houd voor grote productiebatches input-URL’s geldig tot voltooiing en neem contact op met support voordat je zeer hoge concurrency gebruikt.

Gedetailleerde parameters

Volledige endpointspecificaties

Alle endpoints delen een gemeenschappelijke structuur: optionele webhook en modelspecifieke formState-parameters.

POST /api/v1/lipsync-video

Vervangt de audio van een bestaande video met behoud van lipsync

Top-level parameters:
webhookoptioneel

Je callback-URL (HTTPS). We sturen het resultaat via POST zodra klaar.

formStatevereist

Object met alle generatieparameters (zie hieronder).

formState-parameters:
videovereist

Publieke URL van de bronvideo (MP4, MOV, etc.)

audiovereist

Publieke URL van de audio (MP3, WAV, etc.)

resolutionvereist

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

mask_imageoptioneel

Publieke URL van het masker (beperkt lipsync-gebied)

promptoptioneel

Tekst voor stijlaanwijzingen

seedoptioneel

Geheel getal seed voor reproduceerbaarheid

Asynchrone workflow

Kies hoe je de resultaten ontvangt

Alle API-aanroepen zijn asynchroon. Je hebt twee opties om resultaten op te halen:

Voor 1080p-, 2k- en 4k-jobs retourneren webhook- en pollingresponses alleen het uiteindelijke geüpscalede videoresultaat.

Optie 1: Webhook (Aanbevolen)

Geef een webhook-URL op in de JSON-body. We POSTen het resultaat bij voltooiing.

Webhook-URL’s moeten publieke HTTPS-URL’s zijn. Als levering mislukt, proberen we tot 5 keer opnieuw met exponentiële backoff.

Voordelen:
  • Geen herhaaldelijk pollingen nodig
  • Directe melding bij voltooiing
  • Efficiënter voor langlopende jobs (meestal 30–120 s)

Optie 2: Polling

Laat webhook weg en gebruik de geretourneerde requestId om elke 5–10 s GET /api/v1/jobs/{requestId} te pollingen tot de status "completed" is.

Gebruik wanneer:
  • Je geen publieke webhook-endpoint kunt aanbieden
  • Testen of debuggen

Voorbeeld met 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
}

Talking Avatar requestvoorbeeld:

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
}

Voorbeeld zonder 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
}

Complete codevoorbeelden

Kant-en-klare integratievoorbeelden

01Node.js met Webhook (Aanbevolen)

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