# Models

## The APIError object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"APIError":{"properties":{"type":{"type":"string","title":"Type","description":"Error category"},"code":{"type":"string","title":"Code","description":"Machine-readable error code"},"message":{"type":"string","title":"Message","description":"Human-readable summary"},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Top-level parameter that caused the error"},"doc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Url","description":"Link to relevant documentation"},"errors":{"items":{"$ref":"#/components/schemas/APIErrorDetail"},"type":"array","title":"Errors","description":"Detailed per-field validation errors"}},"type":"object","required":["type","code","message"],"title":"APIError"},"APIErrorDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Machine-readable error code"},"message":{"type":"string","title":"Message","description":"Human-readable explanation"},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Parameter that caused the error"}},"type":"object","required":["code","message"],"title":"APIErrorDetail"}}}}
```

## The APIErrorDetail object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"APIErrorDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Machine-readable error code"},"message":{"type":"string","title":"Message","description":"Human-readable explanation"},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Parameter that caused the error"}},"type":"object","required":["code","message"],"title":"APIErrorDetail"}}}}
```

## The APIErrorResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"APIErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/APIError"}},"type":"object","required":["error"],"title":"APIErrorResponse"},"APIError":{"properties":{"type":{"type":"string","title":"Type","description":"Error category"},"code":{"type":"string","title":"Code","description":"Machine-readable error code"},"message":{"type":"string","title":"Message","description":"Human-readable summary"},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Top-level parameter that caused the error"},"doc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doc Url","description":"Link to relevant documentation"},"errors":{"items":{"$ref":"#/components/schemas/APIErrorDetail"},"type":"array","title":"Errors","description":"Detailed per-field validation errors"}},"type":"object","required":["type","code","message"],"title":"APIError"},"APIErrorDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Machine-readable error code"},"message":{"type":"string","title":"Message","description":"Human-readable explanation"},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"Parameter that caused the error"}},"type":"object","required":["code","message"],"title":"APIErrorDetail"}}}}
```

## The AgentFormSummary object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"AgentFormSummary":{"properties":{"is_complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Complete","description":"Whether the candidate completed the form."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed all knockout questions."},"questions_answered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Questions Answered","description":"Number of questions answered."},"total_questions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Questions","description":"Total number of questions on the form."}},"type":"object","title":"AgentFormSummary","description":"Form screening summary metrics."}}}}
```

## The AgentResumeSummary object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"AgentResumeSummary":{"properties":{"resume_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resume Score","description":"Resume match score."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets eligibility criteria."},"resume_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Link","description":"URL to the uploaded resume."}},"type":"object","title":"AgentResumeSummary","description":"Resume screening summary metrics."}}}}
```

## The AgentSMSSummary object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"AgentSMSSummary":{"properties":{"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed SMS screening."},"criteria_passed":{"items":{"type":"string"},"type":"array","title":"Criteria Passed","description":"Criteria the candidate passed."},"criteria_failed":{"items":{"type":"string"},"type":"array","title":"Criteria Failed","description":"Criteria the candidate failed."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."}},"type":"object","title":"AgentSMSSummary","description":"SMS screening summary metrics."}}}}
```

## The AgentSummary object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"AgentSummary":{"properties":{"resume":{"anyOf":[{"$ref":"#/components/schemas/AgentResumeSummary"},{"type":"null"}],"description":"Resume screening summary."},"web_interview":{"anyOf":[{"$ref":"#/components/schemas/AgentWebInterviewSummary"},{"type":"null"}],"description":"Web interview summary."},"sms":{"anyOf":[{"$ref":"#/components/schemas/AgentSMSSummary"},{"type":"null"}],"description":"SMS screening summary."},"form":{"anyOf":[{"$ref":"#/components/schemas/AgentFormSummary"},{"type":"null"}],"description":"Form screening summary."}},"type":"object","title":"AgentSummary","description":"Per-agent-type summary metrics for a candidate."},"AgentResumeSummary":{"properties":{"resume_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resume Score","description":"Resume match score."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets eligibility criteria."},"resume_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Link","description":"URL to the uploaded resume."}},"type":"object","title":"AgentResumeSummary","description":"Resume screening summary metrics."},"AgentWebInterviewSummary":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall interview score."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"audio_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Link","description":"Signed URL to audio recording."},"video_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Link","description":"Signed URL to video recording."}},"type":"object","title":"AgentWebInterviewSummary","description":"Web interview summary metrics."},"AgentSMSSummary":{"properties":{"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed SMS screening."},"criteria_passed":{"items":{"type":"string"},"type":"array","title":"Criteria Passed","description":"Criteria the candidate passed."},"criteria_failed":{"items":{"type":"string"},"type":"array","title":"Criteria Failed","description":"Criteria the candidate failed."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."}},"type":"object","title":"AgentSMSSummary","description":"SMS screening summary metrics."},"AgentFormSummary":{"properties":{"is_complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Complete","description":"Whether the candidate completed the form."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed all knockout questions."},"questions_answered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Questions Answered","description":"Number of questions answered."},"total_questions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Questions","description":"Total number of questions on the form."}},"type":"object","title":"AgentFormSummary","description":"Form screening summary metrics."}}}}
```

## The AgentWebInterviewSummary object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"AgentWebInterviewSummary":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall interview score."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"audio_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Link","description":"Signed URL to audio recording."},"video_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Link","description":"Signed URL to video recording."}},"type":"object","title":"AgentWebInterviewSummary","description":"Web interview summary metrics."}}}}
```

## The AsyncIngestResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"AsyncIngestResponse":{"properties":{"object":{"type":"string","const":"ingestion","title":"Object","description":"Object type identifier.","default":"ingestion"},"ingestion_id":{"type":"string","title":"Ingestion Id","description":"Unique identifier for this ingestion job."},"status":{"type":"string","title":"Status","description":"Status of the ingestion job.","default":"queued"}},"type":"object","required":["ingestion_id"],"title":"AsyncIngestResponse","description":"Response after queuing an async ingest job."}}}}
```

## The BlackoutPeriod object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"BlackoutPeriod":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether the blackout period is active."},"timezone":{"type":"string","title":"Timezone","description":"IANA timezone identifier."},"start_hour":{"type":"integer","title":"Start Hour","description":"Start hour of the blackout window (0-23)."},"end_hour":{"type":"integer","title":"End Hour","description":"End hour of the blackout window (0-24, where 24 = midnight)."}},"type":"object","required":["enabled","timezone","start_hour","end_hour"],"title":"BlackoutPeriod","description":"Time window during which emails will not be sent."}}}}
```

## The BulkCandidateIngestRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"BulkCandidateIngestRequest":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CandidateIngestRequest"},"type":"array","minItems":1,"title":"Data","description":"List of candidates to ingest"}},"type":"object","required":["data"],"title":"BulkCandidateIngestRequest"},"CandidateIngestRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Candidate full name"},"email":{"type":"string","title":"Email","description":"Candidate email address"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number","description":"Candidate phone number (E.164 format)"},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information on the candidate. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data"}},"type":"object","required":["name","email"],"title":"CandidateIngestRequest"}}}}
```

## The BulkIngestCandidateResponseItem object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"BulkIngestCandidateResponseItem":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier for this candidate-posting pair."},"interview_url":{"type":"string","title":"Interview Url","description":"URL the candidate uses to access the interview."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."}},"type":"object","required":["interview_id","interview_url"],"title":"BulkIngestCandidateResponseItem","description":"A single item in the bulk ingest response."}}}}
```

## The CandidateIngestRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CandidateIngestRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Candidate full name"},"email":{"type":"string","title":"Email","description":"Candidate email address"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number","description":"Candidate phone number (E.164 format)"},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information on the candidate. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data"}},"type":"object","required":["name","email"],"title":"CandidateIngestRequest"}}}}
```

## The CandidateResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CandidateResponse":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier (one per candidate-posting pair)."},"candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Id","description":"Unique candidate identifier (shared across postings within a workspace)."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this candidate belongs to."},"name":{"type":"string","title":"Name","description":"Candidate's full name."},"email":{"type":"string","title":"Email","description":"Candidate's email address."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall match score (0-100). Aggregated across all completed workflow steps."},"status":{"type":"string","title":"Status","description":"Current candidate status: 'pending', 'in_progress', 'evaluating', 'completed', 'shortlisted', 'dismissed', 'knocked_out'. 'evaluating' means all workflow steps are done but the final score is still being computed."},"interview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Url","description":"URL the candidate uses to access the interview."},"workflow":{"anyOf":[{"$ref":"#/components/schemas/CandidateWorkflow"},{"type":"null"}],"description":"Step-by-step workflow progress."},"agent_summary":{"anyOf":[{"$ref":"#/components/schemas/AgentSummary"},{"type":"null"}],"description":"Per-agent-type summary metrics."},"shortlisted":{"type":"boolean","title":"Shortlisted","description":"Whether a recruiter has shortlisted this candidate.","default":false},"dismissed":{"type":"boolean","title":"Dismissed","description":"Whether a recruiter has dismissed this candidate.","default":false},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data supplied at ingestion time."},"interviewed_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interviewed At","description":"Unix timestamp when the candidate completed the interview."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the candidate was ingested."}},"type":"object","required":["interview_id","posting_id","name","email","status"],"title":"CandidateResponse","description":"A candidate within a posting's pipeline.\n\nEach candidate has a unique ``interview_id`` (one per\ncandidate-posting pair) and a ``candidate_id`` (shared across\npostings within a workspace)."},"CandidateWorkflow":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepStatus"},"type":"array","title":"Steps","description":"Ordered list of workflow step statuses."},"all_complete":{"type":"boolean","title":"All Complete","description":"True when every step has been completed."},"last_activity_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Activity At","description":"Unix timestamp of the candidate's most recent interaction with any step."}},"type":"object","required":["steps","all_complete"],"title":"CandidateWorkflow","description":"Overall workflow progress for a candidate."},"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."},"AgentSummary":{"properties":{"resume":{"anyOf":[{"$ref":"#/components/schemas/AgentResumeSummary"},{"type":"null"}],"description":"Resume screening summary."},"web_interview":{"anyOf":[{"$ref":"#/components/schemas/AgentWebInterviewSummary"},{"type":"null"}],"description":"Web interview summary."},"sms":{"anyOf":[{"$ref":"#/components/schemas/AgentSMSSummary"},{"type":"null"}],"description":"SMS screening summary."},"form":{"anyOf":[{"$ref":"#/components/schemas/AgentFormSummary"},{"type":"null"}],"description":"Form screening summary."}},"type":"object","title":"AgentSummary","description":"Per-agent-type summary metrics for a candidate."},"AgentResumeSummary":{"properties":{"resume_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resume Score","description":"Resume match score."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets eligibility criteria."},"resume_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Link","description":"URL to the uploaded resume."}},"type":"object","title":"AgentResumeSummary","description":"Resume screening summary metrics."},"AgentWebInterviewSummary":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall interview score."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"audio_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Link","description":"Signed URL to audio recording."},"video_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Link","description":"Signed URL to video recording."}},"type":"object","title":"AgentWebInterviewSummary","description":"Web interview summary metrics."},"AgentSMSSummary":{"properties":{"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed SMS screening."},"criteria_passed":{"items":{"type":"string"},"type":"array","title":"Criteria Passed","description":"Criteria the candidate passed."},"criteria_failed":{"items":{"type":"string"},"type":"array","title":"Criteria Failed","description":"Criteria the candidate failed."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."}},"type":"object","title":"AgentSMSSummary","description":"SMS screening summary metrics."},"AgentFormSummary":{"properties":{"is_complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Complete","description":"Whether the candidate completed the form."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed all knockout questions."},"questions_answered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Questions Answered","description":"Number of questions answered."},"total_questions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Questions","description":"Total number of questions on the form."}},"type":"object","title":"AgentFormSummary","description":"Form screening summary metrics."}}}}
```

## The CandidateWorkflow object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CandidateWorkflow":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepStatus"},"type":"array","title":"Steps","description":"Ordered list of workflow step statuses."},"all_complete":{"type":"boolean","title":"All Complete","description":"True when every step has been completed."},"last_activity_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Activity At","description":"Unix timestamp of the candidate's most recent interaction with any step."}},"type":"object","required":["steps","all_complete"],"title":"CandidateWorkflow","description":"Overall workflow progress for a candidate."},"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."}}}}
```

## The ConversationalSMSConfig object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ConversationalSMSConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-disqualify candidates who fail dealbreaker criteria."},"num_questions":{"anyOf":[{"type":"integer","maximum":10,"minimum":1},{"type":"null"}],"title":"Num Questions","description":"Number of SMS criteria (ignored if criteria provided)."},"intro_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Intro Message","description":"Custom intro message. Supports {{candidate_name}} and {{job_title}} variables."},"disqualification_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Disqualification Message","description":"Message sent when candidate fails a dealbreaker."},"follow_up_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Follow Up Message","description":"Custom follow-up/nudge message."},"hop_on_call_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Hop On Call Message","description":"Message for phone/video call invitation."},"cooldown_period_hrs":{"anyOf":[{"type":"integer","maximum":168,"minimum":1},{"type":"null"}],"title":"Cooldown Period Hrs","description":"Hours to wait before sending a follow-up nudge."},"max_nudge_amount":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Nudge Amount","description":"Maximum number of follow-up nudges."},"blackout_period":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Blackout Period","description":"No-message window: {enabled: bool, timezone: str (IANA), start_hour: 0-23, end_hour: 1-24}"}},"type":"object","title":"ConversationalSMSConfig","description":"Config for the conversational_sms agent."}}}}
```

## The CreatePostingRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CreatePostingRequest":{"properties":{"title":{"type":"string","maxLength":200,"minLength":3,"title":"Title","description":"Job posting title"},"description":{"type":"string","maxLength":50000,"title":"Description","description":"Job posting description. Used by AI to generate interview questions.","default":""},"workflow":{"anyOf":[{"items":{"oneOf":[{"$ref":"#/components/schemas/_WebInterviewStep"},{"$ref":"#/components/schemas/_ConversationalSMSStep"},{"$ref":"#/components/schemas/_ResumeStep"},{"$ref":"#/components/schemas/_FormStep"}]},"type":"array"},{"type":"null"}],"title":"Workflow","description":"Ordered list of workflow steps with optional config and questions. Required unless ``interview_template_id`` is provided. Mutually exclusive with ``interview_template_id``."},"interview_template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Template Id","description":"Optional interview template ID to use as the starting point for this posting. When provided, the template's blueprint posting is cloned (workflow, questions, criteria, agent settings, and any linked configurations are copied) and any other fields supplied in this request override the cloned values (title, description, root-level configs, integration IDs, metadata, etc.). Mutually exclusive with ``workflow``: provide one or the other."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Internal posting slug"},"language":{"type":"string","title":"Language","description":"Interview language (ISO 639-1)","default":"en"},"interviewer_name":{"type":"string","title":"Interviewer Name","description":"AI interviewer display name","default":"Sarah"},"instructions":{"type":"string","title":"Instructions","description":"Instructions for the AI interviewer","default":""},"company_overview":{"type":"string","title":"Company Overview","description":"Brief overview of the company","default":""},"job_overview":{"type":"string","title":"Job Overview","description":"Brief overview of the role","default":""},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Process overview shared with agents."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"How the AI interviewer delivers the company overview. 'exact_delivery' (verbatim, default), 'summarized_delivery' (concise candidate-friendly summary), 'reference_only' (used only to answer candidate questions), 'silent_reference' (used internally, never shared with candidate)."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"How the AI interviewer delivers the job overview. Same options as company_overview_delivery_mode."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"How the AI interviewer delivers the interview process overview. Same options as company_overview_delivery_mode."},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id","description":"Phone number ID for SMS and voice agents."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"Sender email ID for candidate communications."},"email_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Template Group Id","description":"Email template group ID for candidate emails."},"design_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Template Group Id","description":"Design template group ID for interview UI branding."},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url","description":"URL to redirect candidates after completing the interview."},"scheduling_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduling Url","description":"Calendar scheduling URL for shortlisted candidates."},"deadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deadline","description":"ISO 8601 deadline for the posting (e.g. '2025-03-15T00:00:00Z'). If omitted or null, defaults to one calendar month after creation."},"allow_sms_comms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Sms Comms","description":"Allow sending SMS invitations to candidates."},"max_retakes":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Max Retakes","description":"Max retake attempts (0-5)."},"retake_cooldown_days":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Retake Cooldown Days","description":"Days a candidate must wait between retake attempts."},"email_report_to_candidate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Report To Candidate","description":"Email a performance report link to candidates after completion."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information on the interviewer. Up to 50 keys, each key max 40 chars, each value max 500 chars."}},"type":"object","required":["title"],"title":"CreatePostingRequest"},"_WebInterviewStep":{"properties":{"type":{"type":"string","const":"web_interview","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/WebInterviewConfig"},{"type":"null"}],"description":"Web interview agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Questions for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_WebInterviewStep","description":"Workflow step for web_interview agent."},"WebInterviewConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"video":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Video","description":"Enable video during interview (default: audio-only)."},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"Voice ID for AI interviewer. Use GET /api/v2/voices to list available voices."},"phone_calls_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Phone Calls Enabled","description":"Allow outbound phone call interviews (requires phone_number_id)."},"interview_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Type","description":"Interview focus: general, technical, cultural, behavioral."},"num_questions":{"anyOf":[{"type":"integer","maximum":25,"minimum":1},{"type":"null"}],"title":"Num Questions","description":"Number of questions (ignored if questions provided)."},"min_evaluation_score":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Min Evaluation Score","description":"Minimum normalized score (0.0-1.0) to pass this stage."},"prompt_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Version","description":"Prompt version: v1 or v2 (latest)."},"is_multilingual":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Multilingual","description":"Auto-detect candidate language and respond in kind."},"cheat_detection_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cheat Detection Config","description":"Cheat detection settings: {enabled: bool, threshold: int 0-100, types: ['tab_switching','ai_scripted_answer','multiple_people','multiple_speakers','phone_detection','unusual_delays','facial_behaviour']}"},"web_interview_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Web Interview Config","description":"Advanced interview UI config: {show_transcript, candidate_presence_enabled, min_duration_seconds, max_duration_seconds, backdrop_image_url, avatar_image_url, intro_message, outro_message, remove_heymilo_branding}"}},"type":"object","title":"WebInterviewConfig","description":"Config for the web_interview agent."},"CreateQuestion":{"properties":{"modality":{"type":"string","title":"Modality","description":"Question modality: voice, resume_eligibility, resume_scoring, form, sms, voice_tags."},"text":{"type":"string","title":"Text","description":"Question text or criterion text."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"How to evaluate (voice, resume_scoring)."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Score-1 description (voice, resume_scoring)."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Score-5 description (voice, resume_scoring)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Format: open-ended|scored, textarea|dropdown, YES_NO|NUMERIC."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Ask but don't score (voice)."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer (sms)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (sms)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Disqualify on wrong answer (sms)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer (form knockout)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown options (form)."},"response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Format","description":"Response format: text|number|date|freeform (voice_tags)."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"score_weight":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Score Weight","description":"Importance weighting for this question's score (0-5). Higher = more important. Must be a whole number. Applies to voice, sms, resume_eligibility, resume_scoring."},"min_follow_ups":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions the AI must ask (voice only)."},"max_follow_ups":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions the AI may ask (voice only)."},"additional_instructions":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer (voice only)."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied against the full transcript after the interview (voice only)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: single or multiple (form only)."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator for number/date questions: eq, neq, gt, gte, lt, lte (form only)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions for file_upload questions (form only)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow uploading multiple files (form only)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum value for slider questions (form only)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum value for slider questions (form only)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Step increment for slider questions (form only)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Require an answer to this question (form only)."}},"type":"object","required":["modality","text"],"title":"CreateQuestion","description":"A question or criterion for a workflow step."},"_ConversationalSMSStep":{"properties":{"type":{"type":"string","const":"conversational_sms","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/ConversationalSMSConfig"},{"type":"null"}],"description":"SMS screening agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Criteria for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_ConversationalSMSStep","description":"Workflow step for conversational_sms agent."},"ConversationalSMSConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-disqualify candidates who fail dealbreaker criteria."},"num_questions":{"anyOf":[{"type":"integer","maximum":10,"minimum":1},{"type":"null"}],"title":"Num Questions","description":"Number of SMS criteria (ignored if criteria provided)."},"intro_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Intro Message","description":"Custom intro message. Supports {{candidate_name}} and {{job_title}} variables."},"disqualification_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Disqualification Message","description":"Message sent when candidate fails a dealbreaker."},"follow_up_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Follow Up Message","description":"Custom follow-up/nudge message."},"hop_on_call_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Hop On Call Message","description":"Message for phone/video call invitation."},"cooldown_period_hrs":{"anyOf":[{"type":"integer","maximum":168,"minimum":1},{"type":"null"}],"title":"Cooldown Period Hrs","description":"Hours to wait before sending a follow-up nudge."},"max_nudge_amount":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Nudge Amount","description":"Maximum number of follow-up nudges."},"blackout_period":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Blackout Period","description":"No-message window: {enabled: bool, timezone: str (IANA), start_hour: 0-23, end_hour: 1-24}"}},"type":"object","title":"ConversationalSMSConfig","description":"Config for the conversational_sms agent."},"_ResumeStep":{"properties":{"type":{"type":"string","const":"resume","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/ResumeConfig"},{"type":"null"}],"description":"Resume screening agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Criteria for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_ResumeStep","description":"Workflow step for resume screening agent."},"ResumeConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-reject candidates failing eligibility criteria."},"min_evaluation_score":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Min Evaluation Score","description":"Minimum normalized score on scoring criteria."},"mandatory":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mandatory","description":"Require resume upload to proceed."},"num_eligibility_questions":{"anyOf":[{"type":"integer","maximum":15,"minimum":0},{"type":"null"}],"title":"Num Eligibility Questions","description":"Number of pass/fail eligibility criteria."},"num_criteria_questions":{"anyOf":[{"type":"integer","maximum":15,"minimum":0},{"type":"null"}],"title":"Num Criteria Questions","description":"Number of scored criteria."}},"type":"object","title":"ResumeConfig","description":"Config for the resume screening agent."},"_FormStep":{"properties":{"type":{"type":"string","const":"form","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/FormConfig"},{"type":"null"}],"description":"Form screening agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Questions for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_FormStep","description":"Workflow step for form screening agent."},"FormConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-disqualify on knockout question failure."}},"type":"object","title":"FormConfig","description":"Config for the form screening agent."}}}}
```

## The CreatePostingResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CreatePostingResponse":{"properties":{"object":{"type":"string","const":"posting","title":"Object","description":"Object type identifier.","default":"posting"},"id":{"type":"string","title":"Id","description":"Unique posting identifier."},"status":{"type":"string","title":"Status","description":"Posting status after creation."},"urls":{"$ref":"#/components/schemas/PostingURLs","description":"All URLs associated with this posting."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the posting was created."},"posting":{"anyOf":[{"$ref":"#/components/schemas/PostingResponse"},{"type":"null"}],"description":"Full posting resource (receipt pattern)."}},"type":"object","required":["id","status","urls","created_at"],"title":"CreatePostingResponse","description":"Response after successfully creating a posting."},"PostingURLs":{"properties":{"candidate_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Url","description":"Candidate-facing interview URL."},"ingestion_url_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingestion Url Key","description":"URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}."},"review_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Url","description":"Admin dashboard review URL."}},"type":"object","title":"PostingURLs","description":"All URLs associated with a posting."},"PostingResponse":{"properties":{"object":{"type":"string","const":"posting","title":"Object","description":"Object type identifier.","default":"posting"},"id":{"type":"string","title":"Id","description":"Unique posting identifier."},"company_id":{"type":"string","title":"Company Id","description":"ID of the company that owns this posting."},"title":{"type":"string","title":"Title","description":"Job title displayed to candidates."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"URL-friendly slug for the posting."},"description":{"type":"string","title":"Description","description":"Full job description text."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code.","default":"en"},"interviewer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interviewer Name","description":"Display name of the AI interviewer."},"status":{"type":"string","title":"Status","description":"Posting status: 'draft', 'active', 'expired', 'archived'."},"finalized":{"type":"boolean","title":"Finalized","description":"Whether the posting has been finalized/activated."},"archived":{"type":"boolean","title":"Archived","description":"Whether the posting is archived."},"test_posting":{"type":"boolean","title":"Test Posting","description":"Whether this is a test posting."},"workflow":{"items":{"$ref":"#/components/schemas/WorkflowStep"},"type":"array","title":"Workflow","description":"Ordered list of agentic workflow steps."},"urls":{"anyOf":[{"$ref":"#/components/schemas/PostingURLs"},{"type":"null"}],"description":"All URLs associated with this posting."},"deadline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deadline","description":"Unix timestamp deadline for the posting."},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url","description":"URL candidates are redirected to after completing the interview."},"scheduling_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduling Url","description":"Calendar scheduling URL for shortlisted candidates."},"max_retakes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Retakes","description":"Maximum number of interview retakes allowed."},"allow_sms_comms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Sms Comms","description":"Whether SMS communications are enabled.","default":false},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"General instructions for the AI interviewer shared with agents."},"company_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview","description":"Overview of the company shared with agents."},"job_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview","description":"Overview of the job/role shared with agents."},"interview_process_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview","description":"Overview of the interview process shared with agents."},"company_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"How the AI interviewer delivers the company overview."},"job_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"How the AI interviewer delivers the job overview."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"How the AI interviewer delivers the interview process overview."},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id","description":"ID of the phone number used for outbound calls."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email configuration."},"email_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Template Group Id","description":"ID of the email template group."},"design_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Template Group Id","description":"ID of the design template group."},"retake_cooldown_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retake Cooldown Days","description":"Cooldown period in days before a candidate can retake."},"email_report_to_candidate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Report To Candidate","description":"Whether to email the interview report to the candidate.","default":false},"ats_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ats Metadata","description":"ATS integration metadata for postings derived from an ATS (Import-from-ATS flow or `createPosting` with an ATS-derived `interview_template_id`). Null for postings not connected to an ATS. Common fields:\n- `source` (string): how the posting was created, e.g. `job_sync`.\n- `ats_name` (string): identifier of the ATS, e.g. `workable`, `bullhorn`.\n- `ats_job_id` (string): ID of the ATS job that backs this posting.\n- `ats_job_posting_id` (string, optional): ATS-side job-posting ID when distinct from `ats_job_id`.\n- `integration_id` (string, optional): heymilo ATS integration ID.\n- `job_ids` (string[], optional): ATS job IDs included in the mapping config.\n- `pending_activation` (bool): `true` while the agent is in the intermediate stage created by `createPosting` / `clonePosting` for ATS-derived postings. Candidate ingestion does not begin until the caller transitions out of this stage by calling `POST /postings/{posting_id}/activate`, which finalizes the posting and attaches the ATS mapping in one step.\n- `mapping_activated_at`, `mapping_activated_by` (read-only): audit fields stamped when the ATS mapping was attached.\n- `mapping_deactivated_at`, `mapping_deactivated_by` (read-only): audit fields stamped when the ATS mapping was last paused."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the posting was created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when the posting was last updated."}},"type":"object","required":["id","company_id","title","description","status","finalized","archived","test_posting"],"title":"PostingResponse","description":"A job posting with its full agentic workflow configuration.\n\nA posting represents a complete hiring pipeline — it defines the\njob, the AI agents involved, and how candidates progress through\neach screening step."},"WorkflowStep":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for this workflow step."},"type":{"type":"string","title":"Type","description":"Agent type: 'web_interview', 'conversational_sms', 'resume', 'form'."},"order":{"type":"integer","title":"Order","description":"Position in the workflow pipeline (1-based)."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Agent-specific configuration. Shape varies by type. See GET /api/v2/schemas/agents for details."}},"type":"object","required":["type","order"],"title":"WorkflowStep","description":"A single step in a posting's agentic workflow."}}}}
```

## The CreateQuestion object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CreateQuestion":{"properties":{"modality":{"type":"string","title":"Modality","description":"Question modality: voice, resume_eligibility, resume_scoring, form, sms, voice_tags."},"text":{"type":"string","title":"Text","description":"Question text or criterion text."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"How to evaluate (voice, resume_scoring)."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Score-1 description (voice, resume_scoring)."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Score-5 description (voice, resume_scoring)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Format: open-ended|scored, textarea|dropdown, YES_NO|NUMERIC."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Ask but don't score (voice)."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer (sms)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (sms)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Disqualify on wrong answer (sms)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer (form knockout)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown options (form)."},"response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Format","description":"Response format: text|number|date|freeform (voice_tags)."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"score_weight":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Score Weight","description":"Importance weighting for this question's score (0-5). Higher = more important. Must be a whole number. Applies to voice, sms, resume_eligibility, resume_scoring."},"min_follow_ups":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions the AI must ask (voice only)."},"max_follow_ups":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions the AI may ask (voice only)."},"additional_instructions":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer (voice only)."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied against the full transcript after the interview (voice only)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: single or multiple (form only)."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator for number/date questions: eq, neq, gt, gte, lt, lte (form only)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions for file_upload questions (form only)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow uploading multiple files (form only)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum value for slider questions (form only)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum value for slider questions (form only)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Step increment for slider questions (form only)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Require an answer to this question (form only)."}},"type":"object","required":["modality","text"],"title":"CreateQuestion","description":"A question or criterion for a workflow step."}}}}
```

## The CreateQuestionRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CreateQuestionRequest":{"properties":{"modality":{"type":"string","enum":["voice","sms","form","resume_eligibility","resume_scoring","voice_tags"],"title":"Modality","description":"Question modality: voice, sms, form, resume_eligibility, resume_scoring, voice_tags."},"text":{"type":"string","title":"Text","description":"The question text, criterion text, or tag name."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"Evaluation criteria."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Score-1 description."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Score-5 description."},"score_weight":{"anyOf":[{"type":"integer","maximum":10,"minimum":1},{"type":"null"}],"title":"Score Weight","description":"Importance weight for scoring (1–10)."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Ask but don't score."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Question format."},"min_follow_ups":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Min follow-ups."},"max_follow_ups":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Max follow-ups."},"additional_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Post-interview evaluation criteria."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer (SMS)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (SMS)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Dealbreaker flag (SMS)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer (form)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Knockout flag (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown options."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Require answer (form)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"MCQ type (form)."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator (form)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file types (form)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Multiple files (form)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Slider min (form)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Slider max (form)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Slider step (form)."},"response_format":{"anyOf":[{"type":"string","enum":["text","freeform","date","number"]},{"type":"null"}],"title":"Response Format","description":"Response format for voice_tags: 'text', 'freeform', 'date', or 'number'."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Options (voice_tags)."},"structured_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Config","description":"Advanced structured configuration (voice). Opaque key-value object forwarded to the AI interviewer."}},"type":"object","required":["modality","text"],"title":"CreateQuestionRequest","description":"Request body for creating a new question or criterion.\n\nThe ``modality`` field determines the question type. Only fields\nrelevant to the chosen modality need to be provided."}}}}
```

## The CreateWebhookRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CreateWebhookRequest":{"properties":{"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this webhook is for."},"url":{"type":"string","title":"Url","description":"Destination URL for webhook delivery."},"event_type":{"type":"string","title":"Event Type","description":"Type of event that triggers the webhook: 'interview_completed', 'candidate_ingested', etc."}},"type":"object","required":["posting_id","url","event_type"],"title":"CreateWebhookRequest","description":"Request body for creating a webhook."}}}}
```

## The CustomDomainResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"CustomDomainResponse":{"properties":{"object":{"type":"string","const":"domain","title":"Object","description":"Object type identifier.","default":"domain"},"id":{"type":"string","title":"Id","description":"Unique domain configuration identifier."},"domain":{"type":"string","title":"Domain","description":"The custom domain name."},"cname_target":{"type":"string","title":"Cname Target","description":"CNAME target for DNS configuration."},"status":{"type":"string","title":"Status","description":"Domain verification status: 'pending', 'active', 'error'."},"active":{"type":"boolean","title":"Active","description":"Whether the domain is verified and active for use."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the domain was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the domain was last updated."}},"type":"object","required":["id","domain","cname_target","status","active","created_at","updated_at"],"title":"CustomDomainResponse","description":"A custom domain for candidate-facing interview URLs.\n\nCustom domains allow workspaces to white-label the candidate\nexperience (e.g. ``interviews.acme.com`` instead of\n``candidates.heymilo.io``). Domains require CNAME verification\npointing to ``ingress.heymilo.ai``."}}}}
```

## The DesignTemplateGroupResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"DesignTemplateGroupResponse":{"properties":{"object":{"type":"string","const":"design_template_group","title":"Object","description":"Object type identifier.","default":"design_template_group"},"id":{"type":"string","title":"Id","description":"Unique design template group identifier."},"name":{"type":"string","title":"Name","description":"Human-readable group name."},"template_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Template Mappings","description":"Mapping of page type to design template ID. Keys: 'welcome_page', 'status_page', 'interview_complete_page', 'interview_page'."},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this is the default group for the workspace.","default":false},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the group was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the group was last updated."}},"type":"object","required":["id","name","template_mappings","created_at","updated_at"],"title":"DesignTemplateGroupResponse","description":"A group of design templates assigned to a posting.\n\nTemplate groups map page types (e.g. 'welcome_page') to specific\ndesign template IDs."}}}}
```

## The DesignTemplateResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"DesignTemplateResponse":{"properties":{"object":{"type":"string","const":"design_template","title":"Object","description":"Object type identifier.","default":"design_template"},"id":{"type":"string","title":"Id","description":"Unique design template identifier."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"template_type":{"type":"string","title":"Template Type","description":"Page type this template applies to: 'welcome_page', 'status_page', 'interview_complete_page', 'interview_page'."},"design_config":{"additionalProperties":true,"type":"object","title":"Design Config","description":"Design configuration object. Shape varies by template_type. Common fields: background_color, primary_color, font_family, header_text, show_logo, image_url."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","name","template_type","design_config","created_at","updated_at"],"title":"DesignTemplateResponse","description":"A design template controlling the visual appearance of candidate-facing pages.\n\nDesign templates define colors, fonts, images, and text for pages\nsuch as the welcome page, interview page, status page, and\ninterview-complete page."}}}}
```

## The EmailTemplateGroupResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"EmailTemplateGroupResponse":{"properties":{"object":{"type":"string","const":"email_template_group","title":"Object","description":"Object type identifier.","default":"email_template_group"},"id":{"type":"string","title":"Id","description":"Unique template group identifier."},"name":{"type":"string","title":"Name","description":"Human-readable group name."},"template_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Template Mappings","description":"Mapping of template_key to template_id. Keys are email types, values are V4EmailTemplate IDs."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email address associated with this group."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the group was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the group was last updated."}},"type":"object","required":["id","name","template_mappings","created_at","updated_at"],"title":"EmailTemplateGroupResponse","description":"A group of email templates assigned to a posting.\n\nTemplate groups map template keys (e.g. 'WEB_INTERVIEW_INVITATION')\nto specific template IDs, allowing different postings to use\ndifferent email styles."}}}}
```

## The EmailTemplateResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"EmailTemplateResponse":{"properties":{"object":{"type":"string","const":"email_template","title":"Object","description":"Object type identifier.","default":"email_template"},"id":{"type":"string","title":"Id","description":"Unique email template identifier."},"template_key":{"type":"string","title":"Template Key","description":"Template key indicating the email type: 'WEB_INTERVIEW_INVITATION', 'WEB_INTERVIEW_NUDGE', 'RESUME_INVITATION', 'RESUME_NUDGE', 'FORM_INVITATION', 'FORM_NUDGE', 'WEB_INTERVIEW_FINAL_NUDGE', 'SCHEDULING_LINK_EMAIL', 'REPORT_READY_EMAIL'."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"subject":{"type":"string","title":"Subject","description":"Email subject line. Supports {{variable}} placeholders."},"content":{"type":"string","title":"Content","description":"Email HTML body. Supports {{variable}} placeholders."},"blackout_period":{"anyOf":[{"$ref":"#/components/schemas/BlackoutPeriod"},{"type":"null"}],"description":"Blackout period during which this email will not be sent."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","template_key","name","subject","content","created_at","updated_at"],"title":"EmailTemplateResponse","description":"A single email template used for candidate communications.\n\nTemplates define the subject line and HTML body for emails sent at\nvarious stages of the interview workflow (invitations, nudges, etc.)."},"BlackoutPeriod":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether the blackout period is active."},"timezone":{"type":"string","title":"Timezone","description":"IANA timezone identifier."},"start_hour":{"type":"integer","title":"Start Hour","description":"Start hour of the blackout window (0-23)."},"end_hour":{"type":"integer","title":"End Hour","description":"End hour of the blackout window (0-24, where 24 = midnight)."}},"type":"object","required":["enabled","timezone","start_hour","end_hour"],"title":"BlackoutPeriod","description":"Time window during which emails will not be sent."}}}}
```

## The FormConfig object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"FormConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-disqualify on knockout question failure."}},"type":"object","title":"FormConfig","description":"Config for the form screening agent."}}}}
```

## The FormQuestionResult object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"FormQuestionResult":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question displayed on the form."},"question_type":{"type":"string","title":"Question Type","description":"Form field type: textarea, number, multiple-choice, file-upload, slider, date."},"is_knockout":{"type":"boolean","title":"Is Knockout","description":"Whether this is a knockout (pass/fail) question."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate's answer passed validation."},"candidate_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Answer","description":"The candidate's submitted answer."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"The expected correct answer (for knockout questions)."}},"type":"object","required":["question_id","question_text","question_type","is_knockout","passed"],"title":"FormQuestionResult","description":"Result of a single form screening question."}}}}
```

## The FormResult object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"FormResult":{"properties":{"object":{"type":"string","const":"form_result","title":"Object","description":"Object type identifier.","default":"form_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"overall_status":{"type":"string","title":"Overall Status","description":"Overall form status: 'passed', 'failed', 'pending'."},"questions":{"items":{"$ref":"#/components/schemas/FormQuestionResult"},"type":"array","title":"Questions","description":"Individual question results."}},"type":"object","required":["interview_id","overall_status"],"title":"FormResult","description":"Complete results for the form screening step."},"FormQuestionResult":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question displayed on the form."},"question_type":{"type":"string","title":"Question Type","description":"Form field type: textarea, number, multiple-choice, file-upload, slider, date."},"is_knockout":{"type":"boolean","title":"Is Knockout","description":"Whether this is a knockout (pass/fail) question."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate's answer passed validation."},"candidate_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Answer","description":"The candidate's submitted answer."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"The expected correct answer (for knockout questions)."}},"type":"object","required":["question_id","question_text","question_type","is_knockout","passed"],"title":"FormQuestionResult","description":"Result of a single form screening question."}}}}
```

## The HTTPValidationError object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## The IngestCandidateResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"IngestCandidateResponse":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier for this candidate-posting pair."},"interview_url":{"type":"string","title":"Interview Url","description":"URL the candidate uses to access the interview."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this candidate was ingested into."},"candidate":{"anyOf":[{"$ref":"#/components/schemas/CandidateResponse"},{"type":"null"}],"description":"Full candidate resource (receipt pattern)."}},"type":"object","required":["interview_id","interview_url","posting_id"],"title":"IngestCandidateResponse","description":"Response after successfully ingesting a candidate."},"CandidateResponse":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier (one per candidate-posting pair)."},"candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Id","description":"Unique candidate identifier (shared across postings within a workspace)."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this candidate belongs to."},"name":{"type":"string","title":"Name","description":"Candidate's full name."},"email":{"type":"string","title":"Email","description":"Candidate's email address."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall match score (0-100). Aggregated across all completed workflow steps."},"status":{"type":"string","title":"Status","description":"Current candidate status: 'pending', 'in_progress', 'evaluating', 'completed', 'shortlisted', 'dismissed', 'knocked_out'. 'evaluating' means all workflow steps are done but the final score is still being computed."},"interview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Url","description":"URL the candidate uses to access the interview."},"workflow":{"anyOf":[{"$ref":"#/components/schemas/CandidateWorkflow"},{"type":"null"}],"description":"Step-by-step workflow progress."},"agent_summary":{"anyOf":[{"$ref":"#/components/schemas/AgentSummary"},{"type":"null"}],"description":"Per-agent-type summary metrics."},"shortlisted":{"type":"boolean","title":"Shortlisted","description":"Whether a recruiter has shortlisted this candidate.","default":false},"dismissed":{"type":"boolean","title":"Dismissed","description":"Whether a recruiter has dismissed this candidate.","default":false},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data supplied at ingestion time."},"interviewed_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interviewed At","description":"Unix timestamp when the candidate completed the interview."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the candidate was ingested."}},"type":"object","required":["interview_id","posting_id","name","email","status"],"title":"CandidateResponse","description":"A candidate within a posting's pipeline.\n\nEach candidate has a unique ``interview_id`` (one per\ncandidate-posting pair) and a ``candidate_id`` (shared across\npostings within a workspace)."},"CandidateWorkflow":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepStatus"},"type":"array","title":"Steps","description":"Ordered list of workflow step statuses."},"all_complete":{"type":"boolean","title":"All Complete","description":"True when every step has been completed."},"last_activity_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Activity At","description":"Unix timestamp of the candidate's most recent interaction with any step."}},"type":"object","required":["steps","all_complete"],"title":"CandidateWorkflow","description":"Overall workflow progress for a candidate."},"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."},"AgentSummary":{"properties":{"resume":{"anyOf":[{"$ref":"#/components/schemas/AgentResumeSummary"},{"type":"null"}],"description":"Resume screening summary."},"web_interview":{"anyOf":[{"$ref":"#/components/schemas/AgentWebInterviewSummary"},{"type":"null"}],"description":"Web interview summary."},"sms":{"anyOf":[{"$ref":"#/components/schemas/AgentSMSSummary"},{"type":"null"}],"description":"SMS screening summary."},"form":{"anyOf":[{"$ref":"#/components/schemas/AgentFormSummary"},{"type":"null"}],"description":"Form screening summary."}},"type":"object","title":"AgentSummary","description":"Per-agent-type summary metrics for a candidate."},"AgentResumeSummary":{"properties":{"resume_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resume Score","description":"Resume match score."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets eligibility criteria."},"resume_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Link","description":"URL to the uploaded resume."}},"type":"object","title":"AgentResumeSummary","description":"Resume screening summary metrics."},"AgentWebInterviewSummary":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall interview score."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"audio_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Link","description":"Signed URL to audio recording."},"video_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Link","description":"Signed URL to video recording."}},"type":"object","title":"AgentWebInterviewSummary","description":"Web interview summary metrics."},"AgentSMSSummary":{"properties":{"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed SMS screening."},"criteria_passed":{"items":{"type":"string"},"type":"array","title":"Criteria Passed","description":"Criteria the candidate passed."},"criteria_failed":{"items":{"type":"string"},"type":"array","title":"Criteria Failed","description":"Criteria the candidate failed."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."}},"type":"object","title":"AgentSMSSummary","description":"SMS screening summary metrics."},"AgentFormSummary":{"properties":{"is_complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Complete","description":"Whether the candidate completed the form."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed all knockout questions."},"questions_answered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Questions Answered","description":"Number of questions answered."},"total_questions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Questions","description":"Total number of questions on the form."}},"type":"object","title":"AgentFormSummary","description":"Form screening summary metrics."}}}}
```

## The InterviewDataResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"InterviewDataResponse":{"properties":{"object":{"type":"string","const":"interview_data","title":"Object","description":"Object type identifier.","default":"interview_data"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier."},"candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Id","description":"Candidate identifier (shared across postings)."},"posting_id":{"type":"string","title":"Posting Id","description":"Posting this interview belongs to."},"name":{"type":"string","title":"Name","description":"Candidate's full name."},"email":{"type":"string","title":"Email","description":"Candidate's email."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall match score (0-100)."},"status":{"type":"string","title":"Status","description":"Current candidate status: 'pending', 'in_progress', 'evaluating', 'completed', 'shortlisted', 'dismissed', 'knocked_out'. 'evaluating' means all workflow steps are done but the final score is still being computed."},"workflow":{"anyOf":[{"$ref":"#/components/schemas/CandidateWorkflow"},{"type":"null"}],"description":"Step-by-step workflow progress."},"web_interview":{"anyOf":[{"$ref":"#/components/schemas/WebInterviewResult"},{"type":"null"}],"description":"Voice/video interview results (null if not in workflow)."},"resume":{"anyOf":[{"$ref":"#/components/schemas/ResumeResult"},{"type":"null"}],"description":"Resume screening results (null if not in workflow)."},"sms":{"anyOf":[{"$ref":"#/components/schemas/SMSResult"},{"type":"null"}],"description":"SMS screening results (null if not in workflow)."},"form":{"anyOf":[{"$ref":"#/components/schemas/FormResult"},{"type":"null"}],"description":"Form screening results (null if not in workflow)."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data supplied at ingestion time."}},"type":"object","required":["interview_id","posting_id","name","email","status"],"title":"InterviewDataResponse","description":"Full interview results across all workflow steps.\n\nContains the candidate details plus per-agent results. Fields for\nagents not in the posting's workflow will be null."},"CandidateWorkflow":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepStatus"},"type":"array","title":"Steps","description":"Ordered list of workflow step statuses."},"all_complete":{"type":"boolean","title":"All Complete","description":"True when every step has been completed."},"last_activity_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Activity At","description":"Unix timestamp of the candidate's most recent interaction with any step."}},"type":"object","required":["steps","all_complete"],"title":"CandidateWorkflow","description":"Overall workflow progress for a candidate."},"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."},"WebInterviewResult":{"properties":{"object":{"type":"string","const":"web_interview_result","title":"Object","description":"Object type identifier.","default":"web_interview_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"match_score":{"type":"integer","title":"Match Score","description":"Overall match score (0-100)."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"lowlights":{"items":{"type":"string"},"type":"array","title":"Lowlights","description":"Areas for improvement."},"scorecard":{"items":{"$ref":"#/components/schemas/ScorecardQuestion"},"type":"array","title":"Scorecard","description":"Question-by-question evaluation."},"speech_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speech Score","description":"Communication/speech score (0.0-5.0)."},"transcript":{"items":{"$ref":"#/components/schemas/TranscriptEntry"},"type":"array","title":"Transcript","description":"Full chronological interview transcript."},"audio_recording_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Url","description":"Signed URL to audio recording."},"video_recording_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Url","description":"Signed URL to video recording (if enabled)."},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Tags extracted from the interview."}},"type":"object","required":["interview_id","match_score"],"title":"WebInterviewResult","description":"Complete results for the web interview (voice/video) step."},"ScorecardQuestion":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question as asked to the candidate."},"score":{"type":"integer","title":"Score","description":"Score (1-10). 1 = weak, 10 = exceptional."},"score_weight":{"type":"integer","title":"Score Weight","description":"Importance weight (1-10). Higher = more important.","default":5},"evaluation_summary":{"type":"string","title":"Evaluation Summary","description":"AI-generated summary of the candidate's response."},"evaluation_criteria":{"type":"string","title":"Evaluation Criteria","description":"Criteria used to evaluate this question."},"score_1_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 1 Description","description":"What constitutes a score of 1."},"score_5_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 5 Description","description":"What constitutes a score of 5 (midpoint anchor on 1-10 scale)."},"not_scored":{"type":"boolean","title":"Not Scored","description":"If true, this question was informational only.","default":false},"rank":{"type":"integer","title":"Rank","description":"Order in which this question was asked (1-based)."},"transcript":{"items":{"$ref":"#/components/schemas/TranscriptEntry"},"type":"array","title":"Transcript","description":"Dialogue for this specific question."}},"type":"object","required":["question_id","question_text","score","evaluation_summary","evaluation_criteria","rank"],"title":"ScorecardQuestion","description":"Evaluation result for a single scored question."},"TranscriptEntry":{"properties":{"speaker":{"type":"string","title":"Speaker","description":"Who spoke: 'Interviewer', 'Candidate', or 'System'."},"text":{"type":"string","title":"Text","description":"The spoken or written text."},"timestamp":{"type":"number","title":"Timestamp","description":"Seconds from the start of the interview."},"timestamp_str":{"type":"string","title":"Timestamp Str","description":"Human-readable timestamp (MM:SS)."}},"type":"object","required":["speaker","text","timestamp","timestamp_str"],"title":"TranscriptEntry","description":"A single turn in an interview conversation."},"ResumeResult":{"properties":{"object":{"type":"string","const":"resume_result","title":"Object","description":"Object type identifier.","default":"resume_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"overall_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Score","description":"Weighted score across all criteria (0.0-100.0)."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets all eligibility criteria."},"score_criteria":{"items":{"$ref":"#/components/schemas/ResumeScoreCriterion"},"type":"array","title":"Score Criteria","description":"Individual scoring criterion results."},"eligibility_criteria":{"items":{"$ref":"#/components/schemas/ResumeEligibilityCriterion"},"type":"array","title":"Eligibility Criteria","description":"Individual eligibility criterion results."},"resume_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Url","description":"URL to the uploaded resume."}},"type":"object","required":["interview_id"],"title":"ResumeResult","description":"Complete results for the resume screening step."},"ResumeScoreCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion as defined by the recruiter."},"score":{"type":"number","title":"Score","description":"Score (0.0-10.0)."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the score."}},"type":"object","required":["criteria_id","criteria_text","score","confidence"],"title":"ResumeScoreCriterion","description":"Evaluation of a single resume scoring criterion."},"ResumeEligibilityCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion description."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate meets this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the pass/fail."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"ResumeEligibilityCriterion","description":"Evaluation of a single resume eligibility (pass/fail) criterion."},"SMSResult":{"properties":{"object":{"type":"string","const":"sms_result","title":"Object","description":"Object type identifier.","default":"sms_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"is_eligible":{"type":"boolean","title":"Is Eligible","description":"Overall eligibility verdict."},"confidence":{"type":"number","title":"Confidence","description":"Overall AI confidence (0.0-1.0)."},"criteria":{"items":{"$ref":"#/components/schemas/SMSCriterionResult"},"type":"array","title":"Criteria","description":"Individual criterion results."},"transcript":{"items":{"$ref":"#/components/schemas/SMSMessage"},"type":"array","title":"Transcript","description":"Full SMS conversation."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."},"messages_received":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Received","description":"Total messages received from the candidate."}},"type":"object","required":["interview_id","is_eligible","confidence"],"title":"SMSResult","description":"Complete results for the SMS screening step."},"SMSCriterionResult":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The question asked via SMS."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate passed this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"is_dealbreaker":{"type":"boolean","title":"Is Dealbreaker","description":"Whether failing this criterion disqualifies the candidate.","default":false},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"SMSCriterionResult","description":"Evaluation of a single SMS screening criterion."},"SMSMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Message sender: 'agent' or 'candidate'."},"text":{"type":"string","title":"Text","description":"Message content."},"timestamp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timestamp","description":"Unix timestamp when the message was sent."}},"type":"object","required":["role","text"],"title":"SMSMessage","description":"A single message in an SMS screening conversation."},"FormResult":{"properties":{"object":{"type":"string","const":"form_result","title":"Object","description":"Object type identifier.","default":"form_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"overall_status":{"type":"string","title":"Overall Status","description":"Overall form status: 'passed', 'failed', 'pending'."},"questions":{"items":{"$ref":"#/components/schemas/FormQuestionResult"},"type":"array","title":"Questions","description":"Individual question results."}},"type":"object","required":["interview_id","overall_status"],"title":"FormResult","description":"Complete results for the form screening step."},"FormQuestionResult":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question displayed on the form."},"question_type":{"type":"string","title":"Question Type","description":"Form field type: textarea, number, multiple-choice, file-upload, slider, date."},"is_knockout":{"type":"boolean","title":"Is Knockout","description":"Whether this is a knockout (pass/fail) question."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate's answer passed validation."},"candidate_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Answer","description":"The candidate's submitted answer."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"The expected correct answer (for knockout questions)."}},"type":"object","required":["question_id","question_text","question_type","is_knockout","passed"],"title":"FormQuestionResult","description":"Result of a single form screening question."}}}}
```

## The InterviewTemplateResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"InterviewTemplateResponse":{"properties":{"object":{"type":"string","const":"interview_template","title":"Object","description":"Object type identifier.","default":"interview_template"},"id":{"type":"string","title":"Id","description":"Unique interview template identifier."},"template_code":{"type":"string","title":"Template Code","description":"Human-readable template code used for ATS integrations. Alphanumeric and dashes only, max 32 characters, unique per workspace."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description of the template."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the blueprint posting whose workflow, questions, and agent configuration this template captures."},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this template is the workspace default.","default":false},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","template_code","name","posting_id","created_at","updated_at"],"title":"InterviewTemplateResponse","description":"A reusable interview agent configuration.\n\nInterview templates capture a blueprint posting's full agentic\nworkflow (questions, criteria, agent settings) so it can be cloned\nonto new postings or used as the seed for new agents. Each template\nreferences its blueprint posting via ``posting_id``."}}}}
```

## The ListResponse\_CandidateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_CandidateResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CandidateResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[CandidateResponse]"},"CandidateResponse":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier (one per candidate-posting pair)."},"candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Id","description":"Unique candidate identifier (shared across postings within a workspace)."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this candidate belongs to."},"name":{"type":"string","title":"Name","description":"Candidate's full name."},"email":{"type":"string","title":"Email","description":"Candidate's email address."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall match score (0-100). Aggregated across all completed workflow steps."},"status":{"type":"string","title":"Status","description":"Current candidate status: 'pending', 'in_progress', 'evaluating', 'completed', 'shortlisted', 'dismissed', 'knocked_out'. 'evaluating' means all workflow steps are done but the final score is still being computed."},"interview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Url","description":"URL the candidate uses to access the interview."},"workflow":{"anyOf":[{"$ref":"#/components/schemas/CandidateWorkflow"},{"type":"null"}],"description":"Step-by-step workflow progress."},"agent_summary":{"anyOf":[{"$ref":"#/components/schemas/AgentSummary"},{"type":"null"}],"description":"Per-agent-type summary metrics."},"shortlisted":{"type":"boolean","title":"Shortlisted","description":"Whether a recruiter has shortlisted this candidate.","default":false},"dismissed":{"type":"boolean","title":"Dismissed","description":"Whether a recruiter has dismissed this candidate.","default":false},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data supplied at ingestion time."},"interviewed_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interviewed At","description":"Unix timestamp when the candidate completed the interview."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the candidate was ingested."}},"type":"object","required":["interview_id","posting_id","name","email","status"],"title":"CandidateResponse","description":"A candidate within a posting's pipeline.\n\nEach candidate has a unique ``interview_id`` (one per\ncandidate-posting pair) and a ``candidate_id`` (shared across\npostings within a workspace)."},"CandidateWorkflow":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepStatus"},"type":"array","title":"Steps","description":"Ordered list of workflow step statuses."},"all_complete":{"type":"boolean","title":"All Complete","description":"True when every step has been completed."},"last_activity_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Activity At","description":"Unix timestamp of the candidate's most recent interaction with any step."}},"type":"object","required":["steps","all_complete"],"title":"CandidateWorkflow","description":"Overall workflow progress for a candidate."},"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."},"AgentSummary":{"properties":{"resume":{"anyOf":[{"$ref":"#/components/schemas/AgentResumeSummary"},{"type":"null"}],"description":"Resume screening summary."},"web_interview":{"anyOf":[{"$ref":"#/components/schemas/AgentWebInterviewSummary"},{"type":"null"}],"description":"Web interview summary."},"sms":{"anyOf":[{"$ref":"#/components/schemas/AgentSMSSummary"},{"type":"null"}],"description":"SMS screening summary."},"form":{"anyOf":[{"$ref":"#/components/schemas/AgentFormSummary"},{"type":"null"}],"description":"Form screening summary."}},"type":"object","title":"AgentSummary","description":"Per-agent-type summary metrics for a candidate."},"AgentResumeSummary":{"properties":{"resume_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resume Score","description":"Resume match score."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets eligibility criteria."},"resume_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Link","description":"URL to the uploaded resume."}},"type":"object","title":"AgentResumeSummary","description":"Resume screening summary metrics."},"AgentWebInterviewSummary":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall interview score."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"audio_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Link","description":"Signed URL to audio recording."},"video_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Link","description":"Signed URL to video recording."}},"type":"object","title":"AgentWebInterviewSummary","description":"Web interview summary metrics."},"AgentSMSSummary":{"properties":{"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed SMS screening."},"criteria_passed":{"items":{"type":"string"},"type":"array","title":"Criteria Passed","description":"Criteria the candidate passed."},"criteria_failed":{"items":{"type":"string"},"type":"array","title":"Criteria Failed","description":"Criteria the candidate failed."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."}},"type":"object","title":"AgentSMSSummary","description":"SMS screening summary metrics."},"AgentFormSummary":{"properties":{"is_complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Complete","description":"Whether the candidate completed the form."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed all knockout questions."},"questions_answered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Questions Answered","description":"Number of questions answered."},"total_questions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Questions","description":"Total number of questions on the form."}},"type":"object","title":"AgentFormSummary","description":"Form screening summary metrics."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_CustomDomainResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_CustomDomainResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CustomDomainResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[CustomDomainResponse]"},"CustomDomainResponse":{"properties":{"object":{"type":"string","const":"domain","title":"Object","description":"Object type identifier.","default":"domain"},"id":{"type":"string","title":"Id","description":"Unique domain configuration identifier."},"domain":{"type":"string","title":"Domain","description":"The custom domain name."},"cname_target":{"type":"string","title":"Cname Target","description":"CNAME target for DNS configuration."},"status":{"type":"string","title":"Status","description":"Domain verification status: 'pending', 'active', 'error'."},"active":{"type":"boolean","title":"Active","description":"Whether the domain is verified and active for use."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the domain was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the domain was last updated."}},"type":"object","required":["id","domain","cname_target","status","active","created_at","updated_at"],"title":"CustomDomainResponse","description":"A custom domain for candidate-facing interview URLs.\n\nCustom domains allow workspaces to white-label the candidate\nexperience (e.g. ``interviews.acme.com`` instead of\n``candidates.heymilo.io``). Domains require CNAME verification\npointing to ``ingress.heymilo.ai``."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_DesignTemplateGroupResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_DesignTemplateGroupResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DesignTemplateGroupResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[DesignTemplateGroupResponse]"},"DesignTemplateGroupResponse":{"properties":{"object":{"type":"string","const":"design_template_group","title":"Object","description":"Object type identifier.","default":"design_template_group"},"id":{"type":"string","title":"Id","description":"Unique design template group identifier."},"name":{"type":"string","title":"Name","description":"Human-readable group name."},"template_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Template Mappings","description":"Mapping of page type to design template ID. Keys: 'welcome_page', 'status_page', 'interview_complete_page', 'interview_page'."},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this is the default group for the workspace.","default":false},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the group was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the group was last updated."}},"type":"object","required":["id","name","template_mappings","created_at","updated_at"],"title":"DesignTemplateGroupResponse","description":"A group of design templates assigned to a posting.\n\nTemplate groups map page types (e.g. 'welcome_page') to specific\ndesign template IDs."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_DesignTemplateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_DesignTemplateResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DesignTemplateResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[DesignTemplateResponse]"},"DesignTemplateResponse":{"properties":{"object":{"type":"string","const":"design_template","title":"Object","description":"Object type identifier.","default":"design_template"},"id":{"type":"string","title":"Id","description":"Unique design template identifier."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"template_type":{"type":"string","title":"Template Type","description":"Page type this template applies to: 'welcome_page', 'status_page', 'interview_complete_page', 'interview_page'."},"design_config":{"additionalProperties":true,"type":"object","title":"Design Config","description":"Design configuration object. Shape varies by template_type. Common fields: background_color, primary_color, font_family, header_text, show_logo, image_url."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","name","template_type","design_config","created_at","updated_at"],"title":"DesignTemplateResponse","description":"A design template controlling the visual appearance of candidate-facing pages.\n\nDesign templates define colors, fonts, images, and text for pages\nsuch as the welcome page, interview page, status page, and\ninterview-complete page."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_EmailTemplateGroupResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_EmailTemplateGroupResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EmailTemplateGroupResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[EmailTemplateGroupResponse]"},"EmailTemplateGroupResponse":{"properties":{"object":{"type":"string","const":"email_template_group","title":"Object","description":"Object type identifier.","default":"email_template_group"},"id":{"type":"string","title":"Id","description":"Unique template group identifier."},"name":{"type":"string","title":"Name","description":"Human-readable group name."},"template_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Template Mappings","description":"Mapping of template_key to template_id. Keys are email types, values are V4EmailTemplate IDs."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email address associated with this group."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the group was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the group was last updated."}},"type":"object","required":["id","name","template_mappings","created_at","updated_at"],"title":"EmailTemplateGroupResponse","description":"A group of email templates assigned to a posting.\n\nTemplate groups map template keys (e.g. 'WEB_INTERVIEW_INVITATION')\nto specific template IDs, allowing different postings to use\ndifferent email styles."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_EmailTemplateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_EmailTemplateResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EmailTemplateResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[EmailTemplateResponse]"},"EmailTemplateResponse":{"properties":{"object":{"type":"string","const":"email_template","title":"Object","description":"Object type identifier.","default":"email_template"},"id":{"type":"string","title":"Id","description":"Unique email template identifier."},"template_key":{"type":"string","title":"Template Key","description":"Template key indicating the email type: 'WEB_INTERVIEW_INVITATION', 'WEB_INTERVIEW_NUDGE', 'RESUME_INVITATION', 'RESUME_NUDGE', 'FORM_INVITATION', 'FORM_NUDGE', 'WEB_INTERVIEW_FINAL_NUDGE', 'SCHEDULING_LINK_EMAIL', 'REPORT_READY_EMAIL'."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"subject":{"type":"string","title":"Subject","description":"Email subject line. Supports {{variable}} placeholders."},"content":{"type":"string","title":"Content","description":"Email HTML body. Supports {{variable}} placeholders."},"blackout_period":{"anyOf":[{"$ref":"#/components/schemas/BlackoutPeriod"},{"type":"null"}],"description":"Blackout period during which this email will not be sent."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","template_key","name","subject","content","created_at","updated_at"],"title":"EmailTemplateResponse","description":"A single email template used for candidate communications.\n\nTemplates define the subject line and HTML body for emails sent at\nvarious stages of the interview workflow (invitations, nudges, etc.)."},"BlackoutPeriod":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether the blackout period is active."},"timezone":{"type":"string","title":"Timezone","description":"IANA timezone identifier."},"start_hour":{"type":"integer","title":"Start Hour","description":"Start hour of the blackout window (0-23)."},"end_hour":{"type":"integer","title":"End Hour","description":"End hour of the blackout window (0-24, where 24 = midnight)."}},"type":"object","required":["enabled","timezone","start_hour","end_hour"],"title":"BlackoutPeriod","description":"Time window during which emails will not be sent."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_InterviewTemplateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_InterviewTemplateResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InterviewTemplateResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[InterviewTemplateResponse]"},"InterviewTemplateResponse":{"properties":{"object":{"type":"string","const":"interview_template","title":"Object","description":"Object type identifier.","default":"interview_template"},"id":{"type":"string","title":"Id","description":"Unique interview template identifier."},"template_code":{"type":"string","title":"Template Code","description":"Human-readable template code used for ATS integrations. Alphanumeric and dashes only, max 32 characters, unique per workspace."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description of the template."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the blueprint posting whose workflow, questions, and agent configuration this template captures."},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this template is the workspace default.","default":false},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","template_code","name","posting_id","created_at","updated_at"],"title":"InterviewTemplateResponse","description":"A reusable interview agent configuration.\n\nInterview templates capture a blueprint posting's full agentic\nworkflow (questions, criteria, agent settings) so it can be cloned\nonto new postings or used as the seed for new agents. Each template\nreferences its blueprint posting via ``posting_id``."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_PhoneNumberResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_PhoneNumberResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PhoneNumberResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[PhoneNumberResponse]"},"PhoneNumberResponse":{"properties":{"object":{"type":"string","const":"phone_number","title":"Object","description":"Object type identifier.","default":"phone_number"},"id":{"type":"string","title":"Id","description":"Unique phone number configuration identifier."},"phone_number":{"type":"string","title":"Phone Number","description":"Phone number in E.164 format."},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO country code."},"active":{"type":"boolean","title":"Active","description":"Whether the phone number is active."},"date_provisioned":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Date Provisioned","description":"Unix timestamp when the number was provisioned."}},"type":"object","required":["id","phone_number","active"],"title":"PhoneNumberResponse","description":"A phone number provisioned for the workspace.\n\nPhone numbers are used by voice and SMS agents to communicate with\ncandidates. The ``id`` is referenced in posting configs as\n``phone_number_id``."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_PostingResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_PostingResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PostingResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[PostingResponse]"},"PostingResponse":{"properties":{"object":{"type":"string","const":"posting","title":"Object","description":"Object type identifier.","default":"posting"},"id":{"type":"string","title":"Id","description":"Unique posting identifier."},"company_id":{"type":"string","title":"Company Id","description":"ID of the company that owns this posting."},"title":{"type":"string","title":"Title","description":"Job title displayed to candidates."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"URL-friendly slug for the posting."},"description":{"type":"string","title":"Description","description":"Full job description text."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code.","default":"en"},"interviewer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interviewer Name","description":"Display name of the AI interviewer."},"status":{"type":"string","title":"Status","description":"Posting status: 'draft', 'active', 'expired', 'archived'."},"finalized":{"type":"boolean","title":"Finalized","description":"Whether the posting has been finalized/activated."},"archived":{"type":"boolean","title":"Archived","description":"Whether the posting is archived."},"test_posting":{"type":"boolean","title":"Test Posting","description":"Whether this is a test posting."},"workflow":{"items":{"$ref":"#/components/schemas/WorkflowStep"},"type":"array","title":"Workflow","description":"Ordered list of agentic workflow steps."},"urls":{"anyOf":[{"$ref":"#/components/schemas/PostingURLs"},{"type":"null"}],"description":"All URLs associated with this posting."},"deadline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deadline","description":"Unix timestamp deadline for the posting."},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url","description":"URL candidates are redirected to after completing the interview."},"scheduling_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduling Url","description":"Calendar scheduling URL for shortlisted candidates."},"max_retakes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Retakes","description":"Maximum number of interview retakes allowed."},"allow_sms_comms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Sms Comms","description":"Whether SMS communications are enabled.","default":false},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"General instructions for the AI interviewer shared with agents."},"company_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview","description":"Overview of the company shared with agents."},"job_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview","description":"Overview of the job/role shared with agents."},"interview_process_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview","description":"Overview of the interview process shared with agents."},"company_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"How the AI interviewer delivers the company overview."},"job_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"How the AI interviewer delivers the job overview."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"How the AI interviewer delivers the interview process overview."},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id","description":"ID of the phone number used for outbound calls."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email configuration."},"email_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Template Group Id","description":"ID of the email template group."},"design_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Template Group Id","description":"ID of the design template group."},"retake_cooldown_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retake Cooldown Days","description":"Cooldown period in days before a candidate can retake."},"email_report_to_candidate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Report To Candidate","description":"Whether to email the interview report to the candidate.","default":false},"ats_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ats Metadata","description":"ATS integration metadata for postings derived from an ATS (Import-from-ATS flow or `createPosting` with an ATS-derived `interview_template_id`). Null for postings not connected to an ATS. Common fields:\n- `source` (string): how the posting was created, e.g. `job_sync`.\n- `ats_name` (string): identifier of the ATS, e.g. `workable`, `bullhorn`.\n- `ats_job_id` (string): ID of the ATS job that backs this posting.\n- `ats_job_posting_id` (string, optional): ATS-side job-posting ID when distinct from `ats_job_id`.\n- `integration_id` (string, optional): heymilo ATS integration ID.\n- `job_ids` (string[], optional): ATS job IDs included in the mapping config.\n- `pending_activation` (bool): `true` while the agent is in the intermediate stage created by `createPosting` / `clonePosting` for ATS-derived postings. Candidate ingestion does not begin until the caller transitions out of this stage by calling `POST /postings/{posting_id}/activate`, which finalizes the posting and attaches the ATS mapping in one step.\n- `mapping_activated_at`, `mapping_activated_by` (read-only): audit fields stamped when the ATS mapping was attached.\n- `mapping_deactivated_at`, `mapping_deactivated_by` (read-only): audit fields stamped when the ATS mapping was last paused."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the posting was created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when the posting was last updated."}},"type":"object","required":["id","company_id","title","description","status","finalized","archived","test_posting"],"title":"PostingResponse","description":"A job posting with its full agentic workflow configuration.\n\nA posting represents a complete hiring pipeline — it defines the\njob, the AI agents involved, and how candidates progress through\neach screening step."},"WorkflowStep":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for this workflow step."},"type":{"type":"string","title":"Type","description":"Agent type: 'web_interview', 'conversational_sms', 'resume', 'form'."},"order":{"type":"integer","title":"Order","description":"Position in the workflow pipeline (1-based)."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Agent-specific configuration. Shape varies by type. See GET /api/v2/schemas/agents for details."}},"type":"object","required":["type","order"],"title":"WorkflowStep","description":"A single step in a posting's agentic workflow."},"PostingURLs":{"properties":{"candidate_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Url","description":"Candidate-facing interview URL."},"ingestion_url_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingestion Url Key","description":"URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}."},"review_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Url","description":"Admin dashboard review URL."}},"type":"object","title":"PostingURLs","description":"All URLs associated with a posting."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_QuestionResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_QuestionResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/QuestionResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[QuestionResponse]"},"QuestionResponse":{"properties":{"object":{"type":"string","const":"question","title":"Object","description":"Object type identifier.","default":"question"},"id":{"type":"string","title":"Id","description":"Unique question/criterion identifier."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this question belongs to."},"modality":{"type":"string","title":"Modality","description":"Question modality: voice, sms, form, resume_eligibility, resume_scoring, voice_tags."},"text":{"type":"string","title":"Text","description":"The question text, criterion text, or tag name."},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank","description":"Display order (1-based). Lower ranks appear first."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"Evaluation criteria for scoring."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Description of what a score of 1 means."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Description of what a score of 5 means."},"score_weight":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score Weight","description":"Importance weight for scoring (1–10)."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Whether this question is asked but not scored (voice)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Question format. For voice: 'open-ended' or 'scored'. Auto-inferred by the backend for SMS ('YES_NO', 'NUMERIC') and form ('dropdown', 'file_upload', 'slider', etc.) modalities."},"min_follow_ups":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions (voice)."},"max_follow_ups":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions (voice)."},"additional_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied post-interview."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer text (SMS yes/no)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (SMS numeric)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Whether wrong answer disqualifies (SMS)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer for knockout evaluation (form)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Whether this is a knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown option list (form)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Whether an answer is required (form)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: 'single' or 'multiple' (form). May be auto-set to 'multiple' by the backend for dropdown questions."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator: eq, neq, gt, gte, lt, lte (form). May be auto-set by the backend (e.g. 'minimum' for slider questions)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions (form file_upload)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow multiple file uploads (form)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum slider value (form)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum slider value (form)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Slider step increment (form)."},"response_format":{"anyOf":[{"type":"string","enum":["text","freeform","date","number"]},{"type":"null"}],"title":"Response Format","description":"Expected response format for voice_tags: 'text', 'freeform', 'date', or 'number'."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"structured_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Config","description":"Advanced structured configuration (voice). Opaque key-value object forwarded to the AI interviewer."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when last updated."}},"type":"object","required":["id","posting_id","modality","text"],"title":"QuestionResponse","description":"A question or criterion belonging to a posting.\n\nThe ``modality`` field indicates the question type (voice, sms, form,\nresume_eligibility, resume_scoring, voice_tags). Fields that are not\napplicable to a given modality will be ``null``."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_SenderEmailResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_SenderEmailResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SenderEmailResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[SenderEmailResponse]"},"SenderEmailResponse":{"properties":{"object":{"type":"string","const":"sender_email","title":"Object","description":"Object type identifier.","default":"sender_email"},"id":{"type":"string","title":"Id","description":"Unique sender email identifier."},"email_prefix":{"type":"string","title":"Email Prefix","description":"Local part of the email address (before @)."},"domain":{"type":"string","title":"Domain","description":"Email domain."},"full_email":{"type":"string","title":"Full Email","description":"Complete email address."},"domain_id":{"type":"string","title":"Domain Id","description":"ID of the associated email domain."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the sender email was created."}},"type":"object","required":["id","email_prefix","domain","full_email","domain_id","created_at"],"title":"SenderEmailResponse","description":"A sender email address configured for the workspace.\n\nSender emails are used for candidate communications (invitations,\nnudges, reports). The ``id`` is referenced in posting configs as\n``sender_email_id``."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_VoiceResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_VoiceResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/VoiceResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[VoiceResponse]"},"VoiceResponse":{"properties":{"object":{"type":"string","const":"voice","title":"Object","description":"Object type identifier.","default":"voice"},"id":{"type":"string","title":"Id","description":"Registry voice ID (wrv-prefixed)."},"provider":{"type":"string","title":"Provider","description":"Voice provider: 'elevenlabs', 'cartesia', or 'lmnt'."},"provider_voice_id":{"type":"string","title":"Provider Voice Id","description":"Provider-specific voice identifier."},"name":{"type":"string","title":"Name","description":"Human-readable voice name."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code."},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO country code."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender","description":"Voice gender: 'male', 'female', or 'neutral'."},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url","description":"URL to an audio preview of the voice."},"labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels","description":"Provider-defined labels (e.g. accent, age, style)."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the voice was added to the registry."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the voice was last updated."}},"type":"object","required":["id","provider","provider_voice_id","name","created_at","updated_at"],"title":"VoiceResponse","description":"A voice from the workspace voice registry.\n\nVoices are added from external providers (ElevenLabs, Cartesia, LMNT)\nand stored in the workspace registry. The ``id`` (prefixed ``wrv-``)\nis used in posting configs as ``voice_id``."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The ListResponse\_WebhookResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ListResponse_WebhookResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","pagination"],"title":"ListResponse[WebhookResponse]"},"WebhookResponse":{"properties":{"object":{"type":"string","const":"webhook","title":"Object","description":"Object type identifier.","default":"webhook"},"webhook_id":{"type":"string","title":"Webhook Id","description":"Unique webhook identifier."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this webhook is for."},"url":{"type":"string","title":"Url","description":"Destination URL for the webhook."},"event_type":{"type":"string","title":"Event Type","description":"Type of event that triggers the webhook."},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the webhook is active."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the webhook was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the webhook was last updated."}},"type":"object","required":["webhook_id","posting_id","url","event_type","is_active","created_at","updated_at"],"title":"WebhookResponse","description":"A webhook configuration."},"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The MetadataRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"MetadataRequest":{"properties":{"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata","description":"Key-value pairs to set. Up to 50 keys, each key max 40 chars, each value max 500 chars. All values must be strings."}},"type":"object","required":["metadata"],"title":"MetadataRequest","description":"Request body for setting metadata on a resource."}}}}
```

## The MetadataResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"MetadataResponse":{"properties":{"object":{"type":"string","title":"Object","description":"Object type identifier."},"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata","description":"Key-value metadata pairs."}},"type":"object","required":["object"],"title":"MetadataResponse","description":"Response containing metadata for a resource."}}}}
```

## The PaginationMeta object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"PaginationMeta":{"properties":{"has_more":{"type":"boolean","title":"Has More","description":"Whether more results exist beyond this page"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count","description":"Total number of results (if available)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of this resource"}},"type":"object","required":["has_more"],"title":"PaginationMeta"}}}}
```

## The PhoneNumberResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"PhoneNumberResponse":{"properties":{"object":{"type":"string","const":"phone_number","title":"Object","description":"Object type identifier.","default":"phone_number"},"id":{"type":"string","title":"Id","description":"Unique phone number configuration identifier."},"phone_number":{"type":"string","title":"Phone Number","description":"Phone number in E.164 format."},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO country code."},"active":{"type":"boolean","title":"Active","description":"Whether the phone number is active."},"date_provisioned":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Date Provisioned","description":"Unix timestamp when the number was provisioned."}},"type":"object","required":["id","phone_number","active"],"title":"PhoneNumberResponse","description":"A phone number provisioned for the workspace.\n\nPhone numbers are used by voice and SMS agents to communicate with\ncandidates. The ``id`` is referenced in posting configs as\n``phone_number_id``."}}}}
```

## The PostingResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"PostingResponse":{"properties":{"object":{"type":"string","const":"posting","title":"Object","description":"Object type identifier.","default":"posting"},"id":{"type":"string","title":"Id","description":"Unique posting identifier."},"company_id":{"type":"string","title":"Company Id","description":"ID of the company that owns this posting."},"title":{"type":"string","title":"Title","description":"Job title displayed to candidates."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"URL-friendly slug for the posting."},"description":{"type":"string","title":"Description","description":"Full job description text."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code.","default":"en"},"interviewer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interviewer Name","description":"Display name of the AI interviewer."},"status":{"type":"string","title":"Status","description":"Posting status: 'draft', 'active', 'expired', 'archived'."},"finalized":{"type":"boolean","title":"Finalized","description":"Whether the posting has been finalized/activated."},"archived":{"type":"boolean","title":"Archived","description":"Whether the posting is archived."},"test_posting":{"type":"boolean","title":"Test Posting","description":"Whether this is a test posting."},"workflow":{"items":{"$ref":"#/components/schemas/WorkflowStep"},"type":"array","title":"Workflow","description":"Ordered list of agentic workflow steps."},"urls":{"anyOf":[{"$ref":"#/components/schemas/PostingURLs"},{"type":"null"}],"description":"All URLs associated with this posting."},"deadline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deadline","description":"Unix timestamp deadline for the posting."},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url","description":"URL candidates are redirected to after completing the interview."},"scheduling_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduling Url","description":"Calendar scheduling URL for shortlisted candidates."},"max_retakes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Retakes","description":"Maximum number of interview retakes allowed."},"allow_sms_comms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Sms Comms","description":"Whether SMS communications are enabled.","default":false},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"General instructions for the AI interviewer shared with agents."},"company_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview","description":"Overview of the company shared with agents."},"job_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview","description":"Overview of the job/role shared with agents."},"interview_process_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview","description":"Overview of the interview process shared with agents."},"company_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"How the AI interviewer delivers the company overview."},"job_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"How the AI interviewer delivers the job overview."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"How the AI interviewer delivers the interview process overview."},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id","description":"ID of the phone number used for outbound calls."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email configuration."},"email_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Template Group Id","description":"ID of the email template group."},"design_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Template Group Id","description":"ID of the design template group."},"retake_cooldown_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retake Cooldown Days","description":"Cooldown period in days before a candidate can retake."},"email_report_to_candidate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Report To Candidate","description":"Whether to email the interview report to the candidate.","default":false},"ats_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ats Metadata","description":"ATS integration metadata for postings derived from an ATS (Import-from-ATS flow or `createPosting` with an ATS-derived `interview_template_id`). Null for postings not connected to an ATS. Common fields:\n- `source` (string): how the posting was created, e.g. `job_sync`.\n- `ats_name` (string): identifier of the ATS, e.g. `workable`, `bullhorn`.\n- `ats_job_id` (string): ID of the ATS job that backs this posting.\n- `ats_job_posting_id` (string, optional): ATS-side job-posting ID when distinct from `ats_job_id`.\n- `integration_id` (string, optional): heymilo ATS integration ID.\n- `job_ids` (string[], optional): ATS job IDs included in the mapping config.\n- `pending_activation` (bool): `true` while the agent is in the intermediate stage created by `createPosting` / `clonePosting` for ATS-derived postings. Candidate ingestion does not begin until the caller transitions out of this stage by calling `POST /postings/{posting_id}/activate`, which finalizes the posting and attaches the ATS mapping in one step.\n- `mapping_activated_at`, `mapping_activated_by` (read-only): audit fields stamped when the ATS mapping was attached.\n- `mapping_deactivated_at`, `mapping_deactivated_by` (read-only): audit fields stamped when the ATS mapping was last paused."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the posting was created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when the posting was last updated."}},"type":"object","required":["id","company_id","title","description","status","finalized","archived","test_posting"],"title":"PostingResponse","description":"A job posting with its full agentic workflow configuration.\n\nA posting represents a complete hiring pipeline — it defines the\njob, the AI agents involved, and how candidates progress through\neach screening step."},"WorkflowStep":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for this workflow step."},"type":{"type":"string","title":"Type","description":"Agent type: 'web_interview', 'conversational_sms', 'resume', 'form'."},"order":{"type":"integer","title":"Order","description":"Position in the workflow pipeline (1-based)."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Agent-specific configuration. Shape varies by type. See GET /api/v2/schemas/agents for details."}},"type":"object","required":["type","order"],"title":"WorkflowStep","description":"A single step in a posting's agentic workflow."},"PostingURLs":{"properties":{"candidate_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Url","description":"Candidate-facing interview URL."},"ingestion_url_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingestion Url Key","description":"URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}."},"review_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Url","description":"Admin dashboard review URL."}},"type":"object","title":"PostingURLs","description":"All URLs associated with a posting."}}}}
```

## The PostingURLs object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"PostingURLs":{"properties":{"candidate_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Url","description":"Candidate-facing interview URL."},"ingestion_url_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingestion Url Key","description":"URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}."},"review_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Url","description":"Admin dashboard review URL."}},"type":"object","title":"PostingURLs","description":"All URLs associated with a posting."}}}}
```

## The QuestionResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"QuestionResponse":{"properties":{"object":{"type":"string","const":"question","title":"Object","description":"Object type identifier.","default":"question"},"id":{"type":"string","title":"Id","description":"Unique question/criterion identifier."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this question belongs to."},"modality":{"type":"string","title":"Modality","description":"Question modality: voice, sms, form, resume_eligibility, resume_scoring, voice_tags."},"text":{"type":"string","title":"Text","description":"The question text, criterion text, or tag name."},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank","description":"Display order (1-based). Lower ranks appear first."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"Evaluation criteria for scoring."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Description of what a score of 1 means."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Description of what a score of 5 means."},"score_weight":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score Weight","description":"Importance weight for scoring (1–10)."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Whether this question is asked but not scored (voice)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Question format. For voice: 'open-ended' or 'scored'. Auto-inferred by the backend for SMS ('YES_NO', 'NUMERIC') and form ('dropdown', 'file_upload', 'slider', etc.) modalities."},"min_follow_ups":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions (voice)."},"max_follow_ups":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions (voice)."},"additional_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied post-interview."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer text (SMS yes/no)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (SMS numeric)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Whether wrong answer disqualifies (SMS)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer for knockout evaluation (form)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Whether this is a knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown option list (form)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Whether an answer is required (form)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: 'single' or 'multiple' (form). May be auto-set to 'multiple' by the backend for dropdown questions."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator: eq, neq, gt, gte, lt, lte (form). May be auto-set by the backend (e.g. 'minimum' for slider questions)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions (form file_upload)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow multiple file uploads (form)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum slider value (form)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum slider value (form)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Slider step increment (form)."},"response_format":{"anyOf":[{"type":"string","enum":["text","freeform","date","number"]},{"type":"null"}],"title":"Response Format","description":"Expected response format for voice_tags: 'text', 'freeform', 'date', or 'number'."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"structured_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Config","description":"Advanced structured configuration (voice). Opaque key-value object forwarded to the AI interviewer."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when last updated."}},"type":"object","required":["id","posting_id","modality","text"],"title":"QuestionResponse","description":"A question or criterion belonging to a posting.\n\nThe ``modality`` field indicates the question type (voice, sms, form,\nresume_eligibility, resume_scoring, voice_tags). Fields that are not\napplicable to a given modality will be ``null``."}}}}
```

## The ReorderQuestionsRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ReorderQuestionsRequest":{"properties":{"modality":{"type":"string","enum":["voice","sms","form","resume_eligibility","resume_scoring","voice_tags"],"title":"Modality","description":"Modality to reorder: voice, sms, form, resume_eligibility, resume_scoring, voice_tags."},"order":{"items":{"type":"string"},"type":"array","title":"Order","description":"Ordered list of question IDs. Every active question for the specified modality must be included."}},"type":"object","required":["modality","order"],"title":"ReorderQuestionsRequest","description":"Request body for reordering questions within a modality."}}}}
```

## The ResumeConfig object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ResumeConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-reject candidates failing eligibility criteria."},"min_evaluation_score":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Min Evaluation Score","description":"Minimum normalized score on scoring criteria."},"mandatory":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mandatory","description":"Require resume upload to proceed."},"num_eligibility_questions":{"anyOf":[{"type":"integer","maximum":15,"minimum":0},{"type":"null"}],"title":"Num Eligibility Questions","description":"Number of pass/fail eligibility criteria."},"num_criteria_questions":{"anyOf":[{"type":"integer","maximum":15,"minimum":0},{"type":"null"}],"title":"Num Criteria Questions","description":"Number of scored criteria."}},"type":"object","title":"ResumeConfig","description":"Config for the resume screening agent."}}}}
```

## The ResumeEligibilityCriterion object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ResumeEligibilityCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion description."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate meets this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the pass/fail."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"ResumeEligibilityCriterion","description":"Evaluation of a single resume eligibility (pass/fail) criterion."}}}}
```

## The ResumeResult object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ResumeResult":{"properties":{"object":{"type":"string","const":"resume_result","title":"Object","description":"Object type identifier.","default":"resume_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"overall_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Score","description":"Weighted score across all criteria (0.0-100.0)."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets all eligibility criteria."},"score_criteria":{"items":{"$ref":"#/components/schemas/ResumeScoreCriterion"},"type":"array","title":"Score Criteria","description":"Individual scoring criterion results."},"eligibility_criteria":{"items":{"$ref":"#/components/schemas/ResumeEligibilityCriterion"},"type":"array","title":"Eligibility Criteria","description":"Individual eligibility criterion results."},"resume_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Url","description":"URL to the uploaded resume."}},"type":"object","required":["interview_id"],"title":"ResumeResult","description":"Complete results for the resume screening step."},"ResumeScoreCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion as defined by the recruiter."},"score":{"type":"number","title":"Score","description":"Score (0.0-10.0)."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the score."}},"type":"object","required":["criteria_id","criteria_text","score","confidence"],"title":"ResumeScoreCriterion","description":"Evaluation of a single resume scoring criterion."},"ResumeEligibilityCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion description."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate meets this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the pass/fail."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"ResumeEligibilityCriterion","description":"Evaluation of a single resume eligibility (pass/fail) criterion."}}}}
```

## The ResumeScoreCriterion object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ResumeScoreCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion as defined by the recruiter."},"score":{"type":"number","title":"Score","description":"Score (0.0-10.0)."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the score."}},"type":"object","required":["criteria_id","criteria_text","score","confidence"],"title":"ResumeScoreCriterion","description":"Evaluation of a single resume scoring criterion."}}}}
```

## The SMSCriterionResult object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SMSCriterionResult":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The question asked via SMS."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate passed this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"is_dealbreaker":{"type":"boolean","title":"Is Dealbreaker","description":"Whether failing this criterion disqualifies the candidate.","default":false},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"SMSCriterionResult","description":"Evaluation of a single SMS screening criterion."}}}}
```

## The SMSMessage object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SMSMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Message sender: 'agent' or 'candidate'."},"text":{"type":"string","title":"Text","description":"Message content."},"timestamp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timestamp","description":"Unix timestamp when the message was sent."}},"type":"object","required":["role","text"],"title":"SMSMessage","description":"A single message in an SMS screening conversation."}}}}
```

## The SMSResult object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SMSResult":{"properties":{"object":{"type":"string","const":"sms_result","title":"Object","description":"Object type identifier.","default":"sms_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"is_eligible":{"type":"boolean","title":"Is Eligible","description":"Overall eligibility verdict."},"confidence":{"type":"number","title":"Confidence","description":"Overall AI confidence (0.0-1.0)."},"criteria":{"items":{"$ref":"#/components/schemas/SMSCriterionResult"},"type":"array","title":"Criteria","description":"Individual criterion results."},"transcript":{"items":{"$ref":"#/components/schemas/SMSMessage"},"type":"array","title":"Transcript","description":"Full SMS conversation."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."},"messages_received":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Received","description":"Total messages received from the candidate."}},"type":"object","required":["interview_id","is_eligible","confidence"],"title":"SMSResult","description":"Complete results for the SMS screening step."},"SMSCriterionResult":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The question asked via SMS."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate passed this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"is_dealbreaker":{"type":"boolean","title":"Is Dealbreaker","description":"Whether failing this criterion disqualifies the candidate.","default":false},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"SMSCriterionResult","description":"Evaluation of a single SMS screening criterion."},"SMSMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Message sender: 'agent' or 'candidate'."},"text":{"type":"string","title":"Text","description":"Message content."},"timestamp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timestamp","description":"Unix timestamp when the message was sent."}},"type":"object","required":["role","text"],"title":"SMSMessage","description":"A single message in an SMS screening conversation."}}}}
```

## The ScorecardQuestion object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ScorecardQuestion":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question as asked to the candidate."},"score":{"type":"integer","title":"Score","description":"Score (1-10). 1 = weak, 10 = exceptional."},"score_weight":{"type":"integer","title":"Score Weight","description":"Importance weight (1-10). Higher = more important.","default":5},"evaluation_summary":{"type":"string","title":"Evaluation Summary","description":"AI-generated summary of the candidate's response."},"evaluation_criteria":{"type":"string","title":"Evaluation Criteria","description":"Criteria used to evaluate this question."},"score_1_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 1 Description","description":"What constitutes a score of 1."},"score_5_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 5 Description","description":"What constitutes a score of 5 (midpoint anchor on 1-10 scale)."},"not_scored":{"type":"boolean","title":"Not Scored","description":"If true, this question was informational only.","default":false},"rank":{"type":"integer","title":"Rank","description":"Order in which this question was asked (1-based)."},"transcript":{"items":{"$ref":"#/components/schemas/TranscriptEntry"},"type":"array","title":"Transcript","description":"Dialogue for this specific question."}},"type":"object","required":["question_id","question_text","score","evaluation_summary","evaluation_criteria","rank"],"title":"ScorecardQuestion","description":"Evaluation result for a single scored question."},"TranscriptEntry":{"properties":{"speaker":{"type":"string","title":"Speaker","description":"Who spoke: 'Interviewer', 'Candidate', or 'System'."},"text":{"type":"string","title":"Text","description":"The spoken or written text."},"timestamp":{"type":"number","title":"Timestamp","description":"Seconds from the start of the interview."},"timestamp_str":{"type":"string","title":"Timestamp Str","description":"Human-readable timestamp (MM:SS)."}},"type":"object","required":["speaker","text","timestamp","timestamp_str"],"title":"TranscriptEntry","description":"A single turn in an interview conversation."}}}}
```

## The SenderEmailResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SenderEmailResponse":{"properties":{"object":{"type":"string","const":"sender_email","title":"Object","description":"Object type identifier.","default":"sender_email"},"id":{"type":"string","title":"Id","description":"Unique sender email identifier."},"email_prefix":{"type":"string","title":"Email Prefix","description":"Local part of the email address (before @)."},"domain":{"type":"string","title":"Domain","description":"Email domain."},"full_email":{"type":"string","title":"Full Email","description":"Complete email address."},"domain_id":{"type":"string","title":"Domain Id","description":"ID of the associated email domain."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the sender email was created."}},"type":"object","required":["id","email_prefix","domain","full_email","domain_id","created_at"],"title":"SenderEmailResponse","description":"A sender email address configured for the workspace.\n\nSender emails are used for candidate communications (invitations,\nnudges, reports). The ``id`` is referenced in posting configs as\n``sender_email_id``."}}}}
```

## The SingleResponse\_AsyncIngestResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_AsyncIngestResponse_":{"properties":{"data":{"$ref":"#/components/schemas/AsyncIngestResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[AsyncIngestResponse]"},"AsyncIngestResponse":{"properties":{"object":{"type":"string","const":"ingestion","title":"Object","description":"Object type identifier.","default":"ingestion"},"ingestion_id":{"type":"string","title":"Ingestion Id","description":"Unique identifier for this ingestion job."},"status":{"type":"string","title":"Status","description":"Status of the ingestion job.","default":"queued"}},"type":"object","required":["ingestion_id"],"title":"AsyncIngestResponse","description":"Response after queuing an async ingest job."}}}}
```

## The SingleResponse\_CreatePostingResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_CreatePostingResponse_":{"properties":{"data":{"$ref":"#/components/schemas/CreatePostingResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[CreatePostingResponse]"},"CreatePostingResponse":{"properties":{"object":{"type":"string","const":"posting","title":"Object","description":"Object type identifier.","default":"posting"},"id":{"type":"string","title":"Id","description":"Unique posting identifier."},"status":{"type":"string","title":"Status","description":"Posting status after creation."},"urls":{"$ref":"#/components/schemas/PostingURLs","description":"All URLs associated with this posting."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the posting was created."},"posting":{"anyOf":[{"$ref":"#/components/schemas/PostingResponse"},{"type":"null"}],"description":"Full posting resource (receipt pattern)."}},"type":"object","required":["id","status","urls","created_at"],"title":"CreatePostingResponse","description":"Response after successfully creating a posting."},"PostingURLs":{"properties":{"candidate_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Url","description":"Candidate-facing interview URL."},"ingestion_url_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingestion Url Key","description":"URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}."},"review_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Url","description":"Admin dashboard review URL."}},"type":"object","title":"PostingURLs","description":"All URLs associated with a posting."},"PostingResponse":{"properties":{"object":{"type":"string","const":"posting","title":"Object","description":"Object type identifier.","default":"posting"},"id":{"type":"string","title":"Id","description":"Unique posting identifier."},"company_id":{"type":"string","title":"Company Id","description":"ID of the company that owns this posting."},"title":{"type":"string","title":"Title","description":"Job title displayed to candidates."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"URL-friendly slug for the posting."},"description":{"type":"string","title":"Description","description":"Full job description text."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code.","default":"en"},"interviewer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interviewer Name","description":"Display name of the AI interviewer."},"status":{"type":"string","title":"Status","description":"Posting status: 'draft', 'active', 'expired', 'archived'."},"finalized":{"type":"boolean","title":"Finalized","description":"Whether the posting has been finalized/activated."},"archived":{"type":"boolean","title":"Archived","description":"Whether the posting is archived."},"test_posting":{"type":"boolean","title":"Test Posting","description":"Whether this is a test posting."},"workflow":{"items":{"$ref":"#/components/schemas/WorkflowStep"},"type":"array","title":"Workflow","description":"Ordered list of agentic workflow steps."},"urls":{"anyOf":[{"$ref":"#/components/schemas/PostingURLs"},{"type":"null"}],"description":"All URLs associated with this posting."},"deadline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deadline","description":"Unix timestamp deadline for the posting."},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url","description":"URL candidates are redirected to after completing the interview."},"scheduling_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduling Url","description":"Calendar scheduling URL for shortlisted candidates."},"max_retakes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Retakes","description":"Maximum number of interview retakes allowed."},"allow_sms_comms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Sms Comms","description":"Whether SMS communications are enabled.","default":false},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"General instructions for the AI interviewer shared with agents."},"company_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview","description":"Overview of the company shared with agents."},"job_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview","description":"Overview of the job/role shared with agents."},"interview_process_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview","description":"Overview of the interview process shared with agents."},"company_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"How the AI interviewer delivers the company overview."},"job_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"How the AI interviewer delivers the job overview."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"How the AI interviewer delivers the interview process overview."},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id","description":"ID of the phone number used for outbound calls."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email configuration."},"email_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Template Group Id","description":"ID of the email template group."},"design_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Template Group Id","description":"ID of the design template group."},"retake_cooldown_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retake Cooldown Days","description":"Cooldown period in days before a candidate can retake."},"email_report_to_candidate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Report To Candidate","description":"Whether to email the interview report to the candidate.","default":false},"ats_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ats Metadata","description":"ATS integration metadata for postings derived from an ATS (Import-from-ATS flow or `createPosting` with an ATS-derived `interview_template_id`). Null for postings not connected to an ATS. Common fields:\n- `source` (string): how the posting was created, e.g. `job_sync`.\n- `ats_name` (string): identifier of the ATS, e.g. `workable`, `bullhorn`.\n- `ats_job_id` (string): ID of the ATS job that backs this posting.\n- `ats_job_posting_id` (string, optional): ATS-side job-posting ID when distinct from `ats_job_id`.\n- `integration_id` (string, optional): heymilo ATS integration ID.\n- `job_ids` (string[], optional): ATS job IDs included in the mapping config.\n- `pending_activation` (bool): `true` while the agent is in the intermediate stage created by `createPosting` / `clonePosting` for ATS-derived postings. Candidate ingestion does not begin until the caller transitions out of this stage by calling `POST /postings/{posting_id}/activate`, which finalizes the posting and attaches the ATS mapping in one step.\n- `mapping_activated_at`, `mapping_activated_by` (read-only): audit fields stamped when the ATS mapping was attached.\n- `mapping_deactivated_at`, `mapping_deactivated_by` (read-only): audit fields stamped when the ATS mapping was last paused."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the posting was created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when the posting was last updated."}},"type":"object","required":["id","company_id","title","description","status","finalized","archived","test_posting"],"title":"PostingResponse","description":"A job posting with its full agentic workflow configuration.\n\nA posting represents a complete hiring pipeline — it defines the\njob, the AI agents involved, and how candidates progress through\neach screening step."},"WorkflowStep":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for this workflow step."},"type":{"type":"string","title":"Type","description":"Agent type: 'web_interview', 'conversational_sms', 'resume', 'form'."},"order":{"type":"integer","title":"Order","description":"Position in the workflow pipeline (1-based)."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Agent-specific configuration. Shape varies by type. See GET /api/v2/schemas/agents for details."}},"type":"object","required":["type","order"],"title":"WorkflowStep","description":"A single step in a posting's agentic workflow."}}}}
```

## The SingleResponse\_CustomDomainResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_CustomDomainResponse_":{"properties":{"data":{"$ref":"#/components/schemas/CustomDomainResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[CustomDomainResponse]"},"CustomDomainResponse":{"properties":{"object":{"type":"string","const":"domain","title":"Object","description":"Object type identifier.","default":"domain"},"id":{"type":"string","title":"Id","description":"Unique domain configuration identifier."},"domain":{"type":"string","title":"Domain","description":"The custom domain name."},"cname_target":{"type":"string","title":"Cname Target","description":"CNAME target for DNS configuration."},"status":{"type":"string","title":"Status","description":"Domain verification status: 'pending', 'active', 'error'."},"active":{"type":"boolean","title":"Active","description":"Whether the domain is verified and active for use."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the domain was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the domain was last updated."}},"type":"object","required":["id","domain","cname_target","status","active","created_at","updated_at"],"title":"CustomDomainResponse","description":"A custom domain for candidate-facing interview URLs.\n\nCustom domains allow workspaces to white-label the candidate\nexperience (e.g. ``interviews.acme.com`` instead of\n``candidates.heymilo.io``). Domains require CNAME verification\npointing to ``ingress.heymilo.ai``."}}}}
```

## The SingleResponse\_DesignTemplateGroupResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_DesignTemplateGroupResponse_":{"properties":{"data":{"$ref":"#/components/schemas/DesignTemplateGroupResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[DesignTemplateGroupResponse]"},"DesignTemplateGroupResponse":{"properties":{"object":{"type":"string","const":"design_template_group","title":"Object","description":"Object type identifier.","default":"design_template_group"},"id":{"type":"string","title":"Id","description":"Unique design template group identifier."},"name":{"type":"string","title":"Name","description":"Human-readable group name."},"template_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Template Mappings","description":"Mapping of page type to design template ID. Keys: 'welcome_page', 'status_page', 'interview_complete_page', 'interview_page'."},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this is the default group for the workspace.","default":false},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the group was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the group was last updated."}},"type":"object","required":["id","name","template_mappings","created_at","updated_at"],"title":"DesignTemplateGroupResponse","description":"A group of design templates assigned to a posting.\n\nTemplate groups map page types (e.g. 'welcome_page') to specific\ndesign template IDs."}}}}
```

## The SingleResponse\_DesignTemplateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_DesignTemplateResponse_":{"properties":{"data":{"$ref":"#/components/schemas/DesignTemplateResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[DesignTemplateResponse]"},"DesignTemplateResponse":{"properties":{"object":{"type":"string","const":"design_template","title":"Object","description":"Object type identifier.","default":"design_template"},"id":{"type":"string","title":"Id","description":"Unique design template identifier."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"template_type":{"type":"string","title":"Template Type","description":"Page type this template applies to: 'welcome_page', 'status_page', 'interview_complete_page', 'interview_page'."},"design_config":{"additionalProperties":true,"type":"object","title":"Design Config","description":"Design configuration object. Shape varies by template_type. Common fields: background_color, primary_color, font_family, header_text, show_logo, image_url."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","name","template_type","design_config","created_at","updated_at"],"title":"DesignTemplateResponse","description":"A design template controlling the visual appearance of candidate-facing pages.\n\nDesign templates define colors, fonts, images, and text for pages\nsuch as the welcome page, interview page, status page, and\ninterview-complete page."}}}}
```

## The SingleResponse\_EmailTemplateGroupResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_EmailTemplateGroupResponse_":{"properties":{"data":{"$ref":"#/components/schemas/EmailTemplateGroupResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[EmailTemplateGroupResponse]"},"EmailTemplateGroupResponse":{"properties":{"object":{"type":"string","const":"email_template_group","title":"Object","description":"Object type identifier.","default":"email_template_group"},"id":{"type":"string","title":"Id","description":"Unique template group identifier."},"name":{"type":"string","title":"Name","description":"Human-readable group name."},"template_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Template Mappings","description":"Mapping of template_key to template_id. Keys are email types, values are V4EmailTemplate IDs."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email address associated with this group."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the group was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the group was last updated."}},"type":"object","required":["id","name","template_mappings","created_at","updated_at"],"title":"EmailTemplateGroupResponse","description":"A group of email templates assigned to a posting.\n\nTemplate groups map template keys (e.g. 'WEB_INTERVIEW_INVITATION')\nto specific template IDs, allowing different postings to use\ndifferent email styles."}}}}
```

## The SingleResponse\_EmailTemplateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_EmailTemplateResponse_":{"properties":{"data":{"$ref":"#/components/schemas/EmailTemplateResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[EmailTemplateResponse]"},"EmailTemplateResponse":{"properties":{"object":{"type":"string","const":"email_template","title":"Object","description":"Object type identifier.","default":"email_template"},"id":{"type":"string","title":"Id","description":"Unique email template identifier."},"template_key":{"type":"string","title":"Template Key","description":"Template key indicating the email type: 'WEB_INTERVIEW_INVITATION', 'WEB_INTERVIEW_NUDGE', 'RESUME_INVITATION', 'RESUME_NUDGE', 'FORM_INVITATION', 'FORM_NUDGE', 'WEB_INTERVIEW_FINAL_NUDGE', 'SCHEDULING_LINK_EMAIL', 'REPORT_READY_EMAIL'."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"subject":{"type":"string","title":"Subject","description":"Email subject line. Supports {{variable}} placeholders."},"content":{"type":"string","title":"Content","description":"Email HTML body. Supports {{variable}} placeholders."},"blackout_period":{"anyOf":[{"$ref":"#/components/schemas/BlackoutPeriod"},{"type":"null"}],"description":"Blackout period during which this email will not be sent."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","template_key","name","subject","content","created_at","updated_at"],"title":"EmailTemplateResponse","description":"A single email template used for candidate communications.\n\nTemplates define the subject line and HTML body for emails sent at\nvarious stages of the interview workflow (invitations, nudges, etc.)."},"BlackoutPeriod":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether the blackout period is active."},"timezone":{"type":"string","title":"Timezone","description":"IANA timezone identifier."},"start_hour":{"type":"integer","title":"Start Hour","description":"Start hour of the blackout window (0-23)."},"end_hour":{"type":"integer","title":"End Hour","description":"End hour of the blackout window (0-24, where 24 = midnight)."}},"type":"object","required":["enabled","timezone","start_hour","end_hour"],"title":"BlackoutPeriod","description":"Time window during which emails will not be sent."}}}}
```

## The SingleResponse\_IngestCandidateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_IngestCandidateResponse_":{"properties":{"data":{"$ref":"#/components/schemas/IngestCandidateResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[IngestCandidateResponse]"},"IngestCandidateResponse":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier for this candidate-posting pair."},"interview_url":{"type":"string","title":"Interview Url","description":"URL the candidate uses to access the interview."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this candidate was ingested into."},"candidate":{"anyOf":[{"$ref":"#/components/schemas/CandidateResponse"},{"type":"null"}],"description":"Full candidate resource (receipt pattern)."}},"type":"object","required":["interview_id","interview_url","posting_id"],"title":"IngestCandidateResponse","description":"Response after successfully ingesting a candidate."},"CandidateResponse":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier (one per candidate-posting pair)."},"candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Id","description":"Unique candidate identifier (shared across postings within a workspace)."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this candidate belongs to."},"name":{"type":"string","title":"Name","description":"Candidate's full name."},"email":{"type":"string","title":"Email","description":"Candidate's email address."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall match score (0-100). Aggregated across all completed workflow steps."},"status":{"type":"string","title":"Status","description":"Current candidate status: 'pending', 'in_progress', 'evaluating', 'completed', 'shortlisted', 'dismissed', 'knocked_out'. 'evaluating' means all workflow steps are done but the final score is still being computed."},"interview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Url","description":"URL the candidate uses to access the interview."},"workflow":{"anyOf":[{"$ref":"#/components/schemas/CandidateWorkflow"},{"type":"null"}],"description":"Step-by-step workflow progress."},"agent_summary":{"anyOf":[{"$ref":"#/components/schemas/AgentSummary"},{"type":"null"}],"description":"Per-agent-type summary metrics."},"shortlisted":{"type":"boolean","title":"Shortlisted","description":"Whether a recruiter has shortlisted this candidate.","default":false},"dismissed":{"type":"boolean","title":"Dismissed","description":"Whether a recruiter has dismissed this candidate.","default":false},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data supplied at ingestion time."},"interviewed_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Interviewed At","description":"Unix timestamp when the candidate completed the interview."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the candidate was ingested."}},"type":"object","required":["interview_id","posting_id","name","email","status"],"title":"CandidateResponse","description":"A candidate within a posting's pipeline.\n\nEach candidate has a unique ``interview_id`` (one per\ncandidate-posting pair) and a ``candidate_id`` (shared across\npostings within a workspace)."},"CandidateWorkflow":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepStatus"},"type":"array","title":"Steps","description":"Ordered list of workflow step statuses."},"all_complete":{"type":"boolean","title":"All Complete","description":"True when every step has been completed."},"last_activity_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Activity At","description":"Unix timestamp of the candidate's most recent interaction with any step."}},"type":"object","required":["steps","all_complete"],"title":"CandidateWorkflow","description":"Overall workflow progress for a candidate."},"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."},"AgentSummary":{"properties":{"resume":{"anyOf":[{"$ref":"#/components/schemas/AgentResumeSummary"},{"type":"null"}],"description":"Resume screening summary."},"web_interview":{"anyOf":[{"$ref":"#/components/schemas/AgentWebInterviewSummary"},{"type":"null"}],"description":"Web interview summary."},"sms":{"anyOf":[{"$ref":"#/components/schemas/AgentSMSSummary"},{"type":"null"}],"description":"SMS screening summary."},"form":{"anyOf":[{"$ref":"#/components/schemas/AgentFormSummary"},{"type":"null"}],"description":"Form screening summary."}},"type":"object","title":"AgentSummary","description":"Per-agent-type summary metrics for a candidate."},"AgentResumeSummary":{"properties":{"resume_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resume Score","description":"Resume match score."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets eligibility criteria."},"resume_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Link","description":"URL to the uploaded resume."}},"type":"object","title":"AgentResumeSummary","description":"Resume screening summary metrics."},"AgentWebInterviewSummary":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall interview score."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"audio_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Link","description":"Signed URL to audio recording."},"video_recording_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Link","description":"Signed URL to video recording."}},"type":"object","title":"AgentWebInterviewSummary","description":"Web interview summary metrics."},"AgentSMSSummary":{"properties":{"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed SMS screening."},"criteria_passed":{"items":{"type":"string"},"type":"array","title":"Criteria Passed","description":"Criteria the candidate passed."},"criteria_failed":{"items":{"type":"string"},"type":"array","title":"Criteria Failed","description":"Criteria the candidate failed."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."}},"type":"object","title":"AgentSMSSummary","description":"SMS screening summary metrics."},"AgentFormSummary":{"properties":{"is_complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Complete","description":"Whether the candidate completed the form."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate passed all knockout questions."},"questions_answered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Questions Answered","description":"Number of questions answered."},"total_questions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Questions","description":"Total number of questions on the form."}},"type":"object","title":"AgentFormSummary","description":"Form screening summary metrics."}}}}
```

## The SingleResponse\_InterviewDataResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_InterviewDataResponse_":{"properties":{"data":{"$ref":"#/components/schemas/InterviewDataResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[InterviewDataResponse]"},"InterviewDataResponse":{"properties":{"object":{"type":"string","const":"interview_data","title":"Object","description":"Object type identifier.","default":"interview_data"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier."},"candidate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Id","description":"Candidate identifier (shared across postings)."},"posting_id":{"type":"string","title":"Posting Id","description":"Posting this interview belongs to."},"name":{"type":"string","title":"Name","description":"Candidate's full name."},"email":{"type":"string","title":"Email","description":"Candidate's email."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Overall match score (0-100)."},"status":{"type":"string","title":"Status","description":"Current candidate status: 'pending', 'in_progress', 'evaluating', 'completed', 'shortlisted', 'dismissed', 'knocked_out'. 'evaluating' means all workflow steps are done but the final score is still being computed."},"workflow":{"anyOf":[{"$ref":"#/components/schemas/CandidateWorkflow"},{"type":"null"}],"description":"Step-by-step workflow progress."},"web_interview":{"anyOf":[{"$ref":"#/components/schemas/WebInterviewResult"},{"type":"null"}],"description":"Voice/video interview results (null if not in workflow)."},"resume":{"anyOf":[{"$ref":"#/components/schemas/ResumeResult"},{"type":"null"}],"description":"Resume screening results (null if not in workflow)."},"sms":{"anyOf":[{"$ref":"#/components/schemas/SMSResult"},{"type":"null"}],"description":"SMS screening results (null if not in workflow)."},"form":{"anyOf":[{"$ref":"#/components/schemas/FormResult"},{"type":"null"}],"description":"Form screening results (null if not in workflow)."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Additional candidate data supplied at ingestion time."}},"type":"object","required":["interview_id","posting_id","name","email","status"],"title":"InterviewDataResponse","description":"Full interview results across all workflow steps.\n\nContains the candidate details plus per-agent results. Fields for\nagents not in the posting's workflow will be null."},"CandidateWorkflow":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/WorkflowStepStatus"},"type":"array","title":"Steps","description":"Ordered list of workflow step statuses."},"all_complete":{"type":"boolean","title":"All Complete","description":"True when every step has been completed."},"last_activity_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Activity At","description":"Unix timestamp of the candidate's most recent interaction with any step."}},"type":"object","required":["steps","all_complete"],"title":"CandidateWorkflow","description":"Overall workflow progress for a candidate."},"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."},"WebInterviewResult":{"properties":{"object":{"type":"string","const":"web_interview_result","title":"Object","description":"Object type identifier.","default":"web_interview_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"match_score":{"type":"integer","title":"Match Score","description":"Overall match score (0-100)."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"lowlights":{"items":{"type":"string"},"type":"array","title":"Lowlights","description":"Areas for improvement."},"scorecard":{"items":{"$ref":"#/components/schemas/ScorecardQuestion"},"type":"array","title":"Scorecard","description":"Question-by-question evaluation."},"speech_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speech Score","description":"Communication/speech score (0.0-5.0)."},"transcript":{"items":{"$ref":"#/components/schemas/TranscriptEntry"},"type":"array","title":"Transcript","description":"Full chronological interview transcript."},"audio_recording_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Url","description":"Signed URL to audio recording."},"video_recording_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Url","description":"Signed URL to video recording (if enabled)."},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Tags extracted from the interview."}},"type":"object","required":["interview_id","match_score"],"title":"WebInterviewResult","description":"Complete results for the web interview (voice/video) step."},"ScorecardQuestion":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question as asked to the candidate."},"score":{"type":"integer","title":"Score","description":"Score (1-10). 1 = weak, 10 = exceptional."},"score_weight":{"type":"integer","title":"Score Weight","description":"Importance weight (1-10). Higher = more important.","default":5},"evaluation_summary":{"type":"string","title":"Evaluation Summary","description":"AI-generated summary of the candidate's response."},"evaluation_criteria":{"type":"string","title":"Evaluation Criteria","description":"Criteria used to evaluate this question."},"score_1_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 1 Description","description":"What constitutes a score of 1."},"score_5_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 5 Description","description":"What constitutes a score of 5 (midpoint anchor on 1-10 scale)."},"not_scored":{"type":"boolean","title":"Not Scored","description":"If true, this question was informational only.","default":false},"rank":{"type":"integer","title":"Rank","description":"Order in which this question was asked (1-based)."},"transcript":{"items":{"$ref":"#/components/schemas/TranscriptEntry"},"type":"array","title":"Transcript","description":"Dialogue for this specific question."}},"type":"object","required":["question_id","question_text","score","evaluation_summary","evaluation_criteria","rank"],"title":"ScorecardQuestion","description":"Evaluation result for a single scored question."},"TranscriptEntry":{"properties":{"speaker":{"type":"string","title":"Speaker","description":"Who spoke: 'Interviewer', 'Candidate', or 'System'."},"text":{"type":"string","title":"Text","description":"The spoken or written text."},"timestamp":{"type":"number","title":"Timestamp","description":"Seconds from the start of the interview."},"timestamp_str":{"type":"string","title":"Timestamp Str","description":"Human-readable timestamp (MM:SS)."}},"type":"object","required":["speaker","text","timestamp","timestamp_str"],"title":"TranscriptEntry","description":"A single turn in an interview conversation."},"ResumeResult":{"properties":{"object":{"type":"string","const":"resume_result","title":"Object","description":"Object type identifier.","default":"resume_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"overall_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Score","description":"Weighted score across all criteria (0.0-100.0)."},"is_eligible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Eligible","description":"Whether the candidate meets all eligibility criteria."},"score_criteria":{"items":{"$ref":"#/components/schemas/ResumeScoreCriterion"},"type":"array","title":"Score Criteria","description":"Individual scoring criterion results."},"eligibility_criteria":{"items":{"$ref":"#/components/schemas/ResumeEligibilityCriterion"},"type":"array","title":"Eligibility Criteria","description":"Individual eligibility criterion results."},"resume_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume Url","description":"URL to the uploaded resume."}},"type":"object","required":["interview_id"],"title":"ResumeResult","description":"Complete results for the resume screening step."},"ResumeScoreCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion as defined by the recruiter."},"score":{"type":"number","title":"Score","description":"Score (0.0-10.0)."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the score."}},"type":"object","required":["criteria_id","criteria_text","score","confidence"],"title":"ResumeScoreCriterion","description":"Evaluation of a single resume scoring criterion."},"ResumeEligibilityCriterion":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The criterion description."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate meets this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning for the pass/fail."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"ResumeEligibilityCriterion","description":"Evaluation of a single resume eligibility (pass/fail) criterion."},"SMSResult":{"properties":{"object":{"type":"string","const":"sms_result","title":"Object","description":"Object type identifier.","default":"sms_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"is_eligible":{"type":"boolean","title":"Is Eligible","description":"Overall eligibility verdict."},"confidence":{"type":"number","title":"Confidence","description":"Overall AI confidence (0.0-1.0)."},"criteria":{"items":{"$ref":"#/components/schemas/SMSCriterionResult"},"type":"array","title":"Criteria","description":"Individual criterion results."},"transcript":{"items":{"$ref":"#/components/schemas/SMSMessage"},"type":"array","title":"Transcript","description":"Full SMS conversation."},"messages_sent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Sent","description":"Total messages sent by the agent."},"messages_received":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Received","description":"Total messages received from the candidate."}},"type":"object","required":["interview_id","is_eligible","confidence"],"title":"SMSResult","description":"Complete results for the SMS screening step."},"SMSCriterionResult":{"properties":{"criteria_id":{"type":"string","title":"Criteria Id","description":"Unique criterion identifier."},"criteria_text":{"type":"string","title":"Criteria Text","description":"The question asked via SMS."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate passed this criterion."},"confidence":{"type":"number","title":"Confidence","description":"AI confidence (0.0-1.0)."},"is_dealbreaker":{"type":"boolean","title":"Is Dealbreaker","description":"Whether failing this criterion disqualifies the candidate.","default":false},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons","description":"AI reasoning."}},"type":"object","required":["criteria_id","criteria_text","passed","confidence"],"title":"SMSCriterionResult","description":"Evaluation of a single SMS screening criterion."},"SMSMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Message sender: 'agent' or 'candidate'."},"text":{"type":"string","title":"Text","description":"Message content."},"timestamp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timestamp","description":"Unix timestamp when the message was sent."}},"type":"object","required":["role","text"],"title":"SMSMessage","description":"A single message in an SMS screening conversation."},"FormResult":{"properties":{"object":{"type":"string","const":"form_result","title":"Object","description":"Object type identifier.","default":"form_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"overall_status":{"type":"string","title":"Overall Status","description":"Overall form status: 'passed', 'failed', 'pending'."},"questions":{"items":{"$ref":"#/components/schemas/FormQuestionResult"},"type":"array","title":"Questions","description":"Individual question results."}},"type":"object","required":["interview_id","overall_status"],"title":"FormResult","description":"Complete results for the form screening step."},"FormQuestionResult":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question displayed on the form."},"question_type":{"type":"string","title":"Question Type","description":"Form field type: textarea, number, multiple-choice, file-upload, slider, date."},"is_knockout":{"type":"boolean","title":"Is Knockout","description":"Whether this is a knockout (pass/fail) question."},"passed":{"type":"boolean","title":"Passed","description":"Whether the candidate's answer passed validation."},"candidate_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Answer","description":"The candidate's submitted answer."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"The expected correct answer (for knockout questions)."}},"type":"object","required":["question_id","question_text","question_type","is_knockout","passed"],"title":"FormQuestionResult","description":"Result of a single form screening question."}}}}
```

## The SingleResponse\_InterviewTemplateResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_InterviewTemplateResponse_":{"properties":{"data":{"$ref":"#/components/schemas/InterviewTemplateResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[InterviewTemplateResponse]"},"InterviewTemplateResponse":{"properties":{"object":{"type":"string","const":"interview_template","title":"Object","description":"Object type identifier.","default":"interview_template"},"id":{"type":"string","title":"Id","description":"Unique interview template identifier."},"template_code":{"type":"string","title":"Template Code","description":"Human-readable template code used for ATS integrations. Alphanumeric and dashes only, max 32 characters, unique per workspace."},"name":{"type":"string","title":"Name","description":"Human-readable template name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description of the template."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the blueprint posting whose workflow, questions, and agent configuration this template captures."},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this template is the workspace default.","default":false},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the template was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the template was last updated."}},"type":"object","required":["id","template_code","name","posting_id","created_at","updated_at"],"title":"InterviewTemplateResponse","description":"A reusable interview agent configuration.\n\nInterview templates capture a blueprint posting's full agentic\nworkflow (questions, criteria, agent settings) so it can be cloned\nonto new postings or used as the seed for new agents. Each template\nreferences its blueprint posting via ``posting_id``."}}}}
```

## The SingleResponse\_MetadataResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_MetadataResponse_":{"properties":{"data":{"$ref":"#/components/schemas/MetadataResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[MetadataResponse]"},"MetadataResponse":{"properties":{"object":{"type":"string","title":"Object","description":"Object type identifier."},"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata","description":"Key-value metadata pairs."}},"type":"object","required":["object"],"title":"MetadataResponse","description":"Response containing metadata for a resource."}}}}
```

## The SingleResponse\_PhoneNumberResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_PhoneNumberResponse_":{"properties":{"data":{"$ref":"#/components/schemas/PhoneNumberResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[PhoneNumberResponse]"},"PhoneNumberResponse":{"properties":{"object":{"type":"string","const":"phone_number","title":"Object","description":"Object type identifier.","default":"phone_number"},"id":{"type":"string","title":"Id","description":"Unique phone number configuration identifier."},"phone_number":{"type":"string","title":"Phone Number","description":"Phone number in E.164 format."},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO country code."},"active":{"type":"boolean","title":"Active","description":"Whether the phone number is active."},"date_provisioned":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Date Provisioned","description":"Unix timestamp when the number was provisioned."}},"type":"object","required":["id","phone_number","active"],"title":"PhoneNumberResponse","description":"A phone number provisioned for the workspace.\n\nPhone numbers are used by voice and SMS agents to communicate with\ncandidates. The ``id`` is referenced in posting configs as\n``phone_number_id``."}}}}
```

## The SingleResponse\_PostingResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_PostingResponse_":{"properties":{"data":{"$ref":"#/components/schemas/PostingResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[PostingResponse]"},"PostingResponse":{"properties":{"object":{"type":"string","const":"posting","title":"Object","description":"Object type identifier.","default":"posting"},"id":{"type":"string","title":"Id","description":"Unique posting identifier."},"company_id":{"type":"string","title":"Company Id","description":"ID of the company that owns this posting."},"title":{"type":"string","title":"Title","description":"Job title displayed to candidates."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"URL-friendly slug for the posting."},"description":{"type":"string","title":"Description","description":"Full job description text."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code.","default":"en"},"interviewer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interviewer Name","description":"Display name of the AI interviewer."},"status":{"type":"string","title":"Status","description":"Posting status: 'draft', 'active', 'expired', 'archived'."},"finalized":{"type":"boolean","title":"Finalized","description":"Whether the posting has been finalized/activated."},"archived":{"type":"boolean","title":"Archived","description":"Whether the posting is archived."},"test_posting":{"type":"boolean","title":"Test Posting","description":"Whether this is a test posting."},"workflow":{"items":{"$ref":"#/components/schemas/WorkflowStep"},"type":"array","title":"Workflow","description":"Ordered list of agentic workflow steps."},"urls":{"anyOf":[{"$ref":"#/components/schemas/PostingURLs"},{"type":"null"}],"description":"All URLs associated with this posting."},"deadline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Deadline","description":"Unix timestamp deadline for the posting."},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url","description":"URL candidates are redirected to after completing the interview."},"scheduling_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduling Url","description":"Calendar scheduling URL for shortlisted candidates."},"max_retakes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Retakes","description":"Maximum number of interview retakes allowed."},"allow_sms_comms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Sms Comms","description":"Whether SMS communications are enabled.","default":false},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"General instructions for the AI interviewer shared with agents."},"company_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview","description":"Overview of the company shared with agents."},"job_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview","description":"Overview of the job/role shared with agents."},"interview_process_overview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview","description":"Overview of the interview process shared with agents."},"company_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"How the AI interviewer delivers the company overview."},"job_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"How the AI interviewer delivers the job overview."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"How the AI interviewer delivers the interview process overview."},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id","description":"ID of the phone number used for outbound calls."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"ID of the sender email configuration."},"email_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Template Group Id","description":"ID of the email template group."},"design_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Template Group Id","description":"ID of the design template group."},"retake_cooldown_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retake Cooldown Days","description":"Cooldown period in days before a candidate can retake."},"email_report_to_candidate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Report To Candidate","description":"Whether to email the interview report to the candidate.","default":false},"ats_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ats Metadata","description":"ATS integration metadata for postings derived from an ATS (Import-from-ATS flow or `createPosting` with an ATS-derived `interview_template_id`). Null for postings not connected to an ATS. Common fields:\n- `source` (string): how the posting was created, e.g. `job_sync`.\n- `ats_name` (string): identifier of the ATS, e.g. `workable`, `bullhorn`.\n- `ats_job_id` (string): ID of the ATS job that backs this posting.\n- `ats_job_posting_id` (string, optional): ATS-side job-posting ID when distinct from `ats_job_id`.\n- `integration_id` (string, optional): heymilo ATS integration ID.\n- `job_ids` (string[], optional): ATS job IDs included in the mapping config.\n- `pending_activation` (bool): `true` while the agent is in the intermediate stage created by `createPosting` / `clonePosting` for ATS-derived postings. Candidate ingestion does not begin until the caller transitions out of this stage by calling `POST /postings/{posting_id}/activate`, which finalizes the posting and attaches the ATS mapping in one step.\n- `mapping_activated_at`, `mapping_activated_by` (read-only): audit fields stamped when the ATS mapping was attached.\n- `mapping_deactivated_at`, `mapping_deactivated_by` (read-only): audit fields stamped when the ATS mapping was last paused."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when the posting was created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when the posting was last updated."}},"type":"object","required":["id","company_id","title","description","status","finalized","archived","test_posting"],"title":"PostingResponse","description":"A job posting with its full agentic workflow configuration.\n\nA posting represents a complete hiring pipeline — it defines the\njob, the AI agents involved, and how candidates progress through\neach screening step."},"WorkflowStep":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for this workflow step."},"type":{"type":"string","title":"Type","description":"Agent type: 'web_interview', 'conversational_sms', 'resume', 'form'."},"order":{"type":"integer","title":"Order","description":"Position in the workflow pipeline (1-based)."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Agent-specific configuration. Shape varies by type. See GET /api/v2/schemas/agents for details."}},"type":"object","required":["type","order"],"title":"WorkflowStep","description":"A single step in a posting's agentic workflow."},"PostingURLs":{"properties":{"candidate_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Url","description":"Candidate-facing interview URL."},"ingestion_url_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingestion Url Key","description":"URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}."},"review_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Url","description":"Admin dashboard review URL."}},"type":"object","title":"PostingURLs","description":"All URLs associated with a posting."}}}}
```

## The SingleResponse\_QuestionResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_QuestionResponse_":{"properties":{"data":{"$ref":"#/components/schemas/QuestionResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[QuestionResponse]"},"QuestionResponse":{"properties":{"object":{"type":"string","const":"question","title":"Object","description":"Object type identifier.","default":"question"},"id":{"type":"string","title":"Id","description":"Unique question/criterion identifier."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this question belongs to."},"modality":{"type":"string","title":"Modality","description":"Question modality: voice, sms, form, resume_eligibility, resume_scoring, voice_tags."},"text":{"type":"string","title":"Text","description":"The question text, criterion text, or tag name."},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank","description":"Display order (1-based). Lower ranks appear first."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"Evaluation criteria for scoring."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Description of what a score of 1 means."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Description of what a score of 5 means."},"score_weight":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score Weight","description":"Importance weight for scoring (1–10)."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Whether this question is asked but not scored (voice)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Question format. For voice: 'open-ended' or 'scored'. Auto-inferred by the backend for SMS ('YES_NO', 'NUMERIC') and form ('dropdown', 'file_upload', 'slider', etc.) modalities."},"min_follow_ups":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions (voice)."},"max_follow_ups":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions (voice)."},"additional_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied post-interview."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer text (SMS yes/no)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (SMS numeric)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Whether wrong answer disqualifies (SMS)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer for knockout evaluation (form)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Whether this is a knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown option list (form)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Whether an answer is required (form)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: 'single' or 'multiple' (form). May be auto-set to 'multiple' by the backend for dropdown questions."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator: eq, neq, gt, gte, lt, lte (form). May be auto-set by the backend (e.g. 'minimum' for slider questions)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions (form file_upload)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow multiple file uploads (form)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum slider value (form)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum slider value (form)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Slider step increment (form)."},"response_format":{"anyOf":[{"type":"string","enum":["text","freeform","date","number"]},{"type":"null"}],"title":"Response Format","description":"Expected response format for voice_tags: 'text', 'freeform', 'date', or 'number'."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"structured_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Config","description":"Advanced structured configuration (voice). Opaque key-value object forwarded to the AI interviewer."},"created_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Created At","description":"Unix timestamp when created."},"updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Updated At","description":"Unix timestamp when last updated."}},"type":"object","required":["id","posting_id","modality","text"],"title":"QuestionResponse","description":"A question or criterion belonging to a posting.\n\nThe ``modality`` field indicates the question type (voice, sms, form,\nresume_eligibility, resume_scoring, voice_tags). Fields that are not\napplicable to a given modality will be ``null``."}}}}
```

## The SingleResponse\_SenderEmailResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_SenderEmailResponse_":{"properties":{"data":{"$ref":"#/components/schemas/SenderEmailResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[SenderEmailResponse]"},"SenderEmailResponse":{"properties":{"object":{"type":"string","const":"sender_email","title":"Object","description":"Object type identifier.","default":"sender_email"},"id":{"type":"string","title":"Id","description":"Unique sender email identifier."},"email_prefix":{"type":"string","title":"Email Prefix","description":"Local part of the email address (before @)."},"domain":{"type":"string","title":"Domain","description":"Email domain."},"full_email":{"type":"string","title":"Full Email","description":"Complete email address."},"domain_id":{"type":"string","title":"Domain Id","description":"ID of the associated email domain."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the sender email was created."}},"type":"object","required":["id","email_prefix","domain","full_email","domain_id","created_at"],"title":"SenderEmailResponse","description":"A sender email address configured for the workspace.\n\nSender emails are used for candidate communications (invitations,\nnudges, reports). The ``id`` is referenced in posting configs as\n``sender_email_id``."}}}}
```

## The SingleResponse\_VoiceResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_VoiceResponse_":{"properties":{"data":{"$ref":"#/components/schemas/VoiceResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[VoiceResponse]"},"VoiceResponse":{"properties":{"object":{"type":"string","const":"voice","title":"Object","description":"Object type identifier.","default":"voice"},"id":{"type":"string","title":"Id","description":"Registry voice ID (wrv-prefixed)."},"provider":{"type":"string","title":"Provider","description":"Voice provider: 'elevenlabs', 'cartesia', or 'lmnt'."},"provider_voice_id":{"type":"string","title":"Provider Voice Id","description":"Provider-specific voice identifier."},"name":{"type":"string","title":"Name","description":"Human-readable voice name."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code."},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO country code."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender","description":"Voice gender: 'male', 'female', or 'neutral'."},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url","description":"URL to an audio preview of the voice."},"labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels","description":"Provider-defined labels (e.g. accent, age, style)."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the voice was added to the registry."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the voice was last updated."}},"type":"object","required":["id","provider","provider_voice_id","name","created_at","updated_at"],"title":"VoiceResponse","description":"A voice from the workspace voice registry.\n\nVoices are added from external providers (ElevenLabs, Cartesia, LMNT)\nand stored in the workspace registry. The ``id`` (prefixed ``wrv-``)\nis used in posting configs as ``voice_id``."}}}}
```

## The SingleResponse\_WebhookResponse\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_WebhookResponse_":{"properties":{"data":{"$ref":"#/components/schemas/WebhookResponse"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[WebhookResponse]"},"WebhookResponse":{"properties":{"object":{"type":"string","const":"webhook","title":"Object","description":"Object type identifier.","default":"webhook"},"webhook_id":{"type":"string","title":"Webhook Id","description":"Unique webhook identifier."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this webhook is for."},"url":{"type":"string","title":"Url","description":"Destination URL for the webhook."},"event_type":{"type":"string","title":"Event Type","description":"Type of event that triggers the webhook."},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the webhook is active."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the webhook was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the webhook was last updated."}},"type":"object","required":["webhook_id","posting_id","url","event_type","is_active","created_at","updated_at"],"title":"WebhookResponse","description":"A webhook configuration."}}}}
```

## The SingleResponse\_list\_BulkIngestCandidateResponseItem\_\_ object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"SingleResponse_list_BulkIngestCandidateResponseItem__":{"properties":{"data":{"items":{"$ref":"#/components/schemas/BulkIngestCandidateResponseItem"},"type":"array","title":"Data"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Optional metadata. Shape varies by endpoint."}},"type":"object","required":["data"],"title":"SingleResponse[list[BulkIngestCandidateResponseItem]]"},"BulkIngestCandidateResponseItem":{"properties":{"object":{"type":"string","const":"candidate","title":"Object","description":"Object type identifier.","default":"candidate"},"interview_id":{"type":"string","title":"Interview Id","description":"Unique interview identifier for this candidate-posting pair."},"interview_url":{"type":"string","title":"Interview Url","description":"URL the candidate uses to access the interview."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars."}},"type":"object","required":["interview_id","interview_url"],"title":"BulkIngestCandidateResponseItem","description":"A single item in the bulk ingest response."}}}}
```

## The TranscriptEntry object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"TranscriptEntry":{"properties":{"speaker":{"type":"string","title":"Speaker","description":"Who spoke: 'Interviewer', 'Candidate', or 'System'."},"text":{"type":"string","title":"Text","description":"The spoken or written text."},"timestamp":{"type":"number","title":"Timestamp","description":"Seconds from the start of the interview."},"timestamp_str":{"type":"string","title":"Timestamp Str","description":"Human-readable timestamp (MM:SS)."}},"type":"object","required":["speaker","text","timestamp","timestamp_str"],"title":"TranscriptEntry","description":"A single turn in an interview conversation."}}}}
```

## The UpdatePostingRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"UpdatePostingRequest":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":3},{"type":"null"}],"title":"Title","description":"Updated job title."},"description":{"anyOf":[{"type":"string","maxLength":50000,"minLength":10},{"type":"null"}],"title":"Description","description":"Updated job description."},"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name","description":"Updated URL slug."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Updated default language (BCP-47)."},"interviewer_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Interviewer Name","description":"Updated AI interviewer display name."},"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Updated global instructions for the AI interviewer."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Updated company overview."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Updated job overview."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Updated process overview shared with agents."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Updated company overview delivery mode."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Updated job overview delivery mode."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Updated interview process overview delivery mode."},"phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number Id","description":"Updated phone number ID."},"sender_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email Id","description":"Updated sender email ID."},"email_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Template Group Id","description":"Updated email template group ID."},"design_template_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Template Group Id","description":"Updated design template group ID."},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url","description":"Updated post-completion redirect URL."},"scheduling_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduling Url","description":"Updated scheduling URL for shortlisted candidates."},"deadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deadline","description":"Updated ISO 8601 deadline."},"allow_sms_comms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Sms Comms","description":"Updated SMS communications flag."},"max_retakes":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Max Retakes","description":"Updated max retake attempts (0-5)."},"retake_cooldown_days":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Retake Cooldown Days","description":"Updated retake cooldown in days."},"email_report_to_candidate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Report To Candidate","description":"Updated email report flag."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Updated key-value metadata. Replaces existing metadata entirely. Up to 50 keys, each key max 40 chars, each value max 500 chars."}},"type":"object","title":"UpdatePostingRequest","description":"Request body for updating a posting. All fields are optional."}}}}
```

## The UpdateQuestionRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"UpdateQuestionRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Updated question text."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"Updated evaluation criteria."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Updated score-1 description."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Updated score-5 description."},"score_weight":{"anyOf":[{"type":"integer","maximum":10,"minimum":1},{"type":"null"}],"title":"Score Weight","description":"Updated importance weight for scoring (1–10)."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Updated not-scored flag."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Updated question format."},"min_follow_ups":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Updated min follow-ups."},"max_follow_ups":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Updated max follow-ups."},"additional_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Instructions","description":"Updated instructions."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Updated post-processing criteria."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Updated expected answer."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Updated expected value."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Updated dealbreaker flag."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Updated expected answer (form)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Updated knockout flag."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Updated dropdown options."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Updated require-answer flag."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Updated MCQ type."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Updated operator."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Updated file types."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Updated multiple files flag."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Updated slider min."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Updated slider max."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Updated slider step."},"response_format":{"anyOf":[{"type":"string","enum":["text","freeform","date","number"]},{"type":"null"}],"title":"Response Format","description":"Updated response format: 'text', 'freeform', 'date', or 'number'."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Updated instructions."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Updated options."},"structured_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Config","description":"Updated advanced structured configuration (voice)."}},"type":"object","title":"UpdateQuestionRequest","description":"Request body for updating a question.\n\nOnly provided fields are modified; omitted fields remain unchanged."}}}}
```

## The UpdateWorkflowStepRequest object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"UpdateWorkflowStepRequest":{"properties":{"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Partial step config. Allowed keys depend on the step's agent type (see the matching step config in the create request). Nested objects are replaced as a whole. Unknown keys return 400."}},"type":"object","required":["config"],"title":"UpdateWorkflowStepRequest","description":"Partial update of a workflow step's config."}}}}
```

## The ValidationError object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
```

## The VoiceResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"VoiceResponse":{"properties":{"object":{"type":"string","const":"voice","title":"Object","description":"Object type identifier.","default":"voice"},"id":{"type":"string","title":"Id","description":"Registry voice ID (wrv-prefixed)."},"provider":{"type":"string","title":"Provider","description":"Voice provider: 'elevenlabs', 'cartesia', or 'lmnt'."},"provider_voice_id":{"type":"string","title":"Provider Voice Id","description":"Provider-specific voice identifier."},"name":{"type":"string","title":"Name","description":"Human-readable voice name."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code."},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code","description":"ISO country code."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender","description":"Voice gender: 'male', 'female', or 'neutral'."},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url","description":"URL to an audio preview of the voice."},"labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels","description":"Provider-defined labels (e.g. accent, age, style)."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the voice was added to the registry."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the voice was last updated."}},"type":"object","required":["id","provider","provider_voice_id","name","created_at","updated_at"],"title":"VoiceResponse","description":"A voice from the workspace voice registry.\n\nVoices are added from external providers (ElevenLabs, Cartesia, LMNT)\nand stored in the workspace registry. The ``id`` (prefixed ``wrv-``)\nis used in posting configs as ``voice_id``."}}}}
```

## The WebInterviewConfig object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"WebInterviewConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"video":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Video","description":"Enable video during interview (default: audio-only)."},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"Voice ID for AI interviewer. Use GET /api/v2/voices to list available voices."},"phone_calls_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Phone Calls Enabled","description":"Allow outbound phone call interviews (requires phone_number_id)."},"interview_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Type","description":"Interview focus: general, technical, cultural, behavioral."},"num_questions":{"anyOf":[{"type":"integer","maximum":25,"minimum":1},{"type":"null"}],"title":"Num Questions","description":"Number of questions (ignored if questions provided)."},"min_evaluation_score":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Min Evaluation Score","description":"Minimum normalized score (0.0-1.0) to pass this stage."},"prompt_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Version","description":"Prompt version: v1 or v2 (latest)."},"is_multilingual":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Multilingual","description":"Auto-detect candidate language and respond in kind."},"cheat_detection_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cheat Detection Config","description":"Cheat detection settings: {enabled: bool, threshold: int 0-100, types: ['tab_switching','ai_scripted_answer','multiple_people','multiple_speakers','phone_detection','unusual_delays','facial_behaviour']}"},"web_interview_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Web Interview Config","description":"Advanced interview UI config: {show_transcript, candidate_presence_enabled, min_duration_seconds, max_duration_seconds, backdrop_image_url, avatar_image_url, intro_message, outro_message, remove_heymilo_branding}"}},"type":"object","title":"WebInterviewConfig","description":"Config for the web_interview agent."}}}}
```

## The WebInterviewResult object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"WebInterviewResult":{"properties":{"object":{"type":"string","const":"web_interview_result","title":"Object","description":"Object type identifier.","default":"web_interview_result"},"interview_id":{"type":"string","title":"Interview Id","description":"Interview this result belongs to."},"match_score":{"type":"integer","title":"Match Score","description":"Overall match score (0-100)."},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights","description":"Candidate strengths identified by AI."},"lowlights":{"items":{"type":"string"},"type":"array","title":"Lowlights","description":"Areas for improvement."},"scorecard":{"items":{"$ref":"#/components/schemas/ScorecardQuestion"},"type":"array","title":"Scorecard","description":"Question-by-question evaluation."},"speech_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Speech Score","description":"Communication/speech score (0.0-5.0)."},"transcript":{"items":{"$ref":"#/components/schemas/TranscriptEntry"},"type":"array","title":"Transcript","description":"Full chronological interview transcript."},"audio_recording_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Recording Url","description":"Signed URL to audio recording."},"video_recording_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Recording Url","description":"Signed URL to video recording (if enabled)."},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Tags extracted from the interview."}},"type":"object","required":["interview_id","match_score"],"title":"WebInterviewResult","description":"Complete results for the web interview (voice/video) step."},"ScorecardQuestion":{"properties":{"question_id":{"type":"string","title":"Question Id","description":"Unique question identifier."},"question_text":{"type":"string","title":"Question Text","description":"The question as asked to the candidate."},"score":{"type":"integer","title":"Score","description":"Score (1-10). 1 = weak, 10 = exceptional."},"score_weight":{"type":"integer","title":"Score Weight","description":"Importance weight (1-10). Higher = more important.","default":5},"evaluation_summary":{"type":"string","title":"Evaluation Summary","description":"AI-generated summary of the candidate's response."},"evaluation_criteria":{"type":"string","title":"Evaluation Criteria","description":"Criteria used to evaluate this question."},"score_1_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 1 Description","description":"What constitutes a score of 1."},"score_5_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score 5 Description","description":"What constitutes a score of 5 (midpoint anchor on 1-10 scale)."},"not_scored":{"type":"boolean","title":"Not Scored","description":"If true, this question was informational only.","default":false},"rank":{"type":"integer","title":"Rank","description":"Order in which this question was asked (1-based)."},"transcript":{"items":{"$ref":"#/components/schemas/TranscriptEntry"},"type":"array","title":"Transcript","description":"Dialogue for this specific question."}},"type":"object","required":["question_id","question_text","score","evaluation_summary","evaluation_criteria","rank"],"title":"ScorecardQuestion","description":"Evaluation result for a single scored question."},"TranscriptEntry":{"properties":{"speaker":{"type":"string","title":"Speaker","description":"Who spoke: 'Interviewer', 'Candidate', or 'System'."},"text":{"type":"string","title":"Text","description":"The spoken or written text."},"timestamp":{"type":"number","title":"Timestamp","description":"Seconds from the start of the interview."},"timestamp_str":{"type":"string","title":"Timestamp Str","description":"Human-readable timestamp (MM:SS)."}},"type":"object","required":["speaker","text","timestamp","timestamp_str"],"title":"TranscriptEntry","description":"A single turn in an interview conversation."}}}}
```

## The WebhookResponse object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"WebhookResponse":{"properties":{"object":{"type":"string","const":"webhook","title":"Object","description":"Object type identifier.","default":"webhook"},"webhook_id":{"type":"string","title":"Webhook Id","description":"Unique webhook identifier."},"posting_id":{"type":"string","title":"Posting Id","description":"ID of the posting this webhook is for."},"url":{"type":"string","title":"Url","description":"Destination URL for the webhook."},"event_type":{"type":"string","title":"Event Type","description":"Type of event that triggers the webhook."},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the webhook is active."},"created_at":{"type":"number","title":"Created At","description":"Unix timestamp when the webhook was created."},"updated_at":{"type":"number","title":"Updated At","description":"Unix timestamp when the webhook was last updated."}},"type":"object","required":["webhook_id","posting_id","url","event_type","is_active","created_at","updated_at"],"title":"WebhookResponse","description":"A webhook configuration."}}}}
```

## The WorkflowStep object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"WorkflowStep":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier for this workflow step."},"type":{"type":"string","title":"Type","description":"Agent type: 'web_interview', 'conversational_sms', 'resume', 'form'."},"order":{"type":"integer","title":"Order","description":"Position in the workflow pipeline (1-based)."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Agent-specific configuration. Shape varies by type. See GET /api/v2/schemas/agents for details."}},"type":"object","required":["type","order"],"title":"WorkflowStep","description":"A single step in a posting's agentic workflow."}}}}
```

## The WorkflowStepStatus object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"WorkflowStepStatus":{"properties":{"step_id":{"type":"string","title":"Step Id","description":"Workflow step identifier."},"order":{"type":"integer","title":"Order","description":"Position in the workflow (1-based)."},"status":{"type":"string","title":"Status","description":"Step status: 'not_started', 'in_progress', 'completed', 'knocked_out'."},"started":{"type":"boolean","title":"Started","description":"Whether the candidate has started this step."},"completed":{"type":"boolean","title":"Completed","description":"Whether the candidate has completed this step."},"knocked_out":{"type":"boolean","title":"Knocked Out","description":"Whether the candidate was disqualified at this step.","default":false},"last_updated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Updated At","description":"Unix timestamp of the last status change."}},"type":"object","required":["step_id","order","status","started","completed"],"title":"WorkflowStepStatus","description":"Status of a single workflow step for a candidate."}}}}
```

## The \_ConversationalSMSStep object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"_ConversationalSMSStep":{"properties":{"type":{"type":"string","const":"conversational_sms","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/ConversationalSMSConfig"},{"type":"null"}],"description":"SMS screening agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Criteria for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_ConversationalSMSStep","description":"Workflow step for conversational_sms agent."},"ConversationalSMSConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-disqualify candidates who fail dealbreaker criteria."},"num_questions":{"anyOf":[{"type":"integer","maximum":10,"minimum":1},{"type":"null"}],"title":"Num Questions","description":"Number of SMS criteria (ignored if criteria provided)."},"intro_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Intro Message","description":"Custom intro message. Supports {{candidate_name}} and {{job_title}} variables."},"disqualification_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Disqualification Message","description":"Message sent when candidate fails a dealbreaker."},"follow_up_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Follow Up Message","description":"Custom follow-up/nudge message."},"hop_on_call_message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Hop On Call Message","description":"Message for phone/video call invitation."},"cooldown_period_hrs":{"anyOf":[{"type":"integer","maximum":168,"minimum":1},{"type":"null"}],"title":"Cooldown Period Hrs","description":"Hours to wait before sending a follow-up nudge."},"max_nudge_amount":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Nudge Amount","description":"Maximum number of follow-up nudges."},"blackout_period":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Blackout Period","description":"No-message window: {enabled: bool, timezone: str (IANA), start_hour: 0-23, end_hour: 1-24}"}},"type":"object","title":"ConversationalSMSConfig","description":"Config for the conversational_sms agent."},"CreateQuestion":{"properties":{"modality":{"type":"string","title":"Modality","description":"Question modality: voice, resume_eligibility, resume_scoring, form, sms, voice_tags."},"text":{"type":"string","title":"Text","description":"Question text or criterion text."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"How to evaluate (voice, resume_scoring)."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Score-1 description (voice, resume_scoring)."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Score-5 description (voice, resume_scoring)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Format: open-ended|scored, textarea|dropdown, YES_NO|NUMERIC."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Ask but don't score (voice)."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer (sms)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (sms)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Disqualify on wrong answer (sms)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer (form knockout)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown options (form)."},"response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Format","description":"Response format: text|number|date|freeform (voice_tags)."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"score_weight":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Score Weight","description":"Importance weighting for this question's score (0-5). Higher = more important. Must be a whole number. Applies to voice, sms, resume_eligibility, resume_scoring."},"min_follow_ups":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions the AI must ask (voice only)."},"max_follow_ups":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions the AI may ask (voice only)."},"additional_instructions":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer (voice only)."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied against the full transcript after the interview (voice only)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: single or multiple (form only)."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator for number/date questions: eq, neq, gt, gte, lt, lte (form only)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions for file_upload questions (form only)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow uploading multiple files (form only)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum value for slider questions (form only)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum value for slider questions (form only)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Step increment for slider questions (form only)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Require an answer to this question (form only)."}},"type":"object","required":["modality","text"],"title":"CreateQuestion","description":"A question or criterion for a workflow step."}}}}
```

## The \_FormStep object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"_FormStep":{"properties":{"type":{"type":"string","const":"form","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/FormConfig"},{"type":"null"}],"description":"Form screening agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Questions for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_FormStep","description":"Workflow step for form screening agent."},"FormConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-disqualify on knockout question failure."}},"type":"object","title":"FormConfig","description":"Config for the form screening agent."},"CreateQuestion":{"properties":{"modality":{"type":"string","title":"Modality","description":"Question modality: voice, resume_eligibility, resume_scoring, form, sms, voice_tags."},"text":{"type":"string","title":"Text","description":"Question text or criterion text."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"How to evaluate (voice, resume_scoring)."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Score-1 description (voice, resume_scoring)."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Score-5 description (voice, resume_scoring)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Format: open-ended|scored, textarea|dropdown, YES_NO|NUMERIC."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Ask but don't score (voice)."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer (sms)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (sms)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Disqualify on wrong answer (sms)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer (form knockout)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown options (form)."},"response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Format","description":"Response format: text|number|date|freeform (voice_tags)."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"score_weight":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Score Weight","description":"Importance weighting for this question's score (0-5). Higher = more important. Must be a whole number. Applies to voice, sms, resume_eligibility, resume_scoring."},"min_follow_ups":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions the AI must ask (voice only)."},"max_follow_ups":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions the AI may ask (voice only)."},"additional_instructions":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer (voice only)."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied against the full transcript after the interview (voice only)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: single or multiple (form only)."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator for number/date questions: eq, neq, gt, gte, lt, lte (form only)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions for file_upload questions (form only)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow uploading multiple files (form only)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum value for slider questions (form only)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum value for slider questions (form only)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Step increment for slider questions (form only)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Require an answer to this question (form only)."}},"type":"object","required":["modality","text"],"title":"CreateQuestion","description":"A question or criterion for a workflow step."}}}}
```

## The \_ResumeStep object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"_ResumeStep":{"properties":{"type":{"type":"string","const":"resume","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/ResumeConfig"},{"type":"null"}],"description":"Resume screening agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Criteria for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_ResumeStep","description":"Workflow step for resume screening agent."},"ResumeConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"knockout_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Knockout Enabled","description":"Auto-reject candidates failing eligibility criteria."},"min_evaluation_score":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Min Evaluation Score","description":"Minimum normalized score on scoring criteria."},"mandatory":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mandatory","description":"Require resume upload to proceed."},"num_eligibility_questions":{"anyOf":[{"type":"integer","maximum":15,"minimum":0},{"type":"null"}],"title":"Num Eligibility Questions","description":"Number of pass/fail eligibility criteria."},"num_criteria_questions":{"anyOf":[{"type":"integer","maximum":15,"minimum":0},{"type":"null"}],"title":"Num Criteria Questions","description":"Number of scored criteria."}},"type":"object","title":"ResumeConfig","description":"Config for the resume screening agent."},"CreateQuestion":{"properties":{"modality":{"type":"string","title":"Modality","description":"Question modality: voice, resume_eligibility, resume_scoring, form, sms, voice_tags."},"text":{"type":"string","title":"Text","description":"Question text or criterion text."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"How to evaluate (voice, resume_scoring)."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Score-1 description (voice, resume_scoring)."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Score-5 description (voice, resume_scoring)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Format: open-ended|scored, textarea|dropdown, YES_NO|NUMERIC."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Ask but don't score (voice)."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer (sms)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (sms)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Disqualify on wrong answer (sms)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer (form knockout)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown options (form)."},"response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Format","description":"Response format: text|number|date|freeform (voice_tags)."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"score_weight":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Score Weight","description":"Importance weighting for this question's score (0-5). Higher = more important. Must be a whole number. Applies to voice, sms, resume_eligibility, resume_scoring."},"min_follow_ups":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions the AI must ask (voice only)."},"max_follow_ups":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions the AI may ask (voice only)."},"additional_instructions":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer (voice only)."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied against the full transcript after the interview (voice only)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: single or multiple (form only)."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator for number/date questions: eq, neq, gt, gte, lt, lte (form only)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions for file_upload questions (form only)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow uploading multiple files (form only)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum value for slider questions (form only)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum value for slider questions (form only)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Step increment for slider questions (form only)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Require an answer to this question (form only)."}},"type":"object","required":["modality","text"],"title":"CreateQuestion","description":"A question or criterion for a workflow step."}}}}
```

## The \_WebInterviewStep object

```json
{"openapi":"3.1.0","info":{"title":"HeyMilo Public API","version":"2.0.0"},"components":{"schemas":{"_WebInterviewStep":{"properties":{"type":{"type":"string","const":"web_interview","title":"Type","description":"Agent type."},"config":{"anyOf":[{"$ref":"#/components/schemas/WebInterviewConfig"},{"type":"null"}],"description":"Web interview agent configuration."},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/CreateQuestion"},"type":"array"},{"type":"null"}],"title":"Questions","description":"Questions for this step. If omitted, AI auto-generates."}},"type":"object","required":["type"],"title":"_WebInterviewStep","description":"Workflow step for web_interview agent."},"WebInterviewConfig":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Instructions","description":"Per-step override for AI interviewer instructions. Falls back to the posting-level 'instructions' when omitted."},"company_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Company Overview","description":"Per-step override for company overview. Falls back to the posting-level 'company_overview' when omitted."},"job_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Job Overview","description":"Per-step override for job overview. Falls back to the posting-level 'job_overview' when omitted."},"interview_process_overview":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"Interview Process Overview","description":"Per-step override for interview process overview. Falls back to the posting-level 'interview_process_overview' when omitted."},"company_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Company Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the company overview. Falls back to the posting-level value when omitted."},"job_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Job Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the job overview. Falls back to the posting-level value when omitted."},"interview_process_overview_delivery_mode":{"anyOf":[{"type":"string","enum":["exact_delivery","summarized_delivery","reference_only","silent_reference"]},{"type":"null"}],"title":"Interview Process Overview Delivery Mode","description":"Per-step override for how the AI interviewer delivers the interview process overview. Falls back to the posting-level value when omitted."},"video":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Video","description":"Enable video during interview (default: audio-only)."},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id","description":"Voice ID for AI interviewer. Use GET /api/v2/voices to list available voices."},"phone_calls_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Phone Calls Enabled","description":"Allow outbound phone call interviews (requires phone_number_id)."},"interview_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interview Type","description":"Interview focus: general, technical, cultural, behavioral."},"num_questions":{"anyOf":[{"type":"integer","maximum":25,"minimum":1},{"type":"null"}],"title":"Num Questions","description":"Number of questions (ignored if questions provided)."},"min_evaluation_score":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Min Evaluation Score","description":"Minimum normalized score (0.0-1.0) to pass this stage."},"prompt_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Version","description":"Prompt version: v1 or v2 (latest)."},"is_multilingual":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Multilingual","description":"Auto-detect candidate language and respond in kind."},"cheat_detection_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cheat Detection Config","description":"Cheat detection settings: {enabled: bool, threshold: int 0-100, types: ['tab_switching','ai_scripted_answer','multiple_people','multiple_speakers','phone_detection','unusual_delays','facial_behaviour']}"},"web_interview_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Web Interview Config","description":"Advanced interview UI config: {show_transcript, candidate_presence_enabled, min_duration_seconds, max_duration_seconds, backdrop_image_url, avatar_image_url, intro_message, outro_message, remove_heymilo_branding}"}},"type":"object","title":"WebInterviewConfig","description":"Config for the web_interview agent."},"CreateQuestion":{"properties":{"modality":{"type":"string","title":"Modality","description":"Question modality: voice, resume_eligibility, resume_scoring, form, sms, voice_tags."},"text":{"type":"string","title":"Text","description":"Question text or criterion text."},"evaluation_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Criteria","description":"How to evaluate (voice, resume_scoring)."},"score_of_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 1","description":"Score-1 description (voice, resume_scoring)."},"score_of_5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Of 5","description":"Score-5 description (voice, resume_scoring)."},"question_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question Type","description":"Format: open-ended|scored, textarea|dropdown, YES_NO|NUMERIC."},"not_scored":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Not Scored","description":"Ask but don't score (voice)."},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer","description":"Expected answer (sms)."},"expected_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Value","description":"Expected numeric value (sms)."},"is_dealbreaker":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Dealbreaker","description":"Disqualify on wrong answer (sms)."},"answer":{"anyOf":[{},{"type":"null"}],"title":"Answer","description":"Expected answer (form knockout)."},"is_knockout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Knockout","description":"Knockout question (form)."},"dropdown_values":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Dropdown Values","description":"Dropdown options (form)."},"response_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Format","description":"Response format: text|number|date|freeform (voice_tags)."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Extraction instructions (voice_tags)."},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options","description":"Allowed options (voice_tags)."},"score_weight":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Score Weight","description":"Importance weighting for this question's score (0-5). Higher = more important. Must be a whole number. Applies to voice, sms, resume_eligibility, resume_scoring."},"min_follow_ups":{"anyOf":[{"type":"integer","maximum":5,"minimum":0},{"type":"null"}],"title":"Min Follow Ups","description":"Minimum follow-up questions the AI must ask (voice only)."},"max_follow_ups":{"anyOf":[{"type":"integer","maximum":10,"minimum":0},{"type":"null"}],"title":"Max Follow Ups","description":"Maximum follow-up questions the AI may ask (voice only)."},"additional_instructions":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Additional Instructions","description":"Per-question instructions for the AI interviewer (voice only)."},"post_processing_evaluation_criteria":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Post Processing Evaluation Criteria","description":"Evaluation criteria applied against the full transcript after the interview (voice only)."},"mcq_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcq Type","description":"Multiple-choice type: single or multiple (form only)."},"operator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator","description":"Validation operator for number/date questions: eq, neq, gt, gte, lt, lte (form only)."},"file_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Types","description":"Allowed file extensions for file_upload questions (form only)."},"allow_multiple_files":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Multiple Files","description":"Allow uploading multiple files (form only)."},"slider_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Min","description":"Minimum value for slider questions (form only)."},"slider_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Max","description":"Maximum value for slider questions (form only)."},"slider_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slider Step","description":"Step increment for slider questions (form only)."},"is_answer_mandated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Answer Mandated","description":"Require an answer to this question (form only)."}},"type":"object","required":["modality","text"],"title":"CreateQuestion","description":"A question or criterion for a workflow step."}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.admin.heymilo.ai/api-next-gen/reference/models.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
