> ## 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.

# Assign services to a barber

> Assign one or more shop services to a barber.

You can assign up to 25 services per request.
A barber can have up to 10 visible services assigned in total.

The response includes counts of successful and failed assignments,
along with details of any failures.



## OpenAPI

````yaml /api-reference/Services/openapi.yaml post /barbers/{barberId}/services
openapi: 3.0.0
info:
  title: Services
  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 Services API provides operations for managing services
    within the Guile platform.

    Services are created at the shop level and can be assigned to
    individual barbers within that shop.

    Services can be configured as base services, add-ons, or bundles.

    A base service is a standalone service without any additional
    included services.

    An add-on is a service that can be added to an appointment for
    an additional cost.

    A bundle is a base service that includes one or more add-ons with
    a fixed cost and duration. Add-on prices and durations are ignored
    when added to a bundle. A customer cannot remove add-ons from a
    bundle when creating an appointment.

    A bundle cannot be configured as an add-on or another bundle.
servers:
  - url: https://api.guile.app
    variables: {}
  - url: https://guile.fly.dev
    variables: {}
security: []
tags:
  - name: Services
    description: Shop catalog pricing, duration, and visibility
paths:
  /barbers/{barberId}/services:
    post:
      tags:
        - Services
      summary: Assign services to a barber
      description: |-
        Assign one or more shop services to a barber.

        You can assign up to 25 services per request.
        A barber can have up to 10 visible services assigned in total.

        The response includes counts of successful and failed assignments,
        along with details of any failures.
      operationId: assignServiceToBarber
      parameters:
        - name: barberId
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/resourceId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/assignService'
      responses:
        '200':
          description: |-
            Ok.
            The operation succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/assignServicesResult'
        '400':
          description: >-
            Bad Request.

            The request body, request headers, and/or query parameters are not
            well-formed.



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

            *
            [https://docs.guile.app/problems/badRequest](https://docs.guile.app/problems/badRequest)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/apiProblem'
        '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'
        '403':
          description: >-
            Forbidden.

            The authenticated caller is not authorized to perform the requested
            operation.



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

            *
            [https://docs.guile.app/problems/forbidden](https://docs.guile.app/problems/forbidden)
          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'
        '422':
          description: >-
            Unprocessable Entity.

            The request body and/or query parameters were well-formed but
            otherwise invalid.



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

            *
            [https://docs.guile.app/problems/unprocessableEntity](https://docs.guile.app/problems/unprocessableEntity)

            *
            [https://docs.guile.app/problems/tooManyVisibleServices](https://docs.guile.app/problems/tooManyVisibleServices)

            *
            [https://docs.guile.app/problems/serviceAlreadyAssigned](https://docs.guile.app/problems/serviceAlreadyAssigned)
          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:
    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.
    assignService:
      type: object
      required:
        - services
      properties:
        services:
          type: array
          items:
            $ref: '#/components/schemas/Common.ServiceReference'
          minItems: 1
          maxItems: 25
          description: The services to assign to the barber.
      description: Properties for assigning services to a barber.
    assignServicesResult:
      type: object
      required:
        - successCount
        - failureCount
        - successes
        - assigned
        - failures
      properties:
        successCount:
          type: integer
          format: int32
          description: The number of services successfully assigned.
          example: 3
        failureCount:
          type: integer
          format: int32
          description: The number of services that failed to be assigned.
          example: 1
        successes:
          type: array
          items:
            $ref: '#/components/schemas/Common.ServiceReference'
          minItems: 0
          maxItems: 25
          description: The services that were successfully assigned.
          example:
            - id: service-123
              name: Beard Trim
        assigned:
          type: array
          items:
            $ref: '#/components/schemas/BarberServiceReference'
          minItems: 0
          maxItems: 25
          description: The barber service assignments that were created.
          example:
            - id: barber-service-123
              service:
                id: service-456
                name: Skin Fade
        failures:
          type: array
          items:
            $ref: '#/components/schemas/serviceAssignmentFailure'
          minItems: 0
          maxItems: 25
          description: Details of services that failed to be assigned.
          example:
            - type: https://docs.guile.app/problems/serviceAlreadyAssigned
              title: Service already assigned
              occurredAt: '2024-01-15T10:30:00Z'
              attributes:
                service:
                  id: service-369
                  name: Skin Fade
      description: Result of assigning services to a barber.
    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).
    Common.ServiceReference:
      type: object
      required:
        - id
      properties:
        id:
          allOf:
            - $ref: '#/components/schemas/resourceId'
          description: The unique identifier for the service.
        name:
          type: string
          description: The display name for this service.
        cost:
          allOf:
            - $ref: '#/components/schemas/money'
          description: The cost of the service, excluding any fees or taxes.
        duration:
          type: string
          format: duration
          description: The duration of the service.
      description: |-
        A reference to a service resource. This contains a subset of properties
        for the service. Use Service for the full resource entity.
    BarberServiceReference:
      type: object
      required:
        - id
        - service
      properties:
        id:
          allOf:
            - $ref: '#/components/schemas/resourceId'
          description: The unique identifier for the barber service assignment.
        service:
          allOf:
            - $ref: '#/components/schemas/Common.ServiceReference'
          description: The service that is assigned.
      description: A reference to a barber service assignment.
      example:
        id: barber-service-123
        service:
          id: service-456
          name: Skin Fade
    serviceAssignmentFailure:
      type: object
      required:
        - type
        - title
        - occurredAt
        - attributes
      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.
        attributes:
          allOf:
            - $ref: '#/components/schemas/serviceAssignmentFailureAttributes'
          description: |-
            Additional attributes for the service assignment failure.
            Contains the service reference that failed to be assigned.
      description: Details of a failed service assignment.
    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).
    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'
    serviceAssignmentFailureAttributes:
      type: object
      required:
        - service
      properties:
        service:
          allOf:
            - $ref: '#/components/schemas/Common.ServiceReference'
          description: The service that failed to be assigned.
      description: Attributes for a service assignment failure.
    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.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: Bearer

````