> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interviewflowai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update Interviewer API

> Partially update an existing Interviewer's configuration programmatically.

Use this endpoint to update an Interviewer that belongs to your Company. Include only the fields you want to change; omitted fields remain unchanged.

<Info>
  All external API endpoints require a Pro plan. Requests from accounts without API access return `403 Forbidden`.
</Info>

## Endpoint

```http theme={null}
PUT https://api.interviewflowai.com/api/external/ingest/job/{jobId}
```

All requests must include your API key.

```http theme={null}
X-API-KEY: your_api_key_here
Content-Type: application/json
```

<Note>
  **Rate limit:** 5 requests per minute per API key. This limit is shared with the [Create Interviewer API](/platform/api-integration/create-interviewer-api). Requests over the limit return `429 Too Many Requests`.
</Note>

<ParamField path="jobId" type="string" required>
  The UUID of the Interviewer to update.
</ParamField>

## Request body

The body must contain at least one supported field. Unknown fields are rejected.

All fields are optional, but you must provide at least one.

<ParamField body="title" type="string">
  Interviewer title. Must contain 1–255 characters.
</ParamField>

<ParamField body="role" type="string">
  Interviewer role. Must contain 1–255 characters.
</ParamField>

<ParamField body="jobDescription" type="string">
  Interviewer description. Must contain 1–50,000 characters.
</ParamField>

<ParamField body="instructions" type="string">
  Instructions for conducting the interview.
</ParamField>

<ParamField body="interviewMode" type="string">
  `web_call`, `phone_only`, or `both`.
</ParamField>

<ParamField body="videoRequired" type="boolean">
  Whether video is required.
</ParamField>

<ParamField body="resumeRequired" type="boolean">
  Whether a resume is required.
</ParamField>

<ParamField body="desktopOnly" type="boolean">
  Whether Candidates must use a desktop device.
</ParamField>

<ParamField body="portfolioRequired" type="boolean">
  Whether a portfolio is required.
</ParamField>

<ParamField body="viewStatus" type="string">
  `public` or `private`.
</ParamField>

<ParamField body="showToJobSeekers" type="boolean">
  Whether the Interviewer appears to Candidates.
</ParamField>

<ParamField body="isArchived" type="boolean">
  Whether the Interviewer is archived.
</ParamField>

<ParamField body="interviewLanguage" type="string">
  `english`, `hindi`, `spanish`, `french`, `chinese`, `german`, `italian`, `japanese`, `korean`, `portuguese`, `dutch`, `ukrainian`, `malay`, `indonesian`, `arabic`, or `vietnamese`.
</ParamField>

<ParamField body="experienceMin" type="number">
  Minimum experience in years. Must be at least `0`.
</ParamField>

<ParamField body="experienceMax" type="number">
  Maximum experience in years. Must be at least `0`.
</ParamField>

<ParamField body="jobType" type="string">
  `full-time`, `part-time`, `contract`, or `intern`.
</ParamField>

<ParamField body="locationType" type="string">
  `remote`, `onsite`, or `hybrid`.
</ParamField>

<ParamField body="country" type="string">
  Country. Maximum 255 characters.
</ParamField>

<ParamField body="city" type="string">
  City. Maximum 255 characters.
</ParamField>

<ParamField body="zipcode" type="string">
  Postal code. Maximum 20 characters.
</ParamField>

<ParamField body="context" type="string">
  Additional Interviewer context. Maximum 5,000 characters and 200 words. Required when enabling `candidateQuestioning`.
</ParamField>

<ParamField body="candidateQuestioning" type="boolean">
  Whether the Candidate can ask questions during the interview.
</ParamField>

<ParamField body="candidateOptOutEnabled" type="boolean">
  Whether the Candidate can opt out.
</ParamField>

<ParamField body="introVideoUrl" type="string">
  Introduction video URL. Maximum 500 characters. Send `""` to clear it.
</ParamField>

<ParamField body="completionRedirectUrl" type="string">
  Completion redirect URL. Maximum 2,048 characters. Send `""` to clear it.
</ParamField>

<ParamField body="linkExpirationDays" type="number">
  Interview link validity in days. Minimum `1` and maximum `365`.
</ParamField>

<ParamField body="interviewDuration" type="number">
  Interview duration in minutes. Minimum `10` and maximum `60`.
</ParamField>

<ParamField body="introductionMessage" type="string">
  Introduction message. Must contain 1–1,000 characters.
</ParamField>

<ParamField body="iceBreaker" type="string">
  Ice breaker message. Maximum 500 characters.
</ParamField>

<ParamField body="closingMessage" type="string">
  Closing message. Must contain 1–500 characters.
</ParamField>

<ParamField body="retakesAllowed" type="number">
  Number of allowed retakes. Minimum `0` and maximum `3`.
</ParamField>

<ParamField body="tags" type="object[]">
  Up to 25 tag definitions.
</ParamField>

<ParamField body="customQuestions" type="object[]">
  Replacement custom interview questions.
</ParamField>

<ParamField body="customQuestionConfig" type="object">
  Manual, resume, and skills question configuration.
</ParamField>

<ParamField body="screeningQuestions" type="object[]">
  Replacement application screening questions.
</ParamField>

<ParamField body="postInterviewQuestions" type="object[]">
  Replacement post-interview questions.
</ParamField>

<ParamField body="teamCompletionAlert" type="object">
  Team completion email configuration.
</ParamField>

<ParamField body="teamOptOutAlert" type="object">
  Team email alert when a Candidate opts out. Same shape as `teamCompletionAlert`.
</ParamField>

<ParamField body="coordinatorSchedulingLink" type="string">
  Scheduling link sent to Candidates after the interview. Maximum 2,048 characters. Send `""` to clear it.
</ParamField>

<ParamField body="coordinatorPassScore" type="number | null">
  Minimum score (0–100) a Candidate needs to receive the scheduling link, or `null`.
</ParamField>

<ParamField body="coordinatorDelayHours" type="number">
  Hours to wait before sending the scheduling link. Minimum `0` and maximum `720`.
</ParamField>

<ParamField body="sendCandidateEmailOnInterviewCompletion" type="boolean">
  Whether to email the Candidate after completion.
</ParamField>

<ParamField body="sendCandidateBasicReportOnInterviewCompletion" type="boolean">
  Whether to include the basic report in that email.
</ParamField>

<ParamField body="rejectionEmail" type="object">
  Automated rejection email configuration.
</ParamField>

<ParamField body="customSummaryConfig" type="object">
  Custom report summary configuration.
</ParamField>

If `locationType` is `onsite` or `hybrid`, the final Interviewer configuration must include `country`, `city`, and `zipcode`. Setting it to `remote` clears those location fields.

### Tags

Each `tags` item requires:

| Field | Type | Validation |
| - | - | - |
| `label` | string | 1–100 characters. |
| `options` | string\[] | Up to 20 options; each option is 1–100 characters. |

### Custom questions

Each `customQuestions` item requires `question` and `evaluationCriteria`. `generationSource` is optional.

| Field | Type | Validation |
| - | - | - |
| `question` | string | Non-empty question text. |
| `generationSource` | string | `manual`, `skills`, or `resume`. |
| `evaluationCriteria.lookingFor` | string | Required, non-empty. |
| `evaluationCriteria.strongAnswer` | string | Required, non-empty. |
| `evaluationCriteria.weakAnswer` | string | Required, non-empty. |
| `evaluationCriteria.weight` | number | Required, from 1–10. |
| `evaluationCriteria.maxFollowup` | number | Required, from 0–2. |
| `evaluationCriteria.maxDuration` | number | Optional, from 0.5–10 minutes. |

### Question configuration

`customQuestionConfig` accepts:

| Field | Type | Validation |
| - | - | - |
| `sectionOrder` | string\[] | 1–3 unique section names: `manual`, `resume`, or `skills`. |
| `manual.enabled` | boolean | Enables manual questions. |
| `resume.enabled` | boolean | Enables resume-generated questions. |
| `resume.generationInstructions` | string | Up to 4,000 characters. |
| `resume.maxQuestions` | number | From 1–10. |
| `resume.maxDuration` | number | From 0.5–10 minutes per question. |
| `skills.enabled` | boolean | Enables skills-generated questions. |
| `skills.maxQuestions` | number | From 1–10. |
| `skills.maxDuration` | number | From 0.5–10 minutes per question. |
| `skills.allowedSkills` | array | Up to 50 skill strings or `{ "name", "instructions" }` objects. |
| `skills.flexibleSkills` | boolean | Allows skills outside the configured list. |

### Screening and post-interview questions

Each `screeningQuestions` item accepts `id`, `question`, `type`, `idealAnswerType`, `expectedAnswer`, `expectedAnswerMax`, `isRequired`, and `mustHaveQualification`. The required fields are `question`, `type`, `expectedAnswer`, and `isRequired`. `type` must be `yesno`, `numeric`, or `text`; `idealAnswerType` must be `min`, `max`, `range`, or `exact`.

Each `postInterviewQuestions` item requires `question` and optionally accepts `id`. Question text must be 1–200 characters.

### Notifications and reports

| Field | Shape |
| - | - |
| `teamCompletionAlert`, `teamOptOutAlert` | `{ "isEnabled": boolean, "email": string \| null }`; both fields are required and a valid email is required when enabled. |
| `rejectionEmail` | `{ "isEnabled": boolean, "time": number }`; `time` must be from 0–720 hours. |
| `customSummaryConfig` | `{ "enabled": boolean, "fields": [{ "key": string, "description": string }] }`; both properties are required and up to five fields are allowed. Keys are 1–80 characters and descriptions are 1–1,000 characters. |

## Example request

```bash theme={null}
curl -X PUT "https://api.interviewflowai.com/api/external/ingest/job/423e37f0-b96d-4a5e-a226-b3b99dffe614" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: your_api_key_here" \
  -d '{
    "title": "Senior Account Executive",
    "interviewDuration": 20,
    "linkExpirationDays": 14,
    "teamCompletionAlert": {
      "isEnabled": true,
      "email": "hiring@example.com"
    }
  }'
```

## Response

Successful updates return `200 OK` with the complete updated Interviewer in `data`.

```json theme={null}
{
  "data": {
    "id": "423e37f0-b96d-4a5e-a226-b3b99dffe614",
    "title": "Senior Account Executive",
    "interviewDuration": 20,
    "linkExpirationDays": 14
  },
  "code": 200,
  "message": "Job updated successfully"
}
```

## Errors

| Condition | Status |
| - | - |
| Invalid `jobId`, empty body, unsupported field, or invalid value | `400 Bad Request` |
| Missing or invalid API key | `401 Unauthorized` |
| Plan does not include API access | `403 Forbidden` |
| Interviewer does not exist or belongs to another Company | `404 Not Found` |
| Rate limit exceeded | `429 Too Many Requests` |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.