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

# Create a booking

> **Beta** — this endpoint may change before general availability.



## OpenAPI

````yaml /api-reference/openapi.json post /bookings
openapi: 3.1.0
info:
  title: Replo Public API
  version: '2026-11-10'
servers:
  - url: https://api.replo.app/v1
security: []
paths:
  /bookings:
    post:
      tags:
        - Bookings
      summary: Create a booking
      description: '**Beta** — this endpoint may change before general availability.'
      operationId: bookings.create
      parameters:
        - name: Replo-Api-Version
          in: header
          required: true
          schema:
            type: string
            enum:
              - '2026-11-10'
          description: The public API version to use for this request.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                projectId:
                  type: string
                  format: uuid
                  description: The project that owns the forms, from list_projects
                serviceId:
                  type: string
                  format: uuid
                  description: The service's id, from replo_booking_services_list
                staffId:
                  type: string
                  format: uuid
                  description: The staff member's id, from the service's staff list
                startsAt:
                  type: string
                  format: date-time
                  description: >-
                    When the booking starts, such as a startsAt from
                    replo_booking_slots_list; it may fall outside opening hours
                seats:
                  type: integer
                  minimum: 1
                  maximum: 1000
                  description: People in the party; 1 if left out
                addOnKeys:
                  type: array
                  items:
                    type: string
                    pattern: ^[a-z0-9][a-z0-9-]{0,63}$
                  maxItems: 20
                  description: >-
                    Add-ons the person wants, by key; each makes the booking
                    longer. None if left out
                contact:
                  type: object
                  properties:
                    email:
                      type: string
                      format: email
                    name:
                      type:
                        - string
                        - 'null'
                      maxLength: 255
                    phone:
                      type:
                        - string
                        - 'null'
                      maxLength: 64
                  required:
                    - email
                  description: The person the booking is for; saved as a contact
              required:
                - projectId
                - serviceId
                - staffId
                - startsAt
                - contact
              additionalProperties: false
      responses:
        '201':
          description: Create a booking
          content:
            application/json:
              schema:
                type: object
                properties:
                  object:
                    type: string
                    enum:
                      - booking
                  id:
                    type: string
                    format: uuid
                  projectId:
                    type: string
                    format: uuid
                  serviceId:
                    type: string
                    format: uuid
                  staffId:
                    type: string
                    format: uuid
                  responseId:
                    type:
                      - string
                      - 'null'
                    format: uuid
                    description: >-
                      The form response the booking came with; null when added
                      by hand
                  status:
                    type: string
                    enum:
                      - held
                      - confirmed
                      - cancelled
                      - completed
                      - no_show
                    description: >-
                      confirmed, cancelled, completed or no_show; held is a time
                      a visitor is still filling in the form for
                  startsAt:
                    type: string
                  endsAt:
                    type: string
                  seats:
                    type: integer
                  meetingUrl:
                    type:
                      - string
                      - 'null'
                    description: The Google Meet link, if any
                  addOnKeys:
                    type: array
                    items:
                      type: string
                  contact:
                    type:
                      - object
                      - 'null'
                    properties:
                      id:
                        type: string
                        format: uuid
                      email:
                        type: string
                      name:
                        type:
                          - string
                          - 'null'
                      phone:
                        type:
                          - string
                          - 'null'
                    required:
                      - id
                      - email
                      - name
                      - phone
                    description: The person the booking is for
                  createdAt:
                    type: string
                required:
                  - object
                  - id
                  - projectId
                  - serviceId
                  - staffId
                  - responseId
                  - status
                  - startsAt
                  - endsAt
                  - seats
                  - meetingUrl
                  - addOnKeys
                  - contact
                  - createdAt
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '401':
          description: >-
            Missing or invalid Replo Public API token. Send an active key as
            `Authorization: Bearer replo_sk_...`; if it was revoked, create a
            new key in Replo Settings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '403':
          description: >-
            You are not authorized to access this resource. Ask a workspace
            owner to perform this action or to grant the key's creator access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '404':
          description: >-
            Not Found. The resource may not exist, this key may lack the
            required scope, or the key's creator may have lost access. Check the
            key's scopes in Replo Settings and the creator's project or
            workspace access; a workspace owner can grant access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '409':
          description: The resource is in a conflicting state.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '413':
          description: File content exceeds the 10 MiB limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '429':
          description: >-
            Too many requests. Please retry after the time indicated by the
            Retry-After header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '500':
          description: An internal error occurred.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
        '503':
          description: Service temporarily unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
      security:
        - bearerAuth: []
components:
  schemas:
    PublicApiError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            doc_url:
              type: string
            issues:
              type: array
              items:
                type: object
                properties:
                  param:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Dotted path to the failing field within the request body,
                      query or path, e.g. "name" or "variants.0.available"; null
                      when the rule covers the whole input.
                  message:
                    type: string
                    description: Why the field was rejected.
                required:
                  - param
                  - message
              description: >-
                Present on an invalid_request whose input failed validation:
                each failing field and why, at most 10.
          required:
            - code
            - message
            - doc_url
      required:
        - error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.