Practitioners

Create a practitioner

Creates a new Practitioner attached to one or more sites. The minimum body is name + site_ids; everything else has a sensible default or null-equivalent. Returns the freshly created practitioner.

The first entry in site_ids becomes the practitioner's "default" site — zones, commission packages, and the user-uniqueness check are evaluated against this site. The practitioner's timezone is inherited from the default site at creation time.

Requires the SETTINGS_MANAGE permission on every site listed in site_ids.

post/shop/practitioners

Query parameters

site_idstring required

Filter results by the site they belong to

Request body

namestring required

Display name of the practitioner shown to customers in the booking flow and to staff in the admin UI.

site_idsstring[] required

One or more site IDs the practitioner works at. Must contain at least one site; the first entry becomes the practitioner's "default" site for zone- and commission-package lookups. The caller's user must be a member of every site listed.

organisation_idstring uuid

Optional organisation to attribute this practitioner to. The caller's user must belong to the organisation. Defaults to the caller's primary organisation when omitted.

tag_idsstring[]

IDs of practitioner tags this person is associated with. Tags must already exist in the caller's primary organisation AND be marked applies_to: Practitioner — others are rejected with 422.

avatar_idstring object-id nullable

ID of an uploaded Media to use as the practitioner's avatar. Shown next to the practitioner's name in the booking widget and admin UI.

signature_idstring object-id nullable

ID of an uploaded Media to use as the practitioner's signature image. Shown on documents and receipts that require a practitioner signature.

zone_idsstring[]

IDs of zones the practitioner is associated with. Zones must belong to the first site in site_ids — zones from other sites are rejected with 422.

gender'male' | 'female' | 'non_binary' nullable

Optional gender used by the booking flow to honour customer preferences (e.g. "I'd prefer a female therapist").

registration_numberstring nullable

Optional registration or license number for the practitioner. Used to track professional credentials or qualifications.

external_idstring nullable

Optional external identifier for correlating this practitioner with a record in a third-party system.

commission_package_idstring object-id nullable

Optional CommissionPackage to attach to the practitioner. Drives payroll/commission reporting. Must belong to the first site in site_ids.

user_idstring uuid nullable

Optional underlying User to link to this practitioner. The user must share an organisation with the caller. A given user can be linked to at most one practitioner per site — attempting to reuse a user on the same site is rejected with 422.

Example request

{
  "name": "Jane Doe",
  "site_ids": [
    "6f1234567890abcdef123456"
  ],
  "avatar_id": "5f1234567890abcdef123456",
  "registration_number": "REG123456",
  "external_id": "EXT-001"
}

Response

The practitioner was created.

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