Skip to main content
Staffify Docs
Updated

Services

The service catalog powers Advanced Booking. Each service is a bookable template (duration, price, color, team members). Public booking widgets, calendar integrations and the tenant admin UI all read this list.

Endpoints

PathRequired scope
GET /servicesbookings.services.read
GET /services/:idbookings.services.read
POST /servicesbookings.services.write
PATCH /services/:idbookings.services.write
DELETE /services/:idbookings.services.write

DELETE performs a soft-deactivate (sets active=false). Hard delete is blocked because existing bookings reference the service. To restore a service, PATCH it with { "active": true }.

List filters

  • active=true or active=false — hide/show inactive services
  • limit — 1-100, default 50
  • starting_after — cursor from next_cursor of previous page

Create a service

Required: name + duration_minutes. Everything else is optional with sensible defaults.

curl -X POST https://app.staffifyai.com/api/workspace/v1/services \
  -H "Authorization: Bearer $STAFFIFY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Standard installation",
    "duration_minutes": 60,
    "buffer_minutes": 15,
    "price": "149.00",
    "price_includes_vat": true,
    "color": "#F97316",
    "team_member_ids": [12, 15]
  }'

Fields

FieldTypeDescription
idintegerPrimary key
namestringDisplay name shown in booking flows
descriptionstringOptional long description
duration_minutesintegerSlot length. 5-480 minutes.
buffer_minutesintegerPost-service buffer (0-240 min)
pricestringDecimal string, e.g. "49.95". Null = free.
price_is_frombooleanIf true, UI shows "from €49.95" (indicative pricing)
price_includes_vatbooleantrue = gross price. false = net (VAT added on top). Default false.
currencystringISO-4217 code (default EUR)
colorstringHex color used in calendars/widgets
activebooleanfalse = hidden from booking flows. DELETE sets this to false.
sort_orderintegerLower = earlier in catalog
require_photosbooleanPrompt for photos on booking
require_postcode_checkbooleanPrompt for postcode gating
custom_fieldsobjectFree-form JSON for integration metadata
payment_modeenum('inherit','none','deposit','full')Per-service override of tenant-default payment behavior
deposit_amount_overridestringDecimal string. Interpreted per deposit_type_override.
deposit_type_overrideenum('fixed','percentage')How deposit_amount_override is interpreted
team_member_idsinteger[]Which team members can be booked for this service
created_atstring(ISO)When the service was created
updated_atstring(ISO)Last modification

Webhook events

  • service.created — new service added
  • service.updated — any field change
  • service.deactivated — DELETE call completed
Services - Workspace API - Staffify