{"openapi":"3.1.0","info":{"title":"Lambbi speech API","version":"2026-10-26","description":"Haitian Creole (Kreyòl) text to speech (Fatiman) and speech to text (Oswald). Both routes answer directly: no jobs to poll. Every request needs an API key, made in your Lambbi dashboard (https://www.lambbi.xyz/en/dashboard/api-keys) and sent as `Authorization: Bearer lb_…`. Billed per second of audio at 1 credit a minute (2 HTG), after each account's 5 free minutes a month; a failed request is not charged. Also limited per IP address."},"servers":[{"url":"https://www.lambbi.xyz"}],"security":[{"bearerAuth":[]}],"paths":{"/api/tts":{"post":{"operationId":"textToSpeech","summary":"Read Kreyòl text aloud","description":"Reads one piece of Kreyòl text (at most 1200 characters) and returns a WAV file: 24000 Hz, 16-bit, mono. Numbers, dates, times, prices, percentages, phone numbers and web addresses are spelled out as they are said. For longer text, send it in pieces (sentence by sentence) and play each as it arrives. Billed for the seconds of audio made. Limit: 90 requests per 10 minutes per IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TtsRequest"},"example":{"text":"Bonjou! Ki jan ou ye jodi a?","voice":"female1","model":"v3"}}}},"responses":{"200":{"description":"The audio.","headers":{"X-Audio-Seconds":{"description":"Length of the audio, in seconds.","schema":{"type":"string"}},"X-Made-Ms":{"description":"Time the voice service took to make it, in milliseconds.","schema":{"type":"string"}},"X-Model":{"description":"The model that read it: v1, v2 or v3.","schema":{"type":"string"}},"X-Settings":{"description":"JSON of the reading settings actually used, after bringing out-of-range values to the nearest end, e.g. {\"temperature\":0.3,\"lsd_steps\":1,\"eos_threshold\":-4.0,\"cfg\":1.0,\"pause_ms\":300}.","schema":{"type":"string"}},"X-Charged-Seconds":{"description":"Seconds of audio this request was billed for: the audio made (text to speech) or heard (speech to text).","schema":{"type":"string"}},"X-Credits-Used":{"description":"Credits this request took from your balance; 0 while it fits in your free minutes.","schema":{"type":"string"}},"X-Credits-Left":{"description":"Credits left on your account after this request.","schema":{"type":"string"}},"X-Free-Seconds-Left":{"description":"Free seconds left on your account this month.","schema":{"type":"string"}}},"content":{"audio/wav":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request is not what the route expects (missing text, unknown voice/model/translate, a setting that is not a number, no audio). `error` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key (`code: \"no_key\"`) or a key that is not valid or was revoked (`code: \"bad_key\"`). Send `Authorization: Bearer lb_…` with a key from your dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string"}}}},"402":{"description":"Your free minutes and credit have run out (`code: \"no_credit\"`). Add credit in your dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Too long: text over 1200 characters, or audio over 25 MB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from your address. Wait the number of seconds in the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The speech service failed. Retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The speech service took too long, usually a cold start: the first call after ~5 quiet minutes waits up to ~30 s while a machine loads the models. Retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/asr":{"post":{"operationId":"speechToText","summary":"Write down the Kreyòl in an audio file","description":"Transcribes Haitian Creole speech with Oswald-ASR-0.6-V3. Send the audio file as the raw request body with its Content-Type (audio/wav, audio/mpeg, audio/mp4, audio/ogg, audio/webm…), or as a multipart/form-data field named \"file\". At most 25 MB; the first 120 seconds are heard. Billed for the seconds heard (at most 120). Limit: 30 requests per 10 minutes per IP.","parameters":[{"name":"punctuate","in":"query","required":false,"description":"`0` returns the text exactly as heard (no punctuation), about a second sooner. Default: punctuation and capitals are added, without changing any word.","schema":{"type":"string","enum":["0","1"]}},{"name":"correct","in":"query","required":false,"description":"`1` also corrects words the recognizer misheard, the spelling and words said twice by accident (Lambbi AI). `heard` keeps the raw text. A correction that rewrites more than 40% of the words is not used; you get the punctuated text instead.","schema":{"type":"string","enum":["0","1"]}},{"name":"translate","in":"query","required":false,"description":"`en`, `fr` or `es`: also translate the (punctuated or corrected) Kreyòl text into English, French or Spanish, returned in `translation`.","schema":{"type":"string","enum":["en","fr","es"]}}],"requestBody":{"required":true,"content":{"audio/*":{"schema":{"type":"string","format":"binary"}},"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"The transcript.","headers":{"X-Charged-Seconds":{"description":"Seconds of audio this request was billed for: the audio made (text to speech) or heard (speech to text).","schema":{"type":"string"}},"X-Credits-Used":{"description":"Credits this request took from your balance; 0 while it fits in your free minutes.","schema":{"type":"string"}},"X-Credits-Left":{"description":"Credits left on your account after this request.","schema":{"type":"string"}},"X-Free-Seconds-Left":{"description":"Free seconds left on your account this month.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsrResponse"},"example":{"text":"Bonjou, ki jan ou ye jodi a?","heard":"bonjou ki jan ou ye jodi a","punctuated":true,"corrected":false,"seconds":3.4,"ms":1890,"maxSeconds":120,"charged":{"seconds":3.4,"credits":0,"creditsLeft":25,"freeSecondsLeft":296}}}}},"400":{"description":"The request is not what the route expects (missing text, unknown voice/model/translate, a setting that is not a number, no audio). `error` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key (`code: \"no_key\"`) or a key that is not valid or was revoked (`code: \"bad_key\"`). Send `Authorization: Bearer lb_…` with a key from your dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"WWW-Authenticate":{"description":"Always `Bearer`.","schema":{"type":"string"}}}},"402":{"description":"Your free minutes and credit have run out (`code: \"no_credit\"`). Add credit in your dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Too long: text over 1200 characters, or audio over 25 MB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from your address. Wait the number of seconds in the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The speech service failed. Retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The speech service took too long, usually a cold start: the first call after ~5 quiet minutes waits up to ~30 s while a machine loads the models. Retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"TtsRequest":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1,"maxLength":1200,"description":"Kreyòl text to read."},"voice":{"type":"string","enum":["female1","female2","female3","female4","female5","female6","man1","man2","man3","nouvo1","nouvo2","nouvo3","nouvo4"],"default":"female1","description":"The voice: female1 (Fanm 1, female); female2 (Fanm 2, female); female3 (Fanm 3, female); female4 (Fanm 4, female); female5 (Fanm 5, female); female6 (Fanm 6, female); man1 (Gason 1, male); man2 (Gason 2, male); man3 (Gason 3, male); nouvo1 (Gason 4, male, a new voice that belongs to no real person); nouvo2 (Gason 5, male, a new voice that belongs to no real person); nouvo3 (Gason 6, male, a new voice that belongs to no real person); nouvo4 (Gason 7, male, a new voice that belongs to no real person)."},"model":{"type":"string","enum":["v1","v2","v3"],"default":"v1","description":"v1: Fatiman-TTS-v1, the first model (open weights). The default. v2: Fatiman v2, trained on real human voices only; as clear as v1. v3: Fatiman V3, the newest: the most natural and the closest to each voice in our tests."},"continues":{"type":"boolean","default":false,"description":"The text carries on a sentence cut at a comma, so it is not read as a new sentence (its first letter stays small)."},"temperature":{"type":"number","minimum":0.1,"maximum":1,"description":"How freely the voice reads: lower is more even, higher more varied. Default: 0.7 for v1 and v2, 0.3 for v3. Out-of-range values are brought to the nearest end."},"lsd_steps":{"type":"integer","minimum":1,"maximum":8,"description":"Generation steps per sound frame. More is slower and rarely clearer. Default: 1. Out-of-range values are brought to the nearest end."},"eos_threshold":{"type":"number","minimum":-6,"maximum":2,"description":"When the voice decides the text is over. Lower ends sooner and can cut the last word; higher waits longer. Default: -4. Out-of-range values are brought to the nearest end."},"cfg":{"type":"number","minimum":1,"maximum":3,"description":"Guidance toward the text. Above 1 the voice follows the text more closely, in about twice the time; 1 is off. Default: 1. Out-of-range values are brought to the nearest end."},"pause_ms":{"type":"integer","minimum":0,"maximum":2000,"description":"Longest silence kept, in milliseconds: longer pauses are shortened to this. 0 keeps every pause as made (otherwise 100 to 2000). Default: 300. Out-of-range values are brought to the nearest end."}}},"AsrResponse":{"type":"object","required":["text","heard","punctuated","corrected","seconds","ms","charged"],"properties":{"text":{"type":"string","description":"The transcript in Kreyòl spelling, punctuated (and corrected with correct=1). Empty when nothing was heard."},"heard":{"type":"string","description":"What the recognizer (Oswald-ASR-0.6-V3) wrote, lowercase, without punctuation."},"punctuated":{"type":"boolean","description":"Whether punctuation was added."},"corrected":{"type":"boolean","description":"Whether the auto-correction was applied."},"translation":{"type":["string","null"],"description":"With translate=…: the translation; null if it failed. Absent without translate."},"translatedTo":{"type":"string","description":"With translate=…: the language code of translation."},"seconds":{"type":"number","description":"How many seconds of audio were heard."},"ms":{"type":"number","description":"Server time in milliseconds, punctuation, correction and translation included."},"maxSeconds":{"type":"number","description":"The most audio heard per request (120)."},"charged":{"$ref":"#/components/schemas/Charged"}}},"Charged":{"type":"object","description":"What this request cost: `seconds` billed, `credits` used, `creditsLeft` and `freeSecondsLeft` on your account after it (the same as the X-Charged-Seconds, X-Credits-Used, X-Credits-Left and X-Free-Seconds-Left headers).","required":["seconds","credits","creditsLeft","freeSecondsLeft"],"properties":{"seconds":{"type":"number","description":"Seconds of audio billed (those heard, at most 120)."},"credits":{"type":"number","description":"Credits this request used; 0 while it fits in your free minutes."},"creditsLeft":{"type":"number","description":"Credits left on your account after it."},"freeSecondsLeft":{"type":"number","description":"Free seconds left on your account this month."}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"What went wrong, in English."},"code":{"type":"string","enum":["no_key","bad_key","no_credit"],"description":"Only on 401 and 402: no_key (no key sent), bad_key (a key that is not valid or was revoked), no_credit (no free minutes or credit left)."}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"lb_…","description":"An API key from your Lambbi dashboard (https://www.lambbi.xyz/en/dashboard/api-keys): shown once when made, revocable, at most 10 per account."}}}}