1<!DOCTYPE html><!--rVnqImSdE1RyH0dQYUngX--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2FJSFLABS%20WHITE%20VERSION.png&w=128&q=75 1x, /_next/image?url=%2FJSFLABS%20WHITE%20VERSION.png&w=256&q=75 2x"/><link rel="stylesheet" href="/_next/static/chunks/1b66667454ec4256.css?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/8e533c7b3b901b07.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M"/>
1<script src="/_next/static/chunks/7c97a658fdaf21be.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/2eb605ce0d5bc738.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/db62ac5035adc119.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/eb5c283bcf5fe3ff.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/731519fa75ec95af.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/turbopack-5bf24e12e9fed4ad.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/42dc04c16cb206a9.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/7f6648eee67d69e1.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/d80b3790a119a285.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<script src="/_next/static/chunks/88257703cb7c277d.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" async=""></script>
1<link rel="preload" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" as="style"/><meta name="google-site-verification" content="GfxBgEpn5XdnADHBKEzEyJwmnUg3DBCVLtC6qPpGvww"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><meta name="theme-color" content="#0f0f0f"/><title>JSF Labs â AI Voice Cloning & Text to Speech | Pakistan</title><meta name="description" content="JSF Labs delivers next-gen AI voice cloning, text to speech (JSF Labs 1.5 Mini & Max), speech-to-text, voice dubbing, and voice design. The leading ElevenLabs alternative from Pakistan. Free TTS for new users â no credit card required."/><meta name="keywords" content="AI voice cloning,text to speech Pakistan,ElevenLabs alternative,JSF Labs,JSF Labs 1.5 Mini,JSF Labs 1.5 Max,speech to text online,voice dubbing AI,voice design AI,speech to speech,free text to speech,voice cloning free"/><meta name="robots" content="index, follow"/><meta name="googlebot" content="index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"/><link rel="canonical" href="https://jsflabs.io"/><meta property="og:title" content="JSF Labs â AI Voice Cloning & Text to Speech"/><meta property="og:description" content="Clone voices, generate realistic TTS, transcribe audio, and dub videos with JSF Labs â Pakistan's most advanced AI voice platform. Powered by JSF Labs 1.5 Mini & Max models."/><meta property="og:url" content="https://jsflabs.io"/><meta property="og:site_name" content="JSF Labs"/><meta property="og:locale" content="en_US"/><meta property="og:image" content="https://jsflabs.io/og/home-1200x630.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="JSF Labs â AI Voice Cloning & Text to Speech Platform"/><meta property="og:image:type" content="image/png"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:site" content="@jsflabs"/><meta name="twitter:creator" content="@jawadkhan"/><meta name="twitter:title" content="JSF Labs â AI Voice Cloning & TTS | Pakistan"/><meta name="twitter:description" content="The fastest ElevenLabs alternative. Clone voices, TTS, STT, dubbing & voice design â powered by JSF Labs 1.5 Mini & Max. Free to start."/><meta name="twitter:image" content="https://jsflabs.io/og/home-1200x630.png"/><link rel="icon" href="/favicon.ico?favicon.e220c93c.ico" sizes="300x300" type="image/x-icon"/><link rel="icon" href="/favicon.ico"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" rel="stylesheet"/>
1<script src="/_next/static/chunks/a6dad97d9634a72d.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" noModule=""></script>
1</head><body class="bg-[#0f0f0f]"><div hidden=""><!--$--><!--/$--></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><div><div class="min-h-screen bg-[#0c0c0e] font-sans text-zinc-300 antialiased"><header class="fixed inset-x-0 top-0 z-50 h-14 border-b border-white/[0.08] bg-[#0c0c0e]/85 backdrop-blur"><div class="mx-auto flex h-14 max-w-[1600px] items-center gap-4 px-4"><button class="inline-flex h-9 w-9 items-center justify-center rounded-lg border border-white/[0.08] text-zinc-400 hover:text-zinc-100 md:hidden" aria-label="Toggle navigation"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 12h16"></path><path d="M4 18h16"></path><path d="M4 6h16"></path></svg></button><a class="flex items-center gap-2.5" href="/"><img alt="JSF Labs" width="120" height="40" decoding="async" data-nimg="1" class="h-[26px] w-auto" style="color:transparent" srcSet="/_next/image?url=%2FJSFLABS%20WHITE%20VERSION.png&w=128&q=75 1x, /_next/image?url=%2FJSFLABS%20WHITE%20VERSION.png&w=256&q=75 2x" src="/_next/image?url=%2FJSFLABS%20WHITE%20VERSION.png&w=256&q=75"/><span class="rounded-full border border-white/10 px-2 py-0.5 font-mono text-[10px] font-semibold uppercase tracking-widest text-zinc-500">API v1</span></a><div class="flex-1"></div><a href="mailto:[email protected]" class="hidden text-[13px] text-zinc-400 transition-colors hover:text-zinc-100 sm:block">Support</a><a class="rounded-lg px-4 py-2 text-[13px] font-semibold text-[#1a1008] transition-opacity hover:opacity-90" style="background:linear-gradient(120deg,#FF9057,#F2542D)" href="#quickstart">Get started</a></div></header><aside class="fixed bottom-0 left-0 top-14 z-40 w-72 overflow-y-auto border-r border-white/[0.08] bg-[#0c0c0e] px-3 py-5 transition-transform duration-300 md:w-64 md:translate-x-0 -translate-x-full"><div class="relative mb-5"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-zinc-500" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg><input placeholder="Search docsâ¦" class="h-9 w-full rounded-lg border border-white/[0.08] bg-white/[0.03] pl-8 pr-3 text-[13px] text-zinc-200 outline-none transition-colors placeholder:text-zinc-500 focus:border-[#ff6b2c]/50" value=""/></div><nav class="space-y-6"><div><h4 class="px-3 pb-2 font-mono text-[10.5px] font-semibold uppercase tracking-[0.16em] text-zinc-600">Getting started</h4><div class="space-y-0.5"><a href="#introduction" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors bg-[#ff6b2c]/10 font-medium text-[#ff8a50]">Introduction</a><a href="#base-url" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Base URL</a><a href="#quickstart" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Quickstart</a><a href="#authentication" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Authentication</a><a href="#rate-limits" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Rate limits</a><a href="#credits" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Credits & billing</a><a href="#voice-ids" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Voice IDs</a></div></div><div><h4 class="px-3 pb-2 font-mono text-[10.5px] font-semibold uppercase tracking-[0.16em] text-zinc-600">Endpoints</h4><div class="space-y-0.5"><a href="#clone" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100"><span class="rounded border border-[#ff6b2c]/25 bg-[#ff6b2c]/10 px-1.5 py-0.5 font-mono text-[9px] font-bold text-[#ff8a50]">POST</span>Clone a voice</a><a href="#tts" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100"><span class="rounded border border-[#ff6b2c]/25 bg-[#ff6b2c]/10 px-1.5 py-0.5 font-mono text-[9px] font-bold text-[#ff8a50]">POST</span>Text to speech</a></div></div><div><h4 class="px-3 pb-2 font-mono text-[10.5px] font-semibold uppercase tracking-[0.16em] text-zinc-600">Reference</h4><div class="space-y-0.5"><a href="#responses" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Response format</a><a href="#errors" class="flex items-center gap-2 rounded-lg px-3 py-1.5 text-[13.5px] transition-colors text-zinc-400 hover:bg-white/[0.04] hover:text-zinc-100">Error codes</a></div></div></nav></aside><aside class="fixed bottom-0 right-0 top-14 hidden w-56 overflow-y-auto px-5 py-8 xl:block"><h5 class="mb-3 font-mono text-[10px] uppercase tracking-[0.16em] text-zinc-600">On this page</h5><div class="space-y-0.5"><a href="#introduction" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-[#ff8a50] text-[#ff8a50]">Introduction</a><a href="#base-url" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Base URL</a><a href="#quickstart" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Quickstart</a><a href="#authentication" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Authentication</a><a href="#rate-limits" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Rate limits</a><a href="#credits" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Credits & billing</a><a href="#voice-ids" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Voice IDs</a><a href="#clone" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Clone a voice</a><a href="#tts" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Text to speech</a><a href="#responses" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Response format</a><a href="#errors" class="block border-l-[1.5px] py-1 pl-3 text-[12.5px] transition-colors border-white/[0.08] text-zinc-500 hover:text-zinc-300">Error codes</a></div></aside><main class="pt-14 md:pl-64 xl:pr-56"><div class="mx-auto max-w-[46rem] px-6 lg:px-10"><section class="border-b border-white/[0.08] py-16"><div class="mb-4 inline-flex items-center gap-2.5 font-mono text-[11px] font-semibold uppercase tracking-[0.2em] text-[#ff8a50]"><span class="h-px w-6 bg-[#ff8a50]"></span>JSF Labs Developer API</div><h1 class="text-[clamp(34px,5vw,50px)] font-bold leading-[1.05] tracking-tight text-zinc-100">Give any application a<!-- --> <span class="bg-gradient-to-r from-[#FFB57F] via-[#FF7A3D] to-[#F2542D] bg-clip-text text-transparent">voice</span>.</h1><p class="mt-5 max-w-[560px] text-[17px] leading-relaxed text-zinc-400">Clone a voice from a single audio sample, then turn text into studio-mastered speech in that voice â over one simple REST API, authenticated with a single key.</p><div class="mt-9 flex h-[72px] items-center justify-center gap-[3px] overflow-hidden rounded-xl border border-white/[0.08] bg-white/[0.02] px-4"><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:1.75px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:8.515903233952667px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:14.891515620791818px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:19.376708012481263px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:20.864185709270185px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:11.500001477162606px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:6.489508996897747px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:12.043188897769744px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:21.58739242684077px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:28.54758452331949px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:21.73747543050014px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:19.55859719801076px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:13.504577931288257px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:14.770175525124749px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:27.41111811035692px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:25.53107013797993px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:29.887429983441134px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:28.487154570829325px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:22.03344246450955px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:16.471567966060608px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:18.635594041722875px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:30.659849045139612px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:37.21823250059586px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:37.15518694561053px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:30.997867583963874px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:6.633558047779097px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:19.78532342673373px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:34.061642928254074px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:42.77846921206212px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:44.397453486043915px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:24.294585931611504px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:14.130707259249643px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:19.605541147783082px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:35.3472450759644px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:45.83373602810016px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:34.21370755860127px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:30.39342982205395px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:21.08861572218305px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:18.229672258494897px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:34.4102759381635px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:31.418105245439765px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:36.396999741267166px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:34.260515727018564px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:26.363697703347178px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:15.932626328123161px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:17.806088346031007px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:29.764539384247
1517px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:35.78632339767501px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:35.217202933885545px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:29.03469574034408px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:7.3107807821580115px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:14.889284875519184px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:26.098665908489753px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:32.392463017767504px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:32.99508182591745px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:18.099407667666345px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:10.814737186161887px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:11.402268726224444px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:20.895879877741315px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:26.602444113831226px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:19.382886170783927px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:16.865539054852515px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:11.58365070700162px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:7.7838469693818935px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:14.79684178637074px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:12.948929677033547px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:14.456738853468199px"></span><span class="w-[3px] shrink-0 rounded-full bg-gradient-to-b from-[#FF9057] to-[#F2542D] opacity-80" style="height:12.99697000177635px"></span></div><div class="mt-6 flex flex-wrap gap-2"><span class="inline-flex items-center gap-2 rounded-full border border-white/[0.08] bg-white/[0.02] px-3 py-1.5 font-mono text-[11.5px] text-zinc-400"><span class="h-1.5 w-1.5 rounded-full bg-[#ff6b2c]"></span>REST · JSON & multipart</span><span class="inline-flex items-center gap-2 rounded-full border border-white/[0.08] bg-white/[0.02] px-3 py-1.5 font-mono text-[11.5px] text-zinc-400"><span class="h-1.5 w-1.5 rounded-full bg-[#ff6b2c]"></span>Key auth</span><span class="inline-flex items-center gap-2 rounded-full border border-white/[0.08] bg-white/[0.02] px-3 py-1.5 font-mono text-[11.5px] text-zinc-400"><span class="h-1.5 w-1.5 rounded-full bg-[#ff6b2c]"></span>50 requests / min</span><span class="inline-flex items-center gap-2 rounded-full border border-white/[0.08] bg-white/[0.02] px-3 py-1.5 font-mono text-[11.5px] text-zinc-400"><span class="h-1.5 w-1.5 rounded-full bg-[#ff6b2c]"></span>WAV output</span></div></section><section id="introduction" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Overview</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Introduction</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">The JSF Labs API exposes two capabilities behind one gateway. You send audio and get back a reusable voice; you send text and get back speech in that voice. Both endpoints share the same authentication, rate limits, character-based billing, and error format, so once you've called one you already know how to call the other.</p><ul class="mb-4 space-y-2"><li class="relative max-w-[68ch] pl-5 text-[15px] leading-[1.75] text-zinc-300 before:absolute before:left-0 before:top-[13px] before:h-0.5 before:w-2.5 before:rounded before:bg-[#ff6b2c] [&_strong]:font-semibold [&_strong]:text-zinc-100"><strong>Clone a voice</strong> â upload a short sample and receive a portable <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">jsf_</code> voice ID.</li><li class="relative max-w-[68ch] pl-5 text-[15px] leading-[1.75] text-zinc-300 before:absolute before:left-0 before:top-[13px] before:h-0.5 before:w-2.5 before:rounded before:bg-[#ff6b2c] [&_strong]:font-semibold [&_strong]:text-zinc-100"><strong>Text to speech</strong> â pass that voice ID with your text and receive a hosted audio file, loudness-normalized and peak-safe.</li></ul><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Everything is synchronous: each request returns the finished result, so there are no jobs to poll and no webhooks to configure.</p></div></section><section id="base-url" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Overview</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Base URL</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">All endpoints live under a single versioned base. Every path in these docs is written in full, including the version prefix.</p><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">Base URL</span><div class="flex-1"></div></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-[#a5d6a7]">https://www.jsflabs.io</span><span class="text-zinc-500">/api/v1</span></pre></div><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Requests must be sent over HTTPS. Plain HTTP is not supported.</p></div></section><section id="quickstart" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Overview</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Quickstart</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Clone a voice, then speak with it â two calls, start to finish.</p><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">1 â Clone a voice from a sample</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-2 pt-2"><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors border-white/[0.08] border-b-[#141417] bg-[#141417] text-[#ff8a50]">cURL</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Node.js</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Python</button><div class="flex-1"></div><button class="mb-1.5 mr-1 inline-flex items-center gap-1.5 rounded-md border border-white/[0.08] px-2.5 py-1 font-mono text-[11px] transition-colors text-zinc-500 hover:text-zinc-200"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>Copy</button></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-[#ff9d6c]">curl</span> -X POST https://www.jsflabs.io/api/v1/voice-clone \ 2 -H <span class="text-[#a5d6a7]">"x-api-key: jsf_your_api_key"</span> \ 3 -F <span class="text-[#a5d6a7]">"[email protected]"</span> \ 4 -F <span class="text-[#a5d6a7]">"name=Morgan"</span> \ 5 -F <span class="text-[#a5d6a7]">
5"gender=Female"</span> \ 6 -F <span class="text-[#a5d6a7]">"language=en"</span></pre></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">2 â Speak with the cloned voice</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-2 pt-2"><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors border-white/[0.08] border-b-[#141417] bg-[#141417] text-[#ff8a50]">cURL</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Node.js</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Python</button><div class="flex-1"></div><button class="mb-1.5 mr-1 inline-flex items-center gap-1.5 rounded-md border border-white/[0.08] px-2.5 py-1 font-mono text-[11px] transition-colors text-zinc-500 hover:text-zinc-200"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>Copy</button></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-[#ff9d6c]">curl</span> -X POST https://www.jsflabs.io/api/v1/text-to-speech \ 7 -H <span class="text-[#a5d6a7]">"x-api-key: jsf_your_api_key"</span> \ 8 -H <span class="text-[#a5d6a7]">"Content-Type: application/json"</span> \ 9 -d <span class="text-[#a5d6a7]">'{ 10 "text": "The quick brown fox jumps over the lazy dog.", 11 "voice_id": "jsf_c3BlZWNoaWZ5X3ZvaWNlX2lk", 12 "speed": 1 13 }'</span></pre></div></div></section><section id="authentication" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Core concepts</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Authentication</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Every request is authenticated with your secret API key, sent in the <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">x-api-key</code> header. Keys always begin with <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">jsf_</code>. You can find and manage keys in your JSF Labs dashboard.</p><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">Header</span><div class="flex-1"></div></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-zinc-200">x-api-key</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">jsf_your_api_key</span></pre></div><div class="my-4 flex gap-3 rounded-xl border p-4 text-[14px] leading-relaxed text-zinc-300 border-amber-500/25 bg-amber-500/[0.07]"><svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-triangle-alert mt-0.5 shrink-0 text-amber-400" aria-hidden="true"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg><div class="[&_strong]:font-semibold [&_strong]:text-zinc-100">Your key is a secret. Never expose it in client-side code, mobile apps, or public repositories â call the API from your server. A leaked key can spend your character balance.</div></div><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Requests with a missing key, a malformed key, an unknown key, an inactive subscription, or an expired key are rejected before any work is done. See <a href="#errors">Error codes</a> for the exact responses.</p></div></section><section id="rate-limits" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Core concepts</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Rate limits</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Each API key may make up to <strong>50 requests per minute</strong>, measured as a sliding window. The limit is per key, so separate keys have separate budgets.</p><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">When you exceed it, the API responds with <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">429</code> and tells you how long to wait:</p><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">429 Too Many Requests</span><div class="flex-1"></div></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-zinc-200">Retry-After</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">37</span> 14<span class="text-zinc-200">
14X-RateLimit-Limit</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">50</span> 15<span class="text-zinc-200">X-RateLimit-Remaining</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">0</span> 16 17<span class="text-zinc-500">{</span> 18 <span class="text-zinc-200">"success"</span><span class="text-zinc-500">:</span> <span class="text-[#ff9d6c]">false</span><span class="text-zinc-500">,</span> 19 <span class="text-zinc-200">"error"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> 20 <span class="text-zinc-200">"code"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"RATE_LIMITED"</span><span class="text-zinc-500">,</span> 21 <span class="text-zinc-200">"message"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"Rate limit exceeded. You can make up to 50 requests per minute."</span><span class="text-zinc-500">,</span> 22 <span class="text-zinc-200">"retryAfterSeconds"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">37</span> 23 <span class="text-zinc-500">}</span> 24<span class="text-zinc-500">}</span></pre></div><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Read the <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">Retry-After</code> header and back off for that many seconds before retrying. Need a higher ceiling? Contact <a href="mailto:[email protected]">[email protected]</a>.</p></div></section><section id="credits" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Core concepts</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Credits & billing</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Usage is metered in <strong>characters</strong>. Your key carries a total allocation and a running used count; the difference is your available balance.</p><ul class="mb-4 space-y-2"><li class="relative max-w-[68ch] pl-5 text-[15px] leading-[1.75] text-zinc-300 before:absolute before:left-0 before:top-[13px] before:h-0.5 before:w-2.5 before:rounded before:bg-[#ff6b2c] [&_strong]:font-semibold [&_strong]:text-zinc-100"><strong>Text to speech</strong> costs one character per character of <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">text</code> in the request.</li><li class="relative max-w-[68ch] pl-5 text-[15px] leading-[1.75] text-zinc-300 before:absolute before:left-0 before:top-[13px] before:h-0.5 before:w-2.5 before:rounded before:bg-[#ff6b2c] [&_strong]:font-semibold [&_strong]:text-zinc-100"><strong>Cloning</strong> is currently free â it costs zero characters.</li></ul><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Every successful response echoes your balance so you can track it without a separate call:</p><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">credits object</span><div class="flex-1"></div></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-zinc-200">"credits"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> 25 <span class="text-zinc-200">"cost"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">137</span><span class="text-zinc-500">,</span>
25 <span class="text-zinc-500 italic">// charged by this request</span> 26 <span class="text-zinc-200">"used"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">137</span><span class="text-zinc-500">,</span> <span class="text-zinc-500 italic">// total used so far</span> 27 <span class="text-zinc-200">"remaining"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">49863</span><span class="text-zinc-500">,</span> <span class="text-zinc-500 italic">// what's left</span> 28 <span class="text-zinc-200">"total"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">50000</span> <span class="text-zinc-500 italic">// your allocation</span> 29<span class="text-zinc-500">}</span></pre></div><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">If a request would exceed your balance, it's rejected with <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">402</code> and <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">INSUFFICIENT_CHARACTERS</code> before any audio is generated â you're never charged for a request you couldn't afford.</p></div></section><section id="voice-ids" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Core concepts</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Voice IDs</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Cloning returns a portable voice identifier prefixed with <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">jsf_</code>. This is the only identifier you ever need â pass it straight into text to speech as <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">voice_id</code>.</p><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">Example voice ID</span><div class="flex-1"></div></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-[#a5d6a7]">jsf_c3BlZWNoaWZ5X3ZvaWNlX2lk</span></pre></div><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Treat the value as opaque â don't parse or modify it. A value that doesn't start with <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">jsf_</code>, or that has been altered, is rejected with <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">INVALID_VOICE_ID</code>.</p></div></section><section id="clone" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Endpoint</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Clone a voice</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Upload a clean audio sample and receive a reusable voice. Send the request as <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">multipart/form-data</code>.</p><div class="my-3 flex flex-wrap items-center gap-3 rounded-xl border border-white/[0.08] bg-white/[0.02] px-3.5 py-3"><span class="rounded-md border border-[#ff6b2c]/25 bg-[#ff6b2c]/15 px-2.5 py-1 font-mono text-xs font-bold text-[#ff8a50]">POST</span><span class="break-all font-mono text-[14.5px] text-zinc-100"><span class="text-zinc-500">https://www.jsflabs.io</span>/api/v1/voice-clone</span></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Body â multipart/form-data</h4><div class="my-3.5 overflow-hidden rounded-xl border border-white/[0.08]"><div class="grid grid-cols-1 border-b border-white/[0.08] last:border-0 sm:grid-cols-[190p
29x_1fr]"><div class="flex flex-col gap-1.5 border-b border-white/[0.08] p-4 sm:border-b-0 sm:border-r"><span class="font-mono text-[13px] font-semibold text-zinc-100">audio</span><div class="flex flex-wrap gap-1.5"><span class="rounded border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-400">file</span><span class="rounded border border-[#ff6b2c]/30 bg-[#ff6b2c]/10 px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-[#ff8a50]">required</span></div></div><div class="p-4 text-[14px] leading-relaxed text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12.5px] [&_code]:text-zinc-200 [&_strong]:font-semibold [&_strong]:text-zinc-100">The voice sample. <code>WAV</code> or <code>MP3</code>, up to <strong>25 MB</strong>. A clean 10â30 second recording with no background noise gives the best clone.</div></div><div class="grid grid-cols-1 border-b border-white/[0.08] last:border-0 sm:grid-cols-[190px_1fr]"><div class="flex flex-col gap-1.5 border-b border-white/[0.08] p-4 sm:border-b-0 sm:border-r"><span class="font-mono text-[13px] font-semibold text-zinc-100">name</span><div class="flex flex-wrap gap-1.5"><span class="rounded border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-400">string</span><span class="rounded border border-[#ff6b2c]/30 bg-[#ff6b2c]/10 px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-[#ff8a50]">required</span></div></div><div class="p-4 text-[14px] leading-relaxed text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12.5px] [&_code]:text-zinc-200 [&_strong]:font-semibold [&_strong]:text-zinc-100">A label for the voice, 2â80 characters. Shown back to you and stored with the clone.</div></div><div class="grid grid-cols-1 border-b border-white/[0.08] last:border-0 sm:grid-cols-[190px_1fr]"><div class="flex flex-col gap-1.5 border-b border-white/[0.08] p-4 sm:border-b-0 sm:border-r"><span class="font-mono text-[13px] font-semibold text-zinc-100">gender</span><div class="flex flex-wrap gap-1.5"><span class="rounded border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-400">string</span><span class="rounded border border-white/10 px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-500">optional</span></div></div><div class="p-4 text-[14px] leading-relaxed text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12.5px] [&_code]:text-zinc-200 [&_strong]:font-semibold [&_strong]:text-zinc-100">One of <code>Male</code>, <code>Female</code>, <code>Neutral</code>, <code>Unspecified</code>. Defaults to <code>Unspecified</code>.</div></div><div class="grid grid-cols-1 border-b border-white/[0.08] last:border-0 sm:grid-cols-[190px_1fr]"><div class="flex flex-col gap-1.5 border-b border-white/[0.08] p-4 sm:border-b-0 sm:border-r"><span class="font-mono text-[13px] font-semibold text-zinc-100">language</span><div class="flex flex-wrap gap-1.5"><span class="rounded border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-400">string</span><span class="rounded border border-white/10 px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-500">optional</span></div></div><div class="p-4 text-[14px] leading-relaxed text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12.5px] [&_code]:text-zinc-200 [&_strong]:font-semibold [&_strong]:text-zinc-100">Two-letter ISO 639-1 code, e.g. <code>en</code>, <code>fr</code>, <code>ar</code>. Defaults to <code>en</code>.</div></div></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Request</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-2 pt-2"><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors border-white/[0.08] border-b-[#141417] bg-[#141417] text-[#ff8a50]">cURL</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Node.js</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Python</button><div class="flex-1"></div><button class="mb-1.5 mr-1 inline-flex items-center gap-1.5 rounded-md border border-white/[0.08] px-2.5 py-1 font-mono text-[11px] transition-colors text-zinc-500 hover:text-zinc-200"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>Copy</button></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-[#ff9d6c]">curl</span> -X POST https://www.jsflabs.io/api/v1/voice-clone \ 30 -H <span class="text-[#a5d6a7]">"x-api-key: jsf_your_api_key"</span> \ 31 -F <span class="text-[#a5d6a7]">"[email protected]"</span> \ 32 -F <span class="text-[#a5d6a7]">"name=Morgan"</span> \ 33 -F <span class="text-[#a5d6a7]">
33"gender=Female"</span> \ 34 -F <span class="text-[#a5d6a7]">"language=en"</span></pre></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Response · 201 Created</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">JSON</span><div class="flex-1"></div><button class="inline-flex items-center gap-1.5 rounded-md border border-white/[0.08] px-2.5 py-1 font-mono text-[11px] transition-colors text-zinc-500 hover:text-zinc-200"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>Copy</button></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-zinc-500">{</span> 35 <span class="text-zinc-200">"success"</span><span class="text-zinc-500">:</span> <span class="text-[#ff9d6c]">true</span><span class="text-zinc-500">,</span> 36 <span class="text-zinc-200">"message"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"Your voice has been cloned successfully."</span><span class="text-zinc-500">,</span> 37 <span class="text-zinc-200">"data"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> 38 <span class="text-zinc-200">"voiceId"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"jsf_c3BlZWNoaWZ5X3ZvaWNlX2lk"</span><span class="text-zinc-500">,</span> 39 <span class="text-zinc-200">"name"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"Morgan"</span><span class="text-zinc-500">,</span> 40 <span class="text-zinc-200">"language"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"en"</span><span class="text-zinc-500">,</span> 41 <span class="text-zinc-200">"gender"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"Female"</span><span class="text-zinc-500">,</span> 42 <span class="text-zinc-200">"provider"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"speechify"</span><span class="text-zinc-500">,</span> 43 <span class="text-zinc-200">"sampleUrl"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"https://cdn.jsflabs.io/clones/.../sample.wav"</span><span class="text-zinc-500">,</span> 44 <span class="text-zinc-200">"createdAt"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">
44"2026-08-12T09:20:44.120Z"</span> 45 <span class="text-zinc-500">},</span> 46 <span class="text-zinc-200">"credits"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> <span class="text-zinc-200">"cost"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">0</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"used"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">0</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"remaining"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">50000</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"total"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">50000</span> <span class="text-zinc-500">}</span> 47<span class="text-zinc-500">}</span></pre></div><div class="my-4 flex gap-3 rounded-xl border p-4 text-[14px] leading-relaxed text-zinc-300 border-[#ff6b2c]/25 bg-[#ff6b2c]/[0.07]"><svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info mt-0.5 shrink-0 text-[#ff8a50]" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg><div class="[&_strong]:font-semibold [&_strong]:text-zinc-100">Store the <strong>voiceId</strong>. It's permanent and reusable â you never need to re-upload the sample to speak in this voice again.</div></div></div></section><section id="tts" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Endpoint</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Text to speech</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Turn text into speech in a cloned voice. Send the request as <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">application/json</code>. The response is a hosted, loudness-normalized <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">WAV</code> file.</p><div class="my-3 flex flex-wrap items-center gap-3 rounded-xl border border-white/[0.08] bg-white/[0.02] px-3.5 py-3"><span class="rounded-md border border-[#ff6b2c]/25 bg-[#ff6b2c]/15 px-2.5 py-1 font-mono text-xs font-bold text-[#ff8a50]">POST</span><span class="break-all font-mono text-[14.5px] text-zinc-100"><span class="text-zinc-500">https://www.jsflabs.io</span>/api/v1/text-to-speech</span></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Body â application/json</h4><div class="my-3.5 overflow-hidden rounded-xl border border-white/[0.08]"><div class="grid grid-cols-1 border-b border-white/[0.08] last:border-0 sm:grid-cols-[190px_1fr]"><div class="flex flex-col gap-1.5 border-b border-white/[0.08] p-4 sm:border-b-0 sm:border-r"><span class="font-mono text-[13px] font-semibold text-zinc-100">text</span><div class="flex flex-wrap gap-1.5"><span class="rounded border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-400">string</span><span class="rounded border border-[#ff6b2c]/30 bg-[#ff6b2c]/10 px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-[#ff8a50]">required</span></div></div><div class="p-4 text-[14px] leading-relaxed text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12.5px] [&_code]:text-zinc-200 [&_strong]:font-semibold [&_strong]:text-zinc-100">The text to speak. Up to <strong>50,000</strong> characters. Long text is automatically split, generated in parallel, and stitched into one continuous file.</div></div><div class="grid grid-cols-1 border-b border-white/[0.08] last:border-0 sm:grid-cols-[190p
47x_1fr]"><div class="flex flex-col gap-1.5 border-b border-white/[0.08] p-4 sm:border-b-0 sm:border-r"><span class="font-mono text-[13px] font-semibold text-zinc-100">voice_id</span><div class="flex flex-wrap gap-1.5"><span class="rounded border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-400">string</span><span class="rounded border border-[#ff6b2c]/30 bg-[#ff6b2c]/10 px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-[#ff8a50]">required</span></div></div><div class="p-4 text-[14px] leading-relaxed text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12.5px] [&_code]:text-zinc-200 [&_strong]:font-semibold [&_strong]:text-zinc-100">A <code>jsf_</code> voice ID returned by <a href="#clone" class="text-[#ff8a50] underline decoration-[#ff8a50]/30 underline-offset-2">Clone a voice</a>.</div></div><div class="grid grid-cols-1 border-b border-white/[0.08] last:border-0 sm:grid-cols-[190px_1fr]"><div class="flex flex-col gap-1.5 border-b border-white/[0.08] p-4 sm:border-b-0 sm:border-r"><span class="font-mono text-[13px] font-semibold text-zinc-100">speed</span><div class="flex flex-wrap gap-1.5"><span class="rounded border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-400">number</span><span class="rounded border border-white/10 px-1.5 py-0.5 font-mono text-[9.5px] font-semibold uppercase tracking-wide text-zinc-500">optional</span></div></div><div class="p-4 text-[14px] leading-relaxed text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12.5px] [&_code]:text-zinc-200 [&_strong]:font-semibold [&_strong]:text-zinc-100">Playback pace from <code>0.5</code> to <code>2.0</code>. <code>1</code> is natural pace (default). Lower is slower, higher is faster.</div></div></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Request</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-2 pt-2"><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors border-white/[0.08] border-b-[#141417] bg-[#141417] text-[#ff8a50]">cURL</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Node.js</button><button class="-mb-px rounded-t-md border border-transparent px-3 py-2 font-mono text-xs transition-colors text-zinc-500 hover:text-zinc-300">Python</button><div class="flex-1"></div><button class="mb-1.5 mr-1 inline-flex items-center gap-1.5 rounded-md border border-white/[0.08] px-2.5 py-1 font-mono text-[11px] transition-colors text-zinc-500 hover:text-zinc-200"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>Copy</button></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-[#ff9d6c]">curl</span> -X POST https://www.jsflabs.io/api/v1/text-to-speech \ 48 -H <span class="text-[#a5d6a7]">"x-api-key: jsf_your_api_key"</span> \ 49 -H <span class="text-[#a5d6a7]">"Content-Type: application/json"</span> \ 50 -d <span class="text-[#a5d6a7]">'{ 51 "text": "The quick brown fox jumps over the lazy dog.", 52 "voice_id": "jsf_c3BlZWNoaWZ5X3ZvaWNlX2lk", 53 "speed": 1 54 }'</span></pre></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Response · 200 OK</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">JSON</span><div class="flex-1"></div><button class="inline-flex items-center gap-1.5 rounded-md border border-white/[0.08] px-2.5 py-1 font-mono text-[11px] transition-colors text-zinc-500 hover:text-zinc-200"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>Copy</button></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-zinc-500">{</span> 55 <span class="text-zinc-200">"success"</span><span class="text-zinc-500">:</span> <span class="text-[#ff9d6c]">true</span><span class="text-zinc-500">,</span> 56 <span class="text-zinc-200">"message"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"Your audio has been generated successfully."</span><span class="text-zinc-500">,</span> 57 <span class="text-zinc-200">"data"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> 58 <span class="text-zinc-200">
58"audio_url"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"https://cdn.jsflabs.io/tts/.../a1b2c3.wav"</span><span class="text-zinc-500">,</span> 59 <span class="text-zinc-200">"voice_id"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"jsf_c3BlZWNoaWZ5X3ZvaWNlX2lk"</span><span class="text-zinc-500">,</span> 60 <span class="text-zinc-200">"format"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"wav"</span><span class="text-zinc-500">,</span> 61 <span class="text-zinc-200">"characters"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">44</span><span class="text-zinc-500">,</span> 62 <span class="text-zinc-200">"speed"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">1</span> 63 <span class="text-zinc-500">},</span> 64 <span class="text-zinc-200">"credits"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> <span class="text-zinc-200">"cost"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">44</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"used"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">44</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"remaining"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">49956</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"total"</span><span class="text-zinc-500">:</span> <span class="text-[#e2b877]">50000</span> <span class="text-zinc-500">}</span> 65<span class="text-zinc-500">}</span></pre></div><div class="my-4 flex gap-3 rounded-xl border p-4 text-[14px] leading-relaxed text-zinc-300 border-[#ff6b2c]/25 bg-[#ff6b2c]/[0.07]"><svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info mt-0.5 shrink-0 text-[#ff8a50]" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg><div class="[&_strong]:font-semibold [&_strong]:text-zinc-100">The <strong>audio_url</strong> points to a hosted WAV file, already loudness-normalized to -14 LUFS and peak-limited. Download it or stream it directly.</div></div></div></section><section id="responses" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Reference</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Response format</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Every response uses the same envelope, so you can branch on one field. Success and failure never share a shape.</p><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Success</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">2xx</span><div class="flex-1"></div></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-zinc-500">{</span> <span class="text-zinc-200">"success"</span><span class="text-zinc-500">:</span> <span class="text-[#ff9d6c]">true</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"message"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"..."</span><span class="text-zinc-500">,</span> <span class="text-zinc-200">"data"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> <span class="text-zinc-500">...</span> <span class="text-zinc-500">},</span> <span class="text-zinc-200">"credits"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> <span class="text-zinc-500">...</span> <span class="text-zinc-500">}</span> <span class="text-zinc-500">}</span></pre></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Failure</h4><div class="my-4 overflow-hidden rounded-xl border border-white/[0.08] bg-[#141417]"><div class="flex items-center gap-1 border-b border-white/[0.08] px-3 py-2"><span class="font-mono text-xs text-zinc-500">4xx / 5xx</span><div class="flex-1"></div></div><pre class="overflow-x-auto p-4 font-mono text-[13px] leading-relaxed text-zinc-200"><span class="text-zinc-500">{</span> 66 <span class="text-zinc-200">"success"</span><span class="text-zinc-500">:</span> <span class="text-[#ff9d6c]">
66false</span><span class="text-zinc-500">,</span> 67 <span class="text-zinc-200">"error"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> 68 <span class="text-zinc-200">"code"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"VALIDATION_ERROR"</span><span class="text-zinc-500">,</span> 69 <span class="text-zinc-200">"message"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"Some fields are invalid. Check the fields object for details."</span><span class="text-zinc-500">,</span> 70 <span class="text-zinc-200">"fields"</span><span class="text-zinc-500">:</span> <span class="text-zinc-500">{</span> <span class="text-zinc-200">"audio"</span><span class="text-zinc-500">:</span> <span class="text-[#a5d6a7]">"Unsupported audio format. Please upload a WAV or MP3 file."</span> <span class="text-zinc-500">}</span> 71 <span class="text-zinc-500">}</span> 72<span class="text-zinc-500">}</span></pre></div><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">Always branch on <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">success</code>. On failure, <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">error.code</code> is a stable machine-readable string you can switch on; <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">error.message</code> is human-readable and safe to surface to your users. Some errors add extra fields (like <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">fields</code> or <code class="rounded-md border border-white/10 bg-white/[0.05] px-1.5 py-0.5 font-mono text-[0.82em] text-zinc-200">retryAfterSeconds</code>).</p></div></section><section id="errors" data-doc="true" class="scroll-mt-20 border-b border-white/[0.08] py-[52px]"><div class="mb-3 font-mono text-[11px] font-semibold uppercase tracking-[0.16em] text-zinc-500">Reference</div><h2 class="text-[28px] font-bold leading-tight tracking-tight text-zinc-100">Error codes</h2><div class="mt-4"><p class="mb-3.5 max-w-[68ch] text-[15px] leading-[1.75] text-zinc-300 [&_strong]:font-semibold [&_strong]:text-zinc-100 [&_a]:text-[#ff8a50] [&_a]:underline [&_a]:decoration-[#ff8a50]/30 [&_a]:underline-offset-2 [&_a:hover]:decoration-[#ff8a50]">The full set of error codes, grouped by what caused them. Codes are stable â safe to match on in your integration.</p><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Authentication & access</h4><div class="my-3 overflow-hidden rounded-xl border border-white/[0.08]"><table class="w-full border-collapse text-[13.5px]"><thead><tr class="bg-white/[0.03]"><th class="w-[70px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">HTTP</th><th class="w-[220px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Code</th><th class="border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Meaning</th></tr></thead><tbody><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">401</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">MISSING_API_KEY</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">No <code>x-api-key</code> header was sent.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">401</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">INVALID_KEY_FORMAT</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The key doesn't start with <code>jsf_</code> or is too short.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">401</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">INVALID_API_KEY</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The key doesn't match any account.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">403</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">SUBSCRIPTION_INACTIVE</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The account's subscription is turned off.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">403</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">KEY_EXPIRED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The key's expiry date has passed.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">503</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">AUTH_SERVICE_ERROR</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Authentication backend was briefly unavailable. Retry shortly.</td></tr></tbody></table></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Request & quota</h4><div class="my-3 overflow-hidden rounded-xl border border-white/[0.08]"><table class="w-full border-collapse text-[13.5px]"><thead><tr class="bg-white/[0.03]"><th class="w-[70px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">HTTP</th><th class="w-[220px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Code</th><th class="border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Meaning</th></tr></thead><tbody><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">429</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">RATE_LIMITED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Over 50 requests/min. Wait for <code>Retry-After</code> seconds.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">400</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">INVALID_JSON</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Text-to-speech body wasn't valid JSON.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">400</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">INVALID_CONTENT_TYPE</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Clone body wasn't multipart/form-data.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">422</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">VALIDATION_ERROR</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">One or more fields are invalid. See the <code>fields</code> object.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">400</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">INVALID_VOICE_ID</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The <code>voice_id</code> is not a valid <code>jsf_</code> id.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">402</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">INSUFFICIENT_CHARACTERS</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Not enough character balance for this request.</td></tr></tbody></table></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Cloning</h4><div class="my-3 overflow-hidden rounded-xl border border-white/[0.08]"><table class="w-full border-collapse text-[13.5px]"><thead><tr class="bg-white/[0.03]"><th class="w-[70px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">HTTP</th><th class="w-[220px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Code</th><th class="border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Meaning</th></tr></thead><tbody><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">422</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">AUDIO_REJECTED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The sample couldn't be processed. Use a clearer 10â30s recording.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">413</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">AUDIO_TOO_LARGE</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The sample exceeds the size limit. Upload something shorter.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">429</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">CLONING_CAPACITY</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The cloning engine is momentarily at capacity. Retry soon.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">503</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">CLONING_SERVICE_DOWN</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The cloning engine is temporarily unavailable.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">502</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">CLONING_FAILED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&
72_code]:text-zinc-200">Cloning failed unexpectedly. Retry.</td></tr></tbody></table></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Text to speech</h4><div class="my-3 overflow-hidden rounded-xl border border-white/[0.08]"><table class="w-full border-collapse text-[13.5px]"><thead><tr class="bg-white/[0.03]"><th class="w-[70px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">HTTP</th><th class="w-[220px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Code</th><th class="border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Meaning</th></tr></thead><tbody><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">504</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">GENERATION_TIMEOUT</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Generation took too long. Try shorter text.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">502</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">GENERATION_FAILED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Generation failed unexpectedly. Retry.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">502</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">AUDIO_SAVE_FAILED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">Audio was generated but couldn't be stored. Retry.</td></tr></tbody></table></div><h4 class="mb-3 mt-8 font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-500">Server</h4><div class="my-3 overflow-hidden rounded-xl border border-white/[0.08]"><table class="w-full border-collapse text-[13.5px]"><thead><tr class="bg-white/[0.03]"><th class="w-[70px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">HTTP</th><th class="w-[220px] border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Code</th><th class="border-b border-white/[0.08] px-4 py-3 text-left font-mono text-[10.5px] font-semibold uppercase tracking-wider text-zinc-500">Meaning</th></tr></thead><tbody><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">500</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">DB_SAVE_FAILED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The voice was created but the record couldn't be saved. Contact support with the returned reference.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">500</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">INTERNAL_ERROR</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">An unexpected server error. Retry, then contact support.</td></tr><tr class="transition-colors hover:bg-white/[0.02]"><td class="border-b border-white/[0.08] px-4 py-3 align-top font-mono font-semibold text-amber-400/90 last:border-0">405</td><td class="whitespace-nowrap border-b border-white/[0.08] px-4 py-3 align-top font-mono text-[12.5px] text-[#ff8a50]">METHOD_NOT_ALLOWED</td><td class="border-b border-white/[0.08] px-4 py-3 align-top text-zinc-300 [&_code]:rounded [&_code]:border [&_code]:border-white/10 [&_code]:bg-white/[0.05] [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-[12px] [&_code]:text-zinc-200">The endpoint only accepts POST.</td></tr></tbody></table></div><div class="mt-10 flex flex-wrap justify-between gap-3 border-t border-white/[0.08] pt-6 text-[13px] text-zinc-500"><span>JSF Labs API · v1</span><span>Questions? <a href="mailto:[email protected]" class="text-[#ff8a50] underline decoration-[#ff8a50]/30 underline-offset-2">[email protected]</a></span></div></div></section></div></main></div></div><!--$--><!--/$-->
72<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"JSF Labs","url":"https://jsflabs.io","logo":"https://jsflabs.io/logo.png","description":"AI voice cloning, text to speech, speech-to-text, voice dubbing, and voice design platform built in Pakistan.","foundingLocation":{"@type":"Place","name":"Pakistan"},"sameAs":["https://twitter.com/jsflabs","https://github.com/jsflabs","https://linkedin.com/company/jsflabs"],"founder":[{"@type":"Person","name":"Jawad Khan","jobTitle":"AI Engineer","affiliation":{"@type":"EducationalOrganization","name":"Islamia University of Bahawalpur"}},{"@type":"Person","name":"Fahad"},{"@type":"Person","name":"Sajjad"}]}</script>
72<script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"JSF Labs","url":"https://jsflabs.io","applicationCategory":"MultimediaApplication","operatingSystem":"Web","offers":{"@type":"Offer","price":"0","priceCurrency":"USD","description":"Free plan available. Paid plans with higher usage limits."},"description":"AI-powered voice cloning, text to speech, speech-to-text, voice dubbing and voice design â built in Pakistan.","featureList":["Text to Speech â JSF Labs 1.5 Mini (fast) and JSF Labs 1.5 Max (ultra quality)","Voice Cloning â clone any voice from 30 seconds of audio","Voice Design â generate a new AI voice from a text prompt","Speech to Speech â real-time voice conversion","Speech to Text â accurate AI transcription in 30+ languages","Voice Dubbing â dub videos into any language automatically"],"screenshot":"https://jsflabs.io/og/home-1200x630.png"}</script>
72<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"JSF Labs","url":"https://jsflabs.io","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://jsflabs.io/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}</script>
72<script src="/_next/static/chunks/8e533c7b3b901b07.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M" id="_R_" async=""></script>
72<script>(self.__next_f=self.__next_f||[]).push([0])</script>
72<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[68581,[\"/_next/static/chunks/42dc04c16cb206a9.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/7f6648eee67d69e1.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"AuthProvider\"]\n3:I[846696,[\"/_next/static/chunks/42dc04c16cb206a9.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/7f6648eee67d69e1.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"Toaster\"]\n4:I[339756,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/d80b3790a119a285.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"default\"]\n5:I[837457,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/d80b3790a119a285.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"default\"]\na:I[168027,[],\"default\"]\n:HL[\"/_next/static/chunks/1b66667454ec4256.css?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"style\"]\n:HL[\"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700\u0026display=swap\",\"style\"]\n"])</script>
72<script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"rVnqImSdE1RyH0dQYUngX\",\"c\":[\"\",\"api-docs\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"api-docs\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1b66667454ec4256.css?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/42dc04c16cb206a9.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/7f6648eee67d69e1.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"meta\",null,{\"name\":\"google-site-verification\",\"content\":\"GfxBgEpn5XdnADHBKEzEyJwmnUg3DBCVLtC6qPpGvww\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://fonts.googleapis.com\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://fonts.gstatic.com\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"href\":\"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700\u0026display=swap\",\"rel\":\"stylesheet\"}]]}],[\"$\",\"body\",null,{\"className\":\"bg-[#0f0f0f]\",\"children\":[[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"$L3\",null,{\"richColors\":true,\"position\":\"top-right\",\"closeButton\":true}],[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"JSF Labs\\\",\\\"url\\\":\\\"https://jsflabs.io\\\",\\\"logo\\\":\\\"https://jsflabs.io/logo.png\\\",\\\"description\\\":\\\"AI voice cloning, text to speech, speech-to-text, voice dubbing, and voice design platform built in Pakistan.\\\",\\\"foundingLocation\\\":{\\\"@type\\\":\\\"Place\\\",\\\"name\\\":\\\"Pakistan\\\"},\\\"sameAs\\\":[\\\"https://twitter.com/jsflabs\\\",\\\"https://github.com/jsflabs\\\",\\\"https://linkedin.com/company/jsflabs\\\"],\\\"founder\\\":[{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Jawad Khan\\\",\\\"jobTitle\\\":\\\"AI Engineer\\\",\\\"affiliation\\\":{\\\"@type\\\":\\\"EducationalOrganization\\\",\\\"name\\\":\\\"Islamia University of Bahawalpur\\\"}},{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Fahad\\\"},{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Sajjad\\\"}]}\"}}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"name\\\":\\\"JSF Labs\\\",\\\"url\\\":\\\"https://jsflabs.io\\\",\\\"applicationCategory\\\":\\\"MultimediaApplication\\\",\\\"o
72peratingSystem\\\":\\\"Web\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\",\\\"description\\\":\\\"Free plan available. Paid plans with higher usage limits.\\\"},\\\"description\\\":\\\"AI-powered voice cloning, text to speech, speech-to-text, voice dubbing and voice design â built in Pakistan.\\\",\\\"featureList\\\":[\\\"Text to Speech â JSF Labs 1.5 Mini (fast) and JSF Labs 1.5 Max (ultra quality)\\\",\\\"Voice Cloning â clone any voice from 30 seconds of audio\\\",\\\"Voice Design â generate a new AI voice from a text prompt\\\",\\\"Speech to Speech â real-time voice conversion\\\",\\\"Speech to Text â accurate AI transcription in 30+ languages\\\",\\\"Voice Dubbing â dub videos into any language automatically\\\"],\\\"screenshot\\\":\\\"https://jsflabs.io/og/home-1200x630.png\\\"}\"}}],\"$L6\"]}]]}]]}],{\"children\":[\"$L7\",{\"children\":[\"$L8\",{},null,false,false]},null,false,false]},null,false,false],\"$L9\",false]],\"m\":\"$undefined\",\"G\":[\"$a\",[]],\"S\":true}\n"])</script>
72<script>self.__next_f.push([1,"b:I[996774,[\"/_next/static/chunks/42dc04c16cb206a9.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/7f6648eee67d69e1.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/88257703cb7c277d.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"default\"]\nc:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/d80b3790a119a285.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"OutletBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/d80b3790a119a285.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"ViewportBoundary\"]\n11:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/d80b3790a119a285.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"MetadataBoundary\"]\n6:[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"WebSite\\\",\\\"name\\\":\\\"JSF Labs\\\",\\\"url\\\":\\\"https://jsflabs.io\\\",\\\"potentialAction\\\":{\\\"@type\\\":\\\"SearchAction\\\",\\\"target\\\":{\\\"@type\\\":\\\"EntryPoint\\\",\\\"urlTemplate\\\":\\\"https://jsflabs.io/search?q={search_term_string}\\\"},\\\"query-input\\\":\\\"required name=search_term_string\\\"}}\"}}]\n7:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n8:[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"children\":[\"$\",\"$Lb\",null,{}]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/88257703cb7c277d.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$d\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@e\"}]}]]}]\n9:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lf\",null,{\"children\":\"$@10\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$d\",null,{\"name\":\"Next.Metadata\",\"children\":\"$@12\"}]}]}],null]}]\n"])</script>
72<script>self.__next_f.push([1,"10:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0f0f0f\"}]]\n"])</script>
72<script>self.__next_f.push([1,"13:I[27201,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\",\"/_next/static/chunks/d80b3790a119a285.js?dpl=dpl_FuZGfW4RUEXCR4egwrp5F4zo425M\"],\"IconMark\"]\n"])</script>
72<script>self.__next_f.push([1,"12:[[\"$\",\"title\",\"0\",{\"children\":\"JSF Labs â AI Voice Cloning \u0026 Text to Speech | Pakistan\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"JSF Labs delivers next-gen AI voice cloning, text to speech (JSF Labs 1.5 Mini \u0026 Max), speech-to-text, voice dubbing, and voice design. The leading ElevenLabs alternative from Pakistan. Free TTS for new users â no credit card required.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"keywords\",\"content\":\"AI voice cloning,text to speech Pakistan,ElevenLabs alternative,JSF Labs,JSF Labs 1.5 Mini,JSF Labs 1.5 Max,speech to text online,voice dubbing AI,voice design AI,speech to speech,free text to speech,voice cloning free\"}],[\"$\",\"meta\",\"3\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"4\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"link\",\"5\",{\"rel\":\"canonical\",\"href\":\"https://jsflabs.io\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:title\",\"content\":\"JSF Labs â AI Voice Cloning \u0026 Text to Speech\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:description\",\"content\":\"Clone voices, generate realistic TTS, transcribe audio, and dub videos with JSF Labs â Pakistan's most advanced AI voice platform. Powered by JSF Labs 1.5 Mini \u0026 Max models.\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:url\",\"content\":\"https://jsflabs.io\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:site_name\",\"content\":\"JSF Labs\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image\",\"content\":\"https://jsflabs.io/og/home-1200x630.png\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:alt\",\"content\":\"JSF Labs â AI Voice Cloning \u0026 Text to Speech Platform\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:site\",\"content\":\"@jsflabs\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:creator\",\"content\":\"@jawadkhan\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:title\",\"content\":\"JSF Labs â AI Voice Cloning \u0026 TTS | Pakistan\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:description\",\"content\":\"The fastest ElevenLabs alternative. Clone voices, TTS, STT, dubbing \u0026 voice design â powered by JSF Labs 1.5 Mini \u0026 Max. Free to start.\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:image\",\"content\":\"https://jsflabs.io/og/home-1200x630.png\"}],[\"$\",\"link\",\"23\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.e220c93c.ico\",\"sizes\":\"300x300\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"24\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"link\",\"25\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\"}],[\"$\",\"$L13\",\"26\",{}]]\n"])</script>
72<script>self.__next_f.push([1,"e:null\n"])</script>
72</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.