# Resume (Optional) to Voice Agent (Sales Rep)

> **Use case**: Sales hiring where you want to screen resumes when available, but don't want to block candidates who don't have a polished resume. Many great salespeople come from non-traditional backgrounds — this workflow lets them skip straight to the voice interview if they prefer, while still giving you resume insights when provided.

## What You'll Build

A two-stage hiring pipeline with an optional first stage:

1. **Resume Screening (Optional)** — AI analyzes the candidate's resume if provided. Unlike a required resume screen, candidates who skip this step still advance to the voice interview. You get bonus signal when a resume is available, but no one is blocked.
2. **Voice Interview (Video)** — Every candidate completes a video interview focused on sales skills, deal execution, and motivation. The AI scores communication, persuasion, and role fit.

***

## Step 1: Create the Agent

Create a posting with a two-step `workflow`. The key difference from the Software Engineer guide is setting `"optional": true` on the resume step so candidates are not required to upload a resume.

```bash
curl -X POST "https://api.heymilo.network/api/v4/postings" \
  -H "X-API-KEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Sales Representative - Mid Market",
    "description": "We are hiring Mid Market Sales Representatives to drive new business. 2+ years of B2B sales experience preferred but not required — we value hustle and coachability over pedigree. You will own the full sales cycle from prospecting to close for accounts in the $50K-$500K ARR range. OTE $120K-$180K with uncapped commissions.",
    "interviewer_name": "Rachel",
    "language": "en",
    "company_overview": "CloudMetrics is a fast-growing analytics platform helping mid-market companies make data-driven decisions. 200+ customers, $40M ARR, and growing 100% YoY.",
    "job_overview": "Own the full sales cycle for mid-market accounts. Prospect, demo, negotiate, and close deals in the $50K-$500K ARR range.",
    "workflow": [
      {
        "type": "resume",
        "config": {
          "optional": true
        },
        "questions": [
          {
            "modality": "resume_eligibility",
            "text": "Has B2B sales experience (any duration)"
          },
          {
            "modality": "resume_scoring",
            "text": "Track record of meeting or exceeding sales quota",
            "weight": 3.0
          },
          {
            "modality": "resume_scoring",
            "text": "Experience selling SaaS or technology products",
            "weight": 2.0
          },
          {
            "modality": "resume_scoring",
            "text": "Experience with mid-market or enterprise sales cycles",
            "weight": 2.0
          },
          {
            "modality": "resume_scoring",
            "text": "Familiarity with CRM tools (Salesforce, HubSpot, etc.)",
            "weight": 1.0
          }
        ]
      },
      {
        "type": "web_interview",
        "config": {
          "video": true,
          "num_questions": 5
        },
        "questions": [
          {
            "modality": "voice",
            "text": "Walk me through a deal you closed that you are most proud of. What was the deal size, who was involved, and what made it successful?",
            "evaluation_criteria": "Assess deal execution skills, ability to navigate complex sales cycles, and results orientation. Look for specifics: deal size, timeline, stakeholders, and the candidate's exact contribution.",
            "score_of_1": "Cannot describe a specific deal or gives vague generalities about selling.",
            "score_of_5": "Provides a detailed, compelling deal narrative with clear metrics, multi-threading across stakeholders, and a creative approach to overcoming objections.",
            "question_type": "open-ended",
            "score_weight": 3.0,
            "min_follow_ups": 1,
            "max_follow_ups": 2
          },
          {
            "modality": "voice",
            "text": "Imagine I am a VP of Analytics at a 500-person company. Give me your 60-second pitch on why I should consider CloudMetrics.",
            "evaluation_criteria": "Evaluate the candidate's ability to pitch on the spot. Look for a value-driven (not feature-driven) pitch that addresses business outcomes, competitive differentiation, and a clear call to action.",
            "score_of_1": "Rambling, feature-focused, or unable to articulate value. No structure.",
            "score_of_5": "Crisp, confident pitch that leads with business value, includes a relevant proof point, and ends with a clear next step.",
            "question_type": "open-ended",
            "score_weight": 3.0,
            "min_follow_ups": 1,
            "max_follow_ups": 2
          },
          {
            "modality": "voice",
            "text": "Tell me about a time you lost a deal. What happened, and what did you learn from it?",
            "evaluation_criteria": "Assess self-awareness, resilience, and ability to learn from failure. Strong candidates own the loss rather than blaming external factors.",
            "score_of_1": "Blames the loss entirely on external factors or cannot recall a specific example.",
            "score_of_5": "Owns the loss, provides honest self-reflection, and describes concrete changes made to their process as a result.",
            "question_type": "open-ended",
            "score_weight": 2.0,
            "min_follow_ups": 1,
            "max_follow_ups": 1
          },
          {
            "modality": "voice",
            "text": "How do you build pipeline? Walk me through your typical prospecting workflow in a given week.",
            "evaluation_criteria": "Evaluate prospecting methodology and discipline. Look for a structured approach that includes multiple channels (cold call, email, social, referrals) and clear activity metrics.",
            "score_of_1": "No clear process, relies solely on inbound leads, or cannot articulate prospecting habits.",
            "score_of_5": "Describes a disciplined, multi-channel prospecting system with specific daily/weekly activity targets and creative outreach strategies.",
            "question_type": "open-ended",
            "score_weight": 2.5,
            "min_follow_ups": 1,
            "max_follow_ups": 1
          },
          {
            "modality": "voice",
            "text": "Why are you interested in selling an analytics product? What excites you about this space?",
            "evaluation_criteria": "Assess genuine interest in the product space and company fit. Look for curiosity about data/analytics and understanding of why it matters to businesses.",
            "score_of_1": "Generic answer that could apply to any company. No interest in the analytics space.",
            "score_of_5": "Shows genuine curiosity about analytics, articulates why data-driven companies win, and connects it to their own career goals.",
            "question_type": "open-ended",
            "score_weight": 1.5,
            "min_follow_ups": 0,
            "max_follow_ups": 1
          }
        ]
      }
    ]
  }'
```

**Response:**

```json
{
  "object": "posting",
  "data": {
    "object": "posting",
    "id": "D9E0F1A2",
    "status": "active",
    "urls": {
      "candidate_url": "https://candidates.heymilo.io/cloudmetrics/sales-representative",
      "ingestion_url_key": "qS4tU6vW8xY0zA2bC4dE6fG8hI0jK2lM4nO6pQ",
      "review_url": "https://admin.heymilo.ai/w/WORKSPACE_ID/lab2/D9E0F1A2/1-details"
    },
    "created_at": 1739612400.0,
    "posting": { ... }
  }
}
```

{% hint style="info" %}
**Optional vs. required resume screening**: When `"optional": true` is set on the resume step, candidates who skip the resume upload proceed directly to the voice interview. You'll still see resume results for candidates who do upload one, giving you bonus signal without creating friction for candidates who don't have a polished resume handy.
{% endhint %}

***

## Step 2: Manage Questions After Creation

### List all voice interview questions

```bash
curl -X GET "https://api.heymilo.network/api/v4/postings/D9E0F1A2/questions?modality=voice" \
  -H "X-API-KEY: your_api_key_here"
```

### List resume scoring criteria

```bash
curl -X GET "https://api.heymilo.network/api/v4/postings/D9E0F1A2/questions?modality=resume_scoring" \
  -H "X-API-KEY: your_api_key_here"
```

### Add a new interview question

Maybe after a few interviews, you realize you want to ask about objection handling:

```bash
curl -X POST "https://api.heymilo.network/api/v4/postings/D9E0F1A2/questions" \
  -H "X-API-KEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "modality": "voice",
    "text": "What is the toughest objection you regularly face in sales, and how do you handle it?",
    "evaluation_criteria": "Assess objection handling skills. Look for a repeatable framework, not just a one-off example.",
    "score_of_1": "No clear approach to handling objections.",
    "score_of_5": "Describes a structured objection handling framework with a specific, compelling example.",
    "question_type": "open-ended",
    "score_weight": 2.0,
    "min_follow_ups": 1,
    "max_follow_ups": 1
  }'
```

### Update the pitch question to mention a competitor

```bash
curl -X PATCH "https://api.heymilo.network/api/v4/postings/D9E0F1A2/questions/{question_id}" \
  -H "X-API-KEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Imagine I am a VP of Analytics currently using Tableau. Give me your 60-second pitch on why I should switch to CloudMetrics."
  }'
```

### Reorder voice questions

Put the pitch question first so candidates lead with energy:

```bash
curl -X POST "https://api.heymilo.network/api/v4/postings/D9E0F1A2/questions/reorder" \
  -H "X-API-KEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "modality": "voice",
    "question_ids": ["Q002", "Q001", "Q004", "Q003", "Q005"]
  }'
```

***

## Step 3: Ingest Candidates

### Single candidate (with resume)

```bash
curl -X POST "https://api.heymilo.network/api/v4/postings/D9E0F1A2/candidates" \
  -H "X-API-KEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Marcus Johnson",
    "email": "marcus.j@email.com",
    "phone_number": "+12125559876",
    "metadata": {
      "source": "linkedin",
      "current_company": "Salesforce",
      "current_title": "Account Executive"
    }
  }'
```

### Single candidate (no resume expected)

For candidates from a job fair or cold outreach who may not have a resume ready:

```bash
curl -X POST "https://api.heymilo.network/api/v4/postings/D9E0F1A2/candidates" \
  -H "X-API-KEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Aisha Williams",
    "email": "aisha.w@email.com",
    "phone_number": "+13105557654",
    "metadata": {
      "source": "job_fair",
      "notes": "Great energy, bartending background, looking to break into tech sales"
    }
  }'
```

Both candidates receive the same interview link. Marcus may upload his resume for bonus points; Aisha can skip straight to the voice interview with Rachel.

**Response (same for both):**

```json
{
  "object": "candidate",
  "data": {
    "object": "candidate",
    "interview_id": "A1B2C3D4E5F6A7B8",
    "interview_url": "https://candidates.heymilo.io/cloudmetrics/i/A1B2C3D4E5F6A7B8",
    "posting_id": "D9E0F1A2"
  }
}
```

### Bulk ingest

```bash
curl -X POST "https://api.heymilo.network/api/v4/postings/D9E0F1A2/candidates/bulk" \
  -H "X-API-KEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "data": [
      {"name": "David Kim", "email": "d.kim@email.com", "phone_number": "+14155551111", "metadata": {"source": "greenhouse"}},
      {"name": "Emma Rodriguez", "email": "e.rod@email.com", "phone_number": "+14155552222", "metadata": {"source": "referral"}},
      {"name": "Chris Taylor", "email": "c.taylor@email.com", "phone_number": "+14155553333", "metadata": {"source": "indeed"}}
    ]
  }'
```

***

## Step 4: See Results

### List all candidates

```bash
curl -X GET "https://api.heymilo.network/api/v4/postings/D9E0F1A2/candidates" \
  -H "X-API-KEY: your_api_key_here"
```

### Full results — candidate WITH resume

```bash
curl -X GET "https://api.heymilo.network/api/v4/interviews/A1B2C3D4E5F6A7B8/data" \
  -H "X-API-KEY: your_api_key_here"
```

**Response (Marcus — uploaded resume + completed interview):**

```json
{
  "object": "interview_data",
  "data": {
    "object": "interview_data",
    "interview_id": "A1B2C3D4E5F6A7B8",
    "posting_id": "D9E0F1A2",
    "name": "Marcus Johnson",
    "email": "marcus.j@email.com",
    "score": 88.0,
    "status": "completed",
    "workflow": {
      "steps": [
        {"id": "resume", "order": 1, "status": "complete", "started": true, "completed": true},
        {"id": "web_interview", "order": 2, "status": "complete", "started": true, "completed": true}
      ],
      "all_complete": true
    },
    "resume": {
      "object": "resume_result",
      "interview_id": "A1B2C3D4E5F6A7B8",
      "overall_score": 4.5,
      "is_eligible": true,
      "eligibility_criteria": [
        {
          "criteria_id": "rec_001",
          "criteria_text": "Has B2B sales experience (any duration)",
          "passed": true,
          "confidence": 0.97,
          "reasons": ["4 years as Account Executive at Salesforce selling to enterprise accounts"]
        }
      ],
      "score_criteria": [
        {
          "criteria_id": "rsc_001",
          "criteria_text": "Track record of meeting or exceeding sales quota",
          "score": 4.8,
          "confidence": 0.92,
          "reasons": ["Resume states 140% quota attainment in 2025, President's Club winner"]
        },
        {
          "criteria_id": "rsc_002",
          "criteria_text": "Experience selling SaaS or technology products",
          "score": 5.0,
          "confidence": 0.98,
          "reasons": ["4 years selling Salesforce CRM to mid-market and enterprise"]
        },
        {
          "criteria_id": "rsc_003",
          "criteria_text": "Experience with mid-market or enterprise sales cycles",
          "score": 4.2,
          "confidence": 0.90,
          "reasons": ["Managed deals in the $100K-$500K range with 3-6 month sales cycles"]
        },
        {
          "criteria_id": "rsc_004",
          "criteria_text": "Familiarity with CRM tools",
          "score": 5.0,
          "confidence": 0.99,
          "reasons": ["Salesforce power user, also experienced with Outreach and Gong"]
        }
      ],
      "resume_url": "https://cdn.heymilo.io/resumes/A1B2C3D4.pdf"
    },
    "web_interview": {
      "object": "web_interview_result",
      "interview_id": "A1B2C3D4E5F6A7B8",
      "match_score": 88,
      "highlights": [
        "Exceptional pitch delivery — confident, value-driven, with a strong close",
        "Strong deal narrative with specific metrics and multi-threading strategy"
      ],
      "lowlights": [
        "Prospecting workflow relies heavily on SDR-generated pipeline"
      ],
      "speech_score": 92.0,
      "scorecard": [
        {
          "question_id": "Q001",
          "question": "Walk me through a deal you closed that you are most proud of...",
          "evaluation_score": 5,
          "evaluation_summary": "Described a $350K deal with a Fortune 500 company. Navigated 6 stakeholders, overcame a last-minute competitor threat by arranging an executive alignment call. Closed in 4 months.",
          "score_weight": 3.0,
          "rank": 1
        },
        {
          "question_id": "Q002",
          "question": "Give me your 60-second pitch on CloudMetrics...",
          "evaluation_score": 5,
          "evaluation_summary": "Led with a pain point (data silos costing the business), positioned CloudMetrics as the unified solution, referenced a customer proof point, and closed with a clear next step.",
          "score_weight": 3.0,
          "rank": 2
        }
      ],
      "video_recording_url": "https://cdn.heymilo.io/recordings/A1B2C3D4.mp4",
      "audio_recording_url": "https://cdn.heymilo.io/recordings/A1B2C3D4.mp3",
      "tags": ["strong-closer", "enterprise-experience", "polished-communicator"]
    }
  }
}
```

### Full results — candidate WITHOUT resume

**Response (Aisha — skipped resume, completed interview):**

```json
{
  "object": "interview_data",
  "data": {
    "object": "interview_data",
    "interview_id": "B2C3D4E5F6A7B8C9",
    "posting_id": "D9E0F1A2",
    "name": "Aisha Williams",
    "email": "aisha.w@email.com",
    "score": 76.0,
    "status": "completed",
    "workflow": {
      "steps": [
        {"id": "resume", "order": 1, "status": "skipped", "started": false, "completed": false},
        {"id": "web_interview", "order": 2, "status": "complete", "started": true, "completed": true}
      ],
      "all_complete": true
    },
    "resume": null,
    "web_interview": {
      "object": "web_interview_result",
      "interview_id": "B2C3D4E5F6A7B8C9",
      "match_score": 76,
      "highlights": [
        "Natural storyteller with high energy and confidence",
        "Creative prospecting ideas from non-traditional background"
      ],
      "lowlights": [
        "No B2B sales experience — will need SaaS sales training",
        "Unfamiliar with CRM tooling"
      ],
      "speech_score": 90.0,
      "scorecard": [
        {
          "question_id": "Q001",
          "question": "Walk me through a deal you closed...",
          "evaluation_score": 3,
          "evaluation_summary": "No B2B deal experience, but described convincing a high-profile client to book their venue for a corporate event — showed natural selling instincts and persistence.",
          "score_weight": 3.0,
          "rank": 1
        },
        {
          "question_id": "Q002",
          "question": "Give me your 60-second pitch on CloudMetrics...",
          "evaluation_score": 4,
          "evaluation_summary": "Surprisingly strong pitch for someone without SaaS experience. Led with a relatable pain point, showed she researched the product, and had a natural conversational delivery.",
          "score_weight": 3.0,
          "rank": 2
        }
      ],
      "video_recording_url": "https://cdn.heymilo.io/recordings/B2C3D4E5.mp4",
      "audio_recording_url": "https://cdn.heymilo.io/recordings/B2C3D4E5.mp3",
      "tags": ["high-energy", "coachable", "non-traditional-background"]
    }
  }
}
```

{% hint style="success" %}
**Notice the difference**: Marcus has both `resume` and `web_interview` results, while Aisha has `resume: null` because she skipped the optional resume step. Both candidates were evaluated fairly on their voice interview performance. This is exactly why optional resume screening works well for sales roles — you don't miss out on high-potential candidates like Aisha who have great interpersonal skills but non-traditional backgrounds.
{% endhint %}

***

## Summary

| Step              | Endpoint                                            | What Happens                                          |
| ----------------- | --------------------------------------------------- | ----------------------------------------------------- |
| Create agent      | `POST /v4/postings`                                 | Two-stage pipeline: optional resume + video interview |
| Manage questions  | `GET/POST/PATCH/DELETE /v4/postings/{id}/questions` | Edit criteria and interview questions at any time     |
| Reorder questions | `POST /v4/postings/{id}/questions/reorder`          | Change the interview question sequence                |
| Ingest candidate  | `POST /v4/postings/{id}/candidates`                 | Candidate gets an interview link                      |
| Resume screen     | *(optional, automatic)*                             | AI scores resume if uploaded; skips if not            |
| Voice interview   | *(automatic)*                                       | Rachel interviews every candidate on video            |
| Get results       | `GET /v4/interviews/{id}/data`                      | Resume analysis (if available) + voice scorecard      |
| Webhook           | `POST /v4/webhooks`                                 | Real-time notification when interview completes       |


---

# 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/guides/resume-optional-to-voice-agent.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.
