Introduction
CHAMELAION API documentation for AI lip sync and end-to-end video translation, covering dubbing, speaker voices, subtitles, and content localization at scale.
CHAMELAION offers two asynchronous APIs for localizing video:
- Lip Sync takes a video and a new audio track and regenerates the speaker’s lip movements to match it. Send a video of someone speaking English with an audio track in Japanese, and CHAMELAION returns a video where the speaker’s lips move naturally to the Japanese audio.
- Video Translate takes a single video and returns it translated into up to 10 languages per request. It transcribes and translates the speech, voices each speaker, keeps the background audio, and lip-syncs the result. Each target language produces a video, an audio track, and an SRT subtitle file.
At a glance
Section titled “At a glance”| Base URL | https://api.chamelaion.com/api |
| Authentication | Bearer token or x-api-key header |
| Lip Sync input | Video and audio (e.g. MP4, WAV, MP3), via URL or direct upload |
| Video Translate input | One video via URL or direct upload (max 2 GiB), with optional SRT files |
| Video Translate languages | 84 source and 91 target languages |
| Max concurrent jobs | Lip Sync: depends on plan. Video Translate: limited per account |
| Rate limits | Per API token: 10 generation requests and 100 read requests per 10 s |
| SDKs | Python 3.9+, TypeScript/Node.js 20+, and Go 1.22+ |
| Active speaker detection | Automatic for Lip Sync (can be disabled per request) |
| Webhooks | Completion webhooks for Video Translate |
Key capabilities
Section titled “Key capabilities”- AI Lip Sync: State-of-the-art lip sync model that preserves the speaker’s identity, speaking style, and expressions while matching lip movements to new audio.
- Video Translate: Translate one video into up to 10 languages per request, with background audio and lip sync enabled by default.
- Custom subtitles and voices: Supply your own source or translated SRT files and assign a voice to each speaker.
- URL-based or direct upload: Pass publicly accessible media URLs, or upload files via multipart form-data.
- Active speaker detection (Lip Sync): Automatically detects and syncs the active speaker in multi-person scenes.
- Request tracking: Every job returns a
request_id. Poll for status, receive a webhook, or look up requests by your ownreference_id. - Pagination and filters: List your request history with
limitandoffset. Filter byreference_id, and for Video Translate also by status, language, or creation time.
What can I use CHAMELAION for?
Section titled “What can I use CHAMELAION for?”CHAMELAION fits anywhere a video needs to speak a new language or a new script:
- Video translation and dubbing: Translate videos into multiple languages with natural voices and lip-synced results in one API call.
- AI avatars: Make avatars speak with realistic, lip-synced articulation.
- UGC and creative ads: Adapt and scale UGC and ad creatives by changing the message inside existing videos, without re-recording.
- Dialogue replacement and personalization: Replace words or full lines in finished videos without re-shooting.
How do I get started?
Section titled “How do I get started?”Get from zero to your first result in three steps:
- Get your API key: Create one from the Dashboard.
- Authenticate: Pass your key as a Bearer token or
x-api-keyheader. See the Authentication guide. - Start a job: Follow the Quickstart to generate a lip sync, or the Video Translate guide to translate a video.
API endpoints overview
Section titled “API endpoints overview”| Endpoint | Method | Description |
|---|---|---|
/v1/lipsync/generate | POST | Start a lip sync job from video and audio URLs |
/v1/lipsync/generate-with-media | POST | Start a lip sync job from uploaded files |
/v1/lipsync/requests/{id} | GET | Get the status and result of a lip sync request |
/v1/lipsync/requests | GET | List your lip sync requests |
/v1/video-translate/generate | POST | Start a video translation from a video URL |
/v1/video-translate/generate-with-media | POST | Start a video translation from an uploaded video |
/v1/video-translate/requests/{id} | GET | Get the status and outputs of a video translation |
/v1/video-translate/requests | GET | List your video translations with filters |
/v1/video-translate/voices | GET | List voices you can assign to speakers |
/v1/users/me | GET | Verify your API token identity |
/health | GET | Service health check (no auth required) |
Frequently asked questions
Section titled “Frequently asked questions”What media formats does CHAMELAION support?
Lip Sync accepts common video and audio formats such as MP4, WAV, and MP3. Video Translate accepts a single video file up to 2 GiB, plus optional SRT subtitles. Provide media through publicly accessible URLs or upload files directly with multipart form-data.
How long does a job take?
Lip sync time depends on video length and queue depth. Most videos under 60 seconds complete within 1–3 minutes. Video translations take longer because the video is transcribed, then translated, voiced, and lip-synced for each target language. Poll the request or use a webhook to know when it finishes.
Which languages does Video Translate support?
Video Translate supports 84 source languages and 91 target languages with the default Expressive speech model. The Classic model supports a smaller legacy target set. See the complete language and model support. The source language is detected automatically when you omit source_language.
Can CHAMELAION handle multi-person videos?
Yes. Lip Sync includes active speaker detection, which identifies and syncs the person who is speaking. For single-speaker videos, set disable_active_speaker_detection: true for faster processing. Video Translate detects speakers automatically; to choose a voice per speaker, supply a source_srt with Speaker N: labels and map them to voices.
How does authentication work?
Send your API token as a Bearer token in the Authorization header or in the x-api-key header. Both methods work for every endpoint. See the Authentication guide for details.
What happens if my job fails?
Invalid input, such as an inaccessible URL or an unsupported format, is rejected immediately with a 400 error. If a job fails during processing, its status becomes failed and error_message explains what went wrong. See the Error Handling guide for troubleshooting.