openapi: 3.0.3
info:
  title: Operator Site FAQs API
  version: 1.0.0
  description: >
    API for operators to manage a venue's public-facing FAQ list, and for
    partners to read it.


    FAQs are a JSON array of `{question, answer}` items stored per venue.
    `question`/`answer` values are plain strings and may contain markdown syntax
    (e.g. `**bold**`, links, lists); the server does not parse or sanitize
    markdown — it is rendered client-side.


    The venue is identified by its composite ID —
    `{venueGroupId}|{rmsSlug}|{venueId}` — and the caller's venue-group
    ownership of (or partner mapping to) that venue is enforced server-side.


    **Verbs:**

    - `GET`     returns the current FAQ array (empty array when none stored).
    Readable by operators and mapped partners.

    - `PUT`     replaces the whole array — this is also the bulk-import
    mechanism for a single venue's full FAQ list.

    - `PATCH`   applies an [RFC
    6902](https://datatracker.ietf.org/doc/html/rfc6902) JSON Patch document
    against the array (item-index pointers, e.g. `/0/answer`, or `/-` to
    append).

    - `DELETE`  wipes the stored array. Idempotent.

    - `POST /venues/site-faqs/bulk` applies changes across many venues in one
    transaction (all-or-nothing).
servers:
  - url: https://api.bookabletech.com
    description: Live
tags:
  - name: operator-site-faqs
    description: >
      Public-facing FAQ list attached to a venue, owned and managed by the
      operator, readable by mapped partners.
paths:
  /venues/{venueCompositeId}/site-faqs:
    get:
      tags:
        - operator-site-faqs
      summary: Get site FAQs for a venue
      description: >
        Returns the stored FAQ array for the venue. When no FAQs are stored,
        returns an empty array.
      operationId: getVenueSiteFaqs
      parameters:
        - name: venueCompositeId
          in: path
          required: true
          description: >-
            Composite venue identifier in `{venueGroupId}|{rmsSlug}|{venueId}`
            format.
          schema:
            type: string
            example: 1|CO|123
      responses:
        '200':
          description: Site FAQs successfully retrieved.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteFaqsResponse'
              example:
                venueCompositeId: 1|CO|123
                faqs:
                  - question: What is your cancellation policy?
                    answer: >-
                      See our **cancellation policy**
                      [here](https://example.com/policy).
                  - question: Do you offer private dining?
                    answer: Yes, contact the venue directly to arrange.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Live:
            - venue-site-faqs:read
        - Live:
            - venue-group:read
    put:
      tags:
        - operator-site-faqs
      summary: Replace site FAQs for a venue
      description: >
        Replaces the stored FAQ array with the provided body. This is the
        bulk-import mechanism for a single venue — send the complete FAQ list in
        one call to import/replace it.

        Upserts the row when no FAQs are currently stored for the venue.
      operationId: replaceVenueSiteFaqs
      parameters:
        - name: venueCompositeId
          in: path
          required: true
          description: >-
            Composite venue identifier in `{venueGroupId}|{rmsSlug}|{venueId}`
            format.
          schema:
            type: string
            example: 1|CO|123
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteFaqsRequest'
            example:
              faqs:
                - question: What is your cancellation policy?
                  answer: >-
                    See our **cancellation policy**
                    [here](https://example.com/policy).
      responses:
        '200':
          description: Site FAQs successfully replaced.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteFaqsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Live:
            - venue-group:update
    patch:
      tags:
        - operator-site-faqs
      summary: Patch site FAQs for a venue (RFC 6902)
      description: >
        Applies an [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902)
        JSON Patch document to the stored FAQ array. Supported operations are
        `add`, `remove`, and `replace`. Paths are JSON Pointers ([RFC
        6901](https://datatracker.ietf.org/doc/html/rfc6901)) into the stored
        array — e.g. `/0/answer` references the `answer` key of the first FAQ
        item, `/-` appends a new item to the end. Upserts when no row exists;
        the patch is applied against an empty array in that case.


        **Examples:**


        Append a new FAQ item:

        ```json

        [
          { "op": "add", "path": "/-", "value": { "question": "Do you take walk-ins?", "answer": "Yes, subject to availability." } }
        ]

        ```


        Replace an existing item's answer:

        ```json

        [
          { "op": "replace", "path": "/0/answer", "value": "Updated answer text." }
        ]

        ```


        Remove an item:

        ```json

        [
          { "op": "remove", "path": "/2" }
        ]

        ```
      operationId: patchVenueSiteFaqs
      parameters:
        - name: venueCompositeId
          in: path
          required: true
          description: >-
            Composite venue identifier in `{venueGroupId}|{rmsSlug}|{venueId}`
            format.
          schema:
            type: string
            example: 1|CO|123
      requestBody:
        required: true
        description: Array of JSON Patch operations to apply to the stored FAQ array.
        content:
          application/json-patch+json:
            schema:
              type: array
              minItems: 1
              items:
                $ref: '#/components/schemas/JsonPatchOperation'
            examples:
              appendItem:
                summary: Append a new FAQ item
                value:
                  - op: add
                    path: /-
                    value:
                      question: Do you take walk-ins?
                      answer: Yes, subject to availability.
              replaceAnswer:
                summary: Replace an existing item's answer
                value:
                  - op: replace
                    path: /0/answer
                    value: Updated answer text.
              removeItem:
                summary: Remove an item by index
                value:
                  - op: remove
                    path: /2
      responses:
        '200':
          description: Site FAQs successfully patched.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteFaqsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Live:
            - venue-group:update
    delete:
      tags:
        - operator-site-faqs
      summary: Delete all site FAQs for a venue
      description: >
        Removes the entire stored FAQ row for the venue. Idempotent — returns
        204 whether or not the row existed.
      operationId: deleteVenueSiteFaqs
      parameters:
        - name: venueCompositeId
          in: path
          required: true
          description: >-
            Composite venue identifier in `{venueGroupId}|{rmsSlug}|{venueId}`
            format.
          schema:
            type: string
            example: 1|CO|123
      responses:
        '204':
          description: Site FAQs successfully deleted.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Live:
            - venue-group:delete
  /venues/site-faqs/bulk:
    post:
      tags:
        - operator-site-faqs
      summary: Bulk apply site FAQs across many venues
      description: >
        Applies FAQ changes to many venues in a single all-or-nothing
        transaction. Any per-item failure (unknown venue, foreign venue group,
        invalid composite ID, invalid patch) rolls back the whole request.


        Each item declares the target venue (`venueCompositeId`) and the `mode`:

        - `replace` — overwrite the stored array with `faqs`.

        - `patch`   — apply an [RFC
        6902](https://datatracker.ietf.org/doc/html/rfc6902) JSON Patch document
        (`patch` field) to the stored array.


        Per mode, exactly one payload field is expected: `faqs` for `replace`,
        `patch` for `patch`.
      operationId: bulkApplyVenueSiteFaqs
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteFaqsBulkRequest'
            example:
              items:
                - venueCompositeId: 1|CO|123
                  mode: patch
                  patch:
                    - op: add
                      path: /-
                      value:
                        question: Do you take walk-ins?
                        answer: Yes, subject to availability.
                - venueCompositeId: 1|CO|124
                  mode: replace
                  faqs:
                    - question: What is your cancellation policy?
                      answer: >-
                        See our **cancellation policy**
                        [here](https://example.com/policy).
      responses:
        '200':
          description: Bulk apply completed successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteFaqsBulkResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - Live:
            - venue-group:update
components:
  schemas:
    SiteFaqsResponse:
      type: object
      description: Current FAQ array for the venue.
      properties:
        venueCompositeId:
          type: string
          description: Composite venue identifier.
          example: 1|CO|123
        faqs:
          type: array
          description: FAQ items for the venue.
          items:
            $ref: '#/components/schemas/FaqItem'
          example:
            - question: What is your cancellation policy?
              answer: >-
                See our **cancellation policy**
                [here](https://example.com/policy).
      required:
        - venueCompositeId
        - faqs
    SiteFaqsRequest:
      type: object
      description: Request payload for the replace (PUT) operation.
      properties:
        faqs:
          type: array
          description: FAQ items for the venue.
          items:
            $ref: '#/components/schemas/FaqItem'
          example:
            - question: What is your cancellation policy?
              answer: >-
                See our **cancellation policy**
                [here](https://example.com/policy).
      required:
        - faqs
    JsonPatchOperation:
      type: object
      title: JSON Patch Operation (RFC 6902)
      description: >
        A single JSON Patch operation following [RFC
        6902](https://datatracker.ietf.org/doc/html/rfc6902). Each operation
        modifies the target document at the specified `path`.
      required:
        - op
        - path
      properties:
        op:
          type: string
          enum:
            - add
            - remove
            - replace
          description: The operation to perform.
          example: replace
        path:
          type: string
          pattern: ^\/.*
          description: >
            JSON Pointer ([RFC
            6901](https://datatracker.ietf.org/doc/html/rfc6901)) to the target
            location within the stored FAQ array. Must start with `/`. Use an
            integer segment to address an item by index (e.g. `/0`), and `-` to
            append (e.g. `/-`).
          example: /0/answer
        value:
          nullable: true
          description: >
            The value to use for the operation. Required for `add` and
            `replace`. Omit (or set to null) for `remove`. Can be any valid JSON
            value (string, number, boolean, object, array, null).
          example: Updated answer text.
    SiteFaqsBulkItem:
      type: object
      description: >
        A single bulk item describing a per-venue change.


        - When `mode` is `replace`, `faqs` is required and contains the full
        replacement array.

        - When `mode` is `patch`, `patch` is required and contains an RFC 6902
        operation array.
      properties:
        venueCompositeId:
          type: string
          description: >-
            Composite venue identifier in `{venueGroupId}|{rmsSlug}|{venueId}`
            format.
          example: 1|CO|123
        mode:
          type: string
          description: How to apply the payload to the stored array.
          enum:
            - replace
            - patch
          example: patch
        faqs:
          type: array
          nullable: true
          description: |
            FAQ items. Required when `mode` is `replace`; ignored otherwise.
          items:
            $ref: '#/components/schemas/FaqItem'
        patch:
          type: array
          nullable: true
          minItems: 1
          description: >
            RFC 6902 JSON Patch operations. Required when `mode` is `patch`;
            ignored otherwise.
          items:
            $ref: '#/components/schemas/JsonPatchOperation'
      required:
        - venueCompositeId
        - mode
    SiteFaqsBulkRequest:
      type: object
      description: Bulk request body. All items are applied in a single transaction.
      properties:
        items:
          type: array
          minItems: 1
          maxItems: 500
          items:
            $ref: '#/components/schemas/SiteFaqsBulkItem'
      required:
        - items
    SiteFaqsBulkResponse:
      type: object
      description: Result of a bulk apply.
      properties:
        applied:
          type: integer
          description: Number of items applied successfully.
          example: 2
      required:
        - applied
    FaqItem:
      type: object
      description: >
        Single FAQ entry. `question`/`answer` are plain strings and may contain
        markdown syntax; the server does not parse or sanitize it — rendering
        happens client-side.
      properties:
        question:
          type: string
          nullable: true
          example: What is your cancellation policy?
        answer:
          type: string
          nullable: true
          example: See our **cancellation policy** [here](https://example.com/policy).
    ClientError:
      type: object
      properties:
        type:
          type: string
          format: uri
          description: >-
            A URI reference [rfc9457] that identifies the problem type. This
            specification encourages that, when dereferenced, it provides
            human-readable documentation for the problem type (e.g., using HTML
            [W3C.REC-html5-20141028]). When this member is not present, its
            value is assumed to be "about:blank".
        title:
          type: string
          description: >-
            A short, human-readable summary of the problem type. It SHOULD NOT
            change from occurrence to occurrence of the problem, except for
            purposes of localization.
        status:
          type: integer
          format: int32
          description: >-
            The HTTP status code [rfc9457, Section 3.1.12] generated by the
            origin server for this occurrence of the problem.
        detail:
          type: string
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
        code:
          type: string
          description: >-
            Error code in the format RESOURCE-X-NNN where X is R (retryable) or
            N (non-retryable). See ErrorCatalog.md for all error codes.
          example: VALID-N-001
        isRetryable:
          type: boolean
          description: >-
            Indicates whether the error is retryable. If true, the request may
            succeed if retried. If false, the request will fail again with the
            same input.
        traceId:
          type: string
          description: Request trace identifier for debugging and correlation purposes.
          example: 0HNJ2BG2TU3BU:00000001
        errors:
          type: object
          nullable: true
          additionalProperties:
            type: array
            items:
              type: string
          description: >-
            Validation errors dictionary mapping field names to arrays of error
            messages. Only present for validation errors (VALID-N-001).
          example:
            Date:
              - Availability date cannot be in the past.
            EndTime:
              - EndTime must be after StartTime.
      required:
        - title
        - status
        - code
        - isRetryable
    ServerError:
      type: object
      properties:
        type:
          type: string
          format: uri
          description: >-
            A URI reference [rfc9457] that identifies the problem type. This
            specification encourages that, when dereferenced, it provides
            human-readable documentation for the problem type (e.g., using HTML
            [W3C.REC-html5-20141028]). When this member is not present, its
            value is assumed to be "about:blank".
        title:
          type: string
          description: >-
            A short, human-readable summary of the problem type. It SHOULD NOT
            change from occurrence to occurrence of the problem, except for
            purposes of localization.
        status:
          type: integer
          format: int32
          description: >-
            The HTTP status code [rfc9457, Section 3.1.12] generated by the
            origin server for this occurrence of the problem.
        detail:
          type: string
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
        code:
          type: string
          description: >-
            Error code in the format RESOURCE-X-NNN where X is R (retryable) or
            N (non-retryable). See ErrorCatalog.md for all error codes.
          example: BOOK-N-001
        isRetryable:
          type: boolean
          description: >-
            Indicates whether the error is retryable. If true, the request may
            succeed if retried. If false, the request will fail again with the
            same input.
        traceId:
          type: string
          description: Request trace identifier for debugging and correlation purposes.
          example: 0HNJ2BG2TU3BU:00000001
      required:
        - title
        - status
        - code
        - isRetryable
  securitySchemes:
    Live:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://auth.bookabletech.com/oauth/token
          scopes:
            venue-site-faqs:read: Grants read access to venue site FAQs (partner scope)
            venue-group:read: Grants read access to operator-managed venue data
            venue-group:create: Grants permission to create operator-managed venue data
            venue-group:update: Grants permission to update operator-managed venue data
            venue-group:delete: Grants permission to delete operator-managed venue data
      description: |
        OAuth2 client credentials via Auth0.
    Sandbox:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://auth-sandbox.bookabletech.com/oauth/token
          scopes:
            venue-site-faqs:read: Grants read access to venue site FAQs (partner scope)
            venue-group:read: Grants read access to operator-managed venue data
            venue-group:create: Grants permission to create operator-managed venue data
            venue-group:update: Grants permission to update operator-managed venue data
            venue-group:delete: Grants permission to delete operator-managed venue data
      description: |
        OAuth2 client credentials via Auth0 (Sandbox).
  headers:
    RateLimitLimit:
      description: Maximum number of requests allowed per window.
      schema:
        type: integer
      example: 200
    RateLimitRemaining:
      description: Number of requests remaining in the current window.
      schema:
        type: integer
      example: 150
    RateLimitReset:
      description: >-
        Unix timestamp (seconds since epoch) when the current rate-limit window
        resets.
      schema:
        type: integer
        format: int64
      example: 1741651200
  responses:
    Unauthorized:
      description: Unauthorized - Authentication is required
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ClientError'
          example:
            type: https://tools.ietf.org/html/rfc9110#section-15.5.5
            title: Invalid User Credentials
            status: 401
            detail: The provided credentials are invalid
            code: USER-N-003
            isRetryable: false
            traceId: 0HNJ2BG2TU3BU:00000002
        text/toon:
          schema:
            $ref: '#/components/schemas/ClientError'
          example: |
            type: "https://tools.ietf.org/html/rfc9110#section-15.5.5"
            title: Invalid User Credentials
            status: 401
            detail: The provided credentials are invalid
            code: USER-N-003
            isRetryable: false
            traceId: "0HNJ2BG2TU3BU:00000002"
    Forbidden:
      description: Forbidden - The request is understood but access is denied
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ClientError'
          example:
            type: https://tools.ietf.org/html/rfc9110#section-15.5.4
            title: Venue Not Mapped to Partner
            status: 403
            detail: The requested venue is not mapped to the current partner
            code: PMAP-N-001
            isRetryable: false
            traceId: 0HNJ2BG2TU3BU:00000003
        text/toon:
          schema:
            $ref: '#/components/schemas/ClientError'
          example: |
            type: "https://tools.ietf.org/html/rfc9110#section-15.5.4"
            title: Venue Not Mapped to Partner
            status: 403
            detail: The requested venue is not mapped to the current partner
            code: PMAP-N-001
            isRetryable: false
            traceId: "0HNJ2BG2TU3BU:00000003"
    NotFound:
      description: Not Found - The requested resource was not found
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ClientError'
          example:
            type: https://tools.ietf.org/html/rfc9110#section-15.5.5
            title: Venue Not Found
            status: 404
            detail: The requested venue could not be found
            code: VENUE-N-001
            isRetryable: false
            traceId: 0HNJ2BG2TU3BU:00000004
        text/toon:
          schema:
            $ref: '#/components/schemas/ClientError'
          example: |
            type: "https://tools.ietf.org/html/rfc9110#section-15.5.5"
            title: Venue Not Found
            status: 404
            detail: The requested venue could not be found
            code: VENUE-N-001
            isRetryable: false
            traceId: "0HNJ2BG2TU3BU:00000004"
    TooManyRequests:
      description: >-
        Too Many Requests - Rate limit exceeded. Retry after the window
        specified in the Retry-After header.
      headers:
        Retry-After:
          description: Number of seconds to wait before retrying the request.
          schema:
            type: integer
          example: 60
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ClientError'
          example:
            type: https://tools.ietf.org/html/rfc6585#section-4
            title: Rate Limit Exceeded
            status: 429
            detail: >-
              Too many requests have been made in a short period. Please wait
              and retry.
            code: RATE-R-001
            isRetryable: true
            traceId: 0HNJ2BG2TU3BU:00000006
        text/toon:
          schema:
            $ref: '#/components/schemas/ClientError'
          example: >
            type: "https://tools.ietf.org/html/rfc6585#section-4"

            title: Rate Limit Exceeded

            status: 429

            detail: Too many requests have been made in a short period. Please
            wait and retry.

            code: RATE-R-001

            isRetryable: true

            traceId: "0HNJ2BG2TU3BU:00000006"
    InternalServerError:
      description: Internal Server Error - An unexpected error occurred
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ServerError'
          example:
            type: https://tools.ietf.org/html/rfc9110#section-15.6.1
            title: Internal Server Error
            status: 500
            detail: An unexpected error occurred while processing the request
            code: SYS-N-001
            isRetryable: false
            traceId: 0HNJ2BG2TU3BU:00000007
        text/toon:
          schema:
            $ref: '#/components/schemas/ServerError'
          example: |
            type: "https://tools.ietf.org/html/rfc9110#section-15.6.1"
            title: Internal Server Error
            status: 500
            detail: An unexpected error occurred while processing the request
            code: SYS-N-001
            isRetryable: false
            traceId: "0HNJ2BG2TU3BU:00000007"
    BadRequest:
      description: Bad Request - The request was invalid or cannot be served
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ClientError'
          example:
            type: https://tools.ietf.org/html/rfc9110#section-15.5.1
            title: Validation Failed
            status: 400
            detail: One or more validation errors occurred.
            code: VALID-N-001
            isRetryable: false
            traceId: 0HNJ2BG2TU3BU:00000001
            errors:
              Date:
                - Availability date cannot be in the past.
        text/toon:
          schema:
            $ref: '#/components/schemas/ClientError'
          example: |
            type: "https://tools.ietf.org/html/rfc9110#section-15.5.1"
            title: Validation Failed
            status: 400
            detail: One or more validation errors occurred.
            code: VALID-N-001
            isRetryable: false
            traceId: "0HNJ2BG2TU3BU:00000001"
            errors.Date[1]: "Availability date cannot be in the past."
