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

# Partially update the interview config

> GET/POST/PATCH /jobs/{job_id}/interview-config (one config per job).

POST creates the config for the job in the URL path; the body carries only
config fields. A 409 is returned if the job already has one. PATCH updates
the existing config (404 if absent).



## OpenAPI

````yaml /swagger/v2_schema.yaml patch /jobs/{job_id}/interview-config
openapi: 3.0.3
info:
  title: TalentUnveiled API v2
  version: 2.0.0
  description: >-
    Public API v2 for managing jobs, applications, interviews, and webhooks.


    **Pagination:** list endpoints return a `{count, next, previous, results}`
    envelope. Page with the `limit` and `offset` query parameters; `limit`
    defaults to 50 and is capped at 200.
servers:
  - url: https://api.talentunveiled.com/api/v2
    description: Production server
security: []
tags:
  - name: Meta
    description: Identify the organization an API key belongs to.
  - name: Jobs
    description: Create, read, update, and archive job postings.
  - name: Applications
    description: Create applications and track them through the pipeline.
  - name: Interview Configuration
    description: The interview config and call schedule for a job.
  - name: Interview Criteria
    description: Evaluation criteria for a job's interview.
  - name: Interview Questions
    description: Questions asked during a job's interview.
  - name: Interview Results
    description: The scored interview result for an application.
  - name: Interview Calls
    description: Call attempts, scheduling, and transcripts.
  - name: CV Evaluations
    description: AI scoring of a candidate's CV against the job.
  - name: Insights
    description: Combined CV and interview insights for an application.
  - name: Webhooks
    description: Manage webhook subscriptions and inspect deliveries.
  - name: Hiring Team
    description: Manage the hiring team assigned to a job posting.
  - name: Members
    description: List the members of the organization.
paths:
  /jobs/{job_id}/interview-config:
    patch:
      tags:
        - Interview Configuration
      summary: Partially update the interview config
      description: >-
        GET/POST/PATCH /jobs/{job_id}/interview-config (one config per job).


        POST creates the config for the job in the URL path; the body carries
        only

        config fields. A 409 is returned if the job already has one. PATCH
        updates

        the existing config (404 if absent).
      operationId: jobs_interview_config_partial_update
      parameters:
        - in: path
          name: job_id
          schema:
            type: string
            format: uuid
          required: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedInterviewConfigWriteRequest'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InterviewConfigRead'
          description: ''
        '400':
          description: Invalid input.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Authentication credentials were not provided or are invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: The requested resource does not exist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKeyAuth: []
components:
  schemas:
    PatchedInterviewConfigWriteRequest:
      type: object
      description: >-
        Write shape for ``POST``/``PATCH /jobs/{job_id}/interview-config``.


        The field list is PINNED rather than inherited: the company serializer
        is free to grow, and

        every field it gains must be a deliberate public-API decision instead of
        appearing here on

        its own. DRF silently drops a field missing from this list rather than
        complaining, so the

        pin is enforced by ``test_write_serializer_field_set_is_pinned``.
      properties:
        mode:
          allOf:
            - $ref: '#/components/schemas/InterviewModeEnum'
          description: >-
            Interview mode: web call, or phone call to the applicant. Cannot
            change once the job has interview sessions (409); the organization
            default config stays changeable. Omitted on create: defaults to the
            applied template's mode, else the organization default.


            * `web` - Web

            * `phone` - Phone
        max_retakes:
          type: integer
          maximum: 2147483647
          minimum: 0
          description: >-
            Maximum number of retakes allowed for the interview. 0 means no
            retakes allowed. In web mode candidates can start a retake
            themselves from the candidate portal; in phone mode a retake can
            only be triggered via the retake API endpoints and places a new
            outbound call.
        require_camera:
          type: boolean
          description: >-
            [Web only] Whether the candidate is required to have a camera for
            the interview.
        prompt_intro:
          type: string
          description: >-
            Script for the voice assistant to say at the beginning of the
            interview.
        prompt_outro:
          type: string
          description: Script for the voice assistant to say at the end of the interview.
        prompt_additional_instructions:
          type: string
          description: >-
            Additional instructions given to the voice assistant that guide its
            behavior during the interview.
        organization_name_override:
          type: string
          description: >-
            Override name of the organization used by the voice assistant. If
            not set, the organization name is used.
          maxLength: 100
        schedule_meeting:
          type: boolean
          description: >-
            When enabled, candidates schedule a meeting with a human interviewer
            within the AI interview.
        template_id:
          type: string
          format: uuid
          writeOnly: true
          nullable: true
          description: >-
            Template to apply: copies its config values and generation prompts
            onto the config (later template edits never affect it); null
            detaches and resets the managed fields (on create, null simply means
            no template). Cannot be combined with mode (400), except null on
            create. Never starts generation - use the auto-setup endpoint.
    InterviewConfigRead:
      type: object
      description: >-
        Read shape for ``GET /jobs/{job_id}/interview-config``.


        Adds the read-only ``resolved_*`` org-default fallback fields plus

        ``criteria_count``/``question_count``/``schedule`` that the company
        config

        serializer does not expose. ``job_id`` mirrors the job from the URL/FK.


        The ``resolved_`` prefix marks the effective value after org-default

        fallback, distinguishing it from the raw writable field it shadows

        (``resolved_prompt_intro`` vs ``prompt_intro``); dropping the prefix

        would collide with those fields.
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        job_id:
          type: string
          format: uuid
          readOnly: true
        mode:
          allOf:
            - $ref: '#/components/schemas/InterviewModeEnum'
          readOnly: true
          description: >-
            Mode of the interview. WEB: The interview will be conducted through
            a web interface where applicants have a web call. PHONE:
            TalentUnveiled will call the applicant's phone number and conduct
            the interview over the phone. Can no longer be changed once the job
            has interview sessions (a 409 is returned); the organization default
            config stays changeable.


            * `web` - Web

            * `phone` - Phone
        mode_locked:
          type: boolean
          readOnly: true
          description: >-
            Whether the interview mode is locked. True once the job has
            interview sessions; changing mode then returns a 409.
        max_retakes:
          type: integer
          readOnly: true
          description: >-
            Maximum number of retakes allowed for the interview. 0 means no
            retakes allowed. In web mode candidates can start a retake
            themselves from the candidate portal; in phone mode a retake can
            only be triggered via the retake API endpoints and places a new
            outbound call.
        require_camera:
          type: boolean
          readOnly: true
          description: >-
            [Web only] Whether the candidate is required to have a camera for
            the interview.
        prompt_intro:
          type: string
          readOnly: true
          description: >-
            Script for the voice assistant to say at the beginning of the
            interview.
        prompt_outro:
          type: string
          readOnly: true
          description: Script for the voice assistant to say at the end of the interview.
        prompt_additional_instructions:
          type: string
          readOnly: true
          description: >-
            Additional instructions given to the voice assistant that guide its
            behavior during the interview.
        organization_name_override:
          type: string
          readOnly: true
          description: >-
            Override name of the organization used by the voice assistant. If
            not set, the organization name is used.
        resolved_interviewer_name:
          type: string
          readOnly: true
          description: Interviewer name after org-default fallback.
        resolved_organization_name:
          type: string
          readOnly: true
          description: Organization display name after override/org-default fallback.
        resolved_prompt_intro:
          type: string
          readOnly: true
          description: Interview intro prompt after org-default fallback.
        estimated_duration_minutes:
          type: integer
          readOnly: true
        schedule:
          allOf:
            - $ref: '#/components/schemas/InterviewScheduleConfig'
          readOnly: true
        criteria_count:
          type: integer
          readOnly: true
        question_count:
          type: integer
          readOnly: true
        template_id:
          type: string
          format: uuid
          readOnly: true
          nullable: true
          description: >-
            Interview template this config was set up from; null when none is
            applied.
        template_source:
          allOf:
            - $ref: '#/components/schemas/TemplateSourceEnum'
          readOnly: true
          description: >-
            How the template was assigned: manually picked by a recruiter,
            auto-selected by AI for an automatically created job, or none.


            * `none` - None

            * `manual` - Manual

            * `auto` - Auto
        template_name_snapshot:
          type: string
          readOnly: true
          description: >-
            Name of the applied template at apply time. Survives template rename
            and deletion. Populated only while a template is applied; empty
            otherwise.
        created_at:
          type: string
          format: date-time
          readOnly: true
      required:
        - created_at
        - criteria_count
        - estimated_duration_minutes
        - id
        - job_id
        - max_retakes
        - mode
        - mode_locked
        - organization_name_override
        - prompt_additional_instructions
        - prompt_intro
        - prompt_outro
        - question_count
        - require_camera
        - resolved_interviewer_name
        - resolved_organization_name
        - resolved_prompt_intro
        - schedule
        - template_id
        - template_name_snapshot
        - template_source
    ErrorResponse:
      type: array
      description: List of errors
      items:
        $ref: '#/components/schemas/ErrorItem'
    InterviewModeEnum:
      enum:
        - web
        - phone
      type: string
      description: |-
        * `web` - Web
        * `phone` - Phone
    InterviewScheduleConfig:
      type: object
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
        created_at:
          type: string
          format: date-time
          readOnly: true
        updated_at:
          type: string
          format: date-time
          readOnly: true
        enabled:
          type: boolean
          description: >-
            Whether interview scheduling is enabled. When enabled, application
            creation requires scheduled_at and the interview starts at that slot
            instead of immediately; applications created without a slot
            (recruiter invite, ATS sync) are not auto-started. When disabled,
            the interview starts directly.
        scheduling_horizon_days:
          type: integer
          maximum: 2147483647
          minimum: 0
          description: >-
            [Scheduling enabled only] Number of days in the future that
            candidates can schedule their interviews.
        available_weekdays:
          type: array
          items:
            $ref: '#/components/schemas/WeekdayEnum'
          description: >-
            [Scheduling enabled only] Weekdays when candidates can schedule
            interviews. At least one is required when enabled=true.
        start_time:
          type: string
          format: time
          description: >-
            [Scheduling enabled only] Daily start time for interview scheduling
            (e.g., 08:00). Timezone is determined by the applicant's phone
            number area code.
        end_time:
          type: string
          format: time
          description: >-
            [Scheduling enabled only] Daily end time for interview scheduling
            (e.g., 19:00). Timezone is determined by the applicant's phone
            number area code.
        minimum_notice_hours:
          type: integer
          maximum: 2147483647
          minimum: 0
          nullable: true
          description: >-
            [Scheduling enabled only] Minimum number of hours of notice required
            for candidates to schedule an interview.
      required:
        - created_at
        - id
        - updated_at
    TemplateSourceEnum:
      enum:
        - none
        - manual
        - auto
      type: string
      description: |-
        * `none` - None
        * `manual` - Manual
        * `auto` - Auto
    ErrorItem:
      type: object
      description: Individual error item
      properties:
        code:
          allOf:
            - $ref: '#/components/schemas/ErrorCodeEnum'
          description: Machine-readable error code
        detail:
          type: string
          description: Human-readable error message
        attr:
          type: string
          nullable: true
          description: Field name this error relates to (for validation errors)
      required:
        - code
        - detail
    WeekdayEnum:
      enum:
        - monday
        - tuesday
        - wednesday
        - thursday
        - friday
        - saturday
        - sunday
      type: string
      description: |-
        * `monday` - Monday
        * `tuesday` - Tuesday
        * `wednesday` - Wednesday
        * `thursday` - Thursday
        * `friday` - Friday
        * `saturday` - Saturday
        * `sunday` - Sunday
    ErrorCodeEnum:
      type: string
      enum:
        - error
        - invalid_input
        - parse_error
        - authentication_failed
        - not_authenticated
        - permission_denied
        - not_found
        - method_not_allowed
        - not_acceptable
        - unsupported_media_type
        - throttled
        - required
        - does_not_exist
        - incorrect_type
        - no_match
        - incorrect_match
        - not_a_list
        - not_a_dict
        - empty
        - candidate_user_mismatch
        - candidate_not_found
        - cross_organization_application
        - already_exists
        - call_service_error
        - call_not_joinable
        - call_config_error
        - call_access_denied
        - call_already_linked
        - date_range_too_large
        - date_range_start_after_end
        - invalid_date
        - language_not_configured
        - vapi_api_error
        - webhook_processing_error
        - proxy_error
        - configuration_error
        - interview_call_already_processed
        - call_type_switch_error
        - slot_in_past
        - interview_not_scheduled
        - interview_opt_out_not_eligible
        - interview_retry_not_allowed
        - retake_limit_reached
        - interview_session_not_joinable
        - interview_session_retake_not_eligible
        - interview_session_already_processing
        - interview_session_not_completed
        - interview_session_reset_not_allowed
        - interview_mode_locked
        - application_already_exists
        - gateway_verification_failed
        - invalid_file_type
        - file_too_large
        - cv_already_exists
        - cv_required
        - custom_fields_too_large
        - nylas_grant_already_exists
        - nylas_upstream_error
        - otp_challenge_not_found
        - job_posting_not_found
        - job_application_not_found
        - workflow_execution_error
        - llm_generation_failed
        - report_generation_failed
        - interview_config_has_no_criteria
        - scheduling_not_enabled
        - interview_session_not_reschedulable
        - interview_version_mismatch
        - v3_job_missing_config
        - idempotency_key_conflict
        - idempotency_key_invalid
        - application_status_transition_invalid
        - application_state_conflict
        - external_id_conflict
        - qualification_cannot_have_score
        - competency_requires_bars
      description: Machine-readable error code
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      description: >-
        API key authentication for the public API. Pass your API key as a Bearer
        token.

````