Docs

Studio and API documentation

How to generate lip sync in the browser, how credits and plans are billed, and how to call every tool over /api/v1.

What this studio does

LipSyncing AI is a browser studio that matches a mouth to speech or song. You give it a photo or video, then a script, an audio file, or a recording. It writes visemes onto the face and returns an MP4.

The homepage is the generator. The left menu is a map of specialist jobs — talking photo, talking dog, anime, dubbing, avatars — each with its own page, defaults, and FAQs. English lives at the root; other languages sit under /zh-CN, /ja, and the rest of the locale prefixes.

The same jobs are available over HTTP. The public API lives at /api/v1. It uses the same tools, the same credit meter, and the same Zoice Avatar X engine as the studio. This page is the contract for both.

Quick start

Three steps in the browser. That is the whole studio job.

  1. 1

    Upload a video or photo

    A clear, front-facing face works best. You can also pick a sample portrait, pet, cartoon, or singer in the studio if you only want to try the flow.

  2. 2

    Add audio or a script

    Type the line and pick a voice, drop a file, or record in the browser. There is no timeline to edit. For dubbing, choose a source language and a target language instead.

  3. 3

    Generate lip sync

    Press Make a video. Local preview on this computer does not spend credits. Finished renders spend credits on Starter, Pro, Ultra, or a one-time pack once a model has an API key.

Studio controls

The studio sits on the homepage and on every specialist page. Settings stay in one row so you do not hunt through menus. API callers send the same fields as JSON or multipart.

  • Model — Talking tools use Zoice Avatar X via POST /v1/avatar-videos on api.zoice.com (zoice/avatar-x; poll GET /v1/fetch/{request_id}). Avatar identity stills (AI Avatar Generator, Character Library, Avatar Design) use Wavespeed Nano Banana 2 or GPT Image 2. Avatar Video Generator drives those stills into talking video. AI Image tools also use Z Image. Avatar Dialogue uses Seedance 2.0 (4–15s, 480p–4K) or Seedance 2.5 (4–30s, 480p–4K) as image-to-video from a two-shot. AI Video tools use Seedance 2.0, Seedance 2.5, Veo 3.1 (4/6/8s, 720p–4K, 16:9 or 9:16), and Wan 2.5 (text 5s or 10s; image 3–10s; up to 1080p). The studio seconds, resolution, and aspect chips follow the selected model. Motion Control and Character Swap use Wan 2.2 Animate and Kling Motion. AI Voice uses ElevenLabs Instant Clone, Cartesia, and Chatterbox on RunPod — clone, design from a prompt, or pick from your clones and public voice AI. Staff enable models and paste keys on Admin → Models. Public character stills are edited on Admin → Character Library. Public voices are edited on Admin → Voice Library.
  • Resolution — 480p, 720p, 1080p, 2K, or 4K. Higher output uses the same credit math; the plan gates 1080p and 4K.
  • Aspect ratio — 16:9 for landscape, 9:16 for talking photos and shorts, plus 1:1, 4:5, 3:4, and the other Avatar Videos ratios (2:3, 3:2, 4:3, 5:4, 21:9). Specialist pages pick a sensible default.
  • Duration — 1 to 180 seconds. The first 30 seconds are one 150-credit block. Every extra second is 5 credits.

Source media

Drop a photo or a video. The studio accepts common image and video types in the browser. A still portrait becomes a talking clip. A video keeps the original motion and rewrites the mouth.

If you do not upload a file, sample faces stay in the well so you can still run a preview. Your own uploads also appear later under Assets. The API accepts a public image_url / audio_url or a multipart file (15 MB max).

  • Use even light and a visible mouth. Hair, hands, or a microphone in front of the lips make visemes harder.
  • One main face in frame is more reliable than a crowd, except Avatar Dialogue, which needs two people in a single 16:9 frame.
  • Pets, cartoons, and anime work from a still. Live-action video is better when the head is stable.

Script, file, or recording

Singing tools prefer audio. Motion control and character swap take a character still plus a driving video — no script. Dubbing and translate tools use a language pair instead of a free-text script.

  • Script — type the line. Duration estimates from word count (~150 words per minute) and is capped at 180 seconds.
  • Voices — Nova, Rowan, Mira, Kai, Sol, and Lumen. Dialogue tools pick a voice per person. API field: voice.
  • Audio file — drop speech or a song. The clip length drives credits.
  • Record — use the mic in this browser. Grant permission once; the studio does not keep the stream after you stop.

Tool groups

The left rail lists search intents. Click a group and the tool list stays beside it until you hide it with the chevron. Character Library and Voice Library sit just above API. API (keys, usage, generations, credit log) sits just above Creation (History and Assets). The HTTP catalog is the same map: GET /api/v1/tools returns 68 tools (homepage generator plus every keyword page).

  • AI Lip Sync — homepage generator, video lip sync, photo lip sync, animate face.
  • AI Avatar — reusable digital people, Character Library, Avatar Video Generator, Avatar Design, talking avatars, dialogue, influencers.
  • Talking Photos — still portraits that speak, including talking baby, baby podcast, and news anchor.
  • Singing Videos — faces synced to music rather than spoken audio, including singing photo, singing cartoon, singing anime, singing animals, and baby singing.
  • Animals & Pets — talking dog, cat, and other pets.
  • Cartoons & Art — cartoons, drawings, anime speech, and singing anime.
  • Dubbing & Translate — video dubbing, translation, multilingual lip sync.
  • AI Video, Ads, Audio, Image — generators that feed or sit beside lip sync. Audio Cleaner and Audio Enhancer prep a vocal before the face pass.
  • For Creators — TikTok, YouTube, marketing, and education workflows.
  • Character Library — saved characters and the public catalog. Staff edit the public stills on Admin → Character Library.
  • Voice Library — cloned and designed voices, then the public catalog. Listen to samples here; generate a script on Text to Speech. Staff edit public voices on Admin → Voice Library.
  • API — /developers. Create and revoke live keys, inspect generations, usage, and the credit ledger.
  • Creation — History of jobs and uploaded Assets (studio only, not API tools).

Credits

One credit equals $0.01 on a subscription. There is no free plan. The studio can still preview locally before you pay. The API uses this exact meter — quote first with POST /api/v1/credits/quote.

  • First 30 seconds of any generation = 150 credits ($1.50).
  • Every extra second = 5 credits ($0.05).
  • A 45-second clip is 225 credits. A 60-second clip is 300 credits.
  • One-time packs are $0.08 per credit and do not expire.
  • Yearly billing is 30% off the monthly price, paid once for 12 months, and does not auto-renew.
  • Subscription credits spend first, then pack credits. Unused plan credits roll over while the subscription is active and cancel when you cancel.
  • Resolution, aspect ratio, and language do not change the second price. Duration does.
DurationCreditsUSD on a plan ($0.01)USD on a pack ($0.08)
15s150$1.50$12.00
30s150$1.50$12.00
45s225$2.25$18.00
60s300$3.00$24.00
90s450$4.50$36.00
120s600$6.00$48.00

Plans

Starter, Pro, and Ultra are the paid subscriptions. Pro can slide from 2,999 credits a month up to 100,000 at the same $0.01 per credit. API keys ship with Pro, Ultra, and Enterprise. Starter is studio-only.

Instant voice cloning is capped per plan: Starter 1 clone, Pro 5, Ultra 15. Designed voices and public library picks do not count against that cap.

  • Starter — 999 credits / month. About six 30-second generations. 1 instant voice clone. No live API key.
  • Pro — from 2,999 credits / month, 5 instant voice clones, priority queue, three concurrent jobs, 1080p, API.
  • Ultra — 9,999 credits / month, 15 instant voice clones, highest queue, 4K, team-ready commercial license, API.
  • One-time packs — 100 to 6,250 credits at $0.08 each. They can sit on top of any plan, including API spend.
  • Enterprise — larger pools, more seats, or a custom key: email hello@lipsyncingai.com.
PlanCredits / month~30s clipsInstant clonesMonthlyYearly (30% off)API
Starter99961$9.99$6.99/mo billed as $83.88Studio only
Pro2,999195$29.99$20.99/mo billed as $251.88Yes
Ultra9,9996615$142.84$99.99/mo billed as $1199.88Yes

One-time packs

Packs are for bursts that should not wait for the next subscription refresh. They never expire, including after you cancel a plan. The API spends subscription credits first, then pack credits.

PackCreditsPriceRate
100 credits100$8.00$0.08 / credit
250 credits250$20.00$0.08 / credit
625 credits625$50.00$0.08 / credit
1,250 credits1,250$100.00$0.08 / credit
2,500 credits2,500$200.00$0.08 / credit
6,250 credits6,250$500.00$0.08 / credit

Payment providers

Staff pick the checkout processor on /admin/payments. Add, edit, or remove Dodo Payments, Stripe, Paddle, Lemon Squeezy, PayPal, Razorpay, or a custom processor, then mark one card Use for checkout. Secrets stay in the staff store and never go to the public billing snapshot.

GET /api/studio/billing returns the active processor name, kind, test/live mode, and whether a secret is present (pasted or env). Pricing and the account billing panel show that name. If a secret is present, Subscribe and Buy pack wait for POST /api/webhooks/payments/{kind}. That webhook credits the signed-in studio wallet (same wallet /api/generate spends). Without a secret, plans and packs credit that wallet immediately so you can test.

  • Preferred: paste the secret on the processor card. Env fallbacks are DODO_PAYMENTS_API_KEY, STRIPE_SECRET_KEY, PADDLE_API_KEY, LEMONSQUEEZY_API_KEY, PAYPAL_CLIENT_SECRET, and RAZORPAY_KEY_SECRET.
  • Webhook URL on each card is /api/webhooks/payments/dodopayments (or stripe, paddle, lemonsqueezy, paypal, razorpay, custom).
  • If the card has a webhook secret, send it as x-webhook-secret. Dodo also signs with webhook-id, webhook-timestamp, and webhook-signature (Standard Webhooks). Env DODO_PAYMENTS_WEBHOOK_KEY or DODO_WEBHOOK_SECRET is the fallback secret.
  • POST a completed event with email plus amount or credits. The staff ledger gains a paid row tagged with that processor.
  • Without a secret, checkout copy says the processor is not ready. Plans and packs still update the signed-in studio wallet on this server.

Credit prices do not change when you switch processors. $0.01 per plan credit, $0.08 per pack credit, 150 credits for the first 30 seconds.

Account, history, and assets

Studio login opens an httpOnly cookie (`ls_studio`). Sign in with Google when a Web client ID is set, or with email and a password of six or more characters. Google ID tokens are verified on the server. Credits, plans, and pack balances live on that signed-in user (data/studio-users.json on this host). History, assets, and profile still cache in the browser so the UI stays snappy.

Manage live HTTP keys on /developers. That page is the same wallet as History, Assets, and Credits: generations, usage, and the credit log. Keys are also written to data/studio-api-keys.json on this host so /api/v1 accepts them. Sandbox traffic can still use ls_live_demo. Staff can issue extra tokens in /admin, and LIPSYNCING_API_KEYS still works on the server.

  • History — past generations. Toggle public or private and copy a share link when the clip is public.
  • Assets — photos, audio, and videos you uploaded. Each file has a share URL plus social buttons.
  • Credits — plan credits (roll over while subscribed; cancelled with the plan) and pack credits (never expire). Generation rows show a thumbnail that opens the matching file on Assets.
  • Profile — photo, username, bio, company, password, plan dates, credit expiry, switch to any paid plan, add credits by hand, public and private showcases, and a public page at /u/{username}.
  • API — /developers. Create and revoke live keys, inspect generations, usage, and the credit ledger, and copy curl for /api/v1.
  • GET /api/v1/account — key kind, whether remote render is on, and the studio wallet when the Bearer token is one of your live keys.

Preview and download

Generate always tries to show a result. Local preview does not spend credits. Finished MP4 renders need Starter, Pro, Ultra, or a pack, and they spend credits only when a model has an API key.

Talking clips render through the provider enabled on Admin → Models (Zoice Avatar X by default; Wavespeed, fal.ai, or a RunPod public endpoint if you add them). Avatar identity stills use Wavespeed Nano Banana 2 (default) or GPT Image 2. AI Image stills also include Z Image. Avatar Dialogue clips use Seedance 2.0 or Seedance 2.5 image-to-video from the two-shot. AI Video clips use Seedance 2.0, Seedance 2.5, Veo 3.1, and Wan 2.5. Motion Control and Character Swap use Wan 2.2 Animate and Kling Motion. AI Voice clones, prompt design, public library picks, and TTS use ElevenLabs Instant Clone, Cartesia, and Chatterbox on RunPod. Paste keys on the provider or on each model — they are stored only on the server and are never sent back to the browser. Env ZOICE_API_KEY, WAVESPEED_API_KEY, ELEVENLABS_API_KEY, CARTESIA_API_KEY, and RUNPOD_API_KEY are fallbacks. The studio will not call those providers until you are signed in. Without a key, the studio and the sandbox API still preview locally. A sandbox API job returns status preview and billed false — no credits move.

Tips for a clean mouth

Small source choices matter more than extra settings.

  • Keep the mouth visible for the whole line.
  • Match duration to the audio. Padding silence still spends credits after 30 seconds.
  • For dubbing, start from a video with clear speech in the source language.
  • Do not animate people, pets, or characters you do not own or license.
  • If the mouth looks late, shorten the script or replace noisy audio.
  • Avatar Dialogue needs two faces in one still — a two-shot photo, or two portraits composited into a 16:9 frame — then Seedance 2.0 or 2.5 animates that frame. Other talking tools work better with one main face.

API overview

The LipSyncing AI HTTP API is versioned under /api/v1. Production base: https://lipsyncingai.com/api/v1. Locally it is the same path on this origin. CORS is open so you can call it from a browser app.

The studio UI posts to /api/generate without a customer key — that route is for this website only and requires a signed-in studio or staff session before it will spend a Zoice or Wavespeed key. Integrations must use /api/v1 with a Bearer token.

GET /api/v1 is a discovery document: endpoints, auth, and a link back here. GET /api/v1/tools lists every generator. GET /api/v1/pricing is the live plan and meter catalog.

MethodPathAuthWhat it does
GET/api/v1NoDiscovery document
GET/api/v1/toolsNoTool catalog, voices, resolutions, aspect ratios
GET/api/v1/pricingNoPlans, packs, yearly discount, generation meter
POST/api/v1/credits/quoteBearerQuote credits + USD for a duration or script
GET/api/v1/accountBearerKey kind, render mode, limits
POST/api/v1/generationsBearerStart a job (JSON or multipart)
GET/api/v1/generations/{id}BearerPoll until preview, success, or failed

Poll. There are no webhooks in v1. Wait two seconds between GETs, up to about three minutes.

Authentication

Send the key on every private request. Do not put a live key in client-side JavaScript you ship to end users — proxy through your server.

  • Sandbox key — ls_live_demo. Always valid. Quotes and catalogs work. Generations return status preview and billed false. No credits are charged.
  • Live keys — create them on /developers while signed in. Starter keys quote and preview. Pro and Ultra keys can render MP4s when a provider API key is configured on Admin → Models (or ZOICE_API_KEY for Zoice). A billed true response means that key’s studio wallet was debited. Staff tokens and LIPSYNCING_API_KEYS still work and do not debit a customer wallet.
  • Header — Authorization: Bearer <api_key>
  • ZOICE_API_KEY and WAVESPEED_API_KEY are server secrets. They are not customer API keys, they are never sent to the browser, and they must never be put in client-side JavaScript.
Header
Authorization: Bearer ls_live_demo

Tools catalog

Each left-menu page is a tool id. Pass tool as the slug: talking-photo, talking-dog, anime-lip-sync, video-dubbing, product-avatar, ai-influencer-generator, avatar-video-generator, text-to-speech, ai-voice-design, ai-voice-library, audio-cleaner, audio-enhancer, baby-talking, ai-news-anchor, ai-animate-face-lip-sync, text-to-avatar, audio-to-avatar, ai-presenter, ai-tutor, ai-instructor, ai-coach, ai-subtitle-generator, lip-sync-for-tiktok, and the rest. The homepage generator is ai-lip-sync.

The catalog includes mode (the studio engine preset), group, keyword, path, and the input fields that tool expects. Dialogue uses script plus script_2. Dubbing uses from_language and to_language. Image tools use prompt.

List tools
curl -s https://lipsyncingai.com/api/v1/tools | jq '.tools[] | {id, name, mode, keyword}'

History and Assets are account pages, not generation tools. They are omitted from the catalog.

Create a generation

POST /api/v1/generations with JSON (URLs) or multipart/form-data (files). You need a script or an audio source unless the tool is image-only, motion control, or character swap. Duration is optional: if you omit it, we estimate from the script at about 150 words per minute, minimum 8 seconds, maximum 180. Motion and swap bill from the driving video length.

  • tool — catalog id. Defaults to ai-lip-sync.
  • script — spoken line. For dialogue, also send script_2 (Person 1 left, Person 2 right).
  • image_url or image — face / product still. If omitted on talking tools, a sample portrait is used. For avatar-dialogue, send one two-person still (or two portraits already composited). Seedance image-to-video uses that still as the start frame.
  • video_url or video — driving clip for motion control and character swap.
  • audio_url or audio — speech or song. Overrides TTS when present.
  • voice — nova, rowan, mira, kai, sol, or lumen. Talking tools send this to the renderer. For dialogue, also send voice_2; Seedance folds both voices into the prompt.
  • model — for avatar-dialogue, wavespeed/seedance-2.0 or wavespeed/seedance-2.5.
  • resolution — 480p, 720p, 1080p, 2k, 4k. Dialogue follows the selected Seedance limits.
  • aspect_ratio — 9:16, 16:9, 1:1, 4:5, 3:4. Seedance dialogue also accepts 4:3, 3:4, and 21:9.
  • duration — seconds to bill, 1–180. Dialogue is clamped to Seedance 2.0 (4–15s) or 2.5 (4–30s).
  • action_prompt — optional performance note (smile, nod). Merged with the tool preset.
  • prompt — extra scene text for ads, video-gen, motion, and swap.
  • from_language / to_language — dubbing and translate.
JSON (sandbox)
curl -s -X POST https://lipsyncingai.com/api/v1/generations \
  -H "Authorization: Bearer ls_live_demo" \
  -H "Content-Type: application/json" \
  -d '{
    "tool": "talking-photo",
    "script": "Welcome to LipSyncing AI. This photo now matches every syllable.",
    "aspect_ratio": "9:16",
    "resolution": "720p",
    "duration": 30
  }'
Multipart upload
curl -s -X POST https://lipsyncingai.com/api/v1/generations \
  -H "Authorization: Bearer ls_live_demo" \
  -F tool=talking-dog \
  -F script="Hi, I live here and I would like a walk." \
  -F duration=15 \
  -F image=@./dog.jpg \
  -F audio=@./line.wav

Poll a job

The create response includes id, status, credits, duration_seconds, billed, refunded, refunded_credits, and poll. GET that poll URL until status is preview, success, or failed. A live key holds credits when the provider accepts the job. If the provider later fails, those credits are refunded immediately and billed becomes false.

Sandbox jobs finish immediately as preview with video_url null. Live jobs that hit Avatar X stay on processing until video_url is a https URL.

statusMeaning
previewLocal / sandbox. billed is false. No MP4 URL.
processingAvatar X is working. Poll again.
successvideo_url is ready. credits were billed on a live key.
failed / errorProvider failed. billed is false and refunded is true if credits were held. The user is refunded instantly; a rejected submit is not billed by the provider.
Fetch
curl -s https://lipsyncingai.com/api/v1/generations/GENERATION_ID \
  -H "Authorization: Bearer ls_live_demo"

Quote credits from the API

Always quote before you generate if you display a price to a customer. The quote uses the public meter, not a hidden multiplier.

  • duration_seconds — what we will bill (clamped 1–180).
  • credits — integer to deduct.
  • usd_on_plan — credits × $0.01.
  • usd_on_pack — credits × $0.08.
  • meter.formula — human-readable breakdown (150 + extra × 5).
By duration
curl -s -X POST https://lipsyncingai.com/api/v1/credits/quote \
  -H "Authorization: Bearer ls_live_demo" \
  -H "Content-Type: application/json" \
  -d '{"duration": 45}'
By script
curl -s -X POST https://lipsyncingai.com/api/v1/credits/quote \
  -H "Authorization: Bearer ls_live_demo" \
  -H "Content-Type: application/json" \
  -d '{"script": "A short fifteen-word talking photo for a product launch reel."}'

A 45-second quote is 225 credits = $2.25 on a plan, $18.00 if you only have packs at $0.08.

Pricing from the API

GET /api/v1/pricing returns the same numbers as /pricing: credit rates, the generation meter, Starter / Pro / Ultra, yearly 30% off with no auto-renew, and every one-time pack. checkout.name / kind / mode / ready is the active processor from Admin → Payments (no secrets). Use it to keep a billing UI in sync without scraping the website.

  • credit.usd_on_plan = 0.01, credit.usd_on_pack = 0.08.
  • generation_meter.first_block_credits = 150, extra_second_credits = 5.
  • plans[].api_access is false on Starter, true on Pro and Ultra.
  • free_plan is always false.
  • spend_order is subscription then packs.
  • checkout.ready is true when the active processor has a pasted secret or a matching env key.

Errors and limits

Errors are JSON: { "error": { "code", "message" } }. HTTP status matches the code.

  • Max duration 180 seconds.
  • Max upload 15 MB per file.
  • Sandbox: one concurrent preview job is enough — they return immediately.
  • Live Pro: three concurrent jobs. Ultra: higher queue priority. Enterprise: ask for a raised cap.
  • Poll every 2 seconds. Stop at ~90 attempts (~3 minutes) and surface the last message.
HTTPcodeWhen
401unauthorizedMissing or unknown Bearer token
400unknown_tooltool is not in the catalog
400invalid_jsonBody is not JSON or multipart
400generation_failedScript/audio missing, or file over 15 MB
502generation_failed / fetch_failedAvatar X rejected the job
503not_configuredNo enabled model with an API key on Admin → Models

Language examples

The sandbox key is safe to paste. Swap it for a live key on your server before you charge customers.

JavaScript
const base = "https://lipsyncingai.com/api/v1";
const key = "ls_live_demo";

const quote = await fetch(`${base}/credits/quote`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${key}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ duration: 30 }),
}).then((r) => r.json());
// quote.credits === 150, quote.usd_on_plan === 1.5

const job = await fetch(`${base}/generations`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${key}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    tool: "talking-photo",
    script: "This still is now a talking photo.",
    duration: 30,
  }),
}).then((r) => r.json());

const poll = await fetch(`${base}/generations/${job.id}`, {
  headers: { Authorization: `Bearer ${key}` },
}).then((r) => r.json());
Python
import requests

base = "https://lipsyncingai.com/api/v1"
headers = {"Authorization": "Bearer ls_live_demo"}

quote = requests.post(
    f"{base}/credits/quote",
    headers=headers,
    json={"duration": 60},
).json()
# quote["credits"] == 300

job = requests.post(
    f"{base}/generations",
    headers=headers,
    json={
        "tool": "video-dubbing",
        "script": "Translated line for the host.",
        "duration": 30,
        "from_language": "en",
        "to_language": "es",
    },
).json()

status = requests.get(f"{base}/generations/{job['id']}", headers=headers).json()

Sandbox vs production

On this host, without LIPSYNCING_API_KEYS and ZOICE_API_KEY, every generation is a preview. That is intentional: you can wire an integration, quote credits, and list tools before you buy a plan.

  • Use ls_live_demo against /api/v1 on this site right now, or create a live key on /developers.
  • Buy Pro or Ultra (or email for Enterprise) when you need billed MP4s. Starter live keys still quote and preview.
  • Live keys from /developers are stored for this host in data/studio-api-keys.json. LIPSYNCING_API_KEYS and /admin tokens still work.
  • Set a provider key on Admin → Models (Zoice, Wavespeed, fal.ai, or RunPod), or ZOICE_API_KEY for Avatar X.
  • Keep ZOICE_VOICE_ID / ZOICE_AVATAR_ID optional for a default voice or saved avatar.
  • The website studio continues to work with local preview if those env vars are empty.

Questions about keys, higher concurrency, or a private base URL: hello@lipsyncingai.com.

First 30 seconds = 150 credits ($1.50). Plan credits roll over while you stay subscribed. Email: hello@lipsyncingai.com