[{"data":1,"prerenderedAt":753},["ShallowReactive",2],{"navigation":3,"\u002Fstart\u002Fauthentication":220,"\u002Fstart\u002Fauthentication-surround":748},[4,28,64,92,124,152,192],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Start","\u002Fstart","1.start\u002F1.index",[9,11,15,19,23],{"title":10,"path":6,"stem":7},"Overview",{"title":12,"path":13,"stem":14},"Quickstart","\u002Fstart\u002Fquickstart","1.start\u002F2.quickstart",{"title":16,"path":17,"stem":18},"Authentication","\u002Fstart\u002Fauthentication","1.start\u002F3.authentication",{"title":20,"path":21,"stem":22},"SDKs","\u002Fstart\u002Fsdks","1.start\u002F4.sdks",{"title":24,"path":25,"stem":26},"Choose an API","\u002Fstart\u002Fchoose-an-api","1.start\u002F5.choose-an-api","i-lucide-rocket",{"title":29,"path":30,"stem":31,"children":32,"icon":63},"Realtime","\u002Frealtime","2.realtime\u002F1.index",[33,35,39,43,47,51,55,59],{"title":34,"path":30,"stem":31},"Realtime Overview",{"title":36,"path":37,"stem":38},"Realtime Quickstart","\u002Frealtime\u002Fquickstart","2.realtime\u002F2.quickstart",{"title":40,"path":41,"stem":42},"Connection Lifecycle","\u002Frealtime\u002Fconnection-lifecycle","2.realtime\u002F3.connection-lifecycle",{"title":44,"path":45,"stem":46},"Audio Input","\u002Frealtime\u002Faudio-input","2.realtime\u002F4.audio-input",{"title":48,"path":49,"stem":50},"Transcript Lifecycle","\u002Frealtime\u002Ftranscript-lifecycle","2.realtime\u002F5.transcript-lifecycle",{"title":52,"path":53,"stem":54},"Realtime Translation","\u002Frealtime\u002Frealtime-translation","2.realtime\u002F6.realtime-translation",{"title":56,"path":57,"stem":58},"Session Configuration","\u002Frealtime\u002Fsession-configuration","2.realtime\u002F7.session-configuration",{"title":60,"path":61,"stem":62},"Handling Interruptions & Silence","\u002Frealtime\u002Finterruptions-silence","2.realtime\u002F8.interruptions-silence","i-lucide-radio",{"title":65,"path":66,"stem":67,"children":68,"icon":91},"Recorded","\u002Frecorded","3.recorded\u002F1.index",[69,71,75,79,83,87],{"title":70,"path":66,"stem":67},"Recorded Overview",{"title":72,"path":73,"stem":74},"Transcribe Audio","\u002Frecorded\u002Ftranscribe-audio","3.recorded\u002F2.transcribe-audio",{"title":76,"path":77,"stem":78},"Timestamps & Speakers","\u002Frecorded\u002Ftimestamps-speakers","3.recorded\u002F3.timestamps-speakers",{"title":80,"path":81,"stem":82},"Subtitles","\u002Frecorded\u002Fsubtitles","3.recorded\u002F4.subtitles",{"title":84,"path":85,"stem":86},"Recorded Translation","\u002Frecorded\u002Ftranslation","3.recorded\u002F5.translation",{"title":88,"path":89,"stem":90},"Structured Results","\u002Frecorded\u002Fstructured-results","3.recorded\u002F6.structured-results","i-lucide-file-audio",{"title":93,"path":94,"stem":95,"children":96,"icon":123},"Concepts","\u002Fconcepts","4.concepts\u002F1.index",[97,99,103,107,111,115,119],{"title":98,"path":94,"stem":95},"Voice Context Layer",{"title":100,"path":101,"stem":102},"Stable vs. Partial Text","\u002Fconcepts\u002Fstable-vs-partial-text","4.concepts\u002F2.stable-vs-partial-text",{"title":104,"path":105,"stem":106},"StableStream","\u002Fconcepts\u002Fstablestream","4.concepts\u002F3.stablestream",{"title":108,"path":109,"stem":110},"Context-Aware Processing","\u002Fconcepts\u002Fcontext-aware-processing","4.concepts\u002F4.context-aware-processing",{"title":112,"path":113,"stem":114},"Understanding Latency","\u002Fconcepts\u002Flatency","4.concepts\u002F5.latency",{"title":116,"path":117,"stem":118},"Live Translation","\u002Fconcepts\u002Flive-translation","4.concepts\u002F6.live-translation",{"title":120,"path":121,"stem":122},"Trinity Engine","\u002Fconcepts\u002Ftrinity-engine","4.concepts\u002F7.trinity-engine","i-lucide-brain",{"title":125,"path":126,"stem":127,"children":128,"icon":151},"Guides","\u002Fguides","5.guides\u002F1.index",[129,131,135,139,143,147],{"title":130,"path":126,"stem":127},"Browser Live Captions",{"title":132,"path":133,"stem":134},"Server-side Streaming","\u002Fguides\u002Fserver-side-streaming","5.guides\u002F2.server-side-streaming",{"title":136,"path":137,"stem":138},"Build a Stable Caption UI","\u002Fguides\u002Fstable-caption-ui","5.guides\u002F3.stable-caption-ui",{"title":140,"path":141,"stem":142},"Build Live Translation","\u002Fguides\u002Flive-translation","5.guides\u002F4.live-translation",{"title":144,"path":145,"stem":146},"Save a Transcript","\u002Fguides\u002Fsave-transcript","5.guides\u002F5.save-transcript",{"title":148,"path":149,"stem":150},"Reconnect a Live Session","\u002Fguides\u002Freconnection","5.guides\u002F6.reconnection","i-lucide-book-open",{"title":153,"path":154,"stem":155,"children":156,"icon":191},"Reference","\u002Fapi-reference","6.api-reference\u002F1.index",[157,159,163,167,171,175,179,183,187],{"title":158,"path":154,"stem":155},"API Reference Overview",{"title":160,"path":161,"stem":162},"Realtime API","\u002Fapi-reference\u002Frealtime-api","6.api-reference\u002F2.realtime-api",{"title":164,"path":165,"stem":166},"Client Messages","\u002Fapi-reference\u002Fclient-messages","6.api-reference\u002F3.client-messages",{"title":168,"path":169,"stem":170},"Server Events","\u002Fapi-reference\u002Fserver-events","6.api-reference\u002F4.server-events",{"title":172,"path":173,"stem":174},"Transcription API","\u002Fapi-reference\u002Ftranscription","6.api-reference\u002F5.transcription",{"title":176,"path":177,"stem":178},"Languages & Models","\u002Fapi-reference\u002Flanguages","6.api-reference\u002F6.languages",{"title":180,"path":181,"stem":182},"Errors","\u002Fapi-reference\u002Ferrors","6.api-reference\u002F7.errors",{"title":184,"path":185,"stem":186},"Rate Limits","\u002Fapi-reference\u002Frate-limits","6.api-reference\u002F8.rate-limits",{"title":188,"path":189,"stem":190},"Admin API","\u002Fapi-reference\u002Fadmin","6.api-reference\u002F9.admin","i-lucide-code",{"title":193,"path":194,"stem":195,"children":196,"icon":219},"Production","\u002Fproduction","7.production\u002F1.index",[197,199,203,207,211,215],{"title":198,"path":194,"stem":195},"Production Checklist",{"title":200,"path":201,"stem":202},"Reconnection & Retries","\u002Fproduction\u002Freconnection-retries","7.production\u002F2.reconnection-retries",{"title":204,"path":205,"stem":206},"Latency Best Practices","\u002Fproduction\u002Flatency-best-practices","7.production\u002F3.latency-best-practices",{"title":208,"path":209,"stem":210},"Security & Privacy","\u002Fproduction\u002Fsecurity-privacy","7.production\u002F4.security-privacy",{"title":212,"path":213,"stem":214},"Data Retention","\u002Fproduction\u002Fdata-retention","7.production\u002F5.data-retention",{"title":216,"path":217,"stem":218},"Changelog","\u002Fproduction\u002Fchangelog","7.production\u002F6.changelog","i-lucide-server",{"id":221,"title":16,"body":222,"description":741,"extension":742,"links":743,"meta":744,"navigation":745,"path":17,"seo":746,"status":743,"stem":18,"__hash__":747},"docs\u002F1.start\u002F3.authentication.md",{"type":223,"value":224,"toc":728},"minimark",[225,229,234,254,258,265,300,303,307,315,320,323,331,335,407,411,492,502,506,509,561,576,579,590,594,697,703,707,724],[226,227,228],"p",{},"All API requests require an API key. This page explains the key format, usage patterns, and browser-side security model.",[230,231,233],"h2",{"id":232},"api-key-format","API key format",[235,236,237,245,248],"ul",{},[238,239,240,241],"li",{},"Prefix: ",[242,243,244],"code",{},"sk-",[238,246,247],{},"The plaintext key is returned only once at provisioning. The server stores only a SHA-256 hash.",[238,249,250,251,253],{},"Minimum length: 16 characters (at least 13 characters after ",[242,252,244],{},")",[230,255,257],{"id":256},"server-side-usage","Server-side usage",[226,259,260,261,264],{},"All endpoints accept the key via the ",[242,262,263],{},"Authorization: Bearer"," header:",[266,267,272],"pre",{"className":268,"code":269,"language":270,"meta":271,"style":271},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -H \"Authorization: Bearer sk-...\" https:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\n","bash","",[242,273,274],{"__ignoreMap":271},[275,276,279,283,287,291,294,297],"span",{"class":277,"line":278},"line",1,[275,280,282],{"class":281},"sBMFI","curl",[275,284,286],{"class":285},"sfazB"," -H",[275,288,290],{"class":289},"sMK4o"," \"",[275,292,293],{"class":285},"Authorization: Bearer sk-...",[275,295,296],{"class":289},"\"",[275,298,299],{"class":285}," https:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\n",[226,301,302],{},"This works for both offline HTTP requests and WebSocket upgrade handshakes.",[230,304,306],{"id":305},"browser-side-security","Browser-side security",[308,309,312],"callout",{"color":310,"icon":311},"red","i-lucide-circle-alert",[226,313,314],{},"Never expose your long-lived API key in frontend code or WebSocket URLs. Use a short-lived session token for browser connections.",[316,317,319],"h3",{"id":318},"session-token-flow","Session token flow",[226,321,322],{},"Browsers cannot safely store a long-lived key. LansonAI provides a short-lived token mechanism:",[266,324,329],{"className":325,"code":327,"language":328},[326],"language-text","1. Frontend → your backend: request a session token\n2. Your backend → LansonAI:\n   POST \u002Fv1\u002Faudio\u002Ftranscriptions\u002Fsession-token\n   Authorization: Bearer sk-...   (your long-lived key, server-side only)\n3. LansonAI → your backend: returns rt_... token (valid 60 seconds)\n4. Your backend → frontend: pass the rt_... token\n5. Frontend → LansonAI: open WebSocket\n   ?access_token=rt_...\n","text",[242,330,327],{"__ignoreMap":271},[316,332,334],{"id":333},"session-token-details","Session token details",[336,337,338,351],"table",{},[339,340,341],"thead",{},[342,343,344,348],"tr",{},[345,346,347],"th",{},"Property",[345,349,350],{},"Value",[352,353,354,365,373,381,392],"tbody",{},[342,355,356,360],{},[357,358,359],"td",{},"Prefix",[357,361,362],{},[242,363,364],{},"rt_",[342,366,367,370],{},[357,368,369],{},"Validity",[357,371,372],{},"60 seconds",[342,374,375,378],{},[357,376,377],{},"Signature",[357,379,380],{},"HMAC-SHA256",[342,382,383,386],{},[357,384,385],{},"Signing secret",[357,387,388,391],{},[242,389,390],{},"GATEWAY_SESSION_TOKEN_SECRET"," (server-side config)",[342,393,394,397],{},[357,395,396],{},"Transport",[357,398,399,400,403,404],{},"URL query ",[242,401,402],{},"?access_token=rt_..."," or ",[242,405,406],{},"?token=rt_...",[316,408,410],{"id":409},"token-response","Token response",[266,412,416],{"className":413,"code":414,"language":415,"meta":271,"style":271},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"token\": \"rt_eyJ...\",\n  \"expires_in\": 60,\n  \"endpoint\": \"\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fstream\"\n}\n","json",[242,417,418,423,448,466,486],{"__ignoreMap":271},[275,419,420],{"class":277,"line":278},[275,421,422],{"class":289},"{\n",[275,424,426,429,433,435,438,440,443,445],{"class":277,"line":425},2,[275,427,428],{"class":289},"  \"",[275,430,432],{"class":431},"spNyl","token",[275,434,296],{"class":289},[275,436,437],{"class":289},":",[275,439,290],{"class":289},[275,441,442],{"class":285},"rt_eyJ...",[275,444,296],{"class":289},[275,446,447],{"class":289},",\n",[275,449,451,453,456,458,460,464],{"class":277,"line":450},3,[275,452,428],{"class":289},[275,454,455],{"class":431},"expires_in",[275,457,296],{"class":289},[275,459,437],{"class":289},[275,461,463],{"class":462},"sbssI"," 60",[275,465,447],{"class":289},[275,467,469,471,474,476,478,480,483],{"class":277,"line":468},4,[275,470,428],{"class":289},[275,472,473],{"class":431},"endpoint",[275,475,296],{"class":289},[275,477,437],{"class":289},[275,479,290],{"class":289},[275,481,482],{"class":285},"\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fstream",[275,484,485],{"class":289},"\"\n",[275,487,489],{"class":277,"line":488},5,[275,490,491],{"class":289},"}\n",[226,493,494,495,497,498,501],{},"If ",[242,496,390],{}," is not configured, the endpoint returns ",[242,499,500],{},"503 token_issuer_unavailable",".",[230,503,505],{"id":504},"websocket-authentication-methods","WebSocket authentication methods",[226,507,508],{},"The realtime WebSocket accepts three authentication methods:",[336,510,511,524],{},[339,512,513],{},[342,514,515,518,521],{},[345,516,517],{},"Method",[345,519,520],{},"Use case",[345,522,523],{},"Usage",[352,525,526,538,550],{},[342,527,528,532,535],{},[357,529,530],{},[242,531,293],{},[357,533,534],{},"Server-side clients",[357,536,537],{},"HTTP upgrade header",[342,539,540,544,547],{},[357,541,542],{},[242,543,402],{},[357,545,546],{},"Browser",[357,548,549],{},"URL query parameter",[342,551,552,556,558],{},[357,553,554],{},[242,555,406],{},[357,557,546],{},[357,559,560],{},"URL query parameter (alias)",[308,562,565],{"color":563,"icon":564},"amber","i-lucide-triangle-alert",[226,566,567,568,571,572,575],{},"Never put ",[242,569,570],{},"sk-..."," in a URL. Browser connections must always use ",[242,573,574],{},"rt_..."," session tokens.",[230,577,188],{"id":578},"admin-api",[226,580,581,582,585,586,589],{},"Key provisioning, revocation, and plan-catalog endpoints exist under ",[242,583,584],{},"\u002Fv1\u002Fexternal-transcription",", but they are for internal operators and dashboards, not regular API consumers. See ",[587,588,188],"a",{"href":189}," for details.",[230,591,593],{"id":592},"error-handling","Error handling",[336,595,596,609],{},[339,597,598],{},[342,599,600,603,606],{},[345,601,602],{},"Error code",[345,604,605],{},"HTTP",[345,607,608],{},"Cause",[352,610,611,624,636,648,660,673,685],{},[342,612,613,618,621],{},[357,614,615],{},[242,616,617],{},"missing_api_key",[357,619,620],{},"401",[357,622,623],{},"No Authorization header or query token",[342,625,626,631,633],{},[357,627,628],{},[242,629,630],{},"invalid_api_key",[357,632,620],{},[357,634,635],{},"Key format invalid or unknown key",[342,637,638,643,645],{},[357,639,640],{},[242,641,642],{},"revoked_api_key",[357,644,620],{},[357,646,647],{},"Key has been revoked",[342,649,650,655,657],{},[357,651,652],{},[242,653,654],{},"expired_api_key",[357,656,620],{},[357,658,659],{},"Key has expired",[342,661,662,667,670],{},[357,663,664],{},[242,665,666],{},"auth_unavailable",[357,668,669],{},"503",[357,671,672],{},"Key store unavailable",[342,674,675,680,682],{},[357,676,677],{},[242,678,679],{},"invalid_session_token",[357,681,620],{},[357,683,684],{},"Session token invalid or expired",[342,686,687,692,694],{},[357,688,689],{},[242,690,691],{},"token_issuer_unavailable",[357,693,669],{},[357,695,696],{},"Token issuer not configured",[226,698,699,700,702],{},"See ",[587,701,180],{"href":181}," for the full error reference.",[230,704,706],{"id":705},"next-steps","Next steps",[235,708,709,714,719],{},[238,710,711,713],{},[587,712,12],{"href":13}," — first request",[238,715,716,718],{},[587,717,180],{"href":181}," — full error reference",[238,720,721,723],{},[587,722,160],{"href":161}," — WebSocket endpoint details",[725,726,727],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":271,"searchDepth":278,"depth":425,"links":729},[730,731,732,737,738,739,740],{"id":232,"depth":425,"text":233},{"id":256,"depth":425,"text":257},{"id":305,"depth":425,"text":306,"children":733},[734,735,736],{"id":318,"depth":450,"text":319},{"id":333,"depth":450,"text":334},{"id":409,"depth":450,"text":410},{"id":504,"depth":425,"text":505},{"id":578,"depth":425,"text":188},{"id":592,"depth":425,"text":593},{"id":705,"depth":425,"text":706},"API key, session token, and browser-side security.","md",null,{},true,{"title":16,"description":741},"g7896kjecSHk7wg0luqpz9cjwn2JUeQo36lQ9Asqpc8",[749,751],{"title":12,"path":13,"stem":14,"description":750,"children":-1},"Get from zero to your first transcription request in five minutes.",{"title":20,"path":21,"stem":22,"description":752,"children":-1},"Python, TypeScript\u002FJavaScript SDK; installation, versions, GitHub.",1787340798074]