Appearance
Availability
Catalogue of slots for one venue on one calendar date.
Auth: x-api-key. The venue must be granted (403 VENUE_NOT_AUTHORIZED otherwise).
http
GET /api/v1/slots/availability?venue_id=<uuid>&date=2026-09-20&resource_id=badminton-court-1
x-api-key: <your-api-key>resource_id is optional. date is YYYY-MM-DD and means the venue's local calendar day, not a UTC day. All times in the response are UTC (ISO 8601); convert them to the venue's time zone, given in timezone, before you show them to a customer.
json
{
"venue_id": "a0000000-0000-4000-8000-000000000001",
"date": "2026-09-20",
"timezone": "Asia/Kolkata",
"slots": [
{
"slot_id": "…",
"resource_id": "badminton-court-1",
"slot_start": "2026-09-20T06:00:00.000Z",
"slot_end": "2026-09-20T07:00:00.000Z",
"price_rupees": 500,
"is_available": true
}
]
}is_available: true is not a reservation. Another channel can hold the slot before your hold call returns. Always hold before you promise the customer the court.
price_rupees already includes the venue's price rules — it is what a hold on that slot is charged. base_price_rupees is the price before rules. The hold's own price_rupees is authoritative (it locks the price for that reservation).
Holding a slot from this list
Availability has no duration field. Each slot has a slot_start and a slot_end (ISO 8601, UTC). When you hold a slot, send its slot_start unchanged as slot_start, and send the minutes between slot_end and slot_start as slot_duration_minutes — for example 06:00:00.000Z to 07:00:00.000Z is 60. Do not invent a different start or length.
javascript
const slotDurationMinutes = (Date.parse(slot.slot_end) - Date.parse(slot.slot_start)) / 60000;