---
title: "List venue booking conflicts"
method: GET
path: "/venues/{venueId}/conflicts"
tags: ["Venues"]
---

# List venue booking conflicts

`GET /venues/{venueId}/conflicts`

## Request

- Base URL: `https://joinways.app/api/v1`
- URL: `https://joinways.app/api/v1/venues/{venueId}/conflicts`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://joinways.app/oauth/authorize`, token URL `https://joinways.app/api/oauth/token`, scopes: `mcp.read`)

Option and confirmed (non-archived) events that would collide with a booking of this venue over the date window. An event occupies the spaces it books, or the whole venue when it books none (or when the venue is only rented whole); two events collide when their dates overlap and so do their footprints. Pass `space_ids` to check a booking of some spaces only; without it the check is for the whole venue, so every event of the venue in the window is returned. `venueId` may be a space: the check then runs on its venue for that space. Dates are calendar days of the venue's own time zone. A combined space (e.g. Salon AB = Salon A + Salon B, see `combined_space_ids`) takes its parts: it collides with each part and with any combination sharing one, while two parts do not collide with each other. A space's set-up / tear-down minutes widen each of its slots, and a slot running past midnight (22:00 → 02:00) still holds the next morning. The response also lists the venue's closures on those days (and those of the requested spaces) and the days it does not open (`outside_hours`), with its enforcement mode. **Role permission:** none (any member).

## Query parameters

- `start_date` string, date
- `end_date` string, date
- `space_ids` string[]

## Response `200`

Conflicting events, sorted by start date.

- object
  - `conflicts` VenueConflict[], required
    - `id` string, uuid
    - `title` string, nullable
    - `status` 'option' | 'confirmed'
    - `start_date` string, date-time
    - `end_date` string, date-time, nullable
    - `selected_dates` string[], nullable: Days a multi-date event holds (start/end are then its envelope).
    - `space_ids` string[]: Spaces of the venue the event books; empty = the whole venue.
    - `slots` object[]: When the event uses those spaces (spaces of this venue only). A space listed in `space_ids` without slot is taken all day.
      - `space_id` string, uuid
      - `day_date` string, date
      - `start_time` string, nullable: Venue wall-clock time (HH:MM:SS); null = whole day.
      - `end_time` string, nullable: Venue wall-clock time (HH:MM:SS); before `start_time` = next day.
  - `truncated` boolean: More events than could be read in one call: the list may be incomplete; narrow the window.
  - `closures` ClosureHit[]
    - `id` string, uuid
    - `level` 'venue' | 'space': Set on the venue itself or on one of the requested spaces.
    - `location_id` string, uuid
    - `start_date` string, date
    - `end_date` string, date
    - `start_time` string, nullable: HH:MM, venue wall clock; null = whole days.
    - `end_time` string, nullable
    - `reason` string, nullable
    - `closure_type` 'manual' | 'holiday'
  - `outside_hours` OutsideHoursHit[]
    - `location_id` string, uuid
    - `level` 'venue' | 'space'
    - `date` string, date
    - `requested_start` string, nullable: HH:MM
    - `requested_end` string, nullable: HH:MM
    - `open_time` string, nullable: Earliest opening that day (HH:MM); null when closed.
    - `close_time` string, nullable
    - `closed_all_day` boolean
  - `enforcement` 'warn' | 'block': `block`: events cannot be created or moved onto those closures / outside opening hours (409).
  - `rules_checked` boolean: False when closures / hours could not be read.

## Other responses

- `400`: Validation failed (`invalid_request`). For a body that fails the schema, `details` holds `formErrors` and `fieldErrors`.
- `401`: Missing, invalid, expired or revoked bearer token (`unauthorized`).
- `404`: Not found in this workspace, or the id of the path is not a UUID (`not_found`).
- `429`: Too many requests (`rate_limited`). `details.reason`: `per-ip`, `per-account-minute`, `per-account-day`, or `email_rate_limited` (email budget). Always carries `Retry-After`: wait that many seconds.

---

[API](https://skmtc.dev/joinways/apis/joinways-public-api.md) · [All operations](https://skmtc.dev/joinways/apis/joinways-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/joinways/apis/joinways-public-api/revisions/39e84309953e?raw)
