Venue Hierarchy & Concurrent Booking

End-to-end journey configuring physical sports facilities, schedulable resources, operating schedules, and 2-phase booking holds.

Learn how to set up multi-site facilities, manage schedulable resources, define blackout windows, and process high-concurrency bookings.

Step 1: Structuring Multi-Campus Facilities

Define geographic sites, buildings, and athletic zones with geo-coordinates and amenity tags.

Create Site (POST /api/v1/venue/sites)JSON
{
  "name": "Manhattan Sports Complex",
  "address": "450 W 33rd St, New York, NY 10001",
  "timeZone": "America/New_York",
  "latitude": 40.7535,
  "longitude": -73.9995
}

Step 2: Creating Schedulable Resources & Hierarchies

Configure pitches, courts, and equipment as atomic or composite schedulable assets with capacity limits.

Resource Hierarchy Visual StructureText
Manhattan Sports Complex (Site)
└── Building A: Indoor Arenas (Facility)
    ├── Basketball Court 1 (Schedulable Resource - Hardwood)
    │   ├── Half Court A (Sub-resource)
    │   └── Half Court B (Sub-resource)
    ├── Tennis Court East (Schedulable Resource - Clay)
    └── Padel Court North (Schedulable Resource - Panoramic Glass)

Step 3: Configuring Operating Hours & Blackout Windows

Set weekly recurring schedules, holiday exceptions, and maintenance closure intervals.

Step 4: The 2-Phase Concurrency Hold Engine

Acquire atomic 15-minute reservations during checkout, ensuring instant lock acquisition with automatic TTL expiration.

Step 5: Operations Calendar & Reservation 360

Manage the dispatch grid, review reservation lifecycles, and handle operational alterations.

Create Draft (POST /api/v1/Reservations)Shell
curl -X POST http://localhost:5000/api/v1/Reservations \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "resourceId": "<encrypted-resource-id>",
    "customerPartyId": "<encrypted-party-id>",
    "requestedStartUtc": "2026-10-20T09:00:00Z",
    "requestedEndUtc": "2026-10-20T10:00:00Z",
    "quantity": 1,
    "idempotencyKey": "draft_intent_8f93a10c-2374-4b51"
  }'
Hold Acquisition (POST /api/v1/BookingHolds)Shell
curl -X POST http://localhost:5000/api/v1/BookingHolds \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "reservationId": "<encrypted-reservation-id>",
    "idempotencyKey": "hold_intent_45ae79e1-65d1-447e"
  }'
Calculate Price Quote (reuse the same body and key on retry)Shell
curl -X POST http://localhost:5000/api/v1/catalog-pricing/price-quotes/calculate \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "offeringId": "<encrypted-offering-id>",
    "schedulableResourceId": "<encrypted-resource-id>",
    "partyId": "<encrypted-party-id>",
    "quantity": 1,
    "requestedStartUtc": "2026-10-20T09:00:00Z",
    "requestedEndUtc": "2026-10-20T10:00:00Z",
    "currencyCode": "EGP",
    "expiresAtUtc": "2026-10-20T09:30:00Z",
    "idempotencyKey": "quote_intent_6198e7f8-52b2-4e73"
  }'