/api/v1/tenantGet tenant metadata
TenantMetadata
curl -X GET \
"https://api.lumbu.pt/api/v1/tenant" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/onboarding/checkCheck tenant setup completeness
Returns a structured readiness check for the tenant's salon setup. Validates services, staff, hours, locations, payments, branding, locale, and notification templates.
SetupCheckResult
curl -X GET \
"https://api.lumbu.pt/api/v1/onboarding/check" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/booking/packagesList active, currently bookable service packages
/api/v1/booking/slotsRetrieve available booking slots
SlotsRequest
curl -X POST \
"https://api.lumbu.pt/api/v1/booking/slots" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/booking/bookCreate a new booking
BookRequest
BookResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/booking/book" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/booking/cancelCancel an existing booking
CancelRequest
BookingCancellationResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/booking/cancel" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/booking/rescheduleReschedule a booking to a new time
RescheduleRequest
RescheduleResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/booking/reschedule" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/servicesList services
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| active | query | string | no | Filter by active status[true, false] |
| booking_enabled | query | string | no | Filter by booking-enabled flag[true, false] |
| updated_since | query | string (date-time) | no | Only return services updated on or after this timestamp |
PaginatedServiceList
curl -X GET \
"https://api.lumbu.pt/api/v1/services" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/service-categoriesList service categories with nested services
/api/v1/checkoutCreate a Stripe checkout session
CheckoutRequest
CheckoutResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/checkout" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/customer/appointmentsGet appointment detail and customer history
object
CustomerAppointmentsResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/customer/appointments" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staffList staff members
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| active | query | string | no | Filter by active status[true, false] |
| location_id | query | string (uuid) | no | Filter by location ID |
| updated_since | query | string (date-time) | no | Only return staff updated on or after this timestamp |
PaginatedStaffList
curl -X GET \
"https://api.lumbu.pt/api/v1/staff" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/team-membersList team member assignments
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| location_id | query | string (uuid) | no | Filter by location ID |
| staff_id | query | string (uuid) | no | Filter by staff ID |
| joined_since | query | string (date-time) | no | Only return memberships created on or after this timestamp |
PaginatedTeamMemberList
curl -X GET \
"https://api.lumbu.pt/api/v1/team-members" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-availabilityGet computed staff availability
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| from | query | string | yes | Start date (YYYY-MM-DD) |
| staff_id | query | string (uuid) | no | Filter by staff ID |
| days | query | integer | no | Number of days to look ahead |
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-availability" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-hoursList staff recurring weekly hours
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| staff_id | query | string (uuid) | no | Filter by staff ID |
| location_id | query | string (uuid) | no | Filter by location ID |
PaginatedStaffHoursList
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-hours" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-time-offList staff time-off periods
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| staff_id | query | string (uuid) | no | Filter by staff ID |
| location_id | query | string (uuid) | no | Filter by location ID |
| start_at_gte | query | string (date-time) | no | Filter time-off starting on or after this timestamp |
| start_at_lte | query | string (date-time) | no | Filter time-off starting on or before this timestamp |
PaginatedStaffTimeOffList
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-time-off" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/urlGet the tenant's canonical staff portal URL
Resolves the canonical hosted staff URL from the tenant bound to the tenant API key. It does not accept tenant IDs, template keys, hosts, or return URLs from the caller. A verified staff_portal domain is preferred; a verified primary domain falls back to its /staff route.
StaffPortalUrl
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/url" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/sessionGet the authenticated staff portal session
Verifies the tenant API key and staff portal token, then returns the server-scoped tenant/staff identity, explicit permission flags, and the tenant staff time-management approval policy.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalSession
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/session" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/session/loginLogin staff with email and password
Authenticates a staff member within the authenticated tenant and returns a Lumbu staff portal token plus staff session. Supabase user/session tokens and tenant/platform privileged operations are never returned.
StaffPortalLoginRequest
StaffPortalSessionAuthResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/staff-portal/session/login" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staff-portal/session/refreshRefresh a staff portal session token
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalSessionAuthResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/staff-portal/session/refresh" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/session/logoutRevoke a staff portal session token
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
OkResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/staff-portal/session/logout" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/dashboardGet the staff portal dashboard aggregate
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalDashboard
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/dashboard" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/scheduleGet my or salon staff schedule
Returns appointments plus schedule context for the authenticated staff member (`scope=mine`) or salon (`scope=salon`). Tenant and staff identity are resolved server-side; salon appointment contact fields are redacted unless the staff member has appointment-management permission.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| scope | query | string | no | —[mine, salon] |
| start_date | query | string (date) | yes | Start date (YYYY-MM-DD), maximum range 31 days |
| end_date | query | string (date) | no | End date (YYYY-MM-DD), defaults to start_date |
| target_staff_id | query | string (uuid) | no | Optional staff filter within the authenticated tenant |
StaffPortalSchedule
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/schedule" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/manager/salon-scheduleGet the manager salon schedule
Manager/admin-only salon schedule view with tenant-wide staff, appointments, client details, assigned staff, appointment state, and permissions-aware editing controls.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| start_date | query | string (date) | yes | — |
| end_date | query | string (date) | no | — |
| target_staff_id | query | string (uuid) | no | — |
StaffPortalSchedule
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/manager/salon-schedule" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/appointmentsList staff portal appointments
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| window | query | string | no | —[upcoming, past] |
| status | query | string | no | — |
| staff_id | query | string (uuid) | no | Manager-only staff filter; staff members may only request their own id. |
| limit | query | integer | no | — |
StaffPortalAppointmentListResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/appointments" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/appointments/upcomingList upcoming staff portal appointments
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| status | query | string | no | — |
| limit | query | integer | no | — |
StaffPortalAppointmentListResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/appointments/upcoming" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/appointments/pastList past staff portal appointments
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| status | query | string | no | — |
| limit | query | integer | no | — |
StaffPortalAppointmentListResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/appointments/past" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/appointments/{id}Update a staff portal appointment status
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
StaffPortalAppointmentUpdateRequest
StaffPortalAppointmentMutationResponse
curl -X PATCH \
"https://api.lumbu.pt/api/v1/staff-portal/appointments/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staff-portal/availabilityGet my weekly staff availability
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalAvailabilityResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/availability" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/availabilityReplace my weekly staff availability
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalAvailabilityUpdateRequest
StaffPortalAvailabilityUpdateResponse
curl -X PUT \
"https://api.lumbu.pt/api/v1/staff-portal/availability" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staff-portal/unavailabilityList my one-off unavailability blocks
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| start_at_gte | query | string (date-time) | no | — |
| start_at_lte | query | string (date-time) | no | — |
StaffPortalUnavailabilityListResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/unavailability" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/unavailabilityCreate a one-off unavailability block
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalUnavailabilityCreateRequest
StaffPortalUnavailabilityBlock
curl -X POST \
"https://api.lumbu.pt/api/v1/staff-portal/unavailability" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staff-portal/unavailability/{id}Delete my one-off unavailability block
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
OkResponse
curl -X DELETE \
"https://api.lumbu.pt/api/v1/staff-portal/unavailability/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/time-offList my time-off requests
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| status | query | string | no | —[pending, approved, rejected, cancelled] |
| start_at_gte | query | string (date-time) | no | — |
| start_at_lte | query | string (date-time) | no | — |
StaffPortalTimeOffListResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/time-off" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/time-offRequest time off
Creates a time-off request for the authenticated staff member. If the tenant approval policy is auto-approve, Lumbu also creates the matching staff_time_off availability block before returning the approved request.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalTimeOffCreateRequest
StaffPortalTimeOffRequest
curl -X POST \
"https://api.lumbu.pt/api/v1/staff-portal/time-off" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staff-portal/time-off/{id}Cancel my pending or approved time-off request
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
OkResponse
curl -X DELETE \
"https://api.lumbu.pt/api/v1/staff-portal/time-off/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/shift-swapsList my shift swap requests
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| status | query | string | no | — |
StaffPortalShiftSwapListResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/shift-swaps" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/shift-swapsRequest a shift swap
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalShiftSwapCreateRequest
StaffPortalShiftSwapMutationResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/staff-portal/shift-swaps" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staff-portal/shift-swaps/{id}Accept or decline a received shift swap
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
StaffPortalShiftSwapRespondRequest
StaffPortalShiftSwapMutationResponse
curl -X PATCH \
"https://api.lumbu.pt/api/v1/staff-portal/shift-swaps/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/staff-portal/shift-swaps/{id}Cancel a requested shift swap while it is pending
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
OkResponse
curl -X DELETE \
"https://api.lumbu.pt/api/v1/staff-portal/shift-swaps/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/approval-policyGet staff time-management approval policy
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalApprovalPolicy
curl -X GET \
"https://api.lumbu.pt/api/v1/staff-portal/approval-policy" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/staff-portal/approval-policyUpdate staff time-management approval policy
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
object
StaffPortalApprovalPolicy
curl -X PUT \
"https://api.lumbu.pt/api/v1/staff-portal/approval-policy" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/auth/signinSign in with email and password
SignInRequest
SignInResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/auth/signin" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/auth/signupCreate a new customer account
SignUpRequest
SignUpResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/auth/signup" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/auth/magic-linkSend a passwordless magic link email
MagicLinkRequest
OkResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/auth/magic-link" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/auth/refreshRefresh an authentication token
RefreshRequest
RefreshResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/auth/refresh" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/productsList products
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| active | query | string | no | Filter by active_for_sale status (defaults to true)[true, false] |
| category_id | query | string (uuid) | no | Filter by product category |
| updated_since | query | string (date-time) | no | Only return products updated on or after this timestamp |
PaginatedProductList
curl -X GET \
"https://api.lumbu.pt/api/v1/products" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/products/{id}Get product detail by ID or slug
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | yes | Product UUID or slug |
ProductDetail
curl -X GET \
"https://api.lumbu.pt/api/v1/products/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/product-categoriesList product categories with product counts
/api/v1/appointmentsList appointments
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| start_at_gte | query | string (date-time) | no | Filter appointments starting on or after this timestamp |
| start_at_lte | query | string (date-time) | no | Filter appointments starting on or before this timestamp |
| status | query | string | no | Filter by appointment status[requested, confirmed, cancelled, completed, no_show] |
| location_id | query | string (uuid) | no | Filter by location ID |
| staff_id | query | string (uuid) | no | Filter by staff ID |
| service_id | query | string (uuid) | no | Filter by service ID |
| updated_since | query | string (date-time) | no | Only return appointments updated on or after this timestamp |
PaginatedAppointmentList
curl -X GET \
"https://api.lumbu.pt/api/v1/appointments" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/appointment-feedbackList appointment feedback entries
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| appointment_id | query | string (uuid) | no | Filter by appointment ID |
| updated_since | query | string (date-time) | no | Only return feedback updated on or after this timestamp |
PaginatedFeedbackList
curl -X GET \
"https://api.lumbu.pt/api/v1/appointment-feedback" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/locationsList locations
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| is_active | query | string | no | Filter by active status[true, false] |
| updated_since | query | string (date-time) | no | Only return locations updated on or after this timestamp |
PaginatedLocationList
curl -X GET \
"https://api.lumbu.pt/api/v1/locations" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/waitlistList waitlist entries
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — | ||
| location_id | query | string (uuid) | no | Filter by location ID |
| service_id | query | string (uuid) | no | Filter by service ID |
| staff_id | query | string (uuid) | no | Filter by staff ID |
| created_at_gte | query | string (date-time) | no | Filter entries created on or after this timestamp |
| created_at_lte | query | string (date-time) | no | Filter entries created on or before this timestamp |
PaginatedWaitlistList
curl -X GET \
"https://api.lumbu.pt/api/v1/waitlist" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/gift-cards/validateValidate a gift card code
object
GiftCardValidationResponse
curl -X POST \
"https://api.lumbu.pt/api/v1/gift-cards/validate" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/referral/validateValidate a referral code format
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| code | query | string | yes | Referral code to validate (alphanumeric, 3-50 chars, hyphens/underscores allowed) |
ReferralValidationResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/referral/validate" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v1/orders/lookupLook up an order by session ID or access token
OrderLookupRequest
Order
curl -X POST \
"https://api.lumbu.pt/api/v1/orders/lookup" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/webhooksList webhook subscriptions
/api/v1/webhooksRegister a new webhook subscription
CreateWebhookRequest
WebhookSubscriptionCreated
curl -X POST \
"https://api.lumbu.pt/api/v1/webhooks" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/webhooks/{id}Delete a webhook subscription
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string (uuid) | yes | Webhook subscription ID |
OkResponse
curl -X DELETE \
"https://api.lumbu.pt/api/v1/webhooks/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"