---
title: "Clone an interviewer"
method: POST
path: "/api/v2/postings/{posting_id}/clone"
tags: ["Interviewers"]
---

# Clone an interviewer

`POST /api/v2/postings/{posting_id}/clone`

Create a copy of an existing interviewer with its workflow configuration.

If the source interviewer is ATS-derived, the clone is returned in the same intermediate stage as a fresh ATS create (`status: "draft"`, `ats_metadata.pending_activation: true`) and must be transitioned to live via `POST /postings/{posting_id}/activate`. Cloning a non-ATS posting is unchanged.

## Path parameters

- `posting_id` string, required

## Headers

- `X-API-KEY` string, nullable
- `Authorization` string, nullable
- `X-Workspace-Id` string, nullable

## Response `201`

Successful Response

- SingleResponseCreatePostingResponse
  - `data` CreatePostingResponse, required — Response after successfully creating a posting.
    - `object` 'posting' — Object type identifier.
    - `id` string, required — Unique posting identifier.
    - `status` string, required — Posting status after creation.
    - `urls` PostingURLs, required — All URLs associated with a posting.
      - `candidate_url` string, nullable — Candidate-facing interview URL.
      - `ingestion_url_key` string, nullable — URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}.
      - `review_url` string, nullable — Admin dashboard review URL.
    - `created_at` number, required — Unix timestamp when the posting was created.
    - `posting` PostingResponse — A job posting with its full agentic workflow configuration. A posting represents a complete hiring pipeline — it defines the job, the AI agents involved, and how candidates progress through each screening step.
      - `object` 'posting' — Object type identifier.
      - `id` string, required — Unique posting identifier.
      - `company_id` string, required — ID of the company that owns this posting.
      - `title` string, required — Job title displayed to candidates.
      - `name` string, nullable — URL-friendly slug for the posting.
      - `description` string, required — Full job description text.
      - `language` string, nullable — BCP-47 language code.
      - `interviewer_name` string, nullable — Display name of the AI interviewer.
      - `status` string, required — Posting status: 'draft', 'active', 'expired', 'archived'.
      - `finalized` boolean, required — Whether the posting has been finalized/activated.
      - `archived` boolean, required — Whether the posting is archived.
      - `test_posting` boolean, required — Whether this is a test posting.
      - `workflow` WorkflowStep[] — Ordered list of agentic workflow steps.
        - `id` string, nullable — Unique identifier for this workflow step.
        - `type` string, required — Agent type: 'web_interview', 'conversational_sms', 'resume', 'form'.
        - `order` integer, required — Position in the workflow pipeline (1-based).
        - `config` object — Agent-specific configuration. Shape varies by type. See GET /api/v2/schemas/agents for details.
      - `urls` PostingURLs — All URLs associated with a posting.
        - `candidate_url` string, nullable — Candidate-facing interview URL.
        - `ingestion_url_key` string, nullable — URL key for candidate ingestion. Use with POST /intake/v1/candidate/{key}.
        - `review_url` string, nullable — Admin dashboard review URL.
      - `deadline` number, nullable — Unix timestamp deadline for the posting.
      - `redirect_url` string, nullable — URL candidates are redirected to after completing the interview.
      - `scheduling_url` string, nullable — Calendar scheduling URL for shortlisted candidates.
      - `max_retakes` integer, nullable — Maximum number of interview retakes allowed.
      - `allow_sms_comms` boolean, nullable — Whether SMS communications are enabled.
      - `instructions` string, nullable — General instructions for the AI interviewer shared with agents.
      - `company_overview` string, nullable — Overview of the company shared with agents.
      - `job_overview` string, nullable — Overview of the job/role shared with agents.
      - `interview_process_overview` string, nullable — Overview of the interview process shared with agents.
      - `company_overview_delivery_mode` string, nullable — How the AI interviewer delivers the company overview.
      - `job_overview_delivery_mode` string, nullable — How the AI interviewer delivers the job overview.
      - `interview_process_overview_delivery_mode` string, nullable — How the AI interviewer delivers the interview process overview.
      - `phone_number_id` string, nullable — ID of the phone number used for outbound calls.
      - `sender_email_id` string, nullable — ID of the sender email configuration.
      - `email_template_group_id` string, nullable — ID of the email template group.
      - `design_template_group_id` string, nullable — ID of the design template group.
      - `retake_cooldown_days` number, nullable — Cooldown period in days before a candidate can retake.
      - `email_report_to_candidate` boolean, nullable — Whether to email the interview report to the candidate.
      - `ats_metadata` object, nullable — ATS integration metadata for postings derived from an ATS (Import-from-ATS flow or `createPosting` with an ATS-derived `interview_template_id`). Null for postings not connected to an ATS. Common fields: - `source` (string): how the posting was created, e.g. `job_sync`. - `ats_name` (string): identifier of the ATS, e.g. `workable`, `bullhorn`. - `ats_job_id` (string): ID of the ATS job that backs this posting. - `ats_job_posting_id` (string, optional): ATS-side job-posting ID when distinct from `ats_job_id`. - `integration_id` (string, optional): heymilo ATS integration ID. - `job_ids` (string[], optional): ATS job IDs included in the mapping config. - `pending_activation` (bool): `true` while the agent is in the intermediate stage created by `createPosting` / `clonePosting` for ATS-derived postings. Candidate ingestion does not begin until the caller transitions out of this stage by calling `POST /postings/{posting_id}/activate`, which finalizes the posting and attaches the ATS mapping in one step. - `mapping_activated_at`, `mapping_activated_by` (read-only): audit fields stamped when the ATS mapping was attached. - `mapping_deactivated_at`, `mapping_deactivated_by` (read-only): audit fields stamped when the ATS mapping was last paused.
      - `metadata` object, nullable — Set of key-value pairs for storing additional information. Up to 50 keys, each key max 40 chars, each value max 500 chars.
      - `created_at` number, nullable — Unix timestamp when the posting was created.
      - `updated_at` number, nullable — Unix timestamp when the posting was last updated.
  - `meta` object, nullable — Optional metadata. Shape varies by endpoint.

## Other responses

- `401` — Invalid or missing API key.
- `404` — Resource not found.
- `422` — Validation Error
- `429` — Rate limit exceeded.

---

[API](https://skmtc.net/heymilo/apis/heymilo-public-api.md) · [All operations](https://skmtc.net/heymilo/apis/heymilo-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/heymilo/heymilo-public-api/versions/a93ca9c2c777/schema)
