Skip to main content
POST

Headers

Idempotency-Key
string
required

A client-generated idempotency key to ensure operations are only processed once even if a client retries the operation. The V4 UUID format, as defined in RFC 4122, is recommended to avoid collisions but is not required.

Maximum string length: 255

Body

application/json

Request body for creating an appointment as a client.

Tip, payment selection, booking message, and barber portfolio photos are optional V1 booking inputs. Tips apply to both immediately confirmed appointments and pending booking requests. Customer photo upload is not part of this contract; only approved photos already present in the booked barber's public portfolio can be referenced.

barber
object
required

The barber for this appointment.

location
object
required

The location for this appointment.

services
object[]
required

The services for this appointment.

givenName
string<text>
required

The given name of the customer.

Required string length: 1 - 55
occursOn
string<date-time>
required

The date and time the appointment occurs on. This is expressed in RFC 3339 YYYY-MM-DDThh:mm:ss.sssZ date-time format in UTC time zone.

surname
string<text>

The surname of the customer, if known.

Required string length: 1 - 55
tipAmount
string<decimal>

The tip the customer selected at booking time. Recorded on the appointment for barber visibility, including while the booking is still pending approval. Not charged at create; authorization holds exclude tip.

Pattern: ^(0|[1-9][0-9]*)\.[0-9][0-9]$
Example:

"456.78"

currencyCode
string

The ISO 4217 currency code for tipAmount, required when a tip is included.

Required string length: 3
Example:

"USD"

paymentMethodSource
enum<string>

How this appointment will be paid. Defaults to platform when omitted. Only platform payments can be authorized through Guile; external payments, such as cash or peer-to-peer payments, cannot. When this is external, paymentMethodId, paymentMethodSetupId, and setPaymentMethodAsDefault are not accepted.

Available options:
platform,
external
paymentMethodId
string

The customer's payment method to authorize when paymentMethodSource is platform or omitted. This must be a reusable method belonging to the authenticated customer. It is mutually exclusive with paymentMethodSetupId. When both are omitted and authorization is required, the server uses the customer's default saved method. setPaymentMethodAsDefault is not accepted with this field because the method is already saved.

paymentMethodSetupId
string

A completed payment-method setup created for the authenticated customer. It is mutually exclusive with paymentMethodId and can be bound to only one appointment. It is accepted only for a platform payment. The setup owns the customer's reuse consent; appointment creation cannot broaden it.

setPaymentMethodAsDefault
boolean

Whether a newly collected reusable method becomes the customer's default. Requires paymentMethodSetupId whose setup consent allows reuse.

bookingMessage
string

Optional message for the barber saved with the booking.

Maximum string length: 150
barberPortfolioPhotoIds
string[]

Optional approved photo identifiers from the booked barber's public portfolio. Customer uploads are deferred and are not accepted here.

Required array length: 1 - 3 elements

The unique, opaque system identifier for a resource. This case-sensitive ID is also used as path parameters in URLs or in other properties or parameters that reference a resource by ID rather than URL.

openingOfferId
string

The exact regular opening offer selected for this appointment. Booking clients that consume regularOffers echo it back; legacy regular clients may omit it. It is mutually exclusive with quoteId. The server revalidates its barber, location, services, occurrence, time zone, schedule, booking window, service terms, authority revision, and expiry before creation.

Required string length: 1 - 2048
quoteId
string

The off-hours quote selected for this appointment. Required when creating an off-hours appointment and omitted for regular openings. It is mutually exclusive with openingOfferId. The quote is revalidated against the barber, location, selected services, occurrence, time zone, opening band, fee, approval policy, internal policy revision, and expiry before creation.

Required string length: 1 - 2048

Response

Created.

A representation of an appointment.

givenName
string<text>
required

The given name of the customer.

Required string length: 1 - 55
services
object[]
required

The services for this appointment.

occursOn
string<date-time>
required

The date and time the appointment occurs on. This is expressed in RFC 3339 YYYY-MM-DDThh:mm:ss.sssZ date-time format in UTC time zone.

duration
string<duration>
required

The duration of the appointment. The value is an ISO 8601 duration string.

For example, an appointment lasting 30 minutes would be represented as PT30M.

cost
string<decimal>
required

The cost of the appointment, excluding any tips, fees or taxes.

Pattern: ^-?(0|[1-9][0-9]*)\.[0-9][0-9]$
Example:

"456.78"

barber
object
required

The barber for this appointment.

location
object
required

The location for this appointment.

id
string
required

The unique, opaque system identifier for a resource. This case-sensitive ID is also used as path parameters in URLs or in other properties or parameters that reference a resource by ID rather than URL.

createdAt
string<date-time>
required

The date-time when this resource was created, in RFC 3339 date-time YYYY-MM-DDThh:mm:ss.sssZ format, UTC. This is derived and immutable.

updatedAt
string<date-time>
required

The date-time when this resource was updated, in RFC 3339 date-time YYYY-MM-DDThh:mm:ss.sssZ format, UTC. This is derived and immutable.

state
enum<string>
required

The appointment state. This is derived and immutable.

Available options:
pending,
scheduled,
canceled,
completed,
rejected,
expired
paymentState
enum<string>
required

The payment state of the appointment. This is derived and immutable.

Available options:
pending,
processing,
authorized,
paid,
failed
totalAuthorized
string<decimal>
required

The sum amount of authorized payments for this appointment.

Pattern: ^-?(0|[1-9][0-9]*)\.[0-9][0-9]$
Example:

"456.78"

totalCaptured
string<decimal>
required

The sum amount of captured payments for this appointment.

Pattern: ^-?(0|[1-9][0-9]*)\.[0-9][0-9]$
Example:

"456.78"

totalRefunded
string<decimal>
required

The sum amount of refunded payments for this appointment.

Pattern: ^-?(0|[1-9][0-9]*)\.[0-9][0-9]$
Example:

"456.78"

paymentMethodSource
enum<string>

The payment source for this appointment. Only platform payments can be authorized through Guile; external payments, such as cash or peer-to-peer payments, cannot.

Available options:
platform,
external
pendingType
enum<string>

Why this appointment is pending. bookingApproval means the customer is waiting for the barber's decision. cardConfirmation means the appointment is not awaiting booking approval but still needs card confirmation. Absent when the appointment is not pending or when an older server has not classified the pending state.

Available options:
bookingApproval,
cardConfirmation
bookingRequest
object

The immutable request lifecycle when this appointment originated as a booking request. Present while the request is pending and after it is resolved so the barber and customer can render the same outcome.

offHoursFee
string<decimal>

The off-hours fee accepted when the appointment was created. This is derived and immutable. It is separate from cost. Creating the appointment does not authorize or capture this fee; Guile settles it only after the barber confirms the appointment.

Pattern: ^-?(0|[1-9][0-9]*)\.[0-9][0-9]$
Example:

"456.78"

openingBand
enum<string>

The opening band accepted when the appointment was created. This is derived and immutable.

Available options:
regular,
beforeHours,
afterHours
tipAmount
string<decimal>

The tip the customer selected at booking time, when one was included. Not charged until capture.

Pattern: ^-?(0|[1-9][0-9]*)\.[0-9][0-9]$
Example:

"456.78"

surname
string<text>

The customer's full surname when the authenticated barber may see it.

Required string length: 1 - 55
displayName
string

The customer name the authenticated barber may display under the customer's surname visibility preference.

timeZone
string | null

The IANA time zone for the appointment occurrence.

recurringAppointmentId
string

The identifier of the recurring appointment this appointment belongs to, if any. This field is only present for appointments that are part of a recurring series.

cancelationFeeType
enum<string>

If included, the type of cancelation fee incurred. This is derived and immutable.

Available options:
lateCancelation,
noShow

If included, the payment-link send state for this appointment.

bookingMessage
string

The customer message saved with the appointment. Visible only to the appointment's barber and customer.

Maximum string length: 500
referencePhotos
object[]

Immutable references captured from the booked barber's approved public portfolio at booking time. These remain displayable on the appointment if the barber later changes the public portfolio.

Maximum array length: 3
cancellation
object

The cancellation decision recorded when the appointment is canceled.

cancellationFeePreviews
object

The fee amounts available before a cancellation decision.

deposit
object

The required deposit for this appointment. Percentage deposits exclude tips, taxes, Guile fees, processing fees, and off-hours fees.

calendarEventUrl
string<uri>

The URL of the calendar event artifact for this appointment. Present only when the authenticated actor is the appointment's customer and state is scheduled. Pending, confirming, rejected, expired, and canceled booking requests do not expose a calendar event.

Maximum string length: 1024
reviewed
boolean

Whether the appointment's customer has already submitted a review for this visit. Present for the owning customer; omitted for other audiences.

reviewPromptDismissed
boolean

Whether the appointment's customer dismissed the review prompt for this visit. Present for the owning customer; omitted for other audiences. Dismissing the prompt does not create a review and does not block leaving a review later from appointment history.