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

# Get a candidate

> One candidate as the admin's candidate page shows it: profile, applications with their steps, stand-alone interview results, tags, counts and the duplicate flag; with include, also notes, duplicates, document requests, tasks and segments. Applications to positions hidden from you (position access) are left out; a candidate hidden from you is not found. Recorded in the audit log as a view of the candidate.



## OpenAPI

````yaml https://cool.jobmojito.com/functions/v1/openapi get /merchant-candidate-get
openapi: 3.1.0
info:
  title: JobMojito API
  version: 1.0.0
  description: >-
    Public API for JobMojito, served by Supabase Edge Functions. Authenticate
    with a Supabase JWT access token via the Authorization header.
servers:
  - url: https://cool.jobmojito.com/functions/v1
    description: Production
security: []
tags:
  - name: Interviews
    description: >-
      Create, configure and manage interview / coaching / assessment
      definitions.
  - name: Positions
    description: >-
      A position's hiring process: its steps and their settings, meeting slots,
      and copies of positions and interviews.
  - name: Coaching catalogue
    description: >-
      Directories (pages) of the coaching portal catalogue that group coaching
      sessions and carry custom content pages.
  - name: Results
    description: >-
      Interview results, transcripts, reports, re-attempt requests and
      analytics.
  - name: Reports
    description: >-
      Custom reports: read the catalogue of datasets, build a report definition,
      check it, save it and run it.
  - name: Candidates
    description: List and manage candidates.
  - name: Tasks
    description: >-
      Follow-up tasks for the hiring team, about a candidate, an application or
      a position.
  - name: Document requests
    description: >-
      Ask candidates for documents (certificates, IDs, references), follow them
      up and mark them reviewed.
  - name: Knowledge base
    description: Upload documents used to generate knowledge-base interviews.
  - name: Resume & Form verification
    description: Pre-screen candidates from resumes and forms.
  - name: Admin
    description: >-
      Account administration — invite team/coaching users, manage sub-merchants
      and avatar templates.
  - name: Feedback
    description: >-
      Send feature requests to the product team and report technical issues to
      support.
  - name: Integrations
    description: >-
      Ready-made connectors and how their fields map to JobMojito. A company
      sees the same tables under Integrations > Catalogue > Field mapping.


      ### ATS connector (Kombo)


      The applicant tracking system is connected through Kombo's unified ATS
      API. JobMojito keeps a copy of the ATS jobs, applications and candidates,
      links each position to one ATS job, invites applicants who reach the
      trigger stage, and writes the outcome back. Links, notes and attachments
      are written only when the company switched them on
      (merchant.kombo_selected_result_actions); job fields are not copied into
      the position.


      | JobMojito field | Direction | External field | Notes |

      | --- | --- | --- | --- |

      | `merchant.kombo_integration_id, merchant.kombo_integration_tool` | Into
      JobMojito | `integration-created / integration-deleted webhook: data.id,
      data.tool` | Set when the ATS connection is created and cleared when it is
      deleted. |

      | `kombo_jobs.id, kombo_jobs.name` | Into JobMojito | `GET /ats/jobs: id,
      name (fallback title)` | Copied on every full or incremental sync of the
      jobs. |

      | `kombo_jobs.status` | Into JobMojito | `jobs.status,
      jobs.remote_deleted_at` | DRAFT becomes draft, CLOSED or ARCHIVED becomes
      archived, deleted in the ATS becomes deleted. |

      | `kombo_jobs.data` | Into JobMojito | `jobs.* (whole job object)` | Kept
      as received; the position's own fields are not overwritten from it. |

      | `position_def_set.kombo_parameters.kombo_job_id,
      interview_def_set.kombo_parameters.kombo_job_id` | Into JobMojito |
      `jobs.id` | Links a position or interview to one ATS job, chosen by the
      recruiter. |

      | `position_def_set.status, interview_def_set.status` | Into JobMojito |
      `jobs.status (closed, archived, deleted, reopened)` | Closing the job in
      the ATS archives the linked positions and interviews; reopening it
      restores their previous status. |

      | `kombo_parameters.kombo_stage_id` | Into JobMojito | `jobs.stages[].id
      matched against applications.current_stage_id` | An application entering
      this stage triggers the invitation or the pre-screening; applicants
      already in it are invited when the position is published. |

      | `ATS pipeline report (stage names and order)` | Into JobMojito |
      `jobs.stages[].id, name, index` | Read for the ATS pipeline report only. |

      | `kombo_applications.id, kombo_job_id, kombo_candidate_id, data` | Into
      JobMojito | `GET /ats/applications: id, job_id, candidate_id` | Copied on
      application sync; applications of closed or archived jobs are not
      imported. |

      | `kombo_applications.kombo_stage_id` | Into JobMojito |
      `applications.current_stage_id` | A stage change re-runs the invitation
      check for that application. |

      | `kombo_applications.status` | Into JobMojito | `applications.outcome
      (HIRED, DECLINED), remote_deleted_at` | Hired, declined or deleted
      applications are archived and receive no further invitations. |

      | `position_result.outcome, interview_result.outcome` | Into JobMojito |
      `applications.outcome` | Set to hired or declined when the ATS marks the
      linked application, while the outcome is still pending. |

      | `position_result.status, interview_result.status` | Into JobMojito |
      `applications.remote_deleted_at` | An application deleted in the ATS
      archives the linked application in JobMojito if nobody has decided yet. |

      | `kombo_candidates.id, data, status` | Into JobMojito | `GET
      /ats/candidates: candidates.*, remote_deleted_at` | Copied on candidate
      sync; a candidate deleted in the ATS is archived. |

      | `profile_interview.email, profile_interview.email_auth` | Into JobMojito
      | `candidates.email_addresses[0].email_address` | Finds or creates the
      candidate when the application reaches the trigger stage. |

      | `profile_interview.name` | Into JobMojito | `candidates.first_name +
      last_name` | Set when the candidate is created from the ATS. |

      | `profile_interview.phone_number` | Into JobMojito |
      `candidates.phone_numbers[0].phone_number` | Set when the candidate is
      created from the ATS. |

      | `kombo_candidates.profile_interview_id` | Into JobMojito |
      `candidates.id (matched by e-mail)` | Links the ATS candidate to the
      JobMojito candidate on invitation or pre-screening. |

      | `interview_file (type resume)` | Into JobMojito | `GET
      /ats/applications/{id}/attachments, then /ats/candidates/{id}/attachments:
      type CV (fallback OTHER)` | The CV from the ATS is imported when the
      candidate is invited or pre-screened. |

      | `interview_result_pre_screening (AI pre-screening input)` | Into
      JobMojito | `applications.screening_question_answers[] (question.title,
      answer)` | The candidate's answers to the ATS screening questions are part
      of the AI pre-screening. |

      | `interview_result_pre_screening.nationality, residency` | Into JobMojito
      | `candidates.location.country (fallback address.country)` | Taken from
      the ATS candidate during pre-screening. |

      | `kombo_applications.interview_result_id,
      interview_result_pre_screening_id` | Into JobMojito | `applications.id` |
      Set when the candidate's result is linked back to the ATS application. |

      | `kombo_tags, kombo_rejection_reasons, kombo_users, kombo_offers,
      kombo_interviews` | Into JobMojito | `GET /ats/tags,
      /ats/rejection-reasons, /ats/users, /ats/offers, /ats/interviews` | Kept
      in sync so recruiters can pick tags and rejection reasons; the others are
      stored only. |

      | `kombo_parameters.kombo_selected_stage_id (step:
      config.kombo.accept_stage_id)` | From JobMojito | `PUT
      /ats/applications/{id}/stage` | Moves the application when the recruiter
      selects the candidate; the position's stage is used on the last step. |

      | `kombo_parameters.kombo_sync_all_results_stage_id` | From JobMojito |
      `PUT /ats/applications/{id}/stage` | Every processed result is moved to
      this stage, only when sync all results is on. |

      | `kombo_parameters.kombo_rejected_reason_human_id,
      kombo_rejected_reason_ai_id (step: config.kombo.reject_reason_id)` | From
      JobMojito | `POST /ats/applications/{id}/reject { rejection_reason_id,
      note }` | Rejects the application when the recruiter rejects; nothing is
      sent when no reason is configured. |

      | `Rejection note (result link, score, AI feedback)` | From JobMojito |
      `reject.note` | The note sent with the rejection. |

      | `interview_result result link + interview_result.score` | From JobMojito
      | `POST /ats/applications/{id}/result-links { label, url,
      details.attributes }` | Sent when result links are switched on: a signed
      link to the result with its score. |

      | `interview_result note (result link + score)` | From JobMojito | `POST
      /ats/applications/{id}/notes` | Sent when notes are switched on and the
      recruiter has decided, or sync all results is on. |

      | `interview_result.pdf_export_url (interview PDF report)` | From
      JobMojito | `POST /ats/applications/{id}/attachments (type OTHER)` | Sent
      when attachments are switched on; the PDF is generated first if missing. |

      | `interview_result_pre_screening score, recommendation and analysis` |
      From JobMojito | `POST /ats/applications/{id}/notes` | Sent after every AI
      pre-screening and again when the recruiter decides on it. |

      | `Pre-screening PDF report` | From JobMojito | `POST
      /ats/applications/{id}/attachments (type OTHER)` | Uploaded when
      attachments are switched on. |

      | `interview_result.coach_status (progress note)` | From JobMojito | `POST
      /ats/applications/{id}/notes` | A note when the interview fails or the
      answers are collected, only when sync all results is on. |

      | `position_result_step decision and recruiter notes (meeting step)` |
      From JobMojito | `POST notes, PUT stage, POST reject` | Sends '<step>:
      passed / failed' with the recruiter's notes, then moves or rejects. |

      | `human_interview_request reason and outcome` | From JobMojito | `POST
      notes, PUT stage, POST reject` | Notes the request, moves on pass and
      rejects on fail or decline. |

      | `merchant.kombo_tag_assignment.result_weak / result_moderate /
      result_strong / result_exceptional` | From JobMojito | `POST
      /ats/candidates/{id}/tags` | Score tags on result sync: under 4 weak,
      under 7 moderate, under 8.5 strong, up to 10 exceptional. |

      | `merchant.kombo_tag_assignment.interview_selected / interview_rejected`
      | From JobMojito | `POST /ats/candidates/{id}/tags` | Decision tags on a
      recruiter decision; the selected tag only on the last step. |

      | `merchant.kombo_sync (manual sync)` | From JobMojito | `POST
      /force-sync` | Asks Kombo to sync the ATS again when the recruiter presses
      sync. |


      ### Webhooks


      JobMojito POSTs the same JSON payload for the events interview_result (the
      result is final and scored, sent again when a watched field changes),
      interview_collected (the candidate finished, before scoring) and
      interview_failed (failed, abandoned or no speech). Configure the URL,
      events and authentication headers per environment under Integrations >
      Custom integration; failed deliveries are retried and kept in the delivery
      history.


      | JobMojito field | Direction | External field | Notes |

      | --- | --- | --- | --- |

      | `interview_result.id` | From JobMojito | `id` | The result the event is
      about. |

      | `interview_result.question_set_id (interview_def_set.id)` | From
      JobMojito | `interview_id` | The interview definition. |

      | `interview_result.question_set_id (interview_def_set.id)` | From
      JobMojito | `question_set_id` | Same value as interview_id. |

      | `interview_result.status` | From JobMojito | `status` | active for
      interview_result, draft for the other two events. |

      | `interview_result.coach_status` | From JobMojito | `interview_status` |
      completed, failed, abandoned and so on. |

      | `interview_result.processing_status` | From JobMojito |
      `processing_status` | AI processing state. |

      | `interview_result.profile_interview_id` | From JobMojito |
      `profile_interview_id` | The candidate. |

      | `interview_result.profile_id` | From JobMojito | `profile_id` | The
      candidate's portal account, when there is one. |

      | `profile_interview.external_id` | From JobMojito |
      `candidate_external_id` | Your id for the candidate; present when a
      candidate is linked. |

      | `profile_interview.name` | From JobMojito | `candidate_name` | Present
      when a candidate is linked. |

      | `profile_interview.email` | From JobMojito | `candidate_email` | Present
      when a candidate is linked. |

      | `profile_interview.phone_number` | From JobMojito |
      `candidate_phone_number` | Present when a candidate is linked. |

      | `interview_result.recruiter_go_next_round` | From JobMojito |
      `recruiter_go_next_round` | The recruiter's decision; usually empty in
      interview_collected and interview_failed. |

      | `interview_result.ai_analysis` | From JobMojito | `ai_analysis` |
      Candidate-facing analysis, filled in interview_result. |

      | `interview_result.ai_analysis_recruiter` | From JobMojito |
      `ai_analysis_recruiter` | Recruiter-facing analysis, filled in
      interview_result. |

      | `interview_result.ai_analysis_other` | From JobMojito |
      `ai_analysis_other` | Session analyses by name, for example
      strengths_concerns. |

      | `interview_result.ai_analysis_other.strengths_concerns.strengths` | From
      JobMojito | `ai_analysis_recruiter_why_hire` | Deprecated copy kept for
      existing integrations. |

      | `interview_result.ai_analysis_other.strengths_concerns.concerns` | From
      JobMojito | `ai_analysis_recruiter_why_not_hire` | Deprecated copy kept
      for existing integrations. |

      | `interview_result.score_interview_ai` | From JobMojito |
      `ai_analysis_recruiter_score` | Recruiter-facing AI score, filled in
      interview_result. |

      | `interview_result.score` | From JobMojito | `score` | Overall score,
      filled in interview_result. |

      | `interview_result.pdf_export_url` | From JobMojito | `pdf_export_url` |
      When a PDF report is configured, interview_result waits until the PDF
      exists. |

      | `Changed fields of the result` | From JobMojito | `reason` | Which
      watched fields changed; 'manual re-trigger of ...' on a resend from the
      delivery history. |
paths:
  /merchant-candidate-get:
    get:
      tags:
        - Candidates
      summary: Get a candidate
      description: >-
        One candidate as the admin's candidate page shows it: profile,
        applications with their steps, stand-alone interview results, tags,
        counts and the duplicate flag; with include, also notes, duplicates,
        document requests, tasks and segments. Applications to positions hidden
        from you (position access) are left out; a candidate hidden from you is
        not found. Recorded in the audit log as a view of the candidate.
      parameters:
        - schema:
            type: string
            format: uuid
            description: Candidate id (profile_interview.id).
          required: true
          name: candidate_id
          in: query
        - schema:
            type: string
            description: >-
              Comma list of extra sections: notes, duplicates, documents, tasks,
              segments. Default: none of them.
            example: notes,tasks
          required: false
          name: include
          in: query
      responses:
        '200':
          description: The candidate.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CandidateGetResponse'
        '401':
          description: Missing or invalid access token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Not staff of the candidate's company.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No such candidate, or not visible to you.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Validation error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    CandidateGetResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/CandidateCard'
      required:
        - data
    Error:
      type: object
      properties:
        error:
          type: string
          example: Field is required.
        name:
          type: string
          example: interview_result_id
      required:
        - error
    CandidateCard:
      type: object
      properties:
        id:
          type: string
          description: Candidate id (profile_interview.id).
        merchant_id:
          type: string
          description: The company (merchant.id).
        profile_id:
          type: string
          description: The candidate's platform account (profile.id), when linked.
        name:
          type: string
          description: Name.
        email:
          type: string
          description: Contact e-mail.
        email_auth:
          type: string
          description: Sign-in e-mail.
        phone_number:
          type: string
          description: Phone number.
        emoji:
          type: string
          description: Emoji marker.
        external_id:
          type: string
          description: Id in the company's own or ATS system.
        status:
          type: string
          description: 'Record state: active, draft or archived.'
        linked_in:
          type: string
          description: LinkedIn URL.
        physical_address:
          type: string
          description: Address.
        mojito_language_code:
          type: string
          description: Platform language code.
        avatar_url:
          type: string
          description: Avatar image URL.
        avatar_local_path:
          type: string
          description: Avatar storage path.
        time_zone:
          type: string
          description: IANA time zone.
        skills:
          type: array
          items:
            type: string
          description: Skills read from the latest CV.
        last_login_at:
          type: string
          description: Last sign-in (ISO 8601).
        created_at:
          type: string
          description: Created (ISO 8601).
        updated_at:
          type: string
          description: Last changed (ISO 8601).
        source_channel:
          type: string
          description: >-
            First-touch channel (linkedin, indeed, referral, sourced, ...;
            untracked when unknown).
        is_prospect:
          type: boolean
          description: >-
            Sourced and never applied (prospects feature; left out when it is
            off).
        owner_profile_ids:
          type: array
          items:
            type: string
          description: >-
            Recruiters owning the candidate's visible applications (profile.id;
            the candidate_assignment feature).
        custom_fields:
          type: object
          additionalProperties:
            nullable: true
          description: >-
            Company-defined candidate fields (key: value; the custom_fields
            feature).
        applications:
          type: array
          items:
            $ref: '#/components/schemas/CandidateApplication'
          description: Applications to positions visible to you, newest first.
        interviews:
          type: array
          items:
            $ref: '#/components/schemas/CandidateInterview'
          description: >-
            Stand-alone interview results (not part of an application), newest
            first.
        tags:
          type: array
          items:
            $ref: '#/components/schemas/CandidateTag'
          description: Tags on the candidate.
        auto_tags:
          type: array
          items:
            type: string
          description: >-
            Automatic tags (recent_applicant, completed_interview, no_show,
            inactive_90d, previous_applicant, prospect, possible_duplicate,
            careers_chat_lead).
        counts:
          type: object
          properties:
            notes:
              type: integer
              description: >-
                Notes you can read: on the candidate, its visible interview
                results and pre-screenings.
            open_tasks:
              type: integer
              description: Open tasks you can see (the tasks feature).
            open_document_requests:
              type: integer
              description: Open document requests (the document_requests feature).
            segments:
              type: integer
              description: Saved segments the candidate is in.
          required:
            - notes
            - segments
          description: Counts.
        duplicate_flag:
          type: object
          properties:
            open_count:
              type: integer
              description: Open possible duplicates.
            top_score:
              type: number
              description: Highest match score.
          required:
            - open_count
          description: >-
            Open possible duplicates (the duplicate_detection feature; left out
            when none).
        notes:
          type: array
          items:
            $ref: '#/components/schemas/CandidateNote'
          description: >-
            With include=notes: up to 200 notes you can read, newest first.
            Another person's private note is never returned.
        duplicates:
          type: array
          items:
            $ref: '#/components/schemas/CandidateDuplicate'
          description: 'With include=duplicates: open possible duplicates visible to you.'
        documents:
          type: array
          items:
            $ref: '#/components/schemas/CandidateDocumentRequest'
          description: 'With include=documents: document requests, newest first.'
        tasks:
          type: array
          items:
            $ref: '#/components/schemas/CandidateTask'
          description: >-
            With include=tasks: up to 100 tasks on the candidate you can see,
            open first.
        segments:
          type: array
          items:
            $ref: '#/components/schemas/CandidateSegmentRef'
          description: 'With include=segments: the saved segments the candidate is in.'
        unavailable:
          type: array
          items:
            type: object
            properties:
              section:
                type: string
                description: The section asked for.
              switch:
                type: string
                description: The company switch that is off.
            required:
              - section
              - switch
          description: Sections asked for but left out because their switch is off.
      required:
        - id
        - merchant_id
        - status
        - applications
        - interviews
        - tags
        - auto_tags
        - counts
    CandidateApplication:
      type: object
      properties:
        id:
          type: string
          description: Application id (position_result.id).
        position_id:
          type: string
          description: Position id (position_def_set.id).
        position_name:
          type: string
          description: Position name.
        status:
          type: string
          description: >-
            Application state: draft, active, archived, deleted, preparing or
            completed.
        decision_status:
          type: string
          description: >-
            Decision: recruiter_accept, recruiter_reject, recruiter_action,
            ai_accept, ai_reject, candidate_action or processing.
        outcome:
          type: string
          description: 'Outcome: pending, hired or declined.'
        outcome_at:
          type: string
          description: When the outcome was set (ISO 8601).
        decision_reason_id:
          type: string
          description: Decision reason id (from merchant-reason-list).
        decision_reason_note:
          type: string
          description: Note on the decision.
        withdrawn_at:
          type: string
          description: When the application was withdrawn (ISO 8601).
        assigned_profile_id:
          type: string
          description: Recruiter assigned to the application (profile.id).
        is_test:
          type: boolean
          description: A test application.
        current_step_id:
          type: string
          description: The current step (position_result_step.id).
        created_at:
          type: string
          description: Applied (ISO 8601).
        updated_at:
          type: string
          description: Last changed (ISO 8601).
        steps:
          type: array
          items:
            $ref: '#/components/schemas/CandidateApplicationStep'
          description: The steps reached, in process order.
      required:
        - id
        - position_id
    CandidateInterview:
      type: object
      properties:
        id:
          type: string
          description: Interview result id (interview_result.id).
        interview_id:
          type: string
          description: Interview id (interview_def_set.id).
        interview_name:
          type: string
          description: Interview name.
        type:
          type: string
          description: interview, assessment, persona_interview or public_avatar.
        status:
          type: string
          description: 'Record state: active, draft, archived or deleted.'
        processing_status:
          type: string
          description: 'Analysis state: new, processing, completed or failed.'
        score:
          type: number
          description: Score.
        recruiter_go_next_round:
          type: boolean
          description: 'The recruiter decision: true next round, false rejected.'
        outcome:
          type: string
          description: 'Outcome: pending, hired or declined.'
        decision_reason_id:
          type: string
          description: Decision reason id (from merchant-reason-list).
        is_test:
          type: boolean
          description: A test result.
        created_at:
          type: string
          description: Started (ISO 8601).
      required:
        - id
    CandidateTag:
      type: object
      properties:
        id:
          type: string
          description: Tag id (profile_interview_tag.id).
        name:
          type: string
          description: Tag name.
        color:
          type: string
          enum:
            - default
            - accent
            - success
            - warning
            - danger
          description: 'Tag colour: default, accent, success, warning or danger.'
      required:
        - id
        - name
        - color
    CandidateNote:
      type: object
      properties:
        id:
          type: string
          description: >-
            Note id (interview_result_comments.id or
            interview_result_pre_screening_comments.id).
        target:
          type: string
          enum:
            - candidate
            - result
            - pre_screening
          description: >-
            What the note is on: the candidate, an interview result or a
            pre-screening.
        result_id:
          type: string
          description: Interview result id (interview_result.id), for target result.
        pre_screening_id:
          type: string
          description: >-
            Pre-screening id (interview_result_pre_screening.id), for target
            pre_screening.
        text:
          type: string
          description: The note.
        visibility:
          type: string
          enum:
            - team
            - private
          description: 'team: the company sees it; private: only its author.'
        author_profile_id:
          type: string
          description: Author (profile.id).
        author_name:
          type: string
          description: Author name.
        score_adjustment:
          type: number
          description: Score adjustment of result feedback (0 for notes on the candidate).
        created_at:
          type: string
          description: Written (ISO 8601).
      required:
        - id
        - target
        - visibility
    CandidateDuplicate:
      type: object
      properties:
        duplicate_id:
          type: string
          description: Duplicate pair id (profile_interview_duplicate.id).
        other_candidate_id:
          type: string
          description: The other candidate (profile_interview.id).
        other_name:
          type: string
          description: Its name.
        other_email:
          type: string
          description: Its e-mail.
        other_phone:
          type: string
          description: Its phone number.
        other_created_at:
          type: string
          description: Created (ISO 8601).
        other_applications:
          type: array
          items:
            type: object
            properties:
              application_id:
                type: string
                description: Application id (position_result.id).
              position_name:
                type: string
                description: Position name.
              status:
                type: string
                description: Application state.
          description: Its applications to positions visible to you.
        score:
          type: number
          description: Match score 0 to 100.
        reasons:
          type: array
          items:
            type: string
          description: >-
            Which signals matched, each once: email, phone, name, name_dob,
            linkedin or cv.
        reason_details:
          type: array
          items:
            type: object
            properties:
              signal:
                type: string
                description: email, phone, name, name_dob, linkedin or cv.
              detail:
                type: string
                description: >-
                  The matching value (the e-mail, phone, name or LinkedIn
                  address); absent for cv and name_dob.
            required:
              - signal
          description: Each match with its value.
        status:
          type: string
          description: open, dismissed or merged.
      required:
        - duplicate_id
        - other_candidate_id
    CandidateDocumentRequest:
      type: object
      properties:
        id:
          type: string
          description: Document request id (profile_interview_document_request.id).
        status:
          type: string
          description: open, completed or cancelled.
        message:
          type: string
          description: Message to the candidate.
        due_date:
          type: string
          description: Due date (YYYY-MM-DD).
        created_at:
          type: string
          description: Requested (ISO 8601).
        completed_at:
          type: string
          description: Completed (ISO 8601).
        cancelled_at:
          type: string
          description: Cancelled (ISO 8601).
        application_id:
          type: string
          description: Application (position_result.id).
        position_id:
          type: string
          description: Position (position_def_set.id).
        position_name:
          type: string
          description: Position name.
        created_by_name:
          type: string
          description: Who requested it.
        reviewed_at:
          type: string
          description: When a recruiter reviewed the uploads (ISO 8601).
        items:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                description: Item id (profile_interview_document_request_item.id).
              title:
                type: string
                description: Document asked for.
              description:
                type: string
                description: Details.
              required:
                type: boolean
                description: Required.
              uploaded_at:
                type: string
                description: Uploaded (ISO 8601).
              file_name:
                type: string
                description: Uploaded file name.
            required:
              - id
          description: The documents asked for.
      required:
        - id
    CandidateTask:
      type: object
      properties:
        id:
          type: string
          description: Task id (merchant_task.id).
        title:
          type: string
          description: Title.
        notes:
          type: string
          description: Notes.
        status:
          type: string
          description: open, done or cancelled.
        due_at:
          type: string
          description: Due (ISO 8601).
        due_state:
          type: string
          description: overdue, today, upcoming or none.
        assignee_profile_id:
          type: string
          description: Assignee (profile.id).
        assignee_name:
          type: string
          description: Assignee name.
        created_by_name:
          type: string
          description: Who made it.
        created_at:
          type: string
          description: Created (ISO 8601).
        completed_at:
          type: string
          description: Completed (ISO 8601).
        position_id:
          type: string
          description: Position the task is about (position_def_set.id).
        interview_id:
          type: string
          description: Interview the task is about (interview_def_set.id).
        definition_name:
          type: string
          description: Name of that position or interview.
        application_id:
          type: string
          description: Application the task is about (position_result.id).
      required:
        - id
    CandidateSegmentRef:
      type: object
      properties:
        id:
          type: string
          description: Segment id (profile_interview_segment.id).
        name:
          type: string
          description: Segment name.
        kind:
          type: string
          description: dynamic or static.
      required:
        - id
        - name
        - kind
    CandidateApplicationStep:
      type: object
      properties:
        id:
          type: string
          description: Application step id (position_result_step.id).
        position_step_id:
          type: string
          description: Position step id (position_def_step.id).
        name:
          type: string
          description: Step name (the step type when unnamed).
        type:
          type: string
          description: >-
            Step type: pre-screening, interview, invited, meeting,
            external_assessment or certo_verification.
        sequence_no:
          type: number
          description: Order in the process.
        status:
          type: string
          description: >-
            Step state: draft, active, archived, deleted, preparing or
            completed.
        decision_status:
          type: string
          description: >-
            Decision: recruiter_accept, recruiter_reject, recruiter_action,
            ai_accept, ai_reject, candidate_action or processing.
        processing_status:
          type: string
          description: 'Analysis state: new, processing, completed or failed.'
        decision_reason_id:
          type: string
          description: Decision reason id (from merchant-reason-list).
        skipped_at:
          type: string
          description: When the step was skipped (ISO 8601).
        interview_result_id:
          type: string
          description: Interview result of the step (interview_result.id).
        pre_screening_id:
          type: string
          description: Pre-screening of the step (interview_result_pre_screening.id).
        created_at:
          type: string
          description: When the candidate reached the step (ISO 8601).
      required:
        - id
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Supabase JWT — `Authorization: Bearer <token>`.'

````

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