Booking Endpoints

Create, list, retrieve, complete, and cancel bookings through the HyperXI REST API.

POST/api/public/:slug/book

Create a new booking. This is a public endpoint -- no authentication required. The :slug parameter is the tenant slug.

Request Body

NameTypeRequiredDescription
slot_idstring (uuid)yesThe slot ID to book
room_idstring (uuid)yesRoom ID
party_sizeintegeryesNumber of people in the booking
customer_namestringyesCustomer full name
customer_emailstringyesCustomer email address
customer_phonestringnoCustomer phone number
newsletter_opt_inbooleannoOpt in to newsletter
sms_opt_inbooleannoOpt in to SMS notifications
discount_codestringnoDiscount code to apply
voucher_codestringnoVoucher code to redeem

Examples

curl
curl -X POST "https://api.hyperxi.com:10443/api/public/downtown-escape/book" \
  -H "Content-Type: application/json" \
  -d '{
    "slot_id": "a1b2c3d4-...",
    "room_id": "f47ac10b-...",
    "party_size": 4,
    "customer_name": "John Smith",
    "customer_email": "john@example.com",
    "customer_phone": "+15551234567"
  }'
Node.js
const response = await fetch(
  "https://api.hyperxi.com:10443/api/public/downtown-escape/book",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      slot_id: "a1b2c3d4-...",
      room_id: "f47ac10b-...",
      party_size: 4,
      customer_name: "John Smith",
      customer_email: "john@example.com",
      customer_phone: "+15551234567",
    }),
  }
);

const data = await response.json();
Response
{
  "success": true,
  "data": {
    "id": "b5c6d7e8-...",
    "status": "pending",
    "room_id": "f47ac10b-...",
    "slot_id": "a1b2c3d4-...",
    "party_size": 4,
    "customer_name": "John Smith",
    "customer_email": "john@example.com",
    "total_cents": 14000,
    "checkout_url": "https://checkout.stripe.com/...",
    "created_at": "2026-04-13T10:00:00Z"
  }
}
GET/api/bookings

List bookings for your tenant. Requires authentication. Supports filtering by status, room, date range, and pagination.

Query Parameters

NameTypeRequiredDescription
statusstringnoFilter: pending | confirmed | completed | cancelled | no_show
room_idstring (uuid)noFilter by room
start_datestringnoFilter from date (YYYY-MM-DD)
end_datestringnoFilter to date (YYYY-MM-DD)
limitintegernoMax results (1-100, default 50)

Examples

curl
curl -X GET "https://api.hyperxi.com:10443/api/bookings?status=confirmed&limit=10" \
  -H "Authorization: Bearer hxi_live_your_key_here" \
  -H "x-tenant-slug: downtown-escape"
Node.js
const response = await fetch(
  "https://api.hyperxi.com:10443/api/bookings?status=confirmed&limit=10",
  {
    headers: {
      "Authorization": "Bearer hxi_live_your_key_here",
      "x-tenant-slug": "downtown-escape",
    },
  }
);

const data = await response.json();
Response
{
  "success": true,
  "data": [
    {
      "id": "b5c6d7e8-...",
      "status": "confirmed",
      "room_name": "The Vault",
      "slot_date": "2026-04-15",
      "slot_time": "14:00",
      "party_size": 4,
      "customer_name": "John Smith",
      "total_cents": 14000,
      "created_at": "2026-04-13T10:00:00Z"
    }
  ]
}
GET/api/bookings/:id

Get a single booking by ID with full details including payment information and waiver status. Requires authentication.

Path Parameters

NameTypeRequiredDescription
idstring (uuid)yesBooking ID

Examples

curl
curl -X GET "https://api.hyperxi.com:10443/api/bookings/b5c6d7e8-..." \
  -H "Authorization: Bearer hxi_live_your_key_here" \
  -H "x-tenant-slug: downtown-escape"
Node.js
const response = await fetch(
  "https://api.hyperxi.com:10443/api/bookings/b5c6d7e8-...",
  {
    headers: {
      "Authorization": "Bearer hxi_live_your_key_here",
      "x-tenant-slug": "downtown-escape",
    },
  }
);

const data = await response.json();
Response
{
  "success": true,
  "data": {
    "id": "b5c6d7e8-...",
    "status": "confirmed",
    "room_id": "f47ac10b-...",
    "room_name": "The Vault",
    "slot_id": "a1b2c3d4-...",
    "slot_date": "2026-04-15",
    "slot_time": "14:00",
    "party_size": 4,
    "customer_name": "John Smith",
    "customer_email": "john@example.com",
    "customer_phone": "+15551234567",
    "total_cents": 14000,
    "payment_status": "paid",
    "waiver_status": "pending",
    "created_at": "2026-04-13T10:00:00Z"
  }
}
POST/api/bookings/:id/complete

Mark a booking as completed after the escape room session finishes. Requires authentication.

Path Parameters

NameTypeRequiredDescription
idstring (uuid)yesBooking ID

Examples

curl
curl -X POST "https://api.hyperxi.com:10443/api/bookings/b5c6d7e8-.../complete" \
  -H "Authorization: Bearer hxi_live_your_key_here" \
  -H "x-tenant-slug: downtown-escape"
Node.js
const response = await fetch(
  "https://api.hyperxi.com:10443/api/bookings/b5c6d7e8-.../complete",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hxi_live_your_key_here",
      "x-tenant-slug": "downtown-escape",
    },
  }
);

const data = await response.json();
Response
{
  "success": true,
  "data": {
    "id": "b5c6d7e8-...",
    "status": "completed",
    "completed_at": "2026-04-15T15:05:00Z"
  }
}
POST/api/bookings/:id/cancel

Cancel a booking. If the booking has been paid, a refund may be automatically processed depending on your cancellation policy. Requires authentication.

Path Parameters

NameTypeRequiredDescription
idstring (uuid)yesBooking ID

Request Body

NameTypeRequiredDescription
reasonstringyesReason for cancellation

Examples

curl
curl -X POST "https://api.hyperxi.com:10443/api/bookings/b5c6d7e8-.../cancel" \
  -H "Authorization: Bearer hxi_live_your_key_here" \
  -H "x-tenant-slug: downtown-escape" \
  -H "Content-Type: application/json" \
  -d '{ "reason": "Customer requested reschedule" }'
Node.js
const response = await fetch(
  "https://api.hyperxi.com:10443/api/bookings/b5c6d7e8-.../cancel",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hxi_live_your_key_here",
      "x-tenant-slug": "downtown-escape",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      reason: "Customer requested reschedule",
    }),
  }
);

const data = await response.json();
Response
{
  "success": true,
  "data": {
    "id": "b5c6d7e8-...",
    "status": "cancelled",
    "cancelled_at": "2026-04-13T12:00:00Z",
    "cancellation_reason": "Customer requested reschedule"
  }
}