# Booking Groups

Grouping of related bookings

## GET /api/v1/booking-groups/{id}

Get booking group

Get a single booking group by ID

**Permissions:** 🔵 `bookings.read`

Path parameters:
- `id` (string, required) — Booking group ID

Response 200 — Default Response

```ts
{
  status: "success"
  data: {
    id: string // uuid
    locationId: number
    name: string
    description?: string | null
    sortOrder: number
    isActive: boolean
    schedule: Array<{
        dayOfWeek: number
        startTime: string
        endTime: string
      }>
    scheduleId?: string | null // uuid
    scheduleRules: Array<{
        dayOfWeek?: number | null
        startTime: string
        endTime: string
        ruleType: "WEEKDAY" | "DATE_RANGE" | "SPECIFIC_DATE"
        startDate?: string | null
        endDate?: string | null
        isAvailable: boolean
      }>
    tableIds: string[]
    slotIntervalMinutes: number
    defaultDurationMinutes: number
    maxPartySize: number
    minAdvanceHours: number
    maxAdvanceDays: number
    paymentHoldMinutes: number
    confirmationMode: string
    requiredItems: Array<{
        id: string // uuid
        inventoryItemId: number
        quantityPer: "booking" | "guest"
        itemName?: string | null
        itemPrice?: number | null
      }>
    createdAt: string // date-time
    updatedAt: string // date-time
  }
  meta: {
    requestId: string
    timestamp: string // date-time
    executionTimeMs: number
  }
}
```

## PUT /api/v1/booking-groups/{id}

Update booking group

Update an existing booking group

**Permissions:** ⚪ `bookings.manage`

Path parameters:
- `id` (string, required) — Booking group ID

Request body:

```ts
{
  name?: string
  description?: string | null
  sortOrder?: number
  isActive?: boolean
  schedule?: Array<{
      dayOfWeek: number
      startTime: string
      endTime: string
    }>
  tableIds?: string[]
  slotIntervalMinutes?: number
  defaultDurationMinutes?: number
  maxPartySize?: number
  minAdvanceHours?: number
  maxAdvanceDays?: number
  paymentHoldMinutes?: number
  confirmationMode?: string
  requiredItems?: Array<{
      inventoryItemId: number
      quantityPer: "booking" | "guest"
    }>
}
```

Response 200 — Default Response

```ts
{
  status: "success"
  data: {
    id: string // uuid
    locationId: number
    name: string
    description?: string | null
    sortOrder: number
    isActive: boolean
    schedule: Array<{
        dayOfWeek: number
        startTime: string
        endTime: string
      }>
    scheduleId?: string | null // uuid
    scheduleRules: Array<{
        dayOfWeek?: number | null
        startTime: string
        endTime: string
        ruleType: "WEEKDAY" | "DATE_RANGE" | "SPECIFIC_DATE"
        startDate?: string | null
        endDate?: string | null
        isAvailable: boolean
      }>
    tableIds: string[]
    slotIntervalMinutes: number
    defaultDurationMinutes: number
    maxPartySize: number
    minAdvanceHours: number
    maxAdvanceDays: number
    paymentHoldMinutes: number
    confirmationMode: string
    requiredItems: Array<{
        id: string // uuid
        inventoryItemId: number
        quantityPer: "booking" | "guest"
        itemName?: string | null
        itemPrice?: number | null
      }>
    createdAt: string // date-time
    updatedAt: string // date-time
  }
  meta: {
    requestId: string
    timestamp: string // date-time
    executionTimeMs: number
  }
}
```

## DELETE /api/v1/booking-groups/{id}

Delete booking group

Soft-delete a booking group (sets is_active = false)

**Permissions:** ⚪ `bookings.manage`

Path parameters:
- `id` (string, required) — Booking group ID

Response 200 — Default Response

```ts
{
  status: "success"
  data: {
    id: string // uuid
    locationId: number
    name: string
    description?: string | null
    sortOrder: number
    isActive: boolean
    schedule: Array<{
        dayOfWeek: number
        startTime: string
        endTime: string
      }>
    scheduleId?: string | null // uuid
    scheduleRules: Array<{
        dayOfWeek?: number | null
        startTime: string
        endTime: string
        ruleType: "WEEKDAY" | "DATE_RANGE" | "SPECIFIC_DATE"
        startDate?: string | null
        endDate?: string | null
        isAvailable: boolean
      }>
    tableIds: string[]
    slotIntervalMinutes: number
    defaultDurationMinutes: number
    maxPartySize: number
    minAdvanceHours: number
    maxAdvanceDays: number
    paymentHoldMinutes: number
    confirmationMode: string
    requiredItems: Array<{
        id: string // uuid
        inventoryItemId: number
        quantityPer: "booking" | "guest"
        itemName?: string | null
        itemPrice?: number | null
      }>
    createdAt: string // date-time
    updatedAt: string // date-time
  }
  meta: {
    requestId: string
    timestamp: string // date-time
    executionTimeMs: number
  }
}
```

## GET /api/v1/locations/{locationId}/booking-groups

List booking groups

List booking groups for a location. Active groups only by default; pass includeInactive=true to include inactive.

Query parameters:
- `includeInactive` (boolean, optional) — Include inactive groups

Path parameters:
- `locationId` (number, required) — Location ID

Response 200 — Default Response

```ts
{
  status: "success"
  data: {
    items: Array<{
        id: string // uuid
        locationId: number
        name: string
        description?: string | null
        sortOrder: number
        isActive: boolean
        schedule: unknown[]
        scheduleId?: string | null // uuid
        scheduleRules: unknown[]
        tableIds: unknown[]
        slotIntervalMinutes: number
        defaultDurationMinutes: number
        maxPartySize: number
        minAdvanceHours: number
        maxAdvanceDays: number
        paymentHoldMinutes: number
        confirmationMode: string
        requiredItems: unknown[]
        createdAt: string // date-time
        updatedAt: string // date-time
      }>
  }
  meta: {
    requestId: string
    timestamp: string // date-time
    executionTimeMs: number
  }
}
```

## POST /api/v1/locations/{locationId}/booking-groups

Create booking group

Create a new booking group for a location

**Permissions:** ⚪ `bookings.manage`

Path parameters:
- `locationId` (number, required) — Location ID

Request body:

```ts
{
  name: string
  description?: string | null
  sortOrder?: number
  isActive?: boolean
  schedule?: Array<{
      dayOfWeek: number
      startTime: string
      endTime: string
    }>
  tableIds?: string[]
  slotIntervalMinutes?: number
  defaultDurationMinutes?: number
  maxPartySize?: number
  minAdvanceHours?: number
  maxAdvanceDays?: number
  paymentHoldMinutes?: number
  confirmationMode?: string
  requiredItems?: Array<{
      inventoryItemId: number
      quantityPer: "booking" | "guest"
    }>
}
```

Response 201 — Default Response

```ts
{
  status: "success"
  data: {
    id: string // uuid
    locationId: number
    name: string
    description?: string | null
    sortOrder: number
    isActive: boolean
    schedule: Array<{
        dayOfWeek: number
        startTime: string
        endTime: string
      }>
    scheduleId?: string | null // uuid
    scheduleRules: Array<{
        dayOfWeek?: number | null
        startTime: string
        endTime: string
        ruleType: "WEEKDAY" | "DATE_RANGE" | "SPECIFIC_DATE"
        startDate?: string | null
        endDate?: string | null
        isAvailable: boolean
      }>
    tableIds: string[]
    slotIntervalMinutes: number
    defaultDurationMinutes: number
    maxPartySize: number
    minAdvanceHours: number
    maxAdvanceDays: number
    paymentHoldMinutes: number
    confirmationMode: string
    requiredItems: Array<{
        id: string // uuid
        inventoryItemId: number
        quantityPer: "booking" | "guest"
        itemName?: string | null
        itemPrice?: number | null
      }>
    createdAt: string // date-time
    updatedAt: string // date-time
  }
  meta: {
    requestId: string
    timestamp: string // date-time
    executionTimeMs: number
  }
}
```
