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

# Duplicate an interview draft

> Duplicate a saved draft verbatim into a new draft. **Admin only.**

Every field is copied as-is — including recipients, schedule, reminder
settings, and campaign; the name is copied rather than regenerated since
the topic is identical. Nothing is sent by this call.




## OpenAPI

````yaml /api-reference/openapi-public.yaml post /projects/{project_id}/interview-drafts/{draft_id}/clone/
openapi: 3.0.3
info:
  title: Clarifeye Platform API — Public API
  description: >
    Forward-facing, supported REST API for new integrators of the Clarifeye
    Platform.


    Covers the curated public surface: authentication, knowledge management

    (documents), users & teams, signals, and tool execution. New integrations

    should target these endpoints.


    ## Authentication

    All endpoints require authentication. Include the Authorization header in
    every request using either format:

    - `Authorization: Token <token_key>`

    - `Authorization: Bearer <token_key>`
  version: 1.0.0
  contact:
    name: Clarifeye Support
servers:
  - url: https://eu.app.clarifeye.ai/api/v1
    description: EU
  - url: https://us.app.clarifeye.ai/api/v1
    description: US
security:
  - BearerAuth: []
  - TokenAuth: []
tags:
  - name: Users
    description: Manage users within a project
  - name: Invitations
    description: Manage project invitations
  - name: Documents
    description: Manage documents within a project
  - name: Signals
    description: Submit signals about the project's content for domain experts to review
  - name: Tools
    description: Execute configured AI tools with custom parameters
  - name: Interviews
    description: >-
      Assign, run and review structured interview conversations, and manage
      interview drafts and campaigns
  - name: Artifacts
    description: >
      Knowledge-store artifact catalog: list artifacts, create and edit custom
      artifacts,

      manage scope membership, read and publish versions, and configure the
      cohesion guide.
  - name: Knowledge Changelog
    description: Chronological log of changes to the knowledge store's artifacts.
paths:
  /projects/{project_id}/interview-drafts/{draft_id}/clone/:
    post:
      tags:
        - Interviews
      summary: Duplicate an interview draft
      description: |
        Duplicate a saved draft verbatim into a new draft. **Admin only.**

        Every field is copied as-is — including recipients, schedule, reminder
        settings, and campaign; the name is copied rather than regenerated since
        the topic is identical. Nothing is sent by this call.
      operationId: cloneInterviewDraft
      parameters:
        - $ref: '#/components/parameters/ProjectId'
        - name: draft_id
          in: path
          required: true
          description: UUID of the interview draft to duplicate
          schema:
            type: string
            format: uuid
      responses:
        '201':
          description: Draft duplicated
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Draft duplicated
                  cloned_draft:
                    $ref: '#/components/schemas/InterviewDraft'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    ProjectId:
      name: project_id
      in: path
      required: true
      description: UUID of the project
      schema:
        type: string
        format: uuid
  schemas:
    InterviewDraft:
      allOf:
        - $ref: '#/components/schemas/InterviewDraftInput'
        - type: object
          description: >
            A saved, unsent interview-assignment payload. Becomes one interview
            per

            recipient when sent via the assign endpoint (with `draft_id`), which

            also deletes the draft.
          properties:
            id:
              type: string
              format: uuid
              readOnly: true
            name:
              type: string
              readOnly: true
              description: >
                Title generated from the topic at save time; empty when the
                draft has

                no topic (clients show "Untitled draft interview").
            campaign:
              allOf:
                - $ref: '#/components/schemas/InterviewCampaignRef'
              nullable: true
              readOnly: true
              description: >
                Campaign the interviews created from this draft will belong to;
                null

                when none. Set via `campaign_id` / `campaign_name`.
            test_runs:
              type: array
              readOnly: true
              description: This draft's test runs, newest first (see `InterviewTestRun`).
              items:
                $ref: '#/components/schemas/InterviewTestRun'
            source_session:
              allOf:
                - $ref: '#/components/schemas/InterviewDraftSourceSession'
              nullable: true
              readOnly: true
            created_by:
              type: string
              format: uuid
              nullable: true
              readOnly: true
            created_by_email:
              type: string
              format: email
              nullable: true
              readOnly: true
            created_at:
              type: string
              format: date-time
              readOnly: true
            updated_at:
              type: string
              format: date-time
              readOnly: true
    InterviewDraftInput:
      type: object
      description: >
        Writable fields of an interview draft. Everything is optional — drafts
        are

        deliberately permissive and only sending (assign with `draft_id`)
        enforces

        the real assignment rules.
      properties:
        topic:
          type: string
          description: The interview focus. When set, a short title is generated from it.
        interview_type:
          type: string
          enum:
            - interview
            - guided-interview
          default: interview
          description: >
            Which conversation type the draft fans out to when sent. Set at
            creation

            (form type cards, or the scoping conversation's draft tool) and
            immutable

            afterwards — updates that change it are rejected (400).
        questions:
          type: array
          description: |
            Optional specific topics or questions (max 10). Rejected on
            guided-interview drafts — their `topics` structure the conversation.
          items:
            type: string
        topics:
          type: array
          description: >
            Guided drafts only (rejected otherwise): the ordered, editable
            topics the

            interview walks through (max 12). The scoping conversation's draft
            tool

            pre-seeds them from the standard guide.
          items:
            $ref: '#/components/schemas/GuidedInterviewTopic'
        assignee_ids:
          type: array
          description: >-
            UUIDs of project members to interview. May go stale; re-validated at
            send.
          items:
            type: string
            format: uuid
        invite_emails:
          type: array
          description: >-
            Emails of people not yet on the project. Nobody is contacted until
            the draft is sent.
          items:
            type: string
            format: email
        language:
          type: string
          nullable: true
          description: >
            ISO language code (e.g. `fr`) the interviews created from this draft
            must be

            conducted in. Null (the default) adapts to each recipient's own
            preferred

            language. Unknown codes are rejected (400).
        custom_message:
          type: string
          description: Optional note replacing the default invitation email copy.
        custom_focus:
          type: string
          nullable: true
          description: >
            Overrides the "what it's about" focus block in invitation emails
            without

            changing the interview focus. Null (the default) shows the topic
            truncated

            to a teaser; empty string removes the block; text is shown verbatim.
          maxLength: 500
        scheduled_send_at:
          type: string
          format: date-time
          nullable: true
        reminders_enabled:
          type: boolean
          default: false
        reminder_start_after_days:
          type: integer
          minimum: 1
          maximum: 30
          default: 2
        reminder_interval_days:
          type: integer
          minimum: 1
          maximum: 30
          default: 3
        reminder_max_count:
          type: integer
          minimum: 1
          maximum: 10
          default: 3
        source_agent_session_id:
          type: string
          format: uuid
          nullable: true
          writeOnly: true
          description: >
            Creation only: the CMA Clara session drafting this (passed by the
            agent via

            the MCP `draft_interviews` tool). Must be one of the caller's own
            Clara

            sessions scoped to this project, else 400. Ignored on update.
            In-process

            Clara records its conversation directly; both read back as
            `source_session`.
        campaign_id:
          type: string
          format: uuid
          nullable: true
          writeOnly: true
          description: >
            Existing campaign (of the same project) to group the draft's
            interviews

            under; null removes the draft from its campaign. Wins over

            `campaign_name` when both are sent.
        campaign_name:
          type: string
          writeOnly: true
          description: |
            Campaign to group the draft's interviews under, by name: reuses the
            project's campaign with that name (case-insensitive) or creates it.
    InterviewCampaignRef:
      type: object
      description: Nested campaign reference carried by interviews.
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
    InterviewTestRun:
      type: object
      description: >
        A rehearsal of an unsent draft (CLA-1834): an ordinary interview
        conversation

        the admin plays through themselves, listed only under its draft and
        removed

        with it. Topics in `skipped_topic_ids` were deliberately left out of the
        run

        (started later / jumped ahead) — they are choices, not gaps. On a
        conversation

        detail (`test_run`) the object additionally carries `draft_id`,
        `draft_name`,

        `draft_edit_url`, `draft_source_session` and a `note` for agent readers.
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          nullable: true
          enum:
            - pending
            - in_progress
            - completed
        language:
          type: string
          nullable: true
          description: >-
            ISO code the run is conducted in (outranks the tester's preference);
            null = auto-detect.
        started_from_topic_index:
          type: integer
        started_from_topic_title:
          type: string
          nullable: true
        skipped_topic_ids:
          type: array
          items:
            type: string
            format: uuid
        jumps:
          type: array
          items:
            type: object
            properties:
              from_topic_id:
                type: string
                format: uuid
                nullable: true
              to_topic_id:
                type: string
                format: uuid
              at_message_count:
                type: integer
        message_count:
          type: integer
          description: >-
            Conversation-detail flavour only (drafts list runs without their
            transcripts).
        draft_changed_since_start:
          type: boolean
          description: >
            The draft's interview-shaping fields (focus, topics, questions,
            language)

            changed after this run began — it rehearsed a previous version.
            Re-saving the

            draft unchanged, or starting another run, does not set it.
        interview_url:
          type: string
          description: Absolute URL of the run's focused interview page.
        draft_source_session:
          allOf:
            - $ref: '#/components/schemas/InterviewDraftSourceSession'
          nullable: true
          description: >-
            Conversation-detail flavour only. The session that drafted the
            interview, so the test page can resume it for feedback.
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    InterviewDraftSourceSession:
      type: object
      description: >
        The Clara session that created a draft (provenance, SET_NULL on both
        ends).

        `kind` decides the route a client builds: `clara_fast` = in-process Work
        with

        Clara conversation (`/agent/clara-fast?conversation_id=`), `cma` =
        Managed-Agents

        Clara session (`/agent/clara?session_id=`), `coach` = any other coach

        conversation (e.g. scoping), recorded but not linked from the test page.
      properties:
        kind:
          type: string
          enum:
            - clara_fast
            - cma
            - coach
        id:
          type: string
          format: uuid
        name:
          type: string
          nullable: true
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
      example:
        error: User not found
    GuidedInterviewTopic:
      type: object
      description: >
        One ordered topic of a guided interview. `title` and `description` say
        what THIS

        topic must cover; `skill_id` is its TYPE — how the interviewer works it
        — and

        round-trips through edits, so preserve the values you received or the
        topic loses

        its skill-backed interview depth. Accepted values are the interview
        skills

        (`use_case_exploration`, `use_case_context`, `document_library`,

        `document_upload`, `custom_topic`, `guided_wrap_up`, plus ids retired
        from new

        agendas but still carried by older drafts); an unrecognized id is
        rejected with

        400. Omit `skill_id` for a free-form topic, driven by its own
        title/description

        text.
      required:
        - title
      properties:
        title:
          type: string
          maxLength: 200
        description:
          type: string
        skill_id:
          type: string
          nullable: true
  responses:
    Unauthorized:
      description: Unauthorized - missing or invalid authentication
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Authentication credentials were not provided.
    Forbidden:
      description: Forbidden - insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: You do not have permission to perform this action.
    NotFound:
      description: Not found - resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Not found.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: 'Use Authorization: Bearer <token>'
    TokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Use Authorization: Token <token>'

````