Genereer lipsync-video’s programmatisch met onze krachtige REST-API
Beheer je authenticatiesleutels
Geef een makkelijk te onthouden naam (optioneel)
Inloggen vereist
Log in om API-sleutels te maken en te beheren.
Start met flexibele en concurrerende tarieven
Opmerking: API-credits en gebruikerscredits zijn onafhankelijk en niet uitwisselbaar.
Beveilig je API-verzoeken
Voeg je API-sleutel toe in de Authorization-header:
Authorization: Bearer sk_XXXX_YYYY
RESTful API-endpoints
/api/v1/lipsync-videoVideo-naar-video met audiowissel (lipsync behouden)
/api/v1/lipsync-imageAfbeelding + audio → avatar met één spreker
/api/v1/lipsync-image-multiAfbeelding + twee audios → avatar met meerdere sprekers (gesprek/dialoog)
/api/v1/jobs/{requestId}Jobstatus opvragen en resultaat ophalen
Volledige endpointspecificaties
Alle endpoints delen een gemeenschappelijke structuur: optionele webhook en modelspecifieke formState-parameters.
Vervangt de audio van een bestaande video met behoud van lipsync
webhookoptioneelJe callback-URL (HTTPS). We sturen het resultaat via POST zodra klaar.
formStatevereistObject met alle generatieparameters (zie hieronder).
videovereistPublieke URL van de bronvideo (MP4, MOV, etc.)
audiovereistPublieke URL van de audio (MP3, WAV, etc.)
resolutionoptioneel"480p" of "720p" (standaard: 480p)
mask_imageoptioneelPublieke URL van het masker (beperkt lipsync-gebied)
promptoptioneelTekst voor stijlaanwijzingen
seedoptioneelGeheel getal seed voor reproduceerbaarheid
Choose how to receive your results
All API calls are asynchronous. You have two options to retrieve results:
Provide a webhook URL in the JSON body. We will POST the result to your endpoint when the job completes.
Omit the webhook parameter and use the returned requestId to poll GET /api/v1/jobs/{requestId} every 5-10 seconds until status is "completed".
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
}// 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
}Ready-to-use integration examples
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();