{"openapi":"3.1.0","info":{"title":"oruk Speech API","version":"1.0.0","description":"HTTP file API for English transcription, emotion detection, speaking style, speech analysis, and speaking-proficiency scoring. Realtime is a separate multilingual WebSocket preview. Subscription models use plan minutes. Orukeet is an English preview included in every subscription at $0.00045 per audio minute ($0.027 per audio hour); optional tasks add their published rates. Orukeet usage.cost_microusd is usage valued at task rates, not an additional charge when covered by the monthly allowance. Only excess usage is billed. Existing credit-only accounts retain their credit balance. See https://oruk.ai/docs#orukeet and https://oruk.ai/pricing. Spectra-2 (oruk-spectra-2) adds 25-language transcription and 31 clip-level emotion/style scores through the main analysis and transcription routes. Uses shared speech understanding plan minutes. See https://oruk.ai/docs#spectra-2."},"servers":[{"url":"https://speech-api.oruk.ai","description":"Production"}],"security":[{"bearerAuth":[]}],"paths":{"/v1/audio/transcriptions":{"post":{"operationId":"createTranscription","summary":"Transcribe audio with a supported model","parameters":[{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"anyOf":[{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"WAV, FLAC, MP3, M4A, OGG, or WebM; maximum 30 MB and 60 minutes."},"model":{"type":"string","enum":["oruk-resonance","oruk-fourier"],"default":"oruk-resonance","description":"Defaults to oruk-resonance on every file endpoint. Choose a currently supported model ID; retired IDs return 400 model_retired."},"diarize":{"type":"boolean","default":false,"description":"oruk-resonance only. Label speakers with the diarization pass, then run Resonance on each speaker turn; segments carry a speaker field. Included in subscription plan minutes: one audio minute uses one plan minute. Other models return 400 diarization_unsupported; if the diarizer is unavailable the request fails with 503 diarization_upstream_failed."},"num_speakers":{"type":"integer","minimum":1,"maximum":32,"description":"Optional exact speaker count when diarize is true; leave unset to auto-detect."}}},{"$ref":"#/components/schemas/OrukeetRequest"},{"$ref":"#/components/schemas/Spectra2Request"}]}}}},"responses":{"200":{"description":"Completed result. Spectra-2 returns transcript and all 31 clip-level scores on either endpoint.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SpeechResult"},{"$ref":"#/components/schemas/OrukeetTranscription"},{"$ref":"#/components/schemas/Spectra2Result"}]}},"text/plain":{"schema":{"type":"string"}}}},"409":{"description":"For Spectra-2: request_in_progress for pending or uncertain completion; request_already_completed for a completed ID; idempotency_conflict if the same organization/request ID changes audio bytes, task, model or key. Responses and audio are not retained for replay."},"429":{"description":"Capacity or rate limit reached. Spectra-2 upload_busy and model_busy return Retry-After in seconds. Retry upload_busy with the same ID; model_busy closes the rejected attempt without inference or a charge, so use a new ID after waiting. For network/5xx errors retain the original ID.","headers":{"Retry-After":{"description":"Minimum wait in seconds for Spectra-2 upload_busy or model_busy.","schema":{"type":"integer","minimum":1}}}},"default":{"$ref":"#/components/responses/Error"}},"description":"Spectra-2 (oruk-spectra-2) uses existing Oruk API keys and shared speech understanding minutes. Send file and model only. Both batch endpoints return transcript and 31 clip-level scores without timestamps or diarization. Streaming audio upload uses the separate /v1/audio/spectra-2/stream WebSocket endpoint. For retries, retain X-Request-ID, endpoint and exact file bytes."}},"/v1/audio/emotions":{"post":{"operationId":"createEmotionAnalysis","summary":"Classify multilabel emotion","description":"Emotion only. With oruk-resonance (the default) the request runs the Resonance encoder and affect head; the transcription decoder is never invoked and the response contains no transcript text. One minute of audio uses one plan minute, exactly as unified analysis does.","parameters":[{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"$ref":"#/components/requestBodies/AudioRequestWithLogits"},"responses":{"200":{"$ref":"#/components/responses/SpeechResult"},"default":{"$ref":"#/components/responses/Error"}}}},"/v1/audio/styles":{"post":{"operationId":"createStyleAnalysis","summary":"Classify multilabel speaking style","parameters":[{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"$ref":"#/components/requestBodies/AudioRequestWithLogits"},"responses":{"200":{"$ref":"#/components/responses/SpeechResult"},"default":{"$ref":"#/components/responses/Error"}}}},"/v1/audio/affect":{"post":{"operationId":"createAffectAnalysis","summary":"Classify emotion and speaking style","parameters":[{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"$ref":"#/components/requestBodies/AudioRequestWithLogits"},"responses":{"200":{"$ref":"#/components/responses/SpeechResult"},"default":{"$ref":"#/components/responses/Error"}}}},"/v1/audio/analysis":{"post":{"operationId":"createSpeechAnalysis","summary":"Return transcript, emotion, style, segments, and tagged text","parameters":[{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"$ref":"#/components/requestBodies/AudioRequestWithLogits"},"responses":{"200":{"description":"Completed result. Spectra-2 returns transcript and all 31 clip-level scores on either endpoint.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SpeechResult"},{"$ref":"#/components/schemas/Spectra2Result"}]}}}},"409":{"description":"For Spectra-2: request_in_progress for pending or uncertain completion; request_already_completed for a completed ID; idempotency_conflict if the same organization/request ID changes audio bytes, task, model or key. Responses and audio are not retained for replay."},"429":{"description":"Capacity or rate limit reached. Spectra-2 upload_busy and model_busy return Retry-After in seconds. Retry upload_busy with the same ID; model_busy closes the rejected attempt without inference or a charge, so use a new ID after waiting. For network/5xx errors retain the original ID.","headers":{"Retry-After":{"description":"Minimum wait in seconds for Spectra-2 upload_busy or model_busy.","schema":{"type":"integer","minimum":1}}}},"default":{"$ref":"#/components/responses/Error"}},"description":"Spectra-2 (oruk-spectra-2) uses existing Oruk API keys and shared speech understanding minutes. Send file and model only. Both batch endpoints return transcript and 31 clip-level scores without timestamps or diarization. Streaming audio upload uses the separate /v1/audio/spectra-2/stream WebSocket endpoint. For retries, retain X-Request-ID, endpoint and exact file bytes."}},"/v1/audio/proficiency":{"post":{"operationId":"createSpeechProficiency","summary":"Continuous recording and word pronunciation proficiency (0–1)","description":"Returns the original CEFR and fluency fields, metadata, validity check and billing behavior. cefr_score stays 0–5 and fluency_score stays 0–10, from fluency_cefr-v2-final. Top-level check controls CEFR usability and billing; insufficient_audio is free. For compatibility, numeric legacy estimates are present on invalid checks but must not be treated as valid grades. Additive proficiency.score and words[].score are 0–1 pronunciation estimates from continuous-pilot-v2; unavailable or unscorable continuous values are null. proficiency.continuous_check reports pronunciation validity independently, and continuous_metadata holds alignment-based speech duration, word count and whether a reference was supplied. Legacy speech_seconds remains VAD-based and transcript_used includes automatic transcripts. Supply transcript to skip ASR, or omit it for Resonance transcription. Existing account billing terms apply. V2 was evaluated on short English read speech; its scores are not converted to CEFR. Longer recordings use word-weighted window scores, not separately validated long-form ratings.","parameters":[{"$ref":"#/components/parameters/RequestId"}],"requestBody":{"$ref":"#/components/requestBodies/ProficiencyRequest"},"responses":{"200":{"$ref":"#/components/responses/ProficiencyResult"},"default":{"$ref":"#/components/responses/Error"}}}},"/v1/models":{"get":{"operationId":"listModels","summary":"List public models and supported tasks","responses":{"200":{"description":"Model catalog","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/v1/pricing":{"get":{"operationId":"getPricing","summary":"Get reference cost metadata","description":"This catalog exposes reference cost fields for API compatibility. Subscription charges use included audio minutes and the plan’s overage rate at https://oruk.ai/pricing; these reference fields are not subscription invoice charges.","security":[],"responses":{"200":{"description":"Pricing catalog","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/livez":{"get":{"operationId":"getLiveness","summary":"Service liveness","security":[],"responses":{"200":{"description":"Service process is live"}}}},"/readyz":{"get":{"operationId":"getReadiness","summary":"Inference readiness","security":[],"responses":{"200":{"description":"Inference dependencies are ready"}}}},"/v1/client-token":{"post":{"summary":"Create a single-use Orukeet streaming token","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Token valid for 60 seconds; use orukeet.pcm.v1 and auth.TOKEN WebSocket subprotocols.","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"url":{"type":"string"},"expires_in":{"type":"integer"},"single_use":{"type":"boolean"},"protocol":{"type":"string"}}}}}},"401":{"description":"Invalid API key"},"402":{"description":"Plan allowance or additional-usage budget required"}}}},"/v1/audio/resonance-2/health":{"get":{"tags":["Affect"],"summary":"Check the Resonance emotion sidecar","operationId":"health_v1_audio_resonance_2_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/audio/resonance-2":{"post":{"tags":["Affect"],"summary":"Classify emotion and delivery with Resonance-2","description":"Returns six signed opposite axes, 19 unipolar scores, all 31 category scores, and calibrated selected labels. Opposite labels cannot both be selected. Send 0.1–120 seconds of audio, at most 30 MiB. Longer files use nonoverlapping 20-second windows and average logits before calibration. Digital silence abstains with zero scores; there is no forced top label. Use regime=f1 (default) or regime=precision as a query parameter. Same shared plan minutes and affect tariff as Resonance 1: $0.0100 per audio minute for legacy metered accounts, one-second minimum. Requires approved organization access; existing accounts retain access. Request at /v1/models/oruk-resonance-2/access.","operationId":"classify_v1_audio_resonance_2_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"regime","in":"query","required":false,"schema":{"enum":["f1","precision"],"type":"string","default":"f1","title":"Regime"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resonance2SidecarResponse"}}}},"403":{"description":"model_access_required: organization approval required. No inference or billing occurs."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"additionalProperties":false,"properties":{"file":{"type":"string","format":"binary"},"model":{"type":"string","enum":["oruk-resonance-2","resonance-2"]}}}}}}}},"/v1/models/oruk-resonance-2/access":{"get":{"summary":"Read organization Resonance-2 access","operationId":"getResonance2Access","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Organization model access status","content":{"application/json":{"schema":{"type":"object","required":["model","status","approved"],"properties":{"model":{"type":"string","const":"oruk-resonance-2"},"status":{"type":"string","enum":["not_requested","pending","approved","denied","revoked"]},"approved":{"type":"boolean"},"request_access_url":{"type":"string","format":"uri"}}}}}},"401":{"description":"Invalid API key"}}},"post":{"summary":"Request Resonance-2 access","operationId":"requestResonance2Access","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["use_case"],"properties":{"use_case":{"type":"string","minLength":10,"maxLength":2000}}}}}},"responses":{"200":{"description":"Organization model access status","content":{"application/json":{"schema":{"type":"object","required":["model","status","approved"],"properties":{"model":{"type":"string","const":"oruk-resonance-2"},"status":{"type":"string","enum":["not_requested","pending","approved","denied","revoked"]},"approved":{"type":"boolean"},"request_access_url":{"type":"string","format":"uri"}}}}}},"202":{"description":"Organization model access status","content":{"application/json":{"schema":{"type":"object","required":["model","status","approved"],"properties":{"model":{"type":"string","const":"oruk-resonance-2"},"status":{"type":"string","enum":["not_requested","pending","approved","denied","revoked"]},"approved":{"type":"boolean"},"request_access_url":{"type":"string","format":"uri"}}}}}},"400":{"description":"Invalid use case or JSON"},"401":{"description":"Invalid API key"},"413":{"description":"Body exceeds 12 KB"},"415":{"description":"Requires application/json"},"429":{"description":"Too many requests"}}}},"/v1/audio/sessions":{"post":{"tags":["Audio"],"operationId":"prepareSpectra2Session","summary":"Prepare a Spectra-2 session","description":"Prepare before recording. The session has a 30-second lifetime including setup and uses the same account allowance as ordinary requests. Keep API keys on your server.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["model","id"],"properties":{"model":{"type":"string","enum":["oruk-spectra-2"]},"id":{"type":"string","format":"uuid","description":"A new UUID v4 for this setup attempt."}}}}}},"responses":{"200":{"description":"Prepared connection; no inference has run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Spectra2PreparedSession"}}}},"400":{"description":"Invalid model, task, session, or request ID."},"401":{"description":"An Oruk API bearer key is required."},"402":{"description":"Insufficient account allowance or credits."},"403":{"description":"Account access is unavailable, or a server-only request was made from a browser."},"404":{"description":"Preparation is unavailable for this session. Choose an ordinary speech request before recording."},"409":{"description":"The session expired or direct streaming is unavailable. Choose a new session or an ordinary stream before recording."},"429":{"description":"Session setup is busy. Wait before preparing another recording."},"503":{"description":"Setup could not be confirmed. No inference was requested; an existing reservation can remain until expiry."}}}},"/v1/audio/stream-sessions":{"post":{"tags":["Audio"],"operationId":"prepareSpectra2DirectStream","summary":"Prepare a direct Spectra-2 stream","description":"Server-only setup for one recording in an existing prepared session. Open the returned URL with [protocol, ticket] subprotocols, then use the documented start, PCM16, finish and cancel messages. Finish must precede the original deadline. The result matches the batch schema. No automatic reconnect or inference retry.","security":[{"bearerAuth":[]}],"parameters":[{"name":"X-Oruk-Session","in":"header","required":true,"schema":{"type":"string"},"description":"The existing prepared-session token."},{"name":"X-Request-ID","in":"header","required":true,"schema":{"type":"string"},"description":"One unused request ID supplied by that session."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["model","task"],"properties":{"model":{"type":"string","enum":["oruk-spectra-2"]},"task":{"type":"string","enum":["transcription","analysis"]}}}}}},"responses":{"200":{"description":"Prepared connection; no inference has run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Spectra2StreamSession"}}}},"400":{"description":"Invalid model, task, session, or request ID."},"401":{"description":"An Oruk API bearer key is required."},"402":{"description":"Insufficient account allowance or credits."},"403":{"description":"Account access is unavailable, or a server-only request was made from a browser."},"404":{"description":"Preparation is unavailable for this session. Choose an ordinary speech request before recording."},"409":{"description":"The session expired or direct streaming is unavailable. Choose a new session or an ordinary stream before recording."},"429":{"description":"Session setup is busy. Wait before preparing another recording."},"503":{"description":"Setup could not be confirmed. No inference was requested; an existing reservation can remain until expiry."}}}},"/v1/audio/synthetic-speech":{"post":{"tags":["OrukZero"],"summary":"Detect human or AI speech with OrukZero","description":"English audio, 1–60 seconds, WAV/FLAC/OGG/MP3, at most 12 MiB. Uncalibrated scores with a fixed 0.5 threshold. An Oruk API key and active paid plan are required; OrukZero is included at no extra charge and consumes no credits or plan minutes. Long-audio aggregation is experimental.","operationId":"detect_v1_audio_synthetic_speech_post","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"type":"string","format":"binary"},"model":{"type":"string","enum":["orukzero"],"default":"orukzero"}},"additionalProperties":false,"type":"object","required":["file"]}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticSpeechDetectionResponse"}}}},"401":{"description":"Invalid customer key"},"402":{"description":"Active paid Oruk plan required"},"413":{"description":"Audio exceeds 12 MiB"},"422":{"description":"Invalid audio or multipart upload"},"429":{"description":"Worker busy; retry after one second"},"503":{"description":"Preview disabled or worker unavailable"}},"security":[{"bearerAuth":[]}]}},"/v1/models/orukzero/access":{"get":{"summary":"Check OrukZero paid-plan access","description":"Read-only entitlement check. No credits or plan minutes are consumed. Free trials and prepaid-only accounts are not eligible.","tags":["OrukZero"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Active paid plan; OrukZero is included at no extra charge","content":{"application/json":{"schema":{"type":"object","required":["model","customer","entitlement","billed","consumes_credits","consumes_plan_minutes"],"properties":{"model":{"const":"orukzero"},"customer":{"type":"object","required":["key_id","organization_id","plan"],"properties":{"key_id":{"type":"string"},"organization_id":{"type":"string"},"plan":{"type":"string"}}},"entitlement":{"const":"included_with_paid_plan"},"billed":{"const":false},"consumes_credits":{"const":false},"consumes_plan_minutes":{"const":false}}}}}},"401":{"description":"Invalid API key"},"402":{"description":"Active paid plan required"},"503":{"description":"Account service unavailable"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"oruk API key"},"HTTPBearer":{"type":"http","scheme":"bearer"}},"parameters":{"RequestId":{"name":"X-Request-ID","in":"header","required":false,"description":"Unique request identifier. Reuse returns 409 and never creates a second debit.","schema":{"type":"string","maxLength":128}}},"requestBodies":{"AudioRequest":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"WAV, FLAC, MP3, M4A, OGG, or WebM; maximum 30 MB and 60 minutes."},"model":{"type":"string","enum":["oruk-resonance","oruk-fourier"],"default":"oruk-resonance","description":"Defaults to oruk-resonance on every file endpoint. Choose a currently supported model ID; retired IDs return 400 model_retired."},"diarize":{"type":"boolean","default":false,"description":"oruk-resonance only. Label speakers with the diarization pass, then run Resonance on each speaker turn; segments carry a speaker field. Included in subscription plan minutes: one audio minute uses one plan minute. Other models return 400 diarization_unsupported; if the diarizer is unavailable the request fails with 503 diarization_upstream_failed."},"num_speakers":{"type":"integer","minimum":1,"maximum":32,"description":"Optional exact speaker count when diarize is true; leave unset to auto-detect."}}}}}},"ProficiencyRequest":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"WAV, FLAC, MP3, M4A, OGG, or WebM; 5 s to 10 minutes, maximum 30 MB. Send 30-60 s of spontaneous speech for the most reliable band."},"model":{"type":"string","enum":["oruk-proficiency-1"],"default":"oruk-proficiency-1"},"transcript":{"type":"string","description":"Optional transcript of the audio. When omitted, oruk transcribes the recording first and returns the text."}}}}}},"AudioRequestWithLogits":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"WAV, FLAC, MP3, M4A, OGG, or WebM; maximum 30 MB and 60 minutes."},"model":{"type":"string","enum":["oruk-resonance","oruk-fourier"],"default":"oruk-resonance","description":"Defaults to oruk-resonance on every file endpoint. Choose a currently supported model ID; retired IDs return 400 model_retired."},"diarize":{"type":"boolean","default":false,"description":"oruk-resonance only. Label speakers with the diarization pass, then run Resonance on each speaker turn; segments carry a speaker field. Included in subscription plan minutes: one audio minute uses one plan minute. Other models return 400 diarization_unsupported; if the diarizer is unavailable the request fails with 503 diarization_upstream_failed."},"num_speakers":{"type":"integer","minimum":1,"maximum":32,"description":"Optional exact speaker count when diarize is true; leave unset to auto-detect."},"include_logits":{"type":"boolean","default":false,"description":"Return all per-segment label scores and actual pre-sigmoid raw_logits. Defaults to false: both new fields are omitted and existing fields remain unchanged. Analysis/affect return 31 labels, emotions 15, styles 16. Works with diarize=true. Not supported for transcription-only requests."}}}}}}},"responses":{"SpeechResult":{"description":"Speech result and measured usage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechResult"}}}},"ProficiencyResult":{"description":"Proficiency result and audio usage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProficiencyResult"}}}},"Error":{"description":"Stable error envelope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"schemas":{"Score":{"type":"object","required":["label","score"],"properties":{"label":{"type":"string"},"score":{"type":"number","minimum":0,"maximum":1}}},"Word":{"type":"object","required":["word","start","end"],"properties":{"word":{"type":"string"},"start":{"type":"number","minimum":0},"end":{"type":"number","minimum":0},"confidence":{"type":["number","null"],"minimum":0,"maximum":1}}},"Segment":{"type":"object","required":["id","start","end","emotions","styles"],"properties":{"id":{"type":"integer"},"start":{"type":"number","minimum":0},"end":{"type":"number","minimum":0},"text":{"type":["string","null"]},"tagged_text":{"type":["string","null"]},"words":{"type":"array","items":{"$ref":"#/components/schemas/Word"}},"emotions":{"type":"array","items":{"$ref":"#/components/schemas/Score"}},"styles":{"type":"array","items":{"$ref":"#/components/schemas/Score"}},"speaker":{"type":["string","null"],"description":"Speaker label (speaker_0, speaker_1, ...) when the request set diarize=true; labels are stable within one response only."},"scores":{"type":"object","additionalProperties":{"type":"number","minimum":0,"maximum":1},"description":"All unfiltered sigmoid scores for the requested task, keyed by label, including below-threshold labels. Present only with include_logits=true; scores do not need to sum to one."},"raw_logits":{"type":"object","additionalProperties":{"type":"number"},"description":"Actual finite model outputs before sigmoid, keyed by the same labels as scores. Values are unbounded and may be negative. Present only with include_logits=true."}}},"Usage":{"type":"object","description":"Measured audio duration and reference cost metadata. Subscription usage draws from shared plan minutes, with additional minutes at the plan’s overage rate. Reference amounts are not the subscription invoice.","required":["audio_seconds","billable_seconds","rate_per_minute_usd","estimated_cost_usd","pricing_version"],"properties":{"audio_seconds":{"type":"number","minimum":0},"billable_seconds":{"type":"number","minimum":0},"rate_per_minute_usd":{"type":"string"},"estimated_cost_usd":{"type":"string"},"pricing_version":{"type":"string"},"billing_unit":{"type":"string","enum":["audio_second","request"],"default":"audio_second","description":"Reference unit returned by the inference API. Subscription billing uses audio minutes regardless of this field."},"rate_per_request_usd":{"type":["string","null"],"description":"Reference cost metadata when billing_unit is 'request'; subscription charges are based on audio minutes."}}},"SpeechResult":{"type":"object","required":["id","object","task","model","duration","emotions","styles","segments","usage"],"properties":{"id":{"type":"string"},"object":{"const":"speech.result"},"task":{"type":"string","enum":["transcription","emotion","style","affect","analysis","proficiency"]},"model":{"type":"string"},"text":{"type":["string","null"]},"tagged_text":{"type":["string","null"]},"language":{"type":["string","null"]},"duration":{"type":"number","minimum":0},"emotions":{"type":"array","items":{"$ref":"#/components/schemas/Score"}},"styles":{"type":"array","items":{"$ref":"#/components/schemas/Score"}},"segments":{"type":"array","items":{"$ref":"#/components/schemas/Segment"}},"diarized":{"type":"boolean","default":false,"description":"True when segments are speaker turns (diarize=true)."},"speakers":{"type":"array","items":{"type":"string"},"description":"Speaker labels in order of first appearance; empty unless diarized."},"usage":{"$ref":"#/components/schemas/Usage"}}},"ProficiencyCheck":{"properties":{"status":{"enum":["scored","low_confidence","insufficient_audio"],"title":"Status","type":"string"},"billable":{"description":"False when the check is not valid and is not charged","title":"Billable","type":"boolean"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Reason"}},"required":["status","billable"],"title":"ProficiencyCheck","type":"object"},"ProficiencyScores":{"properties":{"continuous_check":{"$ref":"#/components/schemas/ContinuousProficiencyCheck","description":"Independent pronunciation validity; the top-level CEFR check controls billing"},"continuous_metadata":{"$ref":"#/components/schemas/ContinuousProficiencyMetadata","description":"Alignment metadata; original top-level metadata retains legacy semantics"},"score":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Continuous recording pronunciation proficiency: 0 low, 1 high; not CEFR","title":"Score"},"model_version":{"const":"continuous-pilot-v2","title":"Model Version","type":"string"},"word_score_version":{"const":"v2","title":"Word Score Version","type":"string"},"scope":{"title":"Scope","type":"string"},"score_direction":{"const":"0_low_proficiency__1_high_proficiency","title":"Score Direction","type":"string"},"status":{"enum":["scored","partial_word_scores","unscorable"],"title":"Status","type":"string"},"components":{"anyOf":[{"$ref":"#/components/schemas/ProficiencyComponents"},{"type":"null"}],"default":null},"words":{"items":{"$ref":"#/components/schemas/ProficiencyWord"},"title":"Words","type":"array"},"speech_seconds":{"title":"Speech Seconds","type":"number"},"word_count":{"title":"Word Count","type":"integer"},"scored_word_count":{"title":"Scored Word Count","type":"integer"},"transcript_used":{"title":"Transcript Used","type":"boolean"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Reason"},"word_calibration":{"title":"Word Calibration","type":"string"},"recording_calibration":{"title":"Recording Calibration","type":"string"},"alignment_method":{"title":"Alignment Method","type":"string"},"aggregation":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Aggregation"},"window_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Window Count"},"encoder_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Encoder Sha256"},"word_checkpoint_sha256":{"items":{"type":"string"},"title":"Word Checkpoint Sha256","type":"array"},"alignment_checkpoint_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Alignment Checkpoint Sha256"},"phone_lexicon_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Phone Lexicon Sha256"},"accentedness":{"default":null,"title":"Accentedness","type":"null"},"legacy_model_version":{"const":"fluency_cefr-v2-final","default":"fluency_cefr-v2-final","title":"Legacy Model Version","type":"string"},"legacy_check":{"anyOf":[{"$ref":"#/components/schemas/ProficiencyCheck"},{"type":"null"}],"default":null,"description":"Alias of the top-level legacy CEFR validity and billing check"},"cefr":{"description":"Most likely CEFR band","enum":["A1","A2","B1","B2","C1","C2"],"title":"Cefr","type":"string"},"cefr_score":{"description":"Continuous band index: 0 = A1 ... 5 = C2","maximum":5,"minimum":0,"title":"Cefr Score","type":"number"},"cefr_probs":{"additionalProperties":{"type":"number"},"title":"Cefr Probs","type":"object"},"confidence":{"description":"Probability of the reported band","maximum":1,"minimum":0,"title":"Confidence","type":"number"},"fluency":{"enum":["low","intermediate","high"],"title":"Fluency","type":"string"},"fluency_probs":{"additionalProperties":{"type":"number"},"title":"Fluency Probs","type":"object"},"fluency_score":{"description":"Sentence-fluency scale, 0-10","maximum":10,"minimum":0,"title":"Fluency Score","type":"number"},"features":{"additionalProperties":{"type":"number"},"description":"Utterance-fluency measures (speech rate, pauses, lexical diversity)","title":"Features","type":"object"}},"required":["continuous_check","continuous_metadata","model_version","word_score_version","scope","score_direction","status","speech_seconds","word_count","scored_word_count","transcript_used","word_calibration","recording_calibration","alignment_method","cefr","cefr_score","cefr_probs","confidence","fluency","fluency_probs","fluency_score","features"],"title":"Legacy CEFR proficiency with additive continuous pronunciation scores","type":"object"},"ProficiencyResult":{"description":"SpeechResult plus proficiency and check objects","allOf":[{"$ref":"#/components/schemas/SpeechResult"}],"required":["proficiency","check"],"properties":{"task":{"type":"string","enum":["proficiency"]},"proficiency":{"$ref":"#/components/schemas/ProficiencyScores"},"check":{"$ref":"#/components/schemas/ProficiencyCheck"}}},"ErrorEnvelope":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["type","code","message"],"properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"param":{"type":["string","null"]},"request_id":{"type":["string","null"]}}}}},"OrukeetRequest":{"type":"object","required":["file","model"],"additionalProperties":false,"properties":{"file":{"type":"string","format":"binary","description":"English audio, at most 60 seconds; complete multipart body at most 4 MiB."},"model":{"type":"string","enum":["oruk-orukeet"]},"language":{"type":"string","enum":["en","en-US","en-GB"],"default":"en"},"response_format":{"type":"string","enum":["json","verbose_json","text"],"default":"json","description":"Optional tasks require JSON output."},"num_speakers":{"type":"integer","minimum":1,"maximum":32,"description":"Requires diarize=true."},"emotion_detection":{"type":"boolean","default":false,"description":"15 emotion scores and labels from vocal delivery. Adds $0.0080/audio minute."},"diarize":{"type":"boolean","default":false,"description":"Speaker labels and transcripts for each turn. Adds $0.0040/audio minute."}}},"OrukeetTranscription":{"type":"object","required":["id","object","model","text","duration","usage"],"properties":{"id":{"type":"string"},"object":{"type":"string","enum":["audio.transcription"]},"model":{"type":"string","enum":["oruk-orukeet"]},"text":{"type":"string"},"duration":{"type":"number"},"audio_seconds":{"type":"number"},"language":{"type":"string","enum":["en"]},"asr_ms":{"type":"number","description":"Server transcription processing time; excludes network, authentication, and usage reservation."},"server_ms":{"type":"number","description":"Server processing including optional tasks; excludes network, authentication, and usage reservation."},"emotions":{"type":"array","items":{"$ref":"#/components/schemas/Score"}},"styles":{"type":"array","items":{"$ref":"#/components/schemas/Score"}},"emotion_detection":{"type":"object","description":"Present when emotion_detection=true.","properties":{"emotions":{"type":"array","items":{"$ref":"#/components/schemas/Score"}},"scores":{"type":"object","additionalProperties":{"type":"number"}},"thresholds":{"type":"object","additionalProperties":{"type":"number"}},"segments":{"type":"array","items":{"type":"object"}}}},"diarized":{"type":"boolean"},"speakers":{"type":"array","items":{"type":"string"}},"segments":{"type":"array","description":"Speaker turns with diarize=true; empty for transcription alone. No word timestamps.","items":{"type":"object","properties":{"id":{"type":"integer"},"start":{"type":"number"},"end":{"type":"number"},"speaker":{"type":"string"},"text":{"type":"string"}}}},"usage":{"type":"object","properties":{"audio_seconds":{"type":"number"},"billable_seconds":{"type":"number"},"billing_basis":{"type":"string","enum":["subscription","prepaid"]},"cost_microusd":{"type":"integer"},"estimated_cost_usd":{"type":"string"},"rate_per_minute_usd":{"type":"string"},"pricing_version":{"type":"string"},"tasks":{"type":"array","items":{"type":"string"}}}},"request_id":{"type":"string"}}},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Resonance2SidecarResponse":{"properties":{"model":{"type":"string","const":"oruk-resonance-2","title":"Model","default":"oruk-resonance-2"},"model_revision":{"type":"string","title":"Model Revision","default":"bca79fa889fbf0d8a5b23d41c1dc6303bab43576dcdbc2036980fbfd9b6af9b2","enum":["b34570175184c22066f9d3b595d52ef62281adb9a1d51c332d3874b8ff66832b","bca79fa889fbf0d8a5b23d41c1dc6303bab43576dcdbc2036980fbfd9b6af9b2"]},"calibration_revision":{"type":"string","const":"ccd5948dc3a3cbfd628b158ccf9f95ac582da38c2e8f242128c1e465615e1c07","title":"Calibration Revision","default":"ccd5948dc3a3cbfd628b158ccf9f95ac582da38c2e8f242128c1e465615e1c07"},"duration":{"type":"number","maximum":120,"minimum":0.1,"title":"Duration"},"window_count":{"type":"integer","maximum":6,"minimum":1,"title":"Window Count"},"aggregation":{"type":"string","const":"mean_window_logits","title":"Aggregation","default":"mean_window_logits"},"scores":{"additionalProperties":{"type":"number","maximum":1,"minimum":0},"type":"object","title":"Scores"},"axes":{"additionalProperties":{"type":"number","maximum":1,"minimum":-1},"type":"object","title":"Axes"},"unipolar":{"additionalProperties":{"type":"number","maximum":1,"minimum":0},"type":"object","title":"Unipolar"},"labels":{"items":{"$ref":"#/components/schemas/SelectedLabel"},"type":"array","maxItems":31,"title":"Labels"},"regime":{"type":"string","enum":["f1","precision"],"title":"Regime"},"calibrated":{"type":"boolean","const":true,"title":"Calibrated"},"abstained":{"type":"boolean","title":"Abstained"},"abstention_reason":{"anyOf":[{"type":"string","const":"digital_silence"},{"type":"null"}],"title":"Abstention Reason"},"inference_ms":{"type":"number","minimum":0,"title":"Inference Ms"},"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"speech.affect.result","title":"Object","default":"speech.affect.result"},"task":{"type":"string","const":"affect","title":"Task","default":"affect"},"usage":{"$ref":"#/components/schemas/Resonance2SidecarUsage"}},"additionalProperties":false,"type":"object","required":["duration","window_count","scores","axes","unipolar","labels","regime","calibrated","abstained","abstention_reason","inference_ms","id","usage"],"title":"Resonance2SidecarResponse"},"Resonance2SidecarUsage":{"properties":{"audio_seconds":{"type":"number","title":"Audio Seconds","description":"Measured audio duration"},"billable_seconds":{"type":"number","title":"Billable Seconds","description":"Duration used for billing; one-second minimum"},"rate_per_minute_usd":{"type":"string","title":"Rate Per Minute Usd"},"estimated_cost_usd":{"type":"string","title":"Estimated Cost Usd"},"pricing_version":{"type":"string","title":"Pricing Version"},"billing_unit":{"type":"string","enum":["audio_second","request"],"title":"Billing Unit","default":"audio_second"},"rate_per_request_usd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Per Request Usd","description":"Flat price per billable check"},"rate_per_hour_usd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rate Per Hour Usd"}},"type":"object","required":["audio_seconds","billable_seconds","rate_per_minute_usd","estimated_cost_usd","pricing_version"],"title":"Resonance2SidecarUsage"},"SelectedLabel":{"properties":{"label":{"type":"string","title":"Label"},"score":{"type":"number","maximum":1,"minimum":0,"title":"Score"}},"additionalProperties":false,"type":"object","required":["label","score"],"title":"SelectedLabel"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ProficiencyComponents":{"properties":{"accuracy":{"maximum":1,"minimum":0,"title":"Accuracy","type":"number"},"fluency":{"maximum":1,"minimum":0,"title":"Fluency","type":"number"},"prosody":{"maximum":1,"minimum":0,"title":"Prosody","type":"number"}},"required":["accuracy","fluency","prosody"],"title":"ProficiencyComponents","type":"object"},"ProficiencyWord":{"properties":{"text":{"title":"Text","type":"string"},"start_s":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Start S"},"end_s":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"End S"},"score":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"default":null,"title":"Score"},"status":{"enum":["scored","unscorable"],"title":"Status","type":"string"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Scope"},"accentedness":{"default":null,"title":"Accentedness","type":"null"}},"required":["text","status"],"title":"ProficiencyWord","type":"object"},"ContinuousProficiencyCheck":{"properties":{"status":{"enum":["scored","insufficient_audio","unavailable"],"title":"Status","type":"string"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Reason"}},"required":["status"],"title":"ContinuousProficiencyCheck","type":"object"},"ContinuousProficiencyMetadata":{"properties":{"speech_seconds":{"title":"Speech Seconds","type":"number"},"word_count":{"title":"Word Count","type":"integer"},"transcript_used":{"description":"True when the caller supplied the reference transcript","title":"Transcript Used","type":"boolean"}},"required":["speech_seconds","word_count","transcript_used"],"title":"ContinuousProficiencyMetadata","type":"object"},"Spectra2Request":{"type":"object","additionalProperties":false,"required":["file","model"],"properties":{"file":{"type":"string","format":"binary","description":"Mono 16 kHz WAV, finalized FLAC, signed PCM16 little-endian (file MIME audio/pcm), or float32 little-endian (audio/f32le). Raw PCM requires its MIME type. WAV/FLAC can be detected from file headers. Duration 45 ms–60 seconds, at most 4 MiB. Complete multipart body at most 4 MiB + 16 KiB. Exactly one file; duplicate and unknown fields are rejected."},"model":{"type":"string","enum":["oruk-spectra-2"]}}},"Spectra2Result":{"type":"object","additionalProperties":false,"required":["id","object","model","task","text","duration","emotions","styles","usage"],"properties":{"id":{"type":"string"},"object":{"type":"string","enum":["speech.result"]},"model":{"type":"string","enum":["oruk-spectra-2"]},"task":{"type":"string","enum":["transcription","analysis"]},"text":{"type":"string"},"duration":{"type":"number","minimum":0.045,"maximum":60},"emotions":{"type":"array","minItems":15,"maxItems":15,"description":"One score for every label, covering the whole recording. Scores are independent and do not sum to one.","items":{"type":"object","additionalProperties":false,"required":["label","score"],"properties":{"label":{"type":"string","enum":["happy","excited","hopeful","sad","worried","angry","frustrated","disappointed","scared","disgusted","surprised","embarrassed","proud","relieved","neutral"]},"score":{"type":"number","minimum":0,"maximum":1}}}},"styles":{"type":"array","minItems":16,"maxItems":16,"description":"One score for every label, covering the whole recording. Scores are independent and do not sum to one.","items":{"type":"object","additionalProperties":false,"required":["label","score"],"properties":{"label":{"type":"string","enum":["energetic","passionate","irritated","warm","playful","sarcastic","deadpan","hesitant","confident","sincere","skeptical","tired","formal","casual","impatient","distracted"]},"score":{"type":"number","minimum":0,"maximum":1}}}},"usage":{"type":"object","additionalProperties":false,"required":["audio_seconds","billable_seconds","rate_per_minute_usd","estimated_cost_usd","pricing_version","billing_unit"],"properties":{"audio_seconds":{"type":"number","minimum":0.045,"maximum":60},"billable_seconds":{"type":"number","minimum":1,"maximum":60},"rate_per_minute_usd":{"type":"string","description":"Legacy reference rate; subscription invoices follow shared speech understanding plan minutes."},"estimated_cost_usd":{"type":"string","description":"Legacy reference cost, not the subscription invoice."},"pricing_version":{"type":"string"},"billing_unit":{"type":"string","enum":["audio_second"]}}}}},"Spectra2PreparedSession":{"type":"object","additionalProperties":false,"required":["object","model","token","expires_at_ms","request_ids"],"properties":{"object":{"type":"string","enum":["speech.session"]},"model":{"type":"string","enum":["oruk-spectra-2"]},"token":{"type":"string","description":"Keep private. Send as X-Oruk-Session with the same API key."},"expires_at_ms":{"type":"integer","description":"Unix time in milliseconds; preparation does not extend this deadline."},"request_ids":{"type":"array","minItems":1,"maxItems":128,"items":{"type":"string"},"description":"Use a different supplied ID for each new recording. Retain it if completion is uncertain."},"capacity_seconds":{"type":"integer","minimum":0,"description":"Advisory remaining audio capacity for this new session. Deduct each recording duration rounded up to a whole second before dispatch, including uncertain attempts. The server independently enforces capacity and expiry."}}},"Spectra2StreamSession":{"type":"object","additionalProperties":false,"required":["object","model","task","request_id","url","protocol","ticket","expires_at_ms","max_audio_seconds"],"properties":{"object":{"type":"string","enum":["speech.stream_session"]},"model":{"type":"string","enum":["oruk-spectra-2"]},"task":{"type":"string","enum":["transcription","analysis"]},"request_id":{"type":"string"},"url":{"type":"string","format":"uri","description":"Open this WebSocket URL from your server. Do not add query parameters."},"protocol":{"type":"string","enum":["oruk.spectra2.v1"]},"ticket":{"type":"string","description":"Private one-request credential. Send [protocol, ticket] as WebSocket subprotocols; never log it."},"expires_at_ms":{"type":"integer","description":"Original prepared-session deadline, as Unix milliseconds."},"max_audio_seconds":{"type":"number","exclusiveMinimum":0,"maximum":30,"description":"Time remaining at setup. Honor the fresher recording limit in the WebSocket ready message."}}},"SyntheticSpeechDetectionResponse":{"properties":{"object":{"type":"string","const":"synthetic_speech.result","title":"Object"},"model":{"type":"string","const":"orukzero","title":"Model"},"model_revision":{"type":"string","const":"2026-10-05-adapt-216","title":"Model Revision"},"duration":{"type":"number","maximum":60,"minimum":1,"title":"Duration"},"prediction":{"type":"string","enum":["human","synthetic"],"title":"Prediction"},"synthetic_score":{"type":"number","maximum":1,"minimum":0,"title":"Synthetic Score"},"threshold":{"type":"number","const":0.5,"title":"Threshold"},"score_type":{"type":"string","const":"uncalibrated_sigmoid","title":"Score Type"},"aggregation":{"type":"string","const":"coverage_weighted_mean_logit","title":"Aggregation"},"segments":{"items":{"$ref":"#/components/schemas/SyntheticSpeechSegment"},"type":"array","maxItems":10,"minItems":1,"title":"Segments"},"warnings":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Warnings"},"id":{"type":"string","title":"Id"},"usage":{"additionalProperties":true,"type":"object","title":"Usage"}},"additionalProperties":false,"type":"object","required":["object","model","model_revision","duration","prediction","synthetic_score","threshold","score_type","aggregation","segments","warnings","id","usage"],"title":"DetectionResponse"},"SyntheticSpeechSegment":{"properties":{"start":{"type":"number","maximum":60,"minimum":0,"title":"Start"},"end":{"type":"number","maximum":60,"exclusiveMinimum":0,"title":"End"},"synthetic_score":{"type":"number","maximum":1,"minimum":0,"title":"Synthetic Score"},"prediction":{"type":"string","enum":["human","synthetic"],"title":"Prediction"}},"additionalProperties":false,"type":"object","required":["start","end","synthetic_score","prediction"],"title":"Segment"}}},"x-orukeet":{"model":"oruk-orukeet","billing_basis":"subscription","usd_per_audio_minute":"0.00045","optional_tasks":{"emotion_detection":"0.0080","diarize":"0.0040"},"max_audio_seconds":60,"max_multipart_bytes":4194304,"websocket_url":"wss://orukeet-direct.oruk.ai/v1/audio/transcriptions/stream","docs":"https://oruk.ai/docs#orukeet"},"x-resonance-2":{"id":"oruk-resonance-2","availability":"preview","endpoint":"/v1/audio/resonance-2","documentation":"https://oruk.ai/docs#resonance-2","schema":"https://oruk.ai/resonance-2.openapi.json","pricing":"Same shared plan minutes and legacy affect rate as Resonance 1."},"x-spectra-2":{"model":"oruk-spectra-2","docs":"https://oruk.ai/docs#spectra-2","lifecycle":"Stable","supported_tasks":["transcription","analysis"],"transcription_languages":["bg","hr","cs","da","nl","en","et","fi","fr","de","el","hu","it","lv","lt","mt","pl","pt","ro","ru","sk","sl","es","sv","uk"],"language_details":[{"code":"bg","name":"Bulgarian"},{"code":"hr","name":"Croatian"},{"code":"cs","name":"Czech"},{"code":"da","name":"Danish"},{"code":"nl","name":"Dutch"},{"code":"en","name":"English"},{"code":"et","name":"Estonian"},{"code":"fi","name":"Finnish"},{"code":"fr","name":"French"},{"code":"de","name":"German"},{"code":"el","name":"Greek"},{"code":"hu","name":"Hungarian"},{"code":"it","name":"Italian"},{"code":"lv","name":"Latvian"},{"code":"lt","name":"Lithuanian"},{"code":"mt","name":"Maltese"},{"code":"pl","name":"Polish"},{"code":"pt","name":"Portuguese"},{"code":"ro","name":"Romanian"},{"code":"ru","name":"Russian"},{"code":"sk","name":"Slovak"},{"code":"sl","name":"Slovenian"},{"code":"es","name":"Spanish"},{"code":"sv","name":"Swedish"},{"code":"uk","name":"Ukrainian"}],"language_detection":"automatic","min_audio_seconds":0.045,"max_audio_seconds":60,"max_file_bytes":4194304,"max_multipart_bytes":4210688,"sample_rate":16000,"channels":1,"formats":["wav","flac","pcm16","float32le"],"score_scope":"clip","emotion_labels":["happy","excited","hopeful","sad","worried","angry","frustrated","disappointed","scared","disgusted","surprised","embarrassed","proud","relieved","neutral"],"style_labels":["energetic","passionate","irritated","warm","playful","sarcastic","deadpan","hesitant","confident","sincere","skeptical","tired","formal","casual","impatient","distracted"],"subscription_allowance":"shared_audio_minutes","minimum_billable_seconds":1,"reference_usd_per_audio_minute":{"transcription":"0.0080","analysis":"0.0120"},"streaming":{"url":"wss://speech-api.oruk.ai/v1/audio/spectra-2/stream","authentication":"Authorization bearer header from server clients","input":"mono 16 kHz PCM16 little-endian binary frames","max_frame_bytes":32768,"max_audio_seconds":60,"finalization":"explicit finish message","output":"one final Spectra2Result after finish","provisional_results":false,"prepared_connection":{"session_endpoint":"/v1/audio/sessions","connection_endpoint":"/v1/audio/stream-sessions","lifetime_seconds":30,"server_only":true,"recording_limit":"Use max_audio_seconds from ready and finish before expires_at_ms."}}}}