Practitioners

Duplicate a practitioner

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.

post/shop/practitioners/{practitionerId}/copy

Request body

namestring required

Display name for the new practitioner copy. Shown to customers in the booking flow and to staff in the admin UI.

can_offer_tagsstring[]

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_idsstring[]

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_idsstring[]

IDs of zones the new practitioner is associated with. Zones must belong to the source practitioner's site.

scheduling_week_interval_startstring 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_intervalinteger

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_idstring object-id nullable

ID of an uploaded Media to use as the practitioner's avatar.

signature_idstring object-id nullable

ID of an uploaded Media to use as the practitioner's signature image.

Example request

{
  "name": "Sam Practitioner (Junior)",
  "scheduling_week_interval_start": "2026-01-05",
  "scheduling_week_interval": 1
}

Response

The practitioner was copied.

Example response

{
  "data": {
    "id": "5dcb47800000000000000000",
    "appointment_restrictions": [
      {
        "id": "5dcb47800000000000000011",
        "appointment_type_ids": [
          "5dcb47800000000000000010"
        ],
        "category_ids": [
          "5dcb47800000000000000010"
        ],
        "date_from": "2020-06-20",
        "date_to": "2020-06-20",
        "max_duration": 180,
        "occupied_mins": 60
      }
    ],
    "avatar": {
      "file_name": "super-cool-photo.jpg",
      "mime_type": "image/jpeg",
      "original_url": "https://example.com/media/super-cool-photo.jpg",
      "size": 84256,
      "url": "https://example.com/media/super-cool-photo-thumbnail@2x.jpg"
    },
    "signature": {
      "file_name": "super-cool-photo.jpg",
      "mime_type": "image/jpeg",
      "original_url": "https://example.com/media/super-cool-photo.jpg",
      "size": 84256,
      "url": "https://example.com/media/super-cool-photo-thumbnail@2x.jpg"
    },
    "gender": "female",
    "name": "Jane Doe",
    "registration_number": "A123",
    "organisation_id": "5f8a1b2c-9d3e-4a5b-8c6d-7e8f9a0b1c2d",
    "zones": [
      {
        "id": "5f1234567890abcdef123456",
        "name": "Pool Deck",
        "organisation_id": "22222222-2222-2222-2222-222222222222",
        "site_id": "11111111-1111-1111-1111-111111111111"
      }
    ],
    "external_id": "EXT-001",
    "user_id": "5f8a1b2c-9d3e-4a5b-8c6d-7e8f9a0b1c2d",
    "created_at": "2025-02-04T12:00:00+01:00",
    "updated_at": "2025-02-04T12:00:00+01:00"
  }
}

Changes