---
title: "Duplicate a practitioner"
method: POST
path: "/shop/practitioners/{practitionerId}/copy"
tags: ["Practitioners"]
---

# Duplicate a practitioner

`POST /shop/practitioners/{practitionerId}/copy`

Creates a copy of an existing `Practitioner`. The copy inherits the
source's full configuration (avatar, tags, zones, scheduling rules)
except the underlying `user_id` association — the new practitioner
starts without a linked user. Useful when staffing up similar roles
or seeding a new site from a model practitioner.

Requires the `SETTINGS_MANAGE` permission on the source's site.

## Request body

- object
  - `name` string, required — Display name for the new practitioner copy. Shown to customers in the booking flow and to staff in the admin UI.
  - `can_offer_tags` string[] — Tag names the practitioner can deliver appointments for. The exact set of tags is controlled by `practitioner-tags`; this field references them by name for back-compat with older callers.
  - `tag_ids` string[] — IDs of practitioner tags the new copy belongs to. Tags must exist in the caller's organisation AND be marked as `applies_to: Practitioner` — others are rejected with 422.
  - `zone_ids` string[] — IDs of zones the new practitioner is associated with. Zones must belong to the source practitioner's site.
  - `scheduling_week_interval_start` string, date — ISO 8601 date marking the first week of the practitioner's recurring schedule. Used together with `scheduling_week_interval` to compute multi-week rotas.
  - `scheduling_week_interval` integer — Length of the recurring schedule in weeks (1-10). `1` means a weekly schedule; `4` means a 4-weekly rota repeating cyclically from `scheduling_week_interval_start`.
  - `avatar_id` string, object-id, nullable — ID of an uploaded `Media` to use as the practitioner's avatar.
  - `signature_id` string, object-id, nullable — ID of an uploaded `Media` to use as the practitioner's signature image.

## Response `201`

The practitioner was copied.

- object
  - `data` Practitioner, required — A bookable staff member — typically a therapist, instructor or stylist — that appointments and sessions can be assigned to. Practitioners own a working rota, optional commission rules, and the set of session/appointment types they are qualified to deliver.
    - `id` string, object-id, required — Stable identifier for the practitioner. Used when assigning sessions, appointments and rotas to the practitioner, and when the booking storefront resolves a slot to a specific staff member.
    - `appointment_restrictions` PractitionerAppointmentRestriction[], required
      - `id` string, required — The ID of the restriction
      - `applies_to_type` 'specific' | 'categories', required — The type of the restriction
      - `appointment_type_ids` string[] — The IDs of appointment types that this restriction applies to
      - `appointment_types` object[] — The appointment types associated with this product
        - `id` string, required
        - `name` string, required
      - `categories` object[] — The category associated with this product
        - `id` string, required
        - `name` string, required
      - `category_ids` string[] — The IDs of categories that this restriction applies to
      - `date_from` string, date, required — The first day that this restriction should apply
      - `date_to` string, date, required — The last date that this restriction should apply
      - `max_duration` integer — For a `max_duration` rule, this specifies the maximum number of minutes of the appointment type that the practitioner may offer each day.
      - `occupied_mins` integer
      - `type` 'cannot_offer' | 'max_duration' — The type of the restriction
    - `avatar` Media
      - `id` string, uuid, required — Unique identifier of the uploaded media item, returned from `createMedia`. Pass this ID into any field that accepts a media reference (logos, hero images, product images, etc.).
      - `file_name` string, required — Original filename of the uploaded asset, preserved as provided at upload time. Used for display in the media library and as a hint when serving downloads.
      - `mime_type` string, required — The mime type of the media item.
      - `original_url` string, required — The url of the media resource.
      - `size` integer, required — The size of the media item in bytes.
      - `url` string, required — The url of the converted media resource.
    - `signature` Media
      - `id` string, uuid, required — Unique identifier of the uploaded media item, returned from `createMedia`. Pass this ID into any field that accepts a media reference (logos, hero images, product images, etc.).
      - `file_name` string, required — Original filename of the uploaded asset, preserved as provided at upload time. Used for display in the media library and as a hint when serving downloads.
      - `mime_type` string, required — The mime type of the media item.
      - `original_url` string, required — The url of the media resource.
      - `size` integer, required — The size of the media item in bytes.
      - `url` string, required — The url of the converted media resource.
    - `can_offer_tags` string[], required
    - `gender` string, nullable — Self-identified gender of the practitioner, surfaced to guests who filter the booking storefront by practitioner gender. Free text — common values are `female`, `male` and `non-binary`. `null` when the practitioner hasn't supplied a value.
    - `name` string, required — Public display name of the practitioner. Shown to guests on the booking storefront and on receipts. Should be the name the practitioner wants to appear in front of guests — typically first name plus last initial or full name.
    - `registration_number` string, nullable — Optional registration or license number for the practitioner. Used to track professional credentials or qualifications.
    - `organisation_id` string, uuid, required — Organisation the practitioner belongs to. Practitioners are scoped to a single organisation and are not visible to API callers from other organisations.
    - `site_ids` string[], required
    - `tag_ids` string[], required
    - `tags` Tag[], required
      - `id` string, required
      - `name` string, required
      - `organisation_id` string, required
    - `zones` Zone[], required
      - `id` string, object-id, required — Unique identifier for the zone.
      - `name` string, required — Display name for the zone, shown wherever zones are listed or filtered. Plain text only.
      - `organisation_id` string, uuid, required — ID of the organisation that owns this zone. Inherited from the site on create.
      - `site_id` string, uuid, required — ID of the site this zone belongs to.
    - `commission_package_id` string, mongo-id, nullable — The commission package to use for this practitioner. If not set, the practitioner's default commission package will be the site's default commission package (as defined by `ShopSite.default_commission_package_id`).
    - `external_id` string, nullable, required — Optional external identifier for the practitioner, used to correlate this record with an entry in a third-party system (e.g. a PMS, payroll provider, or CRM). Not interpreted by the platform — treated as an opaque string.
    - `user_id` string, uuid, nullable, required — Staff `User` linked to this practitioner record, if any. Linking lets the user manage their own rota and view their appointments from the staff console. `null` for practitioners that don't have a login account.
    - `created_at` string, date-time, required — When then resource was created.
    - `updated_at` string, date-time, required — When then resource was last updated.

## Other responses

- `401` — The user is unauthenticated
- `403` — The authenticated user does not have permission.
- `404` — The resource couldn't be found
- `422` — The request didn't pass validation

---

[API](https://skmtc.dev/try/apis/trybe-api.md) · [All operations](https://skmtc.dev/try/apis/trybe-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/try/trybe-api/revisions/f37f92702da5/schema)
