---
title: "POST /bookings"
method: POST
path: "/bookings"
tags: ["Booking"]
---

# POST /bookings

`POST /bookings`

## Request body

- StoreBookingRequest — Phase 140-03: Store booking via Public API. Scope enforcement handled upstream by EnforceApiScope middleware.
  - `customer_id` string, required
  - `event_date` string, date-time, required
  - `event_name` string, nullable
  - `event_start_time` string, nullable
  - `event_end_time` string, nullable
  - `arrival_time` string, nullable
  - `departure_time` string, nullable
  - `event_type` string, nullable
  - `event_type_id` integer, nullable
  - `package_id` string, nullable — legacy single-package
  - `unit_id` string, nullable
  - `venue_id` string, nullable
  - `offline_payment_method_id` string, nullable
  - `coupon_code` string, nullable
  - `payment_option` 'pay_now' | 'pay_later' | 'deposit' | 'full', nullable
  - `payment_amount_minor` integer, nullable
  - `client_reported_distance` number, nullable
  - `status` 'enquiry' | 'quote_sent' | 'confirmed' | 'deposit_paid' | 'balance_paid' | 'complete' | 'cancelled', nullable
  - `notes` string, nullable
  - `reservation_id` string, nullable — Gap 18: optional reservation hold to atomically promote into a booking. Format: res_<integer> (Availability row with status=reserved).
  - `venue` object
    - `name` string, nullable
    - `address_line1` string, nullable
    - `address_line2` string, nullable
    - `city` string, nullable
    - `postcode` string, nullable
    - `county` string, nullable
    - `country` string, nullable
    - `latitude` number, nullable
    - `longitude` number, nullable
    - `phone` string, nullable
    - `email` string, email, nullable
  - `custom_fields` string[], nullable
  - `media_policy` object — Phase 164 (CAP-01): first-class media-handling policy object. These are SHAPE rules only — the semantic gate (tenant enabled + plan) and route-dependent required-field checks (recipient vs postal_address) live in App\Services\MediaPolicy\MediaPolicyCapture, invoked by the controller. Existing `metadata` bag (incl. cc's legacy u18_* keys) is untouched and coexists independently.
    - `applies` boolean
    - `source` 'customer_question' | 'customer_request' | 'operator', nullable
    - `sharing_opt_in` boolean, nullable
    - `recipient` object, nullable
      - `name` string, nullable
      - `phone` string, nullable
      - `email` string, email, nullable
    - `postal_address` string, nullable
    - `terms_version` string, nullable
  - `metadata` string[], nullable
  - `packages` object[], nullable — multi-package primary form
    - `package_id` string, required
    - `unit_id` string, nullable
    - `quantity` integer, nullable
  - `extras` object[], nullable
    - `id` string, required
    - `quantity` integer, required

## Response `201`

- string

## Other responses

- `409`
- `422` — Validation error

---

[API](https://skmtc.dev/boothzen/apis/boothzen-api-v1.md) · [All operations](https://skmtc.dev/boothzen/apis/boothzen-api-v1/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/boothzen/boothzen-api-v1/revisions/a5ae040e3ba3/schema)
