Indoor Games
Base paths:
/api/venues/{venueId}/indoor-games— public catalog/api/indoor-games/{indoorGame}/availability— slot checker/api/indoor-game-bookings— customer booking CRUD
Indoor games are non-court activities offered at a venue, such as PlayStation, chess, carrom, table tennis, etc.
Game Types
| Value | Label |
|---|---|
playstation | PlayStation / Gaming Console |
chess | Chess |
ludo | Ludo |
cards | Cards |
uno | Uno |
table_tennis | Table Tennis |
carrom | Carrom |
other | Other |
Indoor Game Booking Statuses
| Status | Description |
|---|---|
pending | Booking created, not yet paid |
confirmed | Paid and confirmed |
playing | Session in progress |
completed | Session finished |
cancelled | Cancelled |
Endpoints
GET /api/venues/{venueId}/indoor-games
Browse available indoor games at a venue.
Auth: Not required
Query parameters:
| Parameter | Type | Description |
|---|---|---|
game_type | string | Filter by game type (see table above) |
Response 200:
{
"data": [
{
"id": 1,
"tenant_id": 3,
"venue_id": 1,
"name": "PS5 - Station 1",
"game_type": "playstation",
"description": "Sony PlayStation 5 with FIFA 25 and more",
"capacity": 2,
"slot_minutes": 60,
"price_per_hour": "150.00",
"is_active": true,
"sort_order": 1,
"venue": { "id": 1, "name": "Champions Futsal", "slug": "champions-futsal" },
"created_at": "2025-01-10 10:00:00",
"updated_at": "2025-01-10 10:00:00"
}
]
}GET /api/indoor-games/{indoorGame}/availability
Get available time slots for an indoor game on a date.
Auth: Not required
Query parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
date | date | Yes | YYYY-MM-DD |
Response 200:
{
"date": "2025-06-15",
"slot_minutes": 60,
"slots": [
{
"start_time": "09:00",
"end_time": "10:00",
"is_available": true
},
{
"start_time": "10:00",
"end_time": "11:00",
"is_available": false
}
]
}GET /api/indoor-game-bookings [Auth required]
List all indoor game bookings for the authenticated user.
Response 200:
{
"data": [
{
"id": 5,
"booking_number": "IGB-2025-0005",
"tenant_id": 3,
"indoor_game_id": 1,
"user_id": 12,
"type": "online",
"customer_name": "Jane Doe",
"customer_phone": "9800000000",
"date": "2025-06-15",
"start_time": "09:00",
"end_time": "10:00",
"duration_hours": "1.00",
"players_count": 2,
"base_amount": "150.00",
"discount_amount": 0,
"total_amount": "150.00",
"paid_amount": 0,
"balance_due": 150.00,
"is_paid": false,
"status": "pending",
"cancel_reason": null,
"notes": null,
"indoor_game": { ...IndoorGameResource... },
"user": { ...UserResource... },
"charges": [],
"payments": [],
"created_at": "2025-06-10 09:00:00"
}
]
}POST /api/indoor-game-bookings [Auth required]
Book an indoor game slot.
Request body:
{
"indoor_game_id": 1,
"date": "2025-06-15",
"start_time": "09:00",
"end_time": "10:00",
"players_count": 2,
"customer_phone": "9800000000",
"notes": "First time, need introduction"
}| Field | Type | Required | Description |
|---|---|---|---|
indoor_game_id | integer | Yes | ID of the indoor game to book |
date | date | Yes | YYYY-MM-DD, must be today or future |
start_time | time | Yes | HH:mm (24-hour) |
end_time | time | Yes | HH:mm, after start_time |
players_count | integer | No | Number of players (max 20) |
customer_phone | string | No | Contact phone |
notes | string | No | Optional note for staff |
Response 201: IndoorGameBookingResource
Response 409 — slot already taken:
{ "message": "The selected slot is not available." }GET /api/indoor-game-bookings/{indoorGameBooking} [Auth required]
Get details of a specific indoor game booking.
Response 200: Full IndoorGameBookingResource including indoor_game, user, payments.
PATCH /api/indoor-game-bookings/{indoorGameBooking}/cancel [Auth required]
Cancel an indoor game booking.
Request body:
{
"cancel_reason": "Schedule conflict"
}Response 200: Updated IndoorGameBookingResource with status: "cancelled".
IndoorGameResource — Field Reference
| Field | Type | Notes |
|---|---|---|
id | integer | |
tenant_id | integer | |
venue_id | integer | |
name | string | e.g. "PS5 - Station 1" |
game_type | string | See game types table |
description | string or null | |
capacity | integer | Max players simultaneously |
slot_minutes | integer | Booking slot duration in minutes (e.g. 60) |
price_per_hour | decimal string | Price in NPR |
is_active | boolean | Only show active games |
sort_order | integer | For display ordering |
venue | object | Parent venue summary |
created_at | datetime string |
IndoorGameBookingResource — Field Reference
| Field | Type | Notes |
|---|---|---|
id | integer | |
booking_number | string | e.g. "IGB-2025-0005" |
indoor_game_id | integer | |
type | string | online, offline, walkin |
customer_name | string | |
customer_phone | string or null | |
date | date string | |
start_time | string | HH:mm |
end_time | string | HH:mm |
duration_hours | decimal string | |
players_count | integer or null | |
base_amount | decimal string | |
discount_amount | decimal string | |
total_amount | decimal string | |
paid_amount | decimal string | |
balance_due | decimal number | |
is_paid | boolean | |
status | string | See statuses table |
cancel_reason | string or null | |
notes | string or null | |
indoor_game | object | When loaded |
user | object | When loaded |
charges | array | Extra session charges |
payments | array | Payment history |
created_at | datetime string |
Indoor Game Booking Flow
1. GET /api/venues/{venueId}/indoor-games?game_type=playstation → pick game
2. GET /api/indoor-games/{id}/availability?date=YYYY-MM-DD → pick slot
3. POST /api/indoor-game-bookings → create booking
4. POST /api/payments/initiate (booking_type: "indoor") → pay
5. GET /api/indoor-game-bookings/{id} → show confirmation