Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.
WSS
/
api
/
velma-2-synthetic-voice-detection-streaming
Real-time synthetic voice detection over WebSocket. Streams audio to the server and receives per-frame verdicts (synthetic, non-synthetic, or no-content) with confidence scores as analysis windows complete.For a conceptual explanation of how detection works — including windowing, silence trimming, and the no-content verdict — see Deepfake Detection.
{"docsConfig":{"theme":"sequoia","$schema":"https://mintlify.com/docs.json","name":"Modulate","description":"Build with the modulate.ai models — real-time transcription, deepfake detection, and PII/PHI redaction at scale.","colors":{"primary":"#285FEB","light":"#5B82F0","dark":"#285FEB"},"logo":{"light":"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/wordmark-navy.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=7ee7a19111bb0154aa2e6934ebd29607","dark":"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/wordmark-white.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=98ae552c2cd0d6bf2268f8374825c88a","href":"https://modulate.ai"},"favicon":"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/favicon.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=d8e2a95af577097e3287379354855376","appearance":{"default":"system"},"navbar":{"links":[{"href":"https://platform.modulate.ai/signin","label":"Sign in"}],"primary":{"type":"button","label":"Start building free","href":"https://platform.modulate.ai/signup-request"}},"footer":{"socials":{"website":"https://modulate.ai"},"links":[{"header":"Product","items":[{"label":"Modulate","href":"https://modulate.ai"},{"label":"Velma Preview","href":"https://preview.modulate.ai"}]},{"header":"Support","items":[{"label":"Email support","href":"mailto:support@modulate.ai"},{"label":"Privacy policy","href":"https://www.modulate.ai/privacy-policy"},{"label":"Report a vulnerability","href":"/security"}]}]},"integrations":{"ga4":{"measurementId":"G-0WV1JKWMB3"}},"contextual":{"options":["copy","view","assistant","chatgpt","claude","perplexity"],"display":"header"},"markdown":{"schema":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"modulateai","hasAudioNarration":false,"actualSubdomain":"modulateai","customDomains":["docs.modulate.ai"],"gitSource":{"type":"gitlab","owner":"modulate","repo":"modulate-user-docs","projectId":81929608,"deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae8b8d621d86b83cef2b55b","collectionId":"edb8ba97-3e05-4ed6-950a-9032b207844d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae8b8d621d86b83cef2b55b"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae8b8d621d86b83cef2b55b","clientVersion":"0.0.4064","searchFilterCounts":[{"language":"default","tag":"API Reference","count":31},{"language":"default","tag":"Velma","count":17},{"language":"default","tag":"Get Started","count":16},{"language":"default","tag":"By capability","count":10},{"language":"default","tag":"Speech-to-text Transcription","count":7},{"language":"default","tag":"Detection packages","count":7},{"language":"default","tag":"Benchmarks","count":6},{"language":"default","tag":"Support","count":4},{"language":"default","tag":"Behaviors","count":4},{"language":"default","tag":"AI Music Detection","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@modulate.ai","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/svd/streaming","slug":"/api-reference/svd/streaming","pageMetadata":{"title":"Deepfake Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_synthetic_voice_detection_streaming.yaml streaming-detection","description":"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.","href":"/api-reference/svd/streaming"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Real-time synthetic voice detection over WebSocket. Streams audio to the server and receives per-frame verdicts (`,_jsx(_components.code,{children:`synthetic`}),`, `,_jsx(_components.code,{children:`non-synthetic`}),`, or `,_jsx(_components.code,{children:`no-content`}),`) with confidence scores as analysis windows complete.`]}),`\n`,_jsxs(_components.p,{children:[`For a conceptual explanation of how detection works — including windowing, silence trimming, and the `,_jsx(_components.code,{children:`no-content`}),` verdict — see `,_jsx(_components.a,{href:`/get-started/deepfake`,children:`Deepfake Detection`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`endpoint`,children:`Endpoint`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`wss://platform.modulate.ai/api/velma-2-synthetic-voice-detection-streaming`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`authentication`,children:`Authentication`}),`\n`,_jsx(_components.p,{children:`Pass your API key as a query parameter when opening the connection.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`wss://platform.modulate.ai/api/velma-2-synthetic-voice-detection-streaming?api_key=YOUR_API_KEY\u0026audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Unlike the batch endpoint, the streaming API does not use an `,_jsx(_components.code,{children:`X-API-Key`}),` header. The key must be in the query string at connection time.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`query-parameters`,children:`Query parameters`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Parameter`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`api_key`})}),_jsx(_components.td,{children:`string`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Your API key`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`audio_format`})}),_jsx(_components.td,{children:`string`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`Audio encoding format — see `,_jsx(_components.a,{href:`/get-started/deepfake`,children:`Deepfake Detection`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sample_rate`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Conditional`}),_jsxs(_components.td,{children:[`Required for raw (headerless) formats. One of: `,_jsx(_components.code,{children:`8000`}),`, `,_jsx(_components.code,{children:`11025`}),`, `,_jsx(_components.code,{children:`16000`}),`, `,_jsx(_components.code,{children:`22050`}),`, `,_jsx(_components.code,{children:`32000`}),`, `,_jsx(_components.code,{children:`44100`}),`, `,_jsx(_components.code,{children:`48000`}),`, `,_jsx(_components.code,{children:`96000`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`num_channels`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Conditional`}),_jsx(_components.td,{children:`Required for raw formats. 1–8`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`For supported format values and format selection guidance, see `,_jsx(_components.a,{href:`/get-started/deepfake`,children:`Deepfake Detection`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`connection-flow`,children:`Connection flow`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Connect with `,_jsx(_components.code,{children:`api_key`}),`, `,_jsx(_components.code,{children:`audio_format`}),`, and (for raw formats) `,_jsx(_components.code,{children:`sample_rate`}),` and `,_jsx(_components.code,{children:`num_channels`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Stream audio as `,_jsx(_components.strong,{children:`binary`}),` WebSocket frames. Frames can be any size.`]}),`\n`,_jsxs(_components.li,{children:[`Receive `,_jsx(_components.code,{children:`frame`}),` JSON messages as analysis windows complete.`]}),`\n`,_jsxs(_components.li,{children:[`Send an `,_jsx(_components.strong,{children:`empty text frame`}),` (`,_jsx(_components.code,{children:`\"\"`}),`) to signal end of audio.`]}),`\n`,_jsxs(_components.li,{children:[`Receive a `,_jsx(_components.code,{children:`done`}),` message with total duration and frame count.`]}),`\n`,_jsx(_components.li,{children:`The connection closes automatically.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`server-messages`,children:`Server messages`}),`\n`,_jsx(Heading,{level:`3`,id:`frame-result`,children:`Frame result`}),`\n`,_jsx(_components.p,{children:`Sent each time an analysis window is complete.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"frame\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"frame\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"start_time_ms\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"end_time_ms\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`4000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"verdict\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"synthetic\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"confidence\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0.9732`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`start_time_ms`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Frame start time in the audio stream (ms)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`end_time_ms`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Frame end time in the audio stream (ms)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`verdict`})}),_jsx(_components.td,{children:`string`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\"synthetic\"`}),`, `,_jsx(_components.code,{children:`\"non-synthetic\"`}),`, or `,_jsx(_components.code,{children:`\"no-content\"`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confidence`})}),_jsx(_components.td,{children:`float`}),_jsx(_components.td,{children:`Confidence in the verdict, 0.0–1.0`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`done`,children:`Done`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"done\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"duration_ms\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`12500`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"frame_count\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`10`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`duration_ms`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Total duration of the streamed audio in milliseconds`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`frame_count`})}),_jsx(_components.td,{children:`integer`}),_jsx(_components.td,{children:`Total number of frames analyzed`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`error`,children:`Error`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Invalid audio_format='mid'. Valid values: ['3g2', '3ga', ...]\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`websocket-close-codes`,children:`WebSocket close codes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1000`})}),_jsxs(_components.td,{children:[`Normal closure after a successful `,_jsx(_components.code,{children:`done`}),` message`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1003`})}),_jsx(_components.td,{children:`Invalid query parameters (bad format, sample rate, or channels)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`1011`})}),_jsx(_components.td,{children:`Internal server error`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4001`})}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`api_key`}),` query parameter is missing or invalid`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4002`})}),_jsx(_components.td,{children:`Audio could not be decoded or does not match the declared format`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4003`})}),_jsx(_components.td,{children:`The request is not permitted`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4004`})}),_jsx(_components.td,{children:`The API key does not have access to this model`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4029`})}),_jsx(_components.td,{children:`Insufficient credits`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4030`})}),_jsx(_components.td,{children:`Concurrent request limit reached`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`4031`})}),_jsx(_components.td,{children:`Monthly usage limit reached`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`An `,_jsx(_components.code,{children:`error`}),` JSON message is sent before the connection closes (except on `,_jsx(_components.code,{children:`1000`}),`).`]}),`\n`,_jsx(Heading,{level:`2`,id:`rate-limits`,children:`Rate limits`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Concurrent connection limits apply per model.`}),`\n`,_jsxs(_components.li,{children:[`A connection that exceeds a limit closes with `,_jsx(_components.code,{children:`4029`}),` (insufficient credits), `,_jsx(_components.code,{children:`4030`}),` (concurrent request limit), or `,_jsx(_components.code,{children:`4031`}),` (monthly usage limit).`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/get-started/deepfake`,children:`Deepfake Detection`}),` — windowing, silence trimming, and scoring explained`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/get-started/deepfake`,children:`Deepfake Detection`}),` — format options for the streaming endpoint`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/guides/which-api`,children:`Which API should I use?`}),` — batch vs streaming tradeoffs`]}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/guides/authentication`,children:`Authentication and rate limits`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Deepfake Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_synthetic_voice_detection_streaming.yaml streaming-detection","description":"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.","href":"/api-reference/svd/streaming"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Endpoint","slug":"endpoint","depth":2,"children":[]},{"title":"Authentication","slug":"authentication","depth":2,"children":[]},{"title":"Query parameters","slug":"query-parameters","depth":2,"children":[]},{"title":"Connection flow","slug":"connection-flow","depth":2,"children":[]},{"title":"Server messages","slug":"server-messages","depth":2,"children":[{"title":"Frame result","slug":"frame-result","depth":3,"children":[]},{"title":"Done","slug":"done","depth":3,"children":[]},{"title":"Error","slug":"error","depth":3,"children":[]}]},{"title":"WebSocket close codes","slug":"websocket-close-codes","depth":2,"children":[]},{"title":"Rate limits","slug":"rate-limits","depth":2,"children":[]},{"title":"Related","slug":"related","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/modulateai/6f43a4827c59f292/hubspot.js","/_mintlify/custom/modulateai/0bb96afd82713278/swan.js","/_mintlify/custom/modulateai/476f212ab71e7bd6/hubspot-forms.js","/_mintlify/custom/modulateai/06d8e9ccae2eea7a/detection-package-download.js"],"apiReferenceData":{"channel":{"id":"streaming-detection","title":"Streaming-detection","description":"## WebSocket Close Codes\n- `1000`: Normal closure after the `done` message, or after the\n connection completes.\n- `1003`: Invalid or missing query parameters (unknown `audio_format`,\n invalid `sample_rate` or `num_channels`, a raw format missing\n `sample_rate`/`num_channels`, `sample_rate`/`num_channels` supplied\n without `audio_format`, or `audio_format` omitted). An `error` message\n is sent before the close.\n- `4002`: The audio could not be decoded, or does not match the\n declared raw `audio_format`. An `error` message is sent before the\n close.\n- `1011`: Internal server error. An `error` message is sent before the\n close.\n- `4001`: The `api_key` query parameter is missing or invalid. An\n `error` message is sent before the close.\n- `4003`: The request is not permitted. An `error` message is sent\n before the close.\n- `4004`: The API key does not have access to this model. An `error`\n message is sent before the close.\n- `4029`: The request could not be completed due to insufficient credits.\n An `error` message is sent before the close.\n- `4030`: Concurrent request limit reached. An `error` message is sent\n before the close.\n- `4031`: Monthly usage limit reached. An `error` message is sent before\n the close.\n","servers":[{"id":"production","protocol":"wss","host":"platform.modulate.ai","bindings":[],"variables":[]}],"address":"/api/velma-2-synthetic-voice-detection-streaming","parameters":[],"bindings":[{"protocol":"ws","version":"latest","value":{"query":{"type":"object","required":["api_key","audio_format"],"properties":{"api_key":{"type":"string","description":"API key used for authentication and usage tracking."},"audio_format":{"type":"string","description":"Audio encoding format. Required for all connections. Raw formats\n(headerless samples) also require `sample_rate` and\n`num_channels`; container formats carry that metadata in the\nstream, so those parameters are ignored if supplied. The MP4-family\nvalues (`mp4`, `m4a`, `m4b`, `m4r`, `m4v`, `3gp`, `3gpp`,\n`3ga`, `3g2`, `f4a`, `f4b`) must be sent in a streamable\nlayout; otherwise the connection ends with an\naudio-processing error.\nThe raw `g722` and `vox` formats are mono-only (`num_channels`\nmust be `1`).\n","enum":["s8","s16le","s16be","s24le","s24be","s32le","s32be","u8","u16le","u16be","u24le","u24be","u32le","u32be","f32le","f32be","f64le","f64be","mulaw","alaw","g722","vox","3g2","3ga","3gp","3gpp","8svx","aa3","aac","ac3","act","adts","aif","aifc","aiff","amb","amr","asf","at3","au","avr","awb","bwf","c2","caf","dss","dts","dtshd","eac3","ec3","f4a","f4b","flac","gsm","iff","m2a","m2ts","m4a","m4b","m4r","m4v","mka","mkv","mlp","mp+","mp1","mp2","mp3","mp4","mpa","mpc","mpga","mpp","mts","oga","ogg","ogx","oma","omg","opus","paf","pvf","qcp","ra","rf64","rm","rmvb","snd","svx","thd","ts","tta","voc","vqf","w64","wav","wave","weba","webm","wma","wmv"],"examples":["s16le","f32le","mulaw","webm"]},"sample_rate":{"type":"integer","description":"Sample rate in Hz. **Required** when `audio_format` is a raw\nformat. Must not be specified without `audio_format`.\n","enum":[8000,11025,16000,22050,32000,44100,48000,96000],"examples":[16000,48000]},"num_channels":{"type":"integer","description":"Number of audio channels. **Required** when `audio_format` is\na raw format. Must be between 1 and 8. Must not be specified\nwithout `audio_format`.\n","minimum":1,"maximum":8,"examples":[1,2]}}}},"schemaProperties":[{"name":"query","type":"object","required":false,"properties":[{"name":"api_key","type":"string","description":"API key used for authentication and usage tracking.","required":true},{"name":"audio_format","type":"string","description":"Audio encoding format. Required for all connections. Raw formats\n(headerless samples) also require `sample_rate` and\n`num_channels`; container formats carry that metadata in the\nstream, so those parameters are ignored if supplied. The MP4-family\nvalues (`mp4`, `m4a`, `m4b`, `m4r`, `m4v`, `3gp`, `3gpp`,\n`3ga`, `3g2`, `f4a`, `f4b`) must be sent in a streamable\nlayout; otherwise the connection ends with an\naudio-processing error.\nThe raw `g722` and `vox` formats are mono-only (`num_channels`\nmust be `1`).\n","enumValues":["s8","s16le","s16be","s24le","s24be","s32le","s32be","u8","u16le","u16be","u24le","u24be","u32le","u32be","f32le","f32be","f64le","f64be","mulaw","alaw","g722","vox","3g2","3ga","3gp","3gpp","8svx","aa3","aac","ac3","act","adts","aif","aifc","aiff","amb","amr","asf","at3","au","avr","awb","bwf","c2","caf","dss","dts","dtshd","eac3","ec3","f4a","f4b","flac","gsm","iff","m2a","m2ts","m4a","m4b","m4r","m4v","mka","mkv","mlp","mp+","mp1","mp2","mp3","mp4","mpa","mpc","mpga","mpp","mts","oga","ogg","ogx","oma","omg","opus","paf","pvf","qcp","ra","rf64","rm","rmvb","snd","svx","thd","ts","tta","voc","vqf","w64","wav","wave","weba","webm","wma","wmv"],"examples":["s16le","f32le","mulaw","webm"],"required":true},{"name":"sample_rate","type":"integer","description":"Sample rate in Hz. **Required** when `audio_format` is a raw\nformat. Must not be specified without `audio_format`.\n","enumValues":[8000,11025,16000,22050,32000,44100,48000,96000],"examples":[16000,48000],"required":false},{"name":"num_channels","type":"integer","description":"Number of audio channels. **Required** when `audio_format` is\na raw format. Must be between 1 and 8. Must not be specified\nwithout `audio_format`.\n","examples":[1,2],"required":false}]}]}],"operations":[{"id":"sendAudio","title":"Send audio","description":"Stream audio data to the server.","type":"send","messages":[{"id":"audioData","contentType":"application/octet-stream","payload":[{"type":"string","format":"binary","description":"A binary frame containing audio samples.","x-parser-schema-id":"\u003canonymous-schema-1>","name":"Audio Data"}],"headers":[],"jsonPayloadSchema":{"type":"string","format":"binary","description":"Audio data in the format declared by the `audio_format` query\nparameter. For raw formats this is headerless samples; for\ncontainer formats this is the encoded byte stream. Frames may\nbe any size; the server buffers internally.\n","x-parser-schema-id":"\u003canonymous-schema-1>"},"title":"Audio Data","description":"A binary frame containing audio samples.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"audioData"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"signalEnd","title":"Signal end","description":"Signal end of audio stream.","type":"send","messages":[{"id":"endOfStream","contentType":"text/plain","payload":[{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>","name":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio."}],"headers":[],"jsonPayloadSchema":{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>"},"title":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"endOfStream"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveFrameResult","title":"Receive frame result","description":"Receive a per-frame detection result.","type":"receive","messages":[{"id":"frameResult","contentType":"application/json","payload":[{"name":"Frame Result","description":"A single frame detection result.","type":"object","properties":[{"name":"type","type":"string","description":"frame","required":true},{"name":"frame","type":"object","required":true,"properties":[{"name":"start_time_ms","type":"integer","description":"Frame start time in the original audio stream (ms).","examples":[0],"required":true},{"name":"end_time_ms","type":"integer","description":"Frame end time in the original audio stream (ms).","examples":[4000],"required":true},{"name":"verdict","type":"string","description":"- `synthetic` - the frame likely contains AI-generated speech.\n- `non-synthetic` - the frame likely contains natural human speech.\n- `no-content` - the frame is silent or contains no usable audio.\n","enumValues":["synthetic","non-synthetic","no-content"],"examples":["synthetic"],"required":true},{"name":"confidence","type":"number","description":"Confidence in the stated verdict (0-1).","examples":[0.9732],"required":true}]}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","frame"],"properties":{"type":{"type":"string","const":"frame","x-parser-schema-id":"\u003canonymous-schema-3>"},"frame":{"type":"object","required":["start_time_ms","end_time_ms","verdict","confidence"],"properties":{"start_time_ms":{"type":"integer","minimum":0,"description":"Frame start time in the original audio stream (ms).","examples":[0],"x-parser-schema-id":"\u003canonymous-schema-4>"},"end_time_ms":{"type":"integer","minimum":0,"description":"Frame end time in the original audio stream (ms).","examples":[4000],"x-parser-schema-id":"\u003canonymous-schema-5>"},"verdict":{"type":"string","enum":["synthetic","non-synthetic","no-content"],"description":"- `synthetic` - the frame likely contains AI-generated speech.\n- `non-synthetic` - the frame likely contains natural human speech.\n- `no-content` - the frame is silent or contains no usable audio.\n","examples":["synthetic"],"x-parser-schema-id":"\u003canonymous-schema-6>"},"confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Confidence in the stated verdict (0-1).","examples":[0.9732],"x-parser-schema-id":"\u003canonymous-schema-7>"}},"x-parser-schema-id":"Frame"}},"x-parser-schema-id":"FrameResultMessage"},"title":"Frame Result","description":"A single frame detection result.","example":"{\n \"type\": \"\u003cstring>\",\n \"frame\": {\n \"start_time_ms\": 123,\n \"end_time_ms\": 123,\n \"verdict\": \"\u003cstring>\",\n \"confidence\": 123\n }\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"frameResult"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveDone","title":"Receive done","description":"Receive the final summary when analysis is complete.","type":"receive","messages":[{"id":"done","contentType":"application/json","payload":[{"name":"Done","description":"Analysis complete - all frames have been delivered.","type":"object","properties":[{"name":"type","type":"string","description":"done","required":true},{"name":"duration_ms","type":"integer","description":"Total duration of the streamed audio in milliseconds.","examples":[12500],"required":true},{"name":"frame_count","type":"integer","description":"Total number of frames analysed.","examples":[10],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","duration_ms","frame_count"],"properties":{"type":{"type":"string","const":"done","x-parser-schema-id":"\u003canonymous-schema-8>"},"duration_ms":{"type":"integer","minimum":0,"description":"Total duration of the streamed audio in milliseconds.","examples":[12500],"x-parser-schema-id":"\u003canonymous-schema-9>"},"frame_count":{"type":"integer","minimum":0,"description":"Total number of frames analysed.","examples":[10],"x-parser-schema-id":"\u003canonymous-schema-10>"}},"x-parser-schema-id":"DoneMessage"},"title":"Done","description":"Analysis complete - all frames have been delivered.","example":"{\n \"type\": \"\u003cstring>\",\n \"duration_ms\": 123,\n \"frame_count\": 123\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"done"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveError","title":"Receive error","description":"Receive an error notification.","type":"receive","messages":[{"id":"error","contentType":"application/json","payload":[{"name":"Error","description":"An error occurred during connection or analysis.","type":"object","properties":[{"name":"type","type":"string","description":"error","required":true},{"name":"error","type":"string","description":"Human-readable error description.","examples":["Internal server error","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","error"],"properties":{"type":{"type":"string","const":"error","x-parser-schema-id":"\u003canonymous-schema-11>"},"error":{"type":"string","description":"Human-readable error description.","examples":["Internal server error","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"x-parser-schema-id":"\u003canonymous-schema-12>"}},"x-parser-schema-id":"ErrorResponse"},"title":"Error","description":"An error occurred during connection or analysis.","example":"{\n \"type\": \"\u003cstring>\",\n \"error\": \"\u003cstring>\"\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"error"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]}],"sendOperations":[{"id":"receiveFrameResult","title":"Receive frame result","description":"Receive a per-frame detection result.","type":"receive","messages":[{"id":"frameResult","contentType":"application/json","payload":[{"name":"Frame Result","description":"A single frame detection result.","type":"object","properties":[{"name":"type","type":"string","description":"frame","required":true},{"name":"frame","type":"object","required":true,"properties":[{"name":"start_time_ms","type":"integer","description":"Frame start time in the original audio stream (ms).","examples":[0],"required":true},{"name":"end_time_ms","type":"integer","description":"Frame end time in the original audio stream (ms).","examples":[4000],"required":true},{"name":"verdict","type":"string","description":"- `synthetic` - the frame likely contains AI-generated speech.\n- `non-synthetic` - the frame likely contains natural human speech.\n- `no-content` - the frame is silent or contains no usable audio.\n","enumValues":["synthetic","non-synthetic","no-content"],"examples":["synthetic"],"required":true},{"name":"confidence","type":"number","description":"Confidence in the stated verdict (0-1).","examples":[0.9732],"required":true}]}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","frame"],"properties":{"type":{"type":"string","const":"frame","x-parser-schema-id":"\u003canonymous-schema-3>"},"frame":{"type":"object","required":["start_time_ms","end_time_ms","verdict","confidence"],"properties":{"start_time_ms":{"type":"integer","minimum":0,"description":"Frame start time in the original audio stream (ms).","examples":[0],"x-parser-schema-id":"\u003canonymous-schema-4>"},"end_time_ms":{"type":"integer","minimum":0,"description":"Frame end time in the original audio stream (ms).","examples":[4000],"x-parser-schema-id":"\u003canonymous-schema-5>"},"verdict":{"type":"string","enum":["synthetic","non-synthetic","no-content"],"description":"- `synthetic` - the frame likely contains AI-generated speech.\n- `non-synthetic` - the frame likely contains natural human speech.\n- `no-content` - the frame is silent or contains no usable audio.\n","examples":["synthetic"],"x-parser-schema-id":"\u003canonymous-schema-6>"},"confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Confidence in the stated verdict (0-1).","examples":[0.9732],"x-parser-schema-id":"\u003canonymous-schema-7>"}},"x-parser-schema-id":"Frame"}},"x-parser-schema-id":"FrameResultMessage"},"title":"Frame Result","description":"A single frame detection result.","example":"{\n \"type\": \"\u003cstring>\",\n \"frame\": {\n \"start_time_ms\": 123,\n \"end_time_ms\": 123,\n \"verdict\": \"\u003cstring>\",\n \"confidence\": 123\n }\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"frameResult"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveDone","title":"Receive done","description":"Receive the final summary when analysis is complete.","type":"receive","messages":[{"id":"done","contentType":"application/json","payload":[{"name":"Done","description":"Analysis complete - all frames have been delivered.","type":"object","properties":[{"name":"type","type":"string","description":"done","required":true},{"name":"duration_ms","type":"integer","description":"Total duration of the streamed audio in milliseconds.","examples":[12500],"required":true},{"name":"frame_count","type":"integer","description":"Total number of frames analysed.","examples":[10],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","duration_ms","frame_count"],"properties":{"type":{"type":"string","const":"done","x-parser-schema-id":"\u003canonymous-schema-8>"},"duration_ms":{"type":"integer","minimum":0,"description":"Total duration of the streamed audio in milliseconds.","examples":[12500],"x-parser-schema-id":"\u003canonymous-schema-9>"},"frame_count":{"type":"integer","minimum":0,"description":"Total number of frames analysed.","examples":[10],"x-parser-schema-id":"\u003canonymous-schema-10>"}},"x-parser-schema-id":"DoneMessage"},"title":"Done","description":"Analysis complete - all frames have been delivered.","example":"{\n \"type\": \"\u003cstring>\",\n \"duration_ms\": 123,\n \"frame_count\": 123\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"done"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"receiveError","title":"Receive error","description":"Receive an error notification.","type":"receive","messages":[{"id":"error","contentType":"application/json","payload":[{"name":"Error","description":"An error occurred during connection or analysis.","type":"object","properties":[{"name":"type","type":"string","description":"error","required":true},{"name":"error","type":"string","description":"Human-readable error description.","examples":["Internal server error","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","error"],"properties":{"type":{"type":"string","const":"error","x-parser-schema-id":"\u003canonymous-schema-11>"},"error":{"type":"string","description":"Human-readable error description.","examples":["Internal server error","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"x-parser-schema-id":"\u003canonymous-schema-12>"}},"x-parser-schema-id":"ErrorResponse"},"title":"Error","description":"An error occurred during connection or analysis.","example":"{\n \"type\": \"\u003cstring>\",\n \"error\": \"\u003cstring>\"\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"error"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]}],"receiveOperations":[{"id":"sendAudio","title":"Send audio","description":"Stream audio data to the server.","type":"send","messages":[{"id":"audioData","contentType":"application/octet-stream","payload":[{"type":"string","format":"binary","description":"A binary frame containing audio samples.","x-parser-schema-id":"\u003canonymous-schema-1>","name":"Audio Data"}],"headers":[],"jsonPayloadSchema":{"type":"string","format":"binary","description":"Audio data in the format declared by the `audio_format` query\nparameter. For raw formats this is headerless samples; for\ncontainer formats this is the encoded byte stream. Frames may\nbe any size; the server buffers internally.\n","x-parser-schema-id":"\u003canonymous-schema-1>"},"title":"Audio Data","description":"A binary frame containing audio samples.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"audioData"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]},{"id":"signalEnd","title":"Signal end","description":"Signal end of audio stream.","type":"send","messages":[{"id":"endOfStream","contentType":"text/plain","payload":[{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>","name":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio."}],"headers":[],"jsonPayloadSchema":{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>"},"title":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"endOfStream"}]}],"bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}]}],"sendMessages":[{"id":"frameResult","contentType":"application/json","payload":[{"name":"Frame Result","description":"A single frame detection result.","type":"object","properties":[{"name":"type","type":"string","description":"frame","required":true},{"name":"frame","type":"object","required":true,"properties":[{"name":"start_time_ms","type":"integer","description":"Frame start time in the original audio stream (ms).","examples":[0],"required":true},{"name":"end_time_ms","type":"integer","description":"Frame end time in the original audio stream (ms).","examples":[4000],"required":true},{"name":"verdict","type":"string","description":"- `synthetic` - the frame likely contains AI-generated speech.\n- `non-synthetic` - the frame likely contains natural human speech.\n- `no-content` - the frame is silent or contains no usable audio.\n","enumValues":["synthetic","non-synthetic","no-content"],"examples":["synthetic"],"required":true},{"name":"confidence","type":"number","description":"Confidence in the stated verdict (0-1).","examples":[0.9732],"required":true}]}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","frame"],"properties":{"type":{"type":"string","const":"frame","x-parser-schema-id":"\u003canonymous-schema-3>"},"frame":{"type":"object","required":["start_time_ms","end_time_ms","verdict","confidence"],"properties":{"start_time_ms":{"type":"integer","minimum":0,"description":"Frame start time in the original audio stream (ms).","examples":[0],"x-parser-schema-id":"\u003canonymous-schema-4>"},"end_time_ms":{"type":"integer","minimum":0,"description":"Frame end time in the original audio stream (ms).","examples":[4000],"x-parser-schema-id":"\u003canonymous-schema-5>"},"verdict":{"type":"string","enum":["synthetic","non-synthetic","no-content"],"description":"- `synthetic` - the frame likely contains AI-generated speech.\n- `non-synthetic` - the frame likely contains natural human speech.\n- `no-content` - the frame is silent or contains no usable audio.\n","examples":["synthetic"],"x-parser-schema-id":"\u003canonymous-schema-6>"},"confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"description":"Confidence in the stated verdict (0-1).","examples":[0.9732],"x-parser-schema-id":"\u003canonymous-schema-7>"}},"x-parser-schema-id":"Frame"}},"x-parser-schema-id":"FrameResultMessage"},"title":"Frame Result","description":"A single frame detection result.","example":"{\n \"type\": \"\u003cstring>\",\n \"frame\": {\n \"start_time_ms\": 123,\n \"end_time_ms\": 123,\n \"verdict\": \"\u003cstring>\",\n \"confidence\": 123\n }\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"frameResult"}]},{"id":"done","contentType":"application/json","payload":[{"name":"Done","description":"Analysis complete - all frames have been delivered.","type":"object","properties":[{"name":"type","type":"string","description":"done","required":true},{"name":"duration_ms","type":"integer","description":"Total duration of the streamed audio in milliseconds.","examples":[12500],"required":true},{"name":"frame_count","type":"integer","description":"Total number of frames analysed.","examples":[10],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","duration_ms","frame_count"],"properties":{"type":{"type":"string","const":"done","x-parser-schema-id":"\u003canonymous-schema-8>"},"duration_ms":{"type":"integer","minimum":0,"description":"Total duration of the streamed audio in milliseconds.","examples":[12500],"x-parser-schema-id":"\u003canonymous-schema-9>"},"frame_count":{"type":"integer","minimum":0,"description":"Total number of frames analysed.","examples":[10],"x-parser-schema-id":"\u003canonymous-schema-10>"}},"x-parser-schema-id":"DoneMessage"},"title":"Done","description":"Analysis complete - all frames have been delivered.","example":"{\n \"type\": \"\u003cstring>\",\n \"duration_ms\": 123,\n \"frame_count\": 123\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"done"}]},{"id":"error","contentType":"application/json","payload":[{"name":"Error","description":"An error occurred during connection or analysis.","type":"object","properties":[{"name":"type","type":"string","description":"error","required":true},{"name":"error","type":"string","description":"Human-readable error description.","examples":["Internal server error","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"required":true}]}],"headers":[],"jsonPayloadSchema":{"type":"object","required":["type","error"],"properties":{"type":{"type":"string","const":"error","x-parser-schema-id":"\u003canonymous-schema-11>"},"error":{"type":"string","description":"Human-readable error description.","examples":["Internal server error","This request is not permitted.","Missing API key.","Invalid API key.","This API key does not have access to this model.","Insufficient credits.","Concurrent request limit reached. Please retry after your in-flight requests complete.","Monthly usage limit reached.","Audio data does not match the declared audio_format.","The audio could not be processed. It may be corrupted or in an unsupported format.","Invalid audio_format='mid'. Valid values: ['3g2', '3ga', '3gp', '3gpp', '8svx', 'aa3', 'aac', 'ac3', 'act', 'adts', 'aif', 'aifc', 'aiff', 'alaw', 'amb', 'amr', 'asf', 'at3', 'au', 'avr', 'awb', 'bwf', 'c2', 'caf', 'dss', 'dts', 'dtshd', 'eac3', 'ec3', 'f32be', 'f32le', 'f4a', 'f4b', 'f64be', 'f64le', 'flac', 'g722', 'gsm', 'iff', 'm2a', 'm2ts', 'm4a', 'm4b', 'm4r', 'm4v', 'mka', 'mkv', 'mlp', 'mp+', 'mp1', 'mp2', 'mp3', 'mp4', 'mpa', 'mpc', 'mpga', 'mpp', 'mts', 'mulaw', 'oga', 'ogg', 'ogx', 'oma', 'omg', 'opus', 'paf', 'pvf', 'qcp', 'ra', 'rf64', 'rm', 'rmvb', 's16be', 's16le', 's24be', 's24le', 's32be', 's32le', 's8', 'snd', 'svx', 'thd', 'ts', 'tta', 'u16be', 'u16le', 'u24be', 'u24le', 'u32be', 'u32le', 'u8', 'voc', 'vox', 'vqf', 'w64', 'wav', 'wave', 'weba', 'webm', 'wma', 'wmv']","Raw audio formats require sample_rate and num_channels query parameters","sample_rate and num_channels require audio_format to be specified","Invalid sample_rate=50000. Valid values: [8000, 11025, 16000, 22050, 32000, 44100, 48000, 96000]","Invalid num_channels=12. Must be between 1 and 8","audio_format query parameter is required. Example: audio_format=s16le\u0026sample_rate=16000\u0026num_channels=1"],"x-parser-schema-id":"\u003canonymous-schema-12>"}},"x-parser-schema-id":"ErrorResponse"},"title":"Error","description":"An error occurred during connection or analysis.","example":"{\n \"type\": \"\u003cstring>\",\n \"error\": \"\u003cstring>\"\n}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"error"}]}],"receiveMessages":[{"id":"audioData","contentType":"application/octet-stream","payload":[{"type":"string","format":"binary","description":"A binary frame containing audio samples.","x-parser-schema-id":"\u003canonymous-schema-1>","name":"Audio Data"}],"headers":[],"jsonPayloadSchema":{"type":"string","format":"binary","description":"Audio data in the format declared by the `audio_format` query\nparameter. For raw formats this is headerless samples; for\ncontainer formats this is the encoded byte stream. Frames may\nbe any size; the server buffers internally.\n","x-parser-schema-id":"\u003canonymous-schema-1>"},"title":"Audio Data","description":"A binary frame containing audio samples.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"audioData"}]},{"id":"endOfStream","contentType":"text/plain","payload":[{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>","name":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio."}],"headers":[],"jsonPayloadSchema":{"type":"string","const":"","x-parser-schema-id":"\u003canonymous-schema-2>"},"title":"End of Stream","description":"An empty text frame signalling that the client has finished sending audio.","example":"{}","bindings":[],"extensions":[{"id":"x-parser-unique-object-id","value":"endOfStream"}]}],"extensions":[{"id":"x-parser-unique-object-id","value":"streaming-detection"}],"securitySchemes":[]},"channelId":"streaming-detection","metadata":{"id":7751,"subdomain":"modulateai","eTag":"\"f98ddd17ee657aec026ec3b0303422ad\"","originalFileLocation":"api/velma_2_synthetic_voice_detection_streaming.yaml","uuid":"92ca0822-45a7-48f7-95ff-a54eb4c2b98e","source":"LOCAL_FILE","createdAt":"2026-05-21T18:19:42.627Z","updatedAt":"2026-09-14T18:26:09.376Z","deletedAt":null,"retiredAt":null,"retiredByDeploymentHistoryId":null}},"subdomain":"modulateai","siteName":"Modulate","title":"Deepfake Detection Streaming - Modulate","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-05T18:51:44.910Z","originalFileLocation":"api-reference/svd/streaming.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Modulate\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Deepfake Detection Streaming - Modulate\">\u003cmeta data-mint-head property=\"og:description\" content=\"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Modulate\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.modulate.ai/api-reference/svd/streaming\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://modulateai.mintlify.app/_mintlify/api/og/v2?division=Deepfake+Detection\u0026amp;title=Deepfake+Detection+Streaming\u0026amp;description=Real-time+deepfake+detection+over+WebSocket%2C+with+per-frame+verdicts+and+confidence+scores+delivered+as+analysis+windows+complete.\u0026amp;theme=5b1c5018c22e2de339bbf72b\u0026amp;signature=92e0f897e2117b89124e15a8f13f2df91a785dd2906b5c00d322e8c5b6a87822\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Deepfake Detection Streaming - Modulate\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://modulateai.mintlify.app/_mintlify/api/og/v2?division=Deepfake+Detection\u0026amp;title=Deepfake+Detection+Streaming\u0026amp;description=Real-time+deepfake+detection+over+WebSocket%2C+with+per-frame+verdicts+and+confidence+scores+delivered+as+analysis+windows+complete.\u0026amp;theme=5b1c5018c22e2de339bbf72b\u0026amp;signature=92e0f897e2117b89124e15a8f13f2df91a785dd2906b5c00d322e8c5b6a87822\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/modulateai/DjDAyeOufX95soiv/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Modulate\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#285FEB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.modulate.ai/api-reference/svd/streaming\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/svd/streaming.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.modulate.ai/#organization\",\"name\":\"Modulate\",\"url\":\"https://docs.modulate.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/modulateai/0NHKM9zXEnghoEfZ/images/wordmark-navy.svg?fit=max\u0026auto=format\u0026n=0NHKM9zXEnghoEfZ\u0026q=85\u0026s=7ee7a19111bb0154aa2e6934ebd29607\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.modulate.ai#website\",\"name\":\"Modulate\",\"url\":\"https://docs.modulate.ai\",\"publisher\":{\"@id\":\"https://docs.modulate.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.modulate.ai/api-reference/svd/streaming#webpage\",\"url\":\"https://docs.modulate.ai/api-reference/svd/streaming\",\"name\":\"Deepfake Detection Streaming\",\"description\":\"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.\",\"dateModified\":\"2026-10-05T18:51:44.910Z\",\"isPartOf\":{\"@id\":\"https://docs.modulate.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.modulate.ai/api-reference/svd/streaming#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.modulate.ai/api-reference/svd/streaming#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Deepfake Detection\",\"item\":\"https://docs.modulate.ai/api-reference/svd/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deepfake Detection Streaming\",\"item\":\"https://docs.modulate.ai/api-reference/svd/streaming\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.modulate.ai/api-reference/svd/streaming#apireference\",\"headline\":\"Deepfake Detection Streaming\",\"name\":\"Deepfake Detection Streaming\",\"description\":\"Real-time deepfake detection over WebSocket, with per-frame verdicts and confidence scores delivered as analysis windows complete.\",\"url\":\"https://docs.modulate.ai/api-reference/svd/streaming\",\"mainEntityOfPage\":{\"@id\":\"https://docs.modulate.ai/api-reference/svd/streaming#webpage\"},\"dateModified\":\"2026-10-05T18:51:44.910Z\",\"publisher\":{\"@id\":\"https://docs.modulate.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.modulate.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Modulate\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Modulate","nav":{"global":null,"tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":""}]},{"tab":"Velma","pages":[{"title":"Velma","href":"/velma/overview"}]},{"tab":"API Reference","groups":[{"group":"Velma","icon":"comments","pages":[{"title":"Velma","sidebarTitle":"Overview","href":"/api-reference/velma/overview"},{"title":"Velma Batch","sidebarTitle":"Batch","openapi":"api/velma_2_batch.yaml POST /api/velma-2-batch","href":"/api-reference/velma/batch"},{"title":"List behavior presets","sidebarTitle":"Behavior presets","openapi":"api/velma_2_batch.yaml GET /api/velma-2-batch/list-presets","href":"/api-reference/velma/presets"},{"title":"Velma Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_streaming.yaml velma2Streaming","href":"/api-reference/velma/streaming"}]},{"group":"Speech-to-text Transcription","icon":"microphone","pages":[{"title":"Speech-to-text Transcription","sidebarTitle":"Overview","href":"/api-reference/stt/overview"},{"title":"Speech-to-Text Transcription Batch Multilingual","sidebarTitle":"Batch Multilingual","openapi":"api/velma_2_stt_batch.yaml POST /api/velma-2-stt-batch","href":"/api-reference/stt/batch"},{"title":"Speech-to-Text Transcription Streaming Multilingual","sidebarTitle":"Streaming Multilingual","asyncapi":"api/velma_2_stt_streaming.yaml velma2SttStreaming","href":"/api-reference/stt/streaming"},{"title":"Speech-to-Text Transcription Batch English VFast","sidebarTitle":"Batch English VFast","openapi":"api/velma_2_stt_batch_english_vfast.yaml POST /api/velma-2-stt-batch-english-vfast","href":"/api-reference/stt/batch-english-vfast"},{"title":"Speech-to-Text Streaming English","sidebarTitle":"Streaming English","asyncapi":"api/velma_2_stt_streaming_english_v2.yaml velma2SttStreamingEnglishV2","href":"/api-reference/stt/streaming-vfast"},{"title":"Multilingual Fast Transcription Batch","sidebarTitle":"Batch Multilingual VFast","openapi":"api/velma_2_stt_batch_multilingual_vfast.yaml POST /api/velma-2-stt-batch-multilingual-vfast","href":"/api-reference/stt/batch-multilingual-vfast"},{"title":"Multilingual Fast Transcription Streaming","sidebarTitle":"Streaming (Multilingual Fast)","asyncapi":"api/stt_streaming_multilingual_vfast.yaml velma2SttStreamingMultilingualVfast","href":"/api-reference/stt/streaming-multilingual-vfast"}]},{"group":"Deepfake Detection","icon":"shield-halved","pages":[{"title":"Deepfake Detection","sidebarTitle":"Overview","href":"/api-reference/svd/overview"},{"title":"Deepfake Detection Batch","sidebarTitle":"Batch","description":"Detect synthetic (AI-generated) voice in a pre-recorded audio file. Returns per-frame deepfake scores.","openapi":"api/velma_2_synthetic_voice_detection_batch.yaml POST /api/velma-2-synthetic-voice-detection-batch","href":"/api-reference/svd/batch"},{"title":"Deepfake Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_synthetic_voice_detection_streaming.yaml streaming-detection","href":"/api-reference/svd/streaming"}]},{"group":"Emotion Detection","icon":"face-smile","pages":[{"title":"Emotion Detection","sidebarTitle":"Overview","description":"Emotion detection API — classify the emotional tone of an audio file, with a whole-file label and a per-window time series, in a single synchronous HTTP POST.","href":"/api-reference/emotion/overview"},{"title":"Emotion Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_emotion_batch.yaml POST /api/velma-2-emotion-batch","href":"/api-reference/emotion/batch"}]},{"group":"Accent Detection","icon":"globe","pages":[{"title":"Accent Detection","sidebarTitle":"Overview","href":"/api-reference/accent/overview"},{"title":"Accent Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_accent_batch.yaml POST /api/velma-2-accent-batch","href":"/api-reference/accent/batch"}]},{"group":"PII/PHI Redaction","icon":"eye-slash","pages":[{"title":"PII/PHI Redaction","sidebarTitle":"Overview","href":"/api-reference/redaction/overview"},{"title":"PII/PHI Redaction Batch","sidebarTitle":"Batch","openapi":"api/velma_2_pii_phi_redaction_batch.yaml POST /api/velma-2-pii-phi-redaction-batch","href":"/api-reference/redaction/batch"},{"title":"PII/PHI Redaction Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_pii_phi_redaction_streaming.yaml velma2PiiPhiRedactionStreaming","href":"/api-reference/redaction/streaming"}]},{"group":"Music Detection","icon":"music","pages":[{"title":"Music Detection","sidebarTitle":"Overview","href":"/api-reference/music-detection/overview"},{"title":"Music Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_music_detection_batch.yaml POST /api/velma-2-music-detection-batch","href":"/api-reference/music-detection/batch"},{"title":"Music Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_music_detection_streaming.yaml streaming-detection","href":"/api-reference/music-detection/streaming"}]},{"group":"AI Music Detection","icon":"robot","pages":[{"title":"AI Music Detection","sidebarTitle":"Overview","href":"/api-reference/ai-music-detection/overview"},{"title":"AI Music Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_ai_music_detection_batch.yaml POST /api/velma-2-ai-music-detection-batch","href":"/api-reference/ai-music-detection/batch"},{"title":"AI Music Detection Streaming","sidebarTitle":"Streaming","asyncapi":"api/velma_2_ai_music_detection_streaming.yaml streaming-detection","href":"/api-reference/ai-music-detection/streaming"}]},{"group":"Language Detection","icon":"language","pages":[{"title":"Language Detection","sidebarTitle":"Overview","href":"/api-reference/language-detection/overview"},{"title":"Language Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_language_detection_batch.yaml POST /api/velma-2-language-detection-batch","href":"/api-reference/language-detection/batch"}]},{"group":"Audio Event Detection","icon":"waveform-lines","pages":[{"title":"Audio Event Detection","sidebarTitle":"Overview","href":"/api-reference/audio-event-detection/overview"},{"title":"Audio Event Detection Batch","sidebarTitle":"Batch","openapi":"api/velma_2_audio_event_classifier.yaml POST /api/velma-2-audio-event-classifier","href":"/api-reference/audio-event-detection/batch"}]}]},{"tab":"Benchmarks","pages":[{"title":"Benchmarks","href":"/benchmarks/overview"}]},{"tab":"Support","pages":[{"title":"Support","href":"/support"}]}]},"basePath":"","title":"Deepfake Detection Streaming - Modulate","buildId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","deploymentId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","dynamics":["a4b48b4bee","a9bb46feb3","3b021dca80"],"chunks":["Page-D51V6jq3.js","utils-Bfp7HcY4.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","getPastedJson-Dev-X0Xy.js","icon-7L2WL0jD.js","MethodPill-Ble59Dl_.js","DuplicateIcon-r-98uLGh.js","createIcon-DaFzipjW.js","DynamicMarkdown-Jk8YAWGN.js","getApiPlaygroundDisplay-GMPxUzWV.js","MessageExamples-DdnrpTjW.js","CodeSnippet-wTmV0wP6.js","Markdown-_QGow1Wo.js","clsx-v8ssfMzu.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CjboTi0T.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DkAyo-p5.js"]}