> ## Documentation Index
> Fetch the complete documentation index at: https://docs.guile.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a public booking profile

> Load the customer-facing booking page for a barber by slug. Anonymous
callers see new-client booking policies; authenticated callers see
policies for their resolved client group when membership can be
determined from their account phone. The response includes public
identity, booking location when known, and omits email, phone, and
private settings.



## OpenAPI

````yaml /api-reference/Barbers/openapi.yaml get /bookingProfiles/{slug}
openapi: 3.0.0
info:
  title: Barbers
  version: 0.1.0
  contact:
    name: Guile Engineering
    url: https://www.guile.app
    email: engineering@guile.app
  license:
    name: MIT
    url: https://opensource.org/license/mit
  description: The Barbers API provides operations for barbers on the Guile platform.
servers:
  - url: https://api.guile.app
    variables: {}
  - url: https://guile.fly.dev
    variables: {}
security: []
tags:
  - name: Barbers
    description: Barber profiles, schedules, and settings
paths:
  /bookingProfiles/{slug}:
    get:
      tags:
        - Barbers
      summary: Get a public booking profile
      description: |-
        Load the customer-facing booking page for a barber by slug. Anonymous
        callers see new-client booking policies; authenticated callers see
        policies for their resolved client group when membership can be
        determined from their account phone. The response includes public
        identity, booking location when known, and omits email, phone, and
        private settings.
      operationId: getBookingProfile
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: |-
            Ok.
            The operation succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/barberPublicProfile'
        '401':
          description: >-
            Unauthorized.

            The operation requires authentication but no authentication or
            insufficient authentication was given.



            This problem response may have one of the following `type` values:

            *
            [https://docs.guile.app/problems/unauthorized](https://docs.guile.app/problems/unauthorized)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/apiProblem'
        '404':
          description: >-
            Not Found.

            There is no such resource at the request URL.



            This problem response may have one of the following `type` values:

            *
            [https://docs.guile.app/problems/notFound](https://docs.guile.app/problems/notFound)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/apiProblem'
        '429':
          description: >-
            Too Many Requests.

            The client has sent too many requests in a given amount of time.



            This problem response may have one of the following `type` values:

            *
            [https://docs.guile.app/problems/tooManyRequests](https://docs.guile.app/problems/tooManyRequests)
          headers:
            Retry-After:
              required: true
              description: The number of seconds to wait before retrying the request.
              schema:
                type: integer
                format: uint32
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/apiProblem'
      security:
        - BearerAuth: []
        - {}
components:
  schemas:
    barberPublicProfile:
      type: object
      required:
        - givenName
        - surname
        - id
        - profile_URL
      properties:
        givenName:
          type: string
          minLength: 1
          maxLength: 55
          format: text
          description: The given name of the barber.
        surname:
          type: string
          minLength: 1
          maxLength: 55
          format: text
          description: The surname of the barber.
        preferredName:
          type: string
          maxLength: 55
          format: text
          description: The preferred name of the barber.
        biography:
          type: string
          maxLength: 2000
          format: text
          description: A short biography of the barber.
        spokenLanguages:
          type: array
          items:
            $ref: '#/components/schemas/spokenLanguageTag'
          minItems: 1
          description: Languages the barber speaks, as IETF BCP 47 language tags.
        experience:
          type: integer
          format: int32
          minimum: 0
          maximum: 100
          description: |-
            Years of professional barbering experience.

            Omitted when the barber has not set a value.
        instagram:
          type: string
          minLength: 1
          maxLength: 30
          pattern: ^[A-Za-z0-9](?:[A-Za-z0-9._]{0,28}[A-Za-z0-9])?$
          description: |-
            Public Instagram username for the booking page, without a leading @.
            Absent when unset. Not a private messaging channel.
        urlSlug:
          allOf:
            - $ref: '#/components/schemas/bookingSlug'
          description: The barber's public booking slug, used in profile links.
        profileImage_URL:
          type: string
          maxLength: 255
          format: uri
          description: A URL to the barber's profile image.
        id:
          allOf:
            - $ref: '#/components/schemas/resourceId'
          description: The unique identifier of the barber profile.
        profilePhoto:
          allOf:
            - $ref: '#/components/schemas/Photos.ProfilePhoto'
          description: The photo assigned to the barber profile.
        profile_URL:
          type: string
          format: uri
          description: The public booking page URL for this profile.
        location:
          allOf:
            - $ref: '#/components/schemas/publicBookingLocation'
          description: >-
            The barber's public booking location. Present when the barber has

            exactly one joined shop location, or when multiple joined locations

            exist and exactly one is marked primary. Absent when none apply,
            when

            multiple joined locations exist with no primary, or when the stored

            address cannot be projected as a United States address. Never
            includes

            shop or location phone numbers.
        bookingPolicies:
          allOf:
            - $ref: '#/components/schemas/publicBookingPolicies'
          description: >-
            Customer-visible booking policies for the resolved client group.

            Anonymous callers receive the barber's new-client rules.
            Authenticated

            API callers receive the group that governs their booking when
            membership

            can be determined from their account phone. Absent when no
            free-cancel

            window or deposit applies.
      description: |-
        A public view of a barber's profile shown on the booking page.

        Booking policies disclose the free-cancel window and deposit for the
        resolved client group when those rules apply.
    apiProblem:
      type: object
      required:
        - type
        - title
        - occurredAt
        - id
        - status
      properties:
        type:
          allOf:
            - $ref: '#/components/schemas/uri'
          description: A URI reference that identifies the problem type.
        title:
          type: string
          maxLength: 120
          description: >-
            A short, human-readable summary of the problem type. The title is
            usually the same for all

            problems with the same `type`.
        occurredAt:
          type: string
          format: date-time
          description: >-
            The date-time when this problem occurred, in [RFC
            3339](https://tools.ietf.org/html/rfc3339)

            date-time `YYYY-MM-DDThh:mm:ss.sssZ` format, UTC. This is derived
            and immutable.
        detail:
          type: string
          maxLength: 256
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
        id:
          allOf:
            - $ref: '#/components/schemas/resourceId'
          description: >-
            The unique identifier for this problem. This is an immutable opaque
            string.
        status:
          allOf:
            - $ref: '#/components/schemas/statusCode'
          description: >-
            The [HTTP status
            code](https://datatracker.ietf.org/doc/html/rfc7231#section-6)for
            this

            occurrence of the problem.
        instance:
          allOf:
            - $ref: '#/components/schemas/uri'
          maxLength: 2048
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem. This is the URI of an

            API resource that the problem is related to, with a unique error
            correlation ID URI fragment.
        attributes:
          type: object
          additionalProperties: {}
          description: >-
            Additional optional attributes related to the problem. This data
            conforms to the schema

            associated with the error type.
        recovery:
          allOf:
            - $ref: '#/components/schemas/clientFailureRecovery'
          description: The recovery contract for this problem occurrence.
        problems:
          type: array
          items:
            $ref: '#/components/schemas/problem'
          maxItems: 128
          description: |-
            Optional root-causes if there are multiple problems in the request
            or API call processing.
      description: >-
        API problem or error response, as per

        [RFC 9457
        application/problem+json](https://tools.ietf.org/html/rfc9457).
    spokenLanguageTag:
      type: string
      enum:
        - ar
        - de
        - en
        - es
        - fr
        - ko
        - ru
        - tl
        - vi
        - zh
      description: An IETF BCP 47 language tag supported on barber profiles.
    bookingSlug:
      type: string
      minLength: 3
      maxLength: 40
      pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$
      description: A barber's public booking slug, used in profile links.
    resourceId:
      type: string
      description: >-
        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.
    Photos.ProfilePhoto:
      type: object
      required:
        - url
      properties:
        url:
          allOf:
            - $ref: '#/components/schemas/uri'
          description: The URL for the full profile image.
        thumbnailUrl:
          allOf:
            - $ref: '#/components/schemas/uri'
          description: The URL for the optimized profile image preview, if available.
      description: The image variants returned with a profile.
    publicBookingLocation:
      type: object
      required:
        - id
        - name
        - shopName
        - address
        - timeZone
        - isPrimary
      properties:
        id:
          allOf:
            - $ref: '#/components/schemas/resourceId'
          description: |-
            The unique identifier for this shop location reference.
            This is an immutable opaque string.
        name:
          type: string
          description: The name of this location for a shop.
        shopName:
          type: string
          description: The name of the shop business entity.
        address:
          allOf:
            - $ref: '#/components/schemas/usAddress'
          description: Street address for the location. Used for maps and directions.
        timeZone:
          allOf:
            - $ref: '#/components/schemas/ianaTimeZone'
          description: IANA time zone for openings and same-day booking at this location.
        isPrimary:
          type: boolean
          description: |-
            True when this joined location is the barber's designated primary
            booking location. At most one joined location per barber is primary.
      description: >-
        Public booking location for a barber profile page.


        Extends the shared shop-location reference with a postal address and
        IANA

        timezone so customers can pin directions and interpret openings locally.
    publicBookingPolicies:
      type: object
      properties:
        freeCancellationWindow:
          type: string
          format: duration
          description: |-
            How long before appointment start a customer can cancel without it
            counting as late. Absent when no free-cancel window is configured.
        deposit:
          allOf:
            - $ref: '#/components/schemas/publicBookingDeposit'
          description: |-
            Legacy deposit policy retained for compatible clients. New booking
            profiles expose card holds through `authorization`.
        authorization:
          allOf:
            - $ref: '#/components/schemas/publicBookingAuthorization'
          description: >-
            Card hold the barber requires for this client group. The hold
            reserves

            funds but is not captured at booking. Absent when no authorization
            is

            configured.
      description: >-
        Customer-visible booking policies for the resolved client group.


        Anonymous callers receive the barber's new-client rules. Authenticated
        API

        callers receive the governing group when membership can be determined
        from

        their account phone.
    uri:
      type: string
      maxLength: 1024
      format: uri
      description: A URI reference to an internal or external resource.
    statusCode:
      type: integer
      format: uint16
      minimum: 100
      maximum: 599
      description: The HTTP status code for a response.
    clientFailureRecovery:
      type: object
      required:
        - outcome
        - retry
      properties:
        outcome:
          allOf:
            - $ref: '#/components/schemas/clientFailureOutcome'
          description: The known outcome of the request.
        retry:
          allOf:
            - $ref: '#/components/schemas/clientRetryDirective'
          description: The safe retry action for the request.
        sessionAction:
          allOf:
            - $ref: '#/components/schemas/clientSessionAction'
          description: The session action required before the request can continue.
        rateLimit:
          allOf:
            - $ref: '#/components/schemas/rateLimit'
          description: The rate limit state that prevented the request.
      description: The recovery contract for a failed client request.
    problem:
      type: object
      required:
        - type
        - title
        - occurredAt
        - id
        - status
      properties:
        type:
          allOf:
            - $ref: '#/components/schemas/uri'
          description: A URI reference that identifies the problem type.
        title:
          type: string
          maxLength: 120
          description: >-
            A short, human-readable summary of the problem type. The title is
            usually the same for all

            problems with the same `type`.
        occurredAt:
          type: string
          format: date-time
          description: >-
            The date-time when this problem occurred, in [RFC
            3339](https://tools.ietf.org/html/rfc3339)

            date-time `YYYY-MM-DDThh:mm:ss.sssZ` format, UTC. This is derived
            and immutable.
        detail:
          type: string
          maxLength: 256
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
        id:
          allOf:
            - $ref: '#/components/schemas/resourceId'
          description: >-
            The unique identifier for this problem. This is an immutable opaque
            string.
        status:
          allOf:
            - $ref: '#/components/schemas/statusCode'
          description: >-
            The [HTTP status
            code](https://datatracker.ietf.org/doc/html/rfc7231#section-6)for
            this

            occurrence of the problem.
        instance:
          allOf:
            - $ref: '#/components/schemas/uri'
          maxLength: 2048
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem. This is the URI of an

            API resource that the problem is related to, with a unique error
            correlation ID URI fragment.
        attributes:
          type: object
          additionalProperties: {}
          description: >-
            Additional optional attributes related to the problem. This data
            conforms to the schema

            associated with the error type.
      description: >-
        Standard problem or error response, as per

        [RFC 9457
        application/problem+json](https://tools.ietf.org/html/rfc9457).
    usAddress:
      type: object
      required:
        - address1
        - locality
        - regionCode
        - postalCode
        - countryCode
      properties:
        address1:
          type: string
          maxLength: 35
          description: >-
            The first line of the postal address. In the US, this typically
            includes

            the building number and street name.
        address2:
          type: string
          maxLength: 35
          description: |-
            The second line of the street address. This should only be used
            if it has a value. Typical values include building numbers, suite
            numbers, and other identifying information beyond the first line
            of the postal address.
        locality:
          type: string
          maxLength: 30
          description: The city/town/municipality of the address.
          example: Atlanta
        regionCode:
          type: string
          minLength: 2
          maxLength: 2
          pattern: ^[A-Za-z]{2}$
          description: The state, district, or outlying area of the postal address.
          example: VT
        postalCode:
          type: string
          minLength: 5
          maxLength: 10
          pattern: ^\d{5}(?:[- ]?\d{4})?$
          description: >-
            A group of five or nine numbers that are added to a postal address
            to

            assist the sorting of mail.
          example: 20521-9000
        countryCode:
          type: string
          minLength: 2
          maxLength: 2
          pattern: ^[A-Za-z]{2}$
          description: The ISO-3611 alpha-2 value for a country.
          example: CA
      description: A postal address within the United States or US territories.
    ianaTimeZone:
      type: string
      description: An IANA time-zone identifier.
    publicBookingDeposit:
      type: object
      required:
        - type
      properties:
        type:
          allOf:
            - $ref: '#/components/schemas/publicBookingDepositType'
          description: >-
            Whether the deposit is a fixed amount or a percentage of the service
            total.
        fixed:
          allOf:
            - $ref: '#/components/schemas/money'
          description: Fixed deposit amount. Required when `type` is `fixed`.
        percentage:
          type: integer
          format: int8
          minimum: 1
          maximum: 100
          description: >-
            Percentage of the service total. Required when `type` is
            `percentage`.
      description: Customer-visible deposit requirement on the public booking profile.
    publicBookingAuthorization:
      type: object
      required:
        - type
        - appointmentOffset
        - customerFeeApplies
      properties:
        type:
          allOf:
            - $ref: '#/components/schemas/publicBookingAuthorizationType'
          description: >-
            Whether the hold is a fixed amount or a percentage of the service
            subtotal.
        fixed:
          allOf:
            - $ref: '#/components/schemas/money'
          description: Fixed hold amount. Required when `type` is `fixed`.
        percentage:
          type: integer
          format: int8
          minimum: 1
          maximum: 100
          description: >-
            Percentage of the service subtotal. Required when `type` is
            `percentage`.
        appointmentOffset:
          type: string
          format: duration
          description: >-
            Arbitrary non-negative time before appointment start when Guile
            places the hold. `PT0S` means immediately when the booking is
            confirmed; clients may present a smaller preset list.
        customerFeeApplies:
          type: boolean
          description: >-
            Whether Guile adds the separately calculated customer fee to the
            provider hold. False for the exact one-dollar check and converted
            legacy deposits.
      description: Customer-visible card hold on the public booking profile.
    clientFailureOutcome:
      type: string
      enum:
        - notApplied
        - unknown
      description: The known outcome of a failed client request.
    clientRetryDirective:
      type: string
      enum:
        - doNotRetry
        - retrySameRequest
        - retrySameRequestAfterDelay
      description: The safe retry action for a failed client request.
    clientSessionAction:
      type: string
      enum:
        - refresh
        - signIn
      description: The session action required before a failed request can continue.
    rateLimit:
      type: object
      required:
        - limit
        - remaining
        - resetsAt
      properties:
        limit:
          type: integer
          format: uint64
          description: The maximum number of requests allowed in the active window.
        remaining:
          type: integer
          format: uint64
          description: The number of requests remaining in the active window.
        resetsAt:
          type: string
          format: date-time
          description: >-
            The date-time when the active window resets, in [RFC
            3339](https://tools.ietf.org/html/rfc3339) date-time
            `YYYY-MM-DDThh:mm:ss.sssZ` format, UTC.
      description: The rate limit state for the request.
    publicBookingDepositType:
      type: string
      enum:
        - fixed
        - percentage
      description: Deposit amount shape on the public booking profile.
    money:
      type: string
      pattern: ^-?(0|[1-9][0-9]*)\.[0-9][0-9]$
      format: decimal
      description: >-
        A monetary amount in the lowest denomination for the given currency.

        The numeric value is represented as a string so that it can be exact
        with no

        loss of precision. Values may be positive or negative.
      example: '456.78'
    publicBookingAuthorizationType:
      type: string
      enum:
        - fixed
        - percentage
      description: Authorization amount shape on the public booking profile.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: Bearer

````