{"openapi":"3.1.0","info":{"title":"AI Interviewer Service","description":"Standalone AI interview engine — independent from the main Next.js/Node app.","version":"0.1.0"},"paths":{"/health":{"get":{"summary":"Health","description":"Liveness probe — the process is up. Does not touch external dependencies.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/ready":{"get":{"summary":"Ready","description":"Readiness probe — reports AI provider config and live database/Redis/LiveKit connectivity.\n\nAll three infra dependencies are optional-but-verified: if unset,\nreadiness isn't blocked on them; if set, a real connection must succeed\nor the probe fails.","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/ai/test":{"post":{"tags":["ai"],"summary":"Test Ai","description":"Smoke-test endpoint for the provider router.\n\nExercises the full Groq-primary / Mistral-fallback path so the router\ncan be verified against real provider accounts, not just mocks.","operationId":"test_ai_api_v1_ai_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AITestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AITestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/candidates":{"post":{"tags":["candidates"],"summary":"Create Candidate","operationId":"create_candidate_api_v1_candidates_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["candidates"],"summary":"Find Candidate By External Id","operationId":"find_candidate_by_external_id_api_v1_candidates_get","parameters":[{"name":"external_candidate_id","in":"query","required":true,"schema":{"type":"string","title":"External Candidate Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/candidates/{candidate_id}":{"get":{"tags":["candidates"],"summary":"Get Candidate","operationId":"get_candidate_api_v1_candidates__candidate_id__get","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Candidate Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/candidates/parse-cv":{"post":{"tags":["candidates"],"summary":"Parse Cv","description":"Extracts a structured profile from an uploaded CV (PDF/DOCX/text). If\ncandidate_id is given, persists the result to candidate_profiles —\notherwise this is a stateless parse-and-return, same pattern as\nPOST /api/v1/jobs/analyze.\n\nRaw file storage (Supabase Storage upload + candidate_documents row) is\nnot implemented yet — only the parsed profile is persisted.","operationId":"parse_cv_api_v1_candidates_parse_cv_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_parse_cv_api_v1_candidates_parse_cv_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseCVResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/candidates/{candidate_id}/documents":{"post":{"tags":["candidates"],"summary":"Upload Candidate Document","description":"Uploads and stores a raw candidate document (Supabase Storage) and\nrecords its metadata in candidate_documents. Does not parse it — see\nPOST /{candidate_id}/parse-cv for extraction, which also stores the\ndocument it's given via this same path.","operationId":"upload_candidate_document_api_v1_candidates__candidate_id__documents_post","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Candidate Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_candidate_document_api_v1_candidates__candidate_id__documents_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateDocumentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/candidates/{candidate_id}/parse-cv":{"post":{"tags":["candidates"],"summary":"Parse Candidate Cv","description":"Milestone 8: candidate document -> safe text extraction (PDF/DOCX/\nplain text, no OCR) -> AIProviderRouter -> structured\nCandidateIntelligenceProfile -> validation -> persistence. Also stores\nthe raw document (Supabase Storage + candidate_documents) so the parsed\nprofile can be traced back to its source file. Distinct from the\npre-existing POST /parse-cv above — different agent, different output\nshape (packages/schemas/candidate_intelligence.py), different tables.","operationId":"parse_candidate_cv_api_v1_candidates__candidate_id__parse_cv_post","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Candidate Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_parse_candidate_cv_api_v1_candidates__candidate_id__parse_cv_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateIntelligenceProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/candidates/{candidate_id}/profile":{"get":{"tags":["candidates"],"summary":"Get Candidate Intelligence Profile","operationId":"get_candidate_intelligence_profile_api_v1_candidates__candidate_id__profile_get","parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Candidate Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateIntelligenceProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs":{"post":{"tags":["jobs"],"summary":"Create Job","operationId":"create_job_api_v1_jobs_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}":{"get":{"tags":["jobs"],"summary":"Get Job","operationId":"get_job_api_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/analyze":{"post":{"tags":["jobs"],"summary":"Analyze Job","description":"Stateless: analyzes the given role/job info and returns competencies,\nweights, expectations, scenarios, and a rubric. Does not read or write\nthe jobs table. Pre-existing (Milestone 9's Interview Planner consumes\nthis exact RoleAnalysis shape) — left untouched by Milestone 7's new\nRole Intelligence Agent below, which persists to its own tables and\nreturns a different, non-overlapping response shape. See\nPOST /{job_id}/analyze for the job_id-based equivalent of *this*\nendpoint's stateless analysis.","operationId":"analyze_job_api_v1_jobs_analyze_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleAnalysisRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleAnalysis"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}/analyze":{"post":{"tags":["jobs"],"summary":"Analyze Job By Id","description":"Milestone 7: loads a stored job, runs the Role Intelligence Agent\n(packages/interview_engine/role_analyzer_agent.py) over it, validates\nthe output, persists it (roles/competencies/role_competencies), and\nreturns the normalized structured result. Distinct from POST /analyze\nabove — different agent, different output shape, different tables.","operationId":"analyze_job_by_id_api_v1_jobs__job_id__analyze_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews":{"post":{"tags":["interviews"],"summary":"Create Interview","operationId":"create_interview_api_v1_interviews_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}":{"get":{"tags":["interviews"],"summary":"Get Interview","operationId":"get_interview_api_v1_interviews__interview_id__get","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/prepare":{"post":{"tags":["interviews"],"summary":"Prepare Interview","description":"Milestone 9: builds a structured interview BLUEPRINT (section time\nallocation, per-competency question plan, CV claims worth probing,\na handful of seed questions) from the interview's job, its latest Role\nIntelligence Agent analysis (Milestone 7), its candidate's latest parsed\nCV (Milestone 8), and the interview's requested duration/difficulty/\nlanguage. Additive: does not touch interviews.plan/status/session_state,\nwhich the (separately implemented) interactive interview loop still\ndrives — this only persists to interview_blueprints. Can be called more\nthan once; each call adds a new blueprint version rather than\noverwriting the previous one.","operationId":"prepare_interview_api_v1_interviews__interview_id__prepare_post","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewBlueprintResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/start":{"post":{"tags":["interviews"],"summary":"Start Interview","description":"Thin HTTP wrapper — all the actual logic lives in\npackages/interview_engine/turn_handler.py, shared with the voice agent\n(services/interviewer_agent/).","operationId":"start_interview_api_v1_interviews__interview_id__start_post","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/message":{"post":{"tags":["interviews"],"summary":"Send Message","description":"Thin HTTP wrapper around packages/interview_engine/turn_handler.py's\nprocess_candidate_message() — the same function the voice agent calls\nfor each candidate utterance, so there is exactly one implementation of\nthe adaptive turn loop regardless of channel.","operationId":"send_message_api_v1_interviews__interview_id__message_post","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/complete":{"post":{"tags":["interviews"],"summary":"Complete Interview","operationId":"complete_interview_api_v1_interviews__interview_id__complete_post","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/transcript":{"get":{"tags":["interviews"],"summary":"Get Interview Transcript","operationId":"get_interview_transcript_api_v1_interviews__interview_id__transcript_get","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewTranscriptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/consent":{"post":{"tags":["interviews"],"summary":"Record Consent","description":"Milestone 19: the candidate must consent before recording begins —\ncall this before (or as part of) joining the LiveKit room with\nrecord_audio/record_video enabled. The voice worker's\n_start_recording_if_requested checks for a consent row here and skips\nstarting the recording entirely if none is on file, so a recording\nrequest with no prior call to this endpoint is a no-op, not an error.","operationId":"record_consent_api_v1_interviews__interview_id__consent_post","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequest","default":{"consent_type":"recording"}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/recordings":{"get":{"tags":["interviews"],"summary":"Get Interview Recordings","operationId":"get_interview_recordings_api_v1_interviews__interview_id__recordings_get","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewRecordingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/report":{"get":{"tags":["interviews"],"summary":"Get Interview Report","operationId":"get_interview_report_api_v1_interviews__interview_id__report_get","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/interviews/{interview_id}/evaluate":{"post":{"tags":["interviews"],"summary":"Evaluate Interview","description":"Explicit trigger for report generation (Milestone 13), as an\nalternative to GET /report's generate-on-first-read. Shares the exact\nsame idempotent generate-or-return-cached logic — calling this any\nnumber of times, concurrently or not, never produces more than one\ninterview_reports row per interview.","operationId":"evaluate_interview_api_v1_interviews__interview_id__evaluate_post","parameters":[{"name":"interview_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Interview Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/livekit/token":{"post":{"tags":["livekit"],"summary":"Create Livekit Token","operationId":"create_livekit_token_api_v1_livekit_token_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveKitTokenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveKitTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/voices":{"get":{"tags":["voices"],"summary":"List Voices","description":"The normalized voice registry (Milestone 17) — every catalog entry,\nNigerian and International alike, each with an honest `enabled` (is its\nprovider actually configured in this environment) rather than assuming\nevery listed voice is usable. Never exposes voice/accent data to\nscoring — this router has no dependency on packages/evaluation or\npackages/interview_engine (see tests/unit/test_voice_layering.py).","operationId":"list_voices_api_v1_voices_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/voices/{voice_id}/preview":{"post":{"tags":["voices"],"summary":"Preview Voice","description":"Synthesizes each voice's own catalog preview_text — a fixed, known-\nsafe string, never caller-supplied text — so this endpoint can't be\nused to make the interview's TTS say arbitrary things outside a live\ninterview.","operationId":"preview_voice_api_v1_voices__voice_id__preview_post","parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AITestRequest":{"properties":{"prompt":{"type":"string","minLength":1,"title":"Prompt"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"},"temperature":{"type":"number","title":"Temperature","default":0.7}},"type":"object","required":["prompt"],"title":"AITestRequest"},"AITestResponse":{"properties":{"content":{"type":"string","title":"Content"},"provider":{"type":"string","title":"Provider"},"model":{"type":"string","title":"Model"},"latency_ms":{"type":"number","title":"Latency Ms"},"used_fallback":{"type":"boolean","title":"Used Fallback"},"prompt_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Tokens"},"completion_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completion Tokens"},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tokens"}},"type":"object","required":["content","provider","model","latency_ms","used_fallback"],"title":"AITestResponse"},"BlueprintSection":{"properties":{"key":{"type":"string","enum":["INTRODUCTION","CV_VALIDATION","EXPERIENCE","COMPETENCY","SCENARIO","BEHAVIORAL","PROBLEM_SOLVING","CANDIDATE_QUESTIONS","CLOSING"],"title":"Key"},"target_minutes":{"type":"integer","minimum":0.0,"title":"Target Minutes"},"purpose":{"type":"string","minLength":1,"title":"Purpose"}},"type":"object","required":["key","target_minutes","purpose"],"title":"BlueprintSection"},"Body_parse_candidate_cv_api_v1_candidates__candidate_id__parse_cv_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_parse_candidate_cv_api_v1_candidates__candidate_id__parse_cv_post"},"Body_parse_cv_api_v1_candidates_parse_cv_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"candidate_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Candidate Id"}},"type":"object","required":["file"],"title":"Body_parse_cv_api_v1_candidates_parse_cv_post"},"Body_upload_candidate_document_api_v1_candidates__candidate_id__documents_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"document_type":{"type":"string","title":"Document Type","default":"cv"}},"type":"object","required":["file"],"title":"Body_upload_candidate_document_api_v1_candidates__candidate_id__documents_post"},"CandidateCreateRequest":{"properties":{"external_candidate_id":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"External Candidate Id"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":32,"minLength":3},{"type":"null"}],"title":"Phone"}},"type":"object","required":["name","email"],"title":"CandidateCreateRequest"},"CandidateDocumentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"candidate_id":{"type":"string","format":"uuid","title":"Candidate Id"},"document_type":{"type":"string","title":"Document Type"},"storage_path":{"type":"string","title":"Storage Path"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","candidate_id","document_type","storage_path","created_at"],"title":"CandidateDocumentResponse"},"CandidateEducationEntry":{"properties":{"institution":{"type":"string","title":"Institution"},"degree":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Degree"},"field_of_study":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field Of Study"},"graduation_year":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Graduation Year"}},"type":"object","required":["institution"],"title":"CandidateEducationEntry"},"CandidateInput":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["name","email"],"title":"CandidateInput"},"CandidateIntelligenceProfileResponse":{"properties":{"candidate_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Name"},"current_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Role"},"experience_years":{"type":"number","minimum":0.0,"title":"Experience Years","default":0},"roles":{"items":{"$ref":"#/components/schemas/CandidateRoleEntry"},"type":"array","title":"Roles"},"companies":{"items":{"type":"string"},"type":"array","title":"Companies"},"education":{"items":{"$ref":"#/components/schemas/CandidateEducationEntry"},"type":"array","title":"Education"},"skills":{"items":{"type":"string"},"type":"array","title":"Skills"},"certifications":{"items":{"type":"string"},"type":"array","title":"Certifications"},"projects":{"items":{"$ref":"#/components/schemas/CandidateProjectEntry"},"type":"array","title":"Projects"},"achievements":{"items":{"type":"string"},"type":"array","title":"Achievements"},"claims_to_validate":{"items":{"$ref":"#/components/schemas/ClaimToValidate"},"type":"array","title":"Claims To Validate"},"provider":{"type":"string","title":"Provider"},"model":{"type":"string","title":"Model"},"prompt_version":{"type":"string","title":"Prompt Version"},"id":{"type":"string","format":"uuid","title":"Id"},"candidate_id":{"type":"string","format":"uuid","title":"Candidate Id"},"source_document_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Source Document Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["provider","model","prompt_version","id","candidate_id","created_at"],"title":"CandidateIntelligenceProfileResponse"},"CandidateProfile":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"current_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Role"},"total_experience_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Experience Years"},"previous_roles":{"items":{"$ref":"#/components/schemas/PreviousRole"},"type":"array","title":"Previous Roles"},"companies":{"items":{"type":"string"},"type":"array","title":"Companies"},"education":{"items":{"$ref":"#/components/schemas/Education"},"type":"array","title":"Education"},"skills":{"items":{"type":"string"},"type":"array","title":"Skills"},"projects":{"items":{"$ref":"#/components/schemas/Project"},"type":"array","title":"Projects"},"achievements":{"items":{"type":"string"},"type":"array","title":"Achievements"},"measurable_claims":{"items":{"$ref":"#/components/schemas/MeasurableClaim"},"type":"array","title":"Measurable Claims"},"claims_to_validate":{"items":{"type":"string"},"type":"array","title":"Claims To Validate"}},"type":"object","title":"CandidateProfile"},"CandidateProjectEntry":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"technologies":{"items":{"type":"string"},"type":"array","title":"Technologies"}},"type":"object","required":["name"],"title":"CandidateProjectEntry"},"CandidateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"organization_id":{"type":"string","format":"uuid","title":"Organization Id"},"external_candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Candidate Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","organization_id","name","email","created_at","updated_at"],"title":"CandidateResponse"},"CandidateRoleEntry":{"properties":{"title":{"type":"string","title":"Title"},"company":{"type":"string","title":"Company"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},"type":"object","required":["title","company"],"title":"CandidateRoleEntry"},"ClaimToValidate":{"properties":{"claim":{"type":"string","minLength":1,"title":"Claim"},"type":{"type":"string","enum":["achievement","metric","experience","skill","responsibility"],"title":"Type"},"priority":{"type":"string","enum":["low","medium","high"],"title":"Priority"},"source_text":{"type":"string","minLength":1,"title":"Source Text"}},"type":"object","required":["claim","type","priority","source_text"],"title":"ClaimToValidate"},"Competency":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"category":{"type":"string","enum":["technical","behavioral","domain"],"title":"Category"},"weight":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Weight"}},"type":"object","required":["name","description","category","weight"],"title":"Competency"},"CompetencyItem":{"properties":{"key":{"type":"string","minLength":1,"title":"Key"},"name":{"type":"string","minLength":1,"title":"Name"},"description":{"type":"string","title":"Description"},"category":{"type":"string","enum":["technical","behavioral","domain","communication"],"title":"Category"},"weight":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Weight"},"target_difficulty":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Target Difficulty"}},"type":"object","required":["key","name","description","category","weight","target_difficulty"],"title":"CompetencyItem"},"CompetencyPlanItem":{"properties":{"competency_key":{"type":"string","minLength":1,"title":"Competency Key"},"target_minutes":{"type":"integer","minimum":0.0,"title":"Target Minutes"},"starting_difficulty":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Starting Difficulty"},"minimum_questions":{"type":"integer","minimum":1.0,"title":"Minimum Questions"},"maximum_questions":{"type":"integer","minimum":1.0,"title":"Maximum Questions"}},"type":"object","required":["competency_key","target_minutes","starting_difficulty","minimum_questions","maximum_questions"],"title":"CompetencyPlanItem"},"CompetencyResult":{"properties":{"key":{"type":"string","title":"Key"},"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"evidence_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Evidence Ids"}},"type":"object","required":["key","score","confidence"],"title":"CompetencyResult","description":"One competency's entry in the final report (Milestone 13) — score is\non a 0-100 scale (unlike CompetencyScore's raw 0-max_score), and\nevidence_ids are real evidence_items row ids, never LLM-invented, so a\nscore is always traceable back to the specific answers behind it."},"CompetencyRubric":{"properties":{"competency":{"type":"string","title":"Competency"},"levels":{"items":{"$ref":"#/components/schemas/RubricLevel"},"type":"array","title":"Levels"}},"type":"object","required":["competency","levels"],"title":"CompetencyRubric"},"ConsentRequest":{"properties":{"consent_type":{"type":"string","title":"Consent Type","default":"recording"}},"type":"object","title":"ConsentRequest"},"ConsentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"consent_type":{"type":"string","title":"Consent Type"},"method":{"type":"string","title":"Method"},"granted_at":{"type":"string","format":"date-time","title":"Granted At"}},"type":"object","required":["id","interview_id","consent_type","method","granted_at"],"title":"ConsentResponse"},"Education":{"properties":{"institution":{"type":"string","title":"Institution"},"degree":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Degree"},"field_of_study":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field Of Study"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},"type":"object","required":["institution"],"title":"Education"},"FollowUpPolicy":{"properties":{"max_follow_up_depth":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Max Follow Up Depth"}},"type":"object","required":["max_follow_up_depth"],"title":"FollowUpPolicy"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InterviewBlueprintResponse":{"properties":{"duration_minutes":{"type":"integer","minimum":1.0,"title":"Duration Minutes"},"difficulty_mode":{"type":"string","minLength":1,"title":"Difficulty Mode"},"sections":{"items":{"$ref":"#/components/schemas/BlueprintSection"},"type":"array","title":"Sections"},"competency_plan":{"items":{"$ref":"#/components/schemas/CompetencyPlanItem"},"type":"array","title":"Competency Plan"},"cv_claims_to_probe":{"items":{"$ref":"#/components/schemas/ClaimToValidate"},"type":"array","title":"Cv Claims To Probe"},"initial_questions":{"items":{"type":"string"},"type":"array","title":"Initial Questions"},"scenario_topics":{"items":{"type":"string"},"type":"array","title":"Scenario Topics"},"follow_up_policy":{"$ref":"#/components/schemas/FollowUpPolicy"},"provider":{"type":"string","title":"Provider"},"model":{"type":"string","title":"Model"},"prompt_version":{"type":"string","title":"Prompt Version"},"id":{"type":"string","format":"uuid","title":"Id"},"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["duration_minutes","difficulty_mode","sections","follow_up_policy","provider","model","prompt_version","id","interview_id","created_at"],"title":"InterviewBlueprintResponse"},"InterviewCreateRequest":{"properties":{"external_candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Candidate Id"},"external_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Job Id"},"candidate":{"$ref":"#/components/schemas/CandidateInput"},"job":{"$ref":"#/components/schemas/JobInput"},"settings":{"$ref":"#/components/schemas/InterviewSettingsInput"}},"type":"object","required":["candidate","job"],"title":"InterviewCreateRequest"},"InterviewCreateResponse":{"properties":{"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"status":{"type":"string","title":"Status"},"interview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Url"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["interview_id","status","expires_at"],"title":"InterviewCreateResponse"},"InterviewMessageRequest":{"properties":{"message":{"type":"string","minLength":1,"title":"Message"}},"type":"object","required":["message"],"title":"InterviewMessageRequest"},"InterviewRecordingsResponse":{"properties":{"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"recordings":{"items":{"$ref":"#/components/schemas/RecordingResponse"},"type":"array","title":"Recordings"}},"type":"object","required":["interview_id","recordings"],"title":"InterviewRecordingsResponse"},"InterviewReport":{"properties":{"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"overall_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Overall Score"},"recommendation":{"type":"string","enum":["advance","review","do_not_advance"],"title":"Recommendation"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"competencies":{"items":{"$ref":"#/components/schemas/CompetencyResult"},"type":"array","title":"Competencies"},"strengths":{"items":{"type":"string"},"type":"array","title":"Strengths"},"concerns":{"items":{"type":"string"},"type":"array","title":"Concerns"},"summary":{"type":"string","title":"Summary"},"insufficient_evidence":{"items":{"type":"string"},"type":"array","title":"Insufficient Evidence"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["interview_id","overall_score","recommendation","confidence","competencies","strengths","concerns","summary","insufficient_evidence","generated_at"],"title":"InterviewReport"},"InterviewSettingsInput":{"properties":{"duration_minutes":{"type":"integer","maximum":180.0,"minimum":10.0,"title":"Duration Minutes","default":25},"difficulty":{"type":"string","title":"Difficulty","default":"adaptive"},"language":{"type":"string","title":"Language","default":"en"},"voice":{"$ref":"#/components/schemas/VoiceSettings"},"record_audio":{"type":"boolean","title":"Record Audio","default":false},"record_video":{"type":"boolean","title":"Record Video","default":false}},"type":"object","title":"InterviewSettingsInput"},"InterviewSummaryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","title":"Status"},"candidate_id":{"type":"string","format":"uuid","title":"Candidate Id"},"job_id":{"type":"string","format":"uuid","title":"Job Id"},"duration_minutes":{"type":"integer","title":"Duration Minutes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","status","candidate_id","job_id","duration_minutes","created_at"],"title":"InterviewSummaryResponse"},"InterviewTranscriptResponse":{"properties":{"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"entries":{"items":{"$ref":"#/components/schemas/TranscriptEntryWithTimestamp"},"type":"array","title":"Entries"}},"type":"object","required":["interview_id","entries"],"title":"InterviewTranscriptResponse"},"InterviewTurnResponse":{"properties":{"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"status":{"type":"string","title":"Status"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"competency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Competency"},"difficulty":{"type":"integer","title":"Difficulty"},"remaining_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Seconds"}},"type":"object","required":["interview_id","status","difficulty"],"title":"InterviewTurnResponse"},"JobCreateRequest":{"properties":{"external_job_id":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"External Job Id"},"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"description":{"type":"string","maxLength":50000,"minLength":1,"title":"Description"},"seniority":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Seniority"},"requirements":{"items":{"$ref":"#/components/schemas/JobRequirementInput"},"type":"array","title":"Requirements"},"skills":{"items":{"$ref":"#/components/schemas/JobSkillInput"},"type":"array","title":"Skills"}},"type":"object","required":["title","description"],"title":"JobCreateRequest"},"JobInput":{"properties":{"title":{"type":"string","minLength":1,"title":"Title"},"description":{"type":"string","minLength":1,"title":"Description"},"seniority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seniority","default":"mid"},"required_skills":{"items":{"type":"string"},"type":"array","title":"Required Skills"},"preferred_skills":{"items":{"type":"string"},"type":"array","title":"Preferred Skills"}},"type":"object","required":["title","description"],"title":"JobInput"},"JobRequirementInput":{"properties":{"requirement":{"type":"string","maxLength":50000,"minLength":1,"title":"Requirement"},"is_required":{"type":"boolean","title":"Is Required","default":true}},"type":"object","required":["requirement"],"title":"JobRequirementInput"},"JobResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"organization_id":{"type":"string","format":"uuid","title":"Organization Id"},"external_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Job Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"seniority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seniority"},"requirements":{"items":{"$ref":"#/components/schemas/JobRequirementInput"},"type":"array","title":"Requirements"},"skills":{"items":{"$ref":"#/components/schemas/JobSkillInput"},"type":"array","title":"Skills"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","organization_id","title","description","requirements","skills","created_at","updated_at"],"title":"JobResponse"},"JobSkillInput":{"properties":{"skill":{"type":"string","maxLength":255,"minLength":1,"title":"Skill"},"is_required":{"type":"boolean","title":"Is Required","default":true}},"type":"object","required":["skill"],"title":"JobSkillInput"},"LiveKitTokenRequest":{"properties":{"interview_id":{"type":"string","format":"uuid","title":"Interview Id"},"role":{"type":"string","enum":["candidate","observer"],"title":"Role","default":"candidate"},"participant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Participant Name"},"allow_completed_rejoin":{"type":"boolean","title":"Allow Completed Rejoin","default":false}},"type":"object","required":["interview_id"],"title":"LiveKitTokenRequest"},"LiveKitTokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"url":{"type":"string","title":"Url"},"room_name":{"type":"string","title":"Room Name"},"identity":{"type":"string","title":"Identity"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["token","url","room_name","identity","expires_at"],"title":"LiveKitTokenResponse"},"MeasurableClaim":{"properties":{"claim":{"type":"string","title":"Claim"},"metric":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"}},"type":"object","required":["claim"],"title":"MeasurableClaim"},"ParseCVResponse":{"properties":{"profile":{"$ref":"#/components/schemas/CandidateProfile"},"candidate_profile_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Candidate Profile Id"}},"type":"object","required":["profile"],"title":"ParseCVResponse"},"PreviousRole":{"properties":{"title":{"type":"string","title":"Title"},"company":{"type":"string","title":"Company"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["title","company"],"title":"PreviousRole"},"Project":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"technologies":{"items":{"type":"string"},"type":"array","title":"Technologies"}},"type":"object","required":["name"],"title":"Project"},"RecordingResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"type":"string","enum":["audio","video"],"title":"Kind"},"status":{"type":"string","enum":["STARTING","ACTIVE","ENDING","COMPLETE","FAILED","ABORTED"],"title":"Status"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"consent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Consent Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","kind","status","created_at"],"title":"RecordingResponse"},"RoleAnalysis":{"properties":{"role_summary":{"type":"string","title":"Role Summary"},"role_context":{"$ref":"#/components/schemas/RoleContext"},"competencies":{"items":{"$ref":"#/components/schemas/Competency"},"type":"array","minItems":1,"title":"Competencies"},"technical_expectations":{"items":{"type":"string"},"type":"array","title":"Technical Expectations"},"behavioral_expectations":{"items":{"type":"string"},"type":"array","title":"Behavioral Expectations"},"scenarios":{"items":{"$ref":"#/components/schemas/Scenario"},"type":"array","title":"Scenarios"},"rubric":{"items":{"$ref":"#/components/schemas/CompetencyRubric"},"type":"array","title":"Rubric"},"target_difficulty":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Target Difficulty"}},"type":"object","required":["role_summary","competencies","technical_expectations","behavioral_expectations","scenarios","rubric","target_difficulty"],"title":"RoleAnalysis"},"RoleAnalysisRequest":{"properties":{"role":{"type":"string","minLength":1,"title":"Role"},"job_title":{"type":"string","minLength":1,"title":"Job Title"},"job_description":{"type":"string","minLength":1,"title":"Job Description"},"seniority":{"type":"string","minLength":1,"title":"Seniority"},"required_skills":{"items":{"type":"string"},"type":"array","title":"Required Skills"},"preferred_skills":{"items":{"type":"string"},"type":"array","title":"Preferred Skills"}},"type":"object","required":["role","job_title","job_description","seniority"],"title":"RoleAnalysisRequest"},"RoleAnalysisResponse":{"properties":{"role":{"type":"string","minLength":1,"title":"Role"},"seniority":{"type":"string","minLength":1,"title":"Seniority"},"competencies":{"items":{"$ref":"#/components/schemas/CompetencyItem"},"type":"array","minItems":1,"title":"Competencies"},"technical_expectations":{"items":{"type":"string"},"type":"array","title":"Technical Expectations"},"behavioral_expectations":{"items":{"type":"string"},"type":"array","title":"Behavioral Expectations"},"scenario_topics":{"items":{"type":"string"},"type":"array","title":"Scenario Topics"},"evaluation_notes":{"items":{"type":"string"},"type":"array","title":"Evaluation Notes"},"provider":{"type":"string","title":"Provider"},"model":{"type":"string","title":"Model"},"prompt_version":{"type":"string","title":"Prompt Version"},"role_id":{"type":"string","format":"uuid","title":"Role Id"},"job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Job Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["role","seniority","competencies","provider","model","prompt_version","role_id","created_at"],"title":"RoleAnalysisResponse","description":"RoleCompetencyFramework plus where it's persisted. raw_output is\ndeliberately not exposed here — it's kept in the roles table for\ndebugging only (see database/migrations/0009_role_intelligence.sql)."},"RoleContext":{"properties":{"occupation":{"type":"string","title":"Occupation","default":"unknown"},"industry":{"type":"string","title":"Industry","default":"unknown"},"seniority_label":{"type":"string","title":"Seniority Label","default":"unknown"}},"type":"object","title":"RoleContext","description":"Explicit occupation/industry/seniority classification, produced by the\nRole Intelligence Agent before it derives competencies/expectations, so\nthe rest of the analysis is anchored to the actual profession rather than\ndefaulting to an IT-flavored read of an ambiguous job description.\n\"unknown\" is a valid value for any field when the input genuinely doesn't\nsay — this model is additive/best-effort, not a hard requirement."},"RubricLevel":{"properties":{"score":{"type":"integer","title":"Score"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"}},"type":"object","required":["score","label","description"],"title":"RubricLevel"},"Scenario":{"properties":{"title":{"type":"string","title":"Title"},"prompt":{"type":"string","title":"Prompt"},"target_competencies":{"items":{"type":"string"},"type":"array","title":"Target Competencies"},"difficulty":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Difficulty"}},"type":"object","required":["title","prompt","target_competencies","difficulty"],"title":"Scenario"},"TranscriptEntryWithTimestamp":{"properties":{"speaker":{"type":"string","enum":["interviewer","candidate"],"title":"Speaker"},"content":{"type":"string","title":"Content"},"section":{"type":"string","title":"Section"},"competency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Competency"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"question_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Question Id"},"start_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start Seconds"},"end_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"End Seconds"}},"type":"object","required":["speaker","content","section","created_at"],"title":"TranscriptEntryWithTimestamp"},"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"},"VoiceListItem":{"properties":{"id":{"type":"string","title":"Id"},"accent":{"type":"string","enum":["nigerian","international"],"title":"Accent"},"gender":{"type":"string","enum":["male","female"],"title":"Gender"},"language":{"type":"string","title":"Language","default":"en"},"style":{"type":"string","title":"Style","default":"professional"},"display_name":{"type":"string","title":"Display Name"},"description":{"type":"string","title":"Description"},"preview_text":{"type":"string","title":"Preview Text"},"provider":{"type":"string","title":"Provider"},"provider_voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Voice Id"},"content_type":{"type":"string","title":"Content Type","default":"audio/mpeg"},"preview_supported":{"type":"boolean","title":"Preview Supported","default":true},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["id","accent","gender","display_name","description","preview_text","provider","enabled"],"title":"VoiceListItem","description":"VoiceProfile plus enabled — whether this voice can actually be\nsynthesized right now, computed at request time from which providers\nare configured in this environment (packages/voice/tts/factory.py),\nnot baked into the static catalog."},"VoiceListResponse":{"properties":{"voices":{"items":{"$ref":"#/components/schemas/VoiceListItem"},"type":"array","title":"Voices"}},"type":"object","required":["voices"],"title":"VoiceListResponse"},"VoiceSettings":{"properties":{"accent":{"type":"string","enum":["nigerian","international"],"title":"Accent","default":"international"},"gender":{"type":"string","enum":["male","female"],"title":"Gender","default":"female"},"style":{"type":"string","title":"Style","default":"professional"},"speed":{"type":"number","title":"Speed","default":1.0}},"type":"object","title":"VoiceSettings"}}}}