API referenceBookings

Bookings

16 operations. Every schema and example on this page is generated from the platform contract.

A store's bookable services.

Every service the store offers, each with its variants and add-ons. Scoped to the authenticated store; archived services are excluded unless asked for.

Parameters

store_idstring · uuidqueryrequired

The store whose catalogue to read (must be the authenticated store).

include_archivedbooleanqueryoptional

Include archived services. Defaults to active only.

Response, 200

servicesarray of objectrequired
22 child fields
idstringrequired
store_idstringrequired
categorystring, nullablerequired
namestringrequired
descriptionstring, nullablerequired
imagesarray of stringrequired

Image URLs the merchant uploaded for this service.

duration_minnumberrequired
price_pencenumberrequired
currencystringrequired
price_typeenumrequired
fixedfromper_person
party_minnumberrequired
party_maxnumberrequired
buffer_before_minnumberrequired
buffer_after_minnumberrequired
processing_minnumberrequired
location_typeenumrequired
on_premisesonlinecustomer_site
rebook_interval_daysnumber, nullablerequired
online_visiblebooleanrequired
sortnumberrequired
is_activebooleanrequired
variantsarray of objectrequired

Pricing/duration variants for this service.

6 child fields
idstringrequired
namestringrequired
duration_minnumber, nullablerequired
price_pencenumber, nullablerequired
sortnumberrequired
is_activebooleanrequired
addonsarray of objectrequired

Optional paid add-ons that extend this service.

6 child fields
idstringrequired
namestringrequired
extra_minnumberrequired
extra_pencenumberrequired
sortnumberrequired
is_activebooleanrequired
curl -G "https://www.membber.com/api/v1/bookings/services" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "services": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "store_id": "6659c139-0000-4000-8000-d0c500000066",
      "category": "<category>",
      "name": "Example name",
      "description": "Added at the front desk",
      "images": [
        "<image>"
      ],
      "duration_min": 1,
      "price_pence": 1500,
      "currency": "GBP",
      "price_type": "fixed",
      "party_min": 1,
      "party_max": 1,
      "buffer_before_min": 1,
      "buffer_after_min": 1,
      "processing_min": 1,
      "location_type": "on_premises",
      "rebook_interval_days": 1,
      "online_visible": true,
      "sort": 1,
      "is_active": true,
      "variants": [
        {
          "id": "00000d1b-0000-4000-8000-d0c500000000",
          "name": "Example name",
          "duration_min": 1,
          "price_pence": 1500,
          "sort": 1,
          "is_active": true
        }
      ],
      "addons": [
        {
          "id": "00000d1b-0000-4000-8000-d0c500000000",
          "name": "Example name",
          "extra_min": 1,
          "extra_pence": 1500,
          "sort": 1,
          "is_active": true
        }
      ]
    }
  ]
}

Create a bookable service.

Adds a service to the authenticated store. Send a `client_token` to make the create idempotent, a retry with the same token returns the same service rather than a duplicate.

Request body

store_idstring · uuidrequired
client_tokenstringoptional

Caller-generated idempotency key. Send the same token on a retry to get the SAME service back instead of a duplicate.

categorystring, nullableoptional
namestringrequired

What the customer books.

descriptionstring, nullableoptional
imagesarray of string · urioptional

Uploaded image URLs.

duration_minintegerrequired

Appointment length in minutes.

price_penceintegeroptional

Price in the smallest currency unit.

currencystringoptional
price_typeenumoptional

'fixed' | 'from' | 'per_person'.

fixedfromper_person
party_minintegeroptional
party_maxintegeroptional
deposit_policyobjectoptional

Deposit policy JSON. WRITABLE but INERT until the money stage, no charge is wired from it here.

buffer_before_minintegeroptional

Prep time the unit is occupied before.

buffer_after_minintegeroptional

Clean-up time the unit is occupied after.

processing_minintegeroptional
location_typeenumoptional
on_premisesonlinecustomer_site
rebook_interval_daysinteger, nullableoptional
online_visiblebooleanoptional

Whether customers can see and book this online.

sortintegeroptional

Response, 200

serviceobjectrequired
22 child fields
idstringrequired
store_idstringrequired
categorystring, nullablerequired
namestringrequired
descriptionstring, nullablerequired
imagesarray of stringrequired

Image URLs the merchant uploaded for this service.

duration_minnumberrequired
price_pencenumberrequired
currencystringrequired
price_typeenumrequired
fixedfromper_person
party_minnumberrequired
party_maxnumberrequired
buffer_before_minnumberrequired
buffer_after_minnumberrequired
processing_minnumberrequired
location_typeenumrequired
on_premisesonlinecustomer_site
rebook_interval_daysnumber, nullablerequired
online_visiblebooleanrequired
sortnumberrequired
is_activebooleanrequired
variantsarray of objectrequired

Pricing/duration variants for this service.

6 child fields
idstringrequired
namestringrequired
duration_minnumber, nullablerequired
price_pencenumber, nullablerequired
sortnumberrequired
is_activebooleanrequired
addonsarray of objectrequired

Optional paid add-ons that extend this service.

6 child fields
idstringrequired
namestringrequired
extra_minnumberrequired
extra_pencenumberrequired
sortnumberrequired
is_activebooleanrequired
curl -X POST "https://www.membber.com/api/v1/bookings/services" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name",
    "duration_min": 1
  }'
Response, 200
{
  "service": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "category": "<category>",
    "name": "Example name",
    "description": "Added at the front desk",
    "images": [
      "<image>"
    ],
    "duration_min": 1,
    "price_pence": 1500,
    "currency": "GBP",
    "price_type": "fixed",
    "party_min": 1,
    "party_max": 1,
    "buffer_before_min": 1,
    "buffer_after_min": 1,
    "processing_min": 1,
    "location_type": "on_premises",
    "rebook_interval_days": 1,
    "online_visible": true,
    "sort": 1,
    "is_active": true,
    "variants": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "name": "Example name",
        "duration_min": 1,
        "price_pence": 1500,
        "sort": 1,
        "is_active": true
      }
    ],
    "addons": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "name": "Example name",
        "extra_min": 1,
        "extra_pence": 1500,
        "sort": 1,
        "is_active": true
      }
    ]
  }
}

Update a service.

Partial update of a service the authenticated store owns. A price or duration change shapes FUTURE availability only, a booked appointment keeps the price and policy it was snapshotted with.

Parameters

serviceIdstringpathrequired

Request body

store_idstring · uuidrequired
categorystring, nullableoptional
namestringoptional

What the customer books.

descriptionstring, nullableoptional
imagesarray of string · urioptional

Uploaded image URLs.

duration_minintegeroptional

Appointment length in minutes.

price_penceintegeroptional

Price in the smallest currency unit.

currencystringoptional
price_typeenumoptional

'fixed' | 'from' | 'per_person'.

fixedfromper_person
party_minintegeroptional
party_maxintegeroptional
deposit_policyobjectoptional

Deposit policy JSON. WRITABLE but INERT until the money stage, no charge is wired from it here.

buffer_before_minintegeroptional

Prep time the unit is occupied before.

buffer_after_minintegeroptional

Clean-up time the unit is occupied after.

processing_minintegeroptional
location_typeenumoptional
on_premisesonlinecustomer_site
rebook_interval_daysinteger, nullableoptional
online_visiblebooleanoptional

Whether customers can see and book this online.

sortintegeroptional

Response, 200

serviceobjectrequired
22 child fields
idstringrequired
store_idstringrequired
categorystring, nullablerequired
namestringrequired
descriptionstring, nullablerequired
imagesarray of stringrequired

Image URLs the merchant uploaded for this service.

duration_minnumberrequired
price_pencenumberrequired
currencystringrequired
price_typeenumrequired
fixedfromper_person
party_minnumberrequired
party_maxnumberrequired
buffer_before_minnumberrequired
buffer_after_minnumberrequired
processing_minnumberrequired
location_typeenumrequired
on_premisesonlinecustomer_site
rebook_interval_daysnumber, nullablerequired
online_visiblebooleanrequired
sortnumberrequired
is_activebooleanrequired
variantsarray of objectrequired

Pricing/duration variants for this service.

6 child fields
idstringrequired
namestringrequired
duration_minnumber, nullablerequired
price_pencenumber, nullablerequired
sortnumberrequired
is_activebooleanrequired
addonsarray of objectrequired

Optional paid add-ons that extend this service.

6 child fields
idstringrequired
namestringrequired
extra_minnumberrequired
extra_pencenumberrequired
sortnumberrequired
is_activebooleanrequired
curl -X PATCH "https://www.membber.com/api/v1/bookings/services/f46cf6b0-0000-4000-8000-d0c5000000f4" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "service": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "category": "<category>",
    "name": "Example name",
    "description": "Added at the front desk",
    "images": [
      "<image>"
    ],
    "duration_min": 1,
    "price_pence": 1500,
    "currency": "GBP",
    "price_type": "fixed",
    "party_min": 1,
    "party_max": 1,
    "buffer_before_min": 1,
    "buffer_after_min": 1,
    "processing_min": 1,
    "location_type": "on_premises",
    "rebook_interval_days": 1,
    "online_visible": true,
    "sort": 1,
    "is_active": true,
    "variants": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "name": "Example name",
        "duration_min": 1,
        "price_pence": 1500,
        "sort": 1,
        "is_active": true
      }
    ],
    "addons": [
      {
        "id": "00000d1b-0000-4000-8000-d0c500000000",
        "name": "Example name",
        "extra_min": 1,
        "extra_pence": 1500,
        "sort": 1,
        "is_active": true
      }
    ]
  }
}

Add a service add-on.

Adds an add-on to a service the authenticated store owns. Idempotent per `client_token`.

Parameters

serviceIdstringpathrequired

Request body

store_idstring · uuidrequired
client_tokenstringoptional

Caller-generated idempotency key. Send the same token on a retry to get the SAME service back instead of a duplicate.

namestringrequired
extra_minintegeroptional

Extra minutes this add-on adds to the appointment.

extra_penceintegeroptional

Extra charge in the smallest currency unit (INERT until the money stage).

sortintegeroptional

Response, 200

addonobjectrequired
6 child fields
idstringrequired
namestringrequired
extra_minnumberrequired
extra_pencenumberrequired
sortnumberrequired
is_activebooleanrequired
curl -X POST "https://www.membber.com/api/v1/bookings/services/f46cf6b0-0000-4000-8000-d0c5000000f4/addons" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name"
  }'
Response, 200
{
  "addon": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "name": "Example name",
    "extra_min": 1,
    "extra_pence": 1500,
    "sort": 1,
    "is_active": true
  }
}

Update or archive a service add-on.

Partial update of an add-on belonging to a service the authenticated store owns.

Parameters

serviceIdstringpathrequired
addonIdstringpathrequired

Request body

store_idstring · uuidrequired
namestringoptional
extra_minintegeroptional
extra_penceintegeroptional
sortintegeroptional
is_activebooleanoptional

Set false to archive this add-on.

Response, 200

addonobjectrequired
6 child fields
idstringrequired
namestringrequired
extra_minnumberrequired
extra_pencenumberrequired
sortnumberrequired
is_activebooleanrequired
curl -X PATCH "https://www.membber.com/api/v1/bookings/services/f46cf6b0-0000-4000-8000-d0c5000000f4/addons/bb965b7b-0000-4000-8000-d0c5000000bb" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "addon": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "name": "Example name",
    "extra_min": 1,
    "extra_pence": 1500,
    "sort": 1,
    "is_active": true
  }
}

Archive a service (honouring existing bookings).

Sets the service inactive so it stops appearing in availability, but NEVER deletes it, every existing appointment keeps its snapshotted price/duration and its link to the service. Idempotent.

Parameters

serviceIdstringpathrequired

Request body

store_idstring · uuidrequired

Response, 200

service_idstringrequired
archivedbooleanrequired

true once inactive (idempotent, archiving twice is a no-op).

curl -X POST "https://www.membber.com/api/v1/bookings/services/f46cf6b0-0000-4000-8000-d0c5000000f4/archive" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "service_id": "993232e5-0000-4000-8000-d0c500000099",
  "archived": true
}

Add a service variant.

Adds a variant to a service the authenticated store owns. Idempotent per `client_token`.

Parameters

serviceIdstringpathrequired

Request body

store_idstring · uuidrequired
client_tokenstringoptional

Caller-generated idempotency key. Send the same token on a retry to get the SAME service back instead of a duplicate.

namestringrequired
duration_mininteger, nullableoptional

Overrides the service duration for this variant.

price_penceinteger, nullableoptional
sortintegeroptional

Response, 200

variantobjectrequired
6 child fields
idstringrequired
namestringrequired
duration_minnumber, nullablerequired
price_pencenumber, nullablerequired
sortnumberrequired
is_activebooleanrequired
curl -X POST "https://www.membber.com/api/v1/bookings/services/f46cf6b0-0000-4000-8000-d0c5000000f4/variants" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "name": "Example name"
  }'
Response, 200
{
  "variant": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "name": "Example name",
    "duration_min": 1,
    "price_pence": 1500,
    "sort": 1,
    "is_active": true
  }
}

Update or archive a service variant.

Partial update of a variant belonging to a service the authenticated store owns.

Parameters

serviceIdstringpathrequired
variantIdstringpathrequired

Request body

store_idstring · uuidrequired
namestringoptional
duration_mininteger, nullableoptional
price_penceinteger, nullableoptional
sortintegeroptional
is_activebooleanoptional

Set false to archive this variant.

Response, 200

variantobjectrequired
6 child fields
idstringrequired
namestringrequired
duration_minnumber, nullablerequired
price_pencenumber, nullablerequired
sortnumberrequired
is_activebooleanrequired
curl -X PATCH "https://www.membber.com/api/v1/bookings/services/f46cf6b0-0000-4000-8000-d0c5000000f4/variants/fb1b0c80-0000-4000-8000-d0c5000000fb" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "variant": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "name": "Example name",
    "duration_min": 1,
    "price_pence": 1500,
    "sort": 1,
    "is_active": true
  }
}

Set the store timezone.

Writes `stores.timezone` after validating it is a real IANA timezone. This is the anchor every day boundary, hour label and rollup in the bookings vertical reads, so an invalid value is refused rather than silently skewing a diary. Idempotent.

Request body

store_idstring · uuidrequired
timezonestringrequired

An IANA timezone name, e.g. "Europe/London". Validated against the runtime before it is written.

Response, 200

store_idstringrequired
timezonestringrequired
curl -X PUT "https://www.membber.com/api/v1/bookings/store-timezone" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "timezone": "Europe/London"
  }'
Response, 200
{
  "store_id": "6659c139-0000-4000-8000-d0c500000066",
  "timezone": "Europe/London"
}

A store's bookable units.

Every bookable unit for the authenticated store, each carrying which services it offers. Archived units excluded unless asked for.

Parameters

store_idstring · uuidqueryrequired
include_archivedbooleanqueryoptional

Response, 200

unitsarray of objectrequired
14 child fields
idstringrequired
store_idstringrequired
kindenumrequired
personspaceasset
unit_typestring, nullablerequired

Free-text sub-type (e.g. "chair", "room").

user_idstring, nullablerequired

The staff member this unit represents, when kind = person.

display_namestringrequired
biostring, nullablerequired
photo_urlstring, nullablerequired
colourstring, nullablerequired

Diary column colour.

bookablebooleanrequired

Whether the unit can hold appointments at all.

online_bookablebooleanrequired

Whether customers can book it online (vs staff-only).

sortnumberrequired
is_activebooleanrequired
servicesarray of objectrequired

Which services this unit offers, with any per-unit overrides.

3 child fields
service_idstringrequired
duration_override_minnumber, nullablerequired
price_override_pencenumber, nullablerequired
curl -G "https://www.membber.com/api/v1/bookings/units" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "units": [
    {
      "id": "00000d1b-0000-4000-8000-d0c500000000",
      "store_id": "6659c139-0000-4000-8000-d0c500000066",
      "kind": "person",
      "unit_type": "<unit_type>",
      "user_id": "f73aee0f-0000-4000-8000-d0c5000000f7",
      "display_name": "<display_name>",
      "bio": "<bio>",
      "photo_url": "https://example.com/image.jpg",
      "colour": "<colour>",
      "bookable": true,
      "online_bookable": true,
      "sort": 1,
      "is_active": true,
      "services": [
        {
          "service_id": "993232e5-0000-4000-8000-d0c500000099",
          "duration_override_min": 1,
          "price_override_pence": 1500
        }
      ]
    }
  ]
}

Create a bookable unit.

Adds a person / space / asset to the authenticated store. Idempotent per `client_token`.

Request body

store_idstring · uuidrequired
client_tokenstringoptional

Caller-generated idempotency key, a retry with the same token returns the SAME unit, never a duplicate.

kindenumoptional

'person' | 'space' | 'asset'. Defaults to 'person'.

personspaceasset
unit_typestring, nullableoptional
user_idstring · uuid, nullableoptional

Only permitted when kind = person (the DB enforces this).

display_namestringrequired

What the diary column is labelled.

biostring, nullableoptional
photo_urlstring · uri, nullableoptional
colourstring, nullableoptional
bookablebooleanoptional
online_bookablebooleanoptional
sortintegeroptional

Response, 200

unitobjectrequired
14 child fields
idstringrequired
store_idstringrequired
kindenumrequired
personspaceasset
unit_typestring, nullablerequired

Free-text sub-type (e.g. "chair", "room").

user_idstring, nullablerequired

The staff member this unit represents, when kind = person.

display_namestringrequired
biostring, nullablerequired
photo_urlstring, nullablerequired
colourstring, nullablerequired

Diary column colour.

bookablebooleanrequired

Whether the unit can hold appointments at all.

online_bookablebooleanrequired

Whether customers can book it online (vs staff-only).

sortnumberrequired
is_activebooleanrequired
servicesarray of objectrequired

Which services this unit offers, with any per-unit overrides.

3 child fields
service_idstringrequired
duration_override_minnumber, nullablerequired
price_override_pencenumber, nullablerequired
curl -X POST "https://www.membber.com/api/v1/bookings/units" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "display_name": "<display_name>"
  }'
Response, 200
{
  "unit": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "kind": "person",
    "unit_type": "<unit_type>",
    "user_id": "f73aee0f-0000-4000-8000-d0c5000000f7",
    "display_name": "<display_name>",
    "bio": "<bio>",
    "photo_url": "https://example.com/image.jpg",
    "colour": "<colour>",
    "bookable": true,
    "online_bookable": true,
    "sort": 1,
    "is_active": true,
    "services": [
      {
        "service_id": "993232e5-0000-4000-8000-d0c500000099",
        "duration_override_min": 1,
        "price_override_pence": 1500
      }
    ]
  }
}

Update or archive a bookable unit.

Partial update of a unit the authenticated store owns. Archiving (is_active=false) keeps existing appointments intact.

Parameters

unitIdstringpathrequired

Request body

store_idstring · uuidrequired
kindenumoptional

'person' | 'space' | 'asset'. Defaults to 'person'.

personspaceasset
unit_typestring, nullableoptional
user_idstring · uuid, nullableoptional

Only permitted when kind = person (the DB enforces this).

display_namestringoptional

What the diary column is labelled.

biostring, nullableoptional
photo_urlstring · uri, nullableoptional
colourstring, nullableoptional
bookablebooleanoptional
online_bookablebooleanoptional
sortintegeroptional
is_activebooleanoptional

Set false to archive the unit (existing appointments are honoured).

Response, 200

unitobjectrequired
14 child fields
idstringrequired
store_idstringrequired
kindenumrequired
personspaceasset
unit_typestring, nullablerequired

Free-text sub-type (e.g. "chair", "room").

user_idstring, nullablerequired

The staff member this unit represents, when kind = person.

display_namestringrequired
biostring, nullablerequired
photo_urlstring, nullablerequired
colourstring, nullablerequired

Diary column colour.

bookablebooleanrequired

Whether the unit can hold appointments at all.

online_bookablebooleanrequired

Whether customers can book it online (vs staff-only).

sortnumberrequired
is_activebooleanrequired
servicesarray of objectrequired

Which services this unit offers, with any per-unit overrides.

3 child fields
service_idstringrequired
duration_override_minnumber, nullablerequired
price_override_pencenumber, nullablerequired
curl -X PATCH "https://www.membber.com/api/v1/bookings/units/cde691bf-0000-4000-8000-d0c5000000cd" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066"
  }'
Response, 200
{
  "unit": {
    "id": "00000d1b-0000-4000-8000-d0c500000000",
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "kind": "person",
    "unit_type": "<unit_type>",
    "user_id": "f73aee0f-0000-4000-8000-d0c5000000f7",
    "display_name": "<display_name>",
    "bio": "<bio>",
    "photo_url": "https://example.com/image.jpg",
    "colour": "<colour>",
    "bookable": true,
    "online_bookable": true,
    "sort": 1,
    "is_active": true,
    "services": [
      {
        "service_id": "993232e5-0000-4000-8000-d0c500000099",
        "duration_override_min": 1,
        "price_override_pence": 1500
      }
    ]
  }
}

Map a service onto a unit.

Records that a unit offers a service (with optional per-unit duration/price overrides). Upsert on the (unit, service) pair, so it is idempotent, re-sending it converges rather than duplicating. Both the unit and the service must belong to the authenticated store.

Parameters

unitIdstringpathrequired

Request body

store_idstring · uuidrequired
service_idstring · uuidrequired

The service this unit should offer (must belong to the same store).

duration_override_mininteger, nullableoptional

Per-unit duration override.

price_override_penceinteger, nullableoptional

Per-unit price override.

Response, 200

unit_idstringrequired
service_idstringrequired
curl -X POST "https://www.membber.com/api/v1/bookings/units/cde691bf-0000-4000-8000-d0c5000000cd/services" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "service_id": "993232e5-0000-4000-8000-d0c500000099"
  }'
Response, 200
{
  "unit_id": "eeebf9b6-0000-4000-8000-d0c5000000ee",
  "service_id": "993232e5-0000-4000-8000-d0c500000099"
}

Unmap a service from a unit.

Removes the (unit, service) mapping. Idempotent, removing one that is already gone is a no-op.

Parameters

unitIdstringpathrequired
serviceIdstringpathrequired
store_idstring · uuidqueryrequired

Response, 200

unit_idstringrequired
service_idstringrequired
removedbooleanrequired

false when there was nothing to remove (idempotent).

curl -X DELETE "https://www.membber.com/api/v1/bookings/units/cde691bf-0000-4000-8000-d0c5000000cd/services/f46cf6b0-0000-4000-8000-d0c5000000f4?store_id=6659c139-0000-4000-8000-d0c500000066" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678"
Response, 200
{
  "unit_id": "eeebf9b6-0000-4000-8000-d0c5000000ee",
  "service_id": "993232e5-0000-4000-8000-d0c500000099",
  "removed": true
}

A unit's working pattern.

The working intervals for a unit the authenticated store owns. Multiple rows for one weekday ARE the intervals; the gaps ARE the breaks.

auth merchant:readop listUnitWorkingPatternsrate limitederrors

Parameters

unitIdstringpathrequired
store_idstring · uuidqueryrequired

Response, 200

unit_idstringrequired
patternsarray of objectrequired
7 child fields
weekdayintegerrequired

0 = Sunday … 6 = Saturday.

start_minuteintegerrequired

Minutes past midnight the interval starts.

end_minuteintegerrequired

Minutes past midnight the interval ends (must be after start).

spans_midnightbooleanoptional

True for an interval that runs past midnight.

effective_fromstring, nullableoptional

YYYY-MM-DD the interval starts applying (null = always).

effective_tostring, nullableoptional

YYYY-MM-DD the interval stops applying (null = open-ended).

idstringrequired
curl -G "https://www.membber.com/api/v1/bookings/units/cde691bf-0000-4000-8000-d0c5000000cd/working-patterns" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  --data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"
Response, 200
{
  "unit_id": "eeebf9b6-0000-4000-8000-d0c5000000ee",
  "patterns": [
    {
      "weekday": 0,
      "start_minute": 0,
      "end_minute": 1,
      "spans_midnight": true,
      "effective_from": "<effective_from>",
      "effective_to": "<effective_to>",
      "id": "00000d1b-0000-4000-8000-d0c500000000"
    }
  ]
}

Replace a unit's working pattern.

Swaps the unit's ENTIRE working pattern for the set you send, atomically (the old rows and the new ones never coexist, and a half-applied pattern is impossible). Idempotent, replacing with the same set converges. The unit must belong to the authenticated store.

Parameters

unitIdstringpathrequired

Request body

store_idstring · uuidrequired
patternsarray of objectrequired

The COMPLETE new set of intervals for this unit. Send an empty array to clear the pattern.

6 child fields
weekdayintegerrequired

0 = Sunday … 6 = Saturday.

start_minuteintegerrequired

Minutes past midnight the interval starts.

end_minuteintegerrequired

Minutes past midnight the interval ends (must be after start).

spans_midnightbooleanoptional

True for an interval that runs past midnight.

effective_fromstring, nullableoptional

YYYY-MM-DD the interval starts applying (null = always).

effective_tostring, nullableoptional

YYYY-MM-DD the interval stops applying (null = open-ended).

Response, 200

unit_idstringrequired
patternsarray of objectrequired
7 child fields
weekdayintegerrequired

0 = Sunday … 6 = Saturday.

start_minuteintegerrequired

Minutes past midnight the interval starts.

end_minuteintegerrequired

Minutes past midnight the interval ends (must be after start).

spans_midnightbooleanoptional

True for an interval that runs past midnight.

effective_fromstring, nullableoptional

YYYY-MM-DD the interval starts applying (null = always).

effective_tostring, nullableoptional

YYYY-MM-DD the interval stops applying (null = open-ended).

idstringrequired
curl -X PUT "https://www.membber.com/api/v1/bookings/units/cde691bf-0000-4000-8000-d0c5000000cd/working-patterns" \
  -H "Authorization: Bearer $MEMBBER_TOKEN" \
  -H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "6659c139-0000-4000-8000-d0c500000066",
    "patterns": [
      {
        "weekday": 0,
        "start_minute": 0,
        "end_minute": 1
      }
    ]
  }'
Response, 200
{
  "unit_id": "eeebf9b6-0000-4000-8000-d0c5000000ee",
  "patterns": [
    {
      "weekday": 0,
      "start_minute": 0,
      "end_minute": 1,
      "spans_midnight": true,
      "effective_from": "<effective_from>",
      "effective_to": "<effective_to>",
      "id": "00000d1b-0000-4000-8000-d0c500000000"
    }
  ]
}
WhatsApp
Book a Call
Start Free