/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. The ready result is authoritative when services, staff, staff hours, staff-service links, locations, and business hours all pass. Payment, branding, locale, and notification checks are informational only.
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| commercial_offer_key | query | string | no | Selects the typed Ukembu hair-therapy offer representation for its configured package. Omit this parameter to preserve the generic package response. |
curl -X GET \
"https://api.lumbu.pt/api/v1/booking/packages" \
-H "Authorization: Bearer {YOUR_API_KEY}"/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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
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] |
| classification | query | string | no | Filter by canonical structured service classification[hair_evaluation, hair_therapy_session, hair_therapy_programme, head_spa, braids, other_hair_service, other] |
| 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/appointmentsList appointments for the signed-in customer
Uses the tenant-scoped customer session cookie. The browser can load this list independently after the profile shell renders.
CustomerAppointmentListResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/customer/appointments" \
-H "Authorization: Bearer {YOUR_API_KEY}"/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/v2/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/v2/staff-portal/url" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/sessionGet the authenticated staff portal session
Verifies the tenant API key and opaque staff adapter session, 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/v2/staff-portal/session" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/session/logoutRevoke an opaque staff adapter session
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
OkResponse
curl -X POST \
"https://api.lumbu.pt/api/v2/staff-portal/session/logout" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/dashboardGet the staff portal dashboard aggregate
Returns today and next appointments, alerts, and the approval policy. It does not include earnings, commissions, sales, or targets.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalDashboard
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/dashboard" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/schedule" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/manager/salon-schedule" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/appointments" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/appointmentsCreate a staff portal appointment
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalAppointmentCreateRequest
StaffPortalAppointmentCreateResponse
curl -X POST \
"https://api.lumbu.pt/api/v2/staff-portal/appointments" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/booking-optionsList bookable services for a staff member
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| staff_id | query | string (uuid) | no | Manager-only target staff member. Defaults to the authenticated staff member. |
StaffPortalBookingOptionsResponse
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/booking-options" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/active-servicesList active bookable services for the salon team
Lists active bookable services assigned to at least one active team member. Requires team appointment management permission.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalActiveServicesResponse
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/active-services" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/customersSearch or inspect Customer 360 records
Searches customers within the authenticated staff member's permitted team scope. Pass customer_key to load one profile. Generic results exclude Care Vault and other protected health or sensitive history.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| q | query | string | no | Search by customer name, phone, or email |
| customer_key | query | string | no | Exact customer email or opaque anonymous customer key |
| limit | query | integer | no | — |
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/customers" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/customers/notesAdd an internal customer note
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — |
object
curl -X POST \
"https://api.lumbu.pt/api/v2/staff-portal/customers/notes" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/customers/notes/{id}Update an internal customer note
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
| string | no | — |
object
curl -X PATCH \
"https://api.lumbu.pt/api/v2/staff-portal/customers/notes/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/customers/notes/{id}Delete an internal customer note
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
| string | no | — |
curl -X DELETE \
"https://api.lumbu.pt/api/v2/staff-portal/customers/notes/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/catalog/servicesList canonical services, prices, variants, and booking compatibility
Scope defaults to the authenticated professional. Team scope requires team appointment permission.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| scope | query | string | no | —[mine, team] |
| service_id | query | string (uuid) | no | — |
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/catalog/services" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/catalog/availabilityCalculate real available slots for a service
Read-only availability calculation using canonical shifts, breaks, time off, appointments, buffers, variants, and tenant rules.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
object
curl -X POST \
"https://api.lumbu.pt/api/v2/staff-portal/catalog/availability" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/inventoryList read-only staff inventory visibility
Returns product, brand, category, SKU, location placeholder, quantity, and low-stock state. Cost and wholesale data are never returned.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| q | query | string | no | — |
| limit | query | integer | no | — |
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/inventory" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/performanceGet personal operational performance metrics
Returns only the authenticated staff member's metrics. Revenue, earnings, commission, tips, and team-wide data are excluded.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| start | query | string (date) | no | — |
| end | query | string (date) | no | — |
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/performance" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/appointments/upcoming" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/appointments/past" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/follow-upsList my pending client follow-ups
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/follow-ups" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/follow-upsCreate an idempotent client follow-up
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| string | no | — |
object
curl -X POST \
"https://api.lumbu.pt/api/v2/staff-portal/follow-ups" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/follow-ups/{id}Complete, reopen, or update a client follow-up
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
| string | no | — |
object
curl -X PATCH \
"https://api.lumbu.pt/api/v2/staff-portal/follow-ups/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/follow-ups/programmes/{id}Complete or dismiss a programme follow-up action
Manager-scoped transition for conversion, next-session, retention, and overdue programme actions.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
| string | no | — |
object
curl -X PATCH \
"https://api.lumbu.pt/api/v2/staff-portal/follow-ups/programmes/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/appointments/{id}Update a staff portal appointment status or duration
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — | ||
| id | path | string (uuid) | yes | — |
StaffPortalAppointmentUpdateRequest
StaffPortalAppointmentMutationResponse
curl -X PATCH \
"https://api.lumbu.pt/api/v2/staff-portal/appointments/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/availabilityGet my weekly staff availability
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalAvailabilityResponse
curl -X GET \
"https://api.lumbu.pt/api/v2/staff-portal/availability" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/availabilityReplace my weekly staff availability
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalAvailabilityUpdateRequest
StaffPortalAvailabilityUpdateResponse
curl -X PUT \
"https://api.lumbu.pt/api/v2/staff-portal/availability" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/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/v2/staff-portal/unavailability" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/unavailability" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/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/v2/staff-portal/unavailability/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/time-off" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/time-off" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/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/v2/staff-portal/time-off/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/shift-swaps" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/staff-portal/shift-swapsRequest a shift swap
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
StaffPortalShiftSwapCreateRequest
StaffPortalShiftSwapMutationResponse
curl -X POST \
"https://api.lumbu.pt/api/v2/staff-portal/shift-swaps" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/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/v2/staff-portal/shift-swaps/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/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/v2/staff-portal/shift-swaps/{id}" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/approval-policy" \
-H "Authorization: Bearer {YOUR_API_KEY}"/api/v2/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/v2/staff-portal/approval-policy" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v2/staff-portal/session/handoffExchange a canonical staff portal handoff
Consumes a host-bound handoff once and returns an opaque adapter session handle.
object
curl -X POST \
"https://api.lumbu.pt/api/v2/staff-portal/session/handoff" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/appointment-feedbackSubmit feedback for an appointment
Requires an appointment-scoped feedback access token. A token and appointment must belong to the authenticated tenant.
SubmitAppointmentFeedbackRequest
Feedback
curl -X POST \
"https://api.lumbu.pt/api/v1/appointment-feedback" \
-H "Authorization: Bearer {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{}'/api/v1/waitlistJoin the booking waitlist
Creates an entry only when the requested service and optional staff member belong to the authenticated tenant.
CreateWaitlistEntryRequest
WaitlistEntry
curl -X POST \
"https://api.lumbu.pt/api/v1/waitlist" \
-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/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}"/api/v1/referral/ownerGet or create the authenticated customer's referral code
Returns the referral code owned by the customer session supplied in `x-lumbu-customer-token`, creating it when needed. The tenant is derived from the tenant API key and the customer identity is verified in that tenant. Email query or body input is not accepted or used for authorization.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| string | no | — |
ReferralOwnerCodeResponse
curl -X GET \
"https://api.lumbu.pt/api/v1/referral/owner" \
-H "Authorization: Bearer {YOUR_API_KEY}"/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}"