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/talking-avatarAfbeelding + audio + prompt -> pratende avatar met expressie- en bewegingscontrole
/api/v1/lipsync-image-multiAfbeelding + twee audios → avatar met meerdere sprekers (gesprek/dialoog)
/api/v1/jobs/{requestId}Jobstatus opvragen en resultaat ophalen
Input, privacy, modeldekking en productienotities
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-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.
Selecteer de workflow via endpoint: lipsync-image, lipsync-video of lipsync-image-multi. Gebruik talking-avatar voor het afbeeldingsmodel met expressie- en bewegingscontrole.
Deze pagina is de huidige API-referentie. Een machineleesbare OpenAPI/Swagger-specificatie is momenteel niet gepubliceerd.
Beeldverhouding, guidance scale en audio guidance zijn niet beschikbaar als API-parameters voor de huidige lip-sync endpoints.
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.
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.)
resolutionvereist"360p", "480p", "720p", "1080p", "2k" of "4k"
mask_imageoptioneelPublieke URL van het masker (beperkt lipsync-gebied)
promptoptioneelTekst voor stijlaanwijzingen
seedoptioneelGeheel getal seed voor reproduceerbaarheid
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.
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.
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.
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
}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
}// 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
}Kant-en-klare integratievoorbeelden
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();