An empty organization to a confirmed booking, in the order the product expects. Five steps, and the API equivalent of each one.
Villas → New villa. A name and a photo are enough to create it; everything that matters comes next.
A villa needs both its opening hours and its rates before it can take a booking. A villa that looks ready but refuses every slot is almost always missing one of the two.
Villa → Opening hours. A weekly grid: for each day, when the villa opens and when it closes. A day left empty is a closed day.
Bookings are checked against this grid, so it decides more than it looks: a villa open 09:00–18:00 will refuse a 08:30 slot, and the calendar greys the closed bands so nobody tries.
API: PUT /api/v1/properties/{id}/opening-hours
Villa → Rates. A price per duration. The grid is what the villa offers: a duration absent from it is not bookable at all, not even at a negotiated price. You can override the amount on a given booking, but the duration has to exist in the grid first.
API: PUT /api/v1/properties/{id}/rates
Customers → New customer. A name is the only thing required. An email lets you send them a payment link, and an access link to their own space.
API: POST /api/v1/customers — or
POST /api/v1/customers/bulk to bring a list over in
one call.
Calendar. Drag across the hours you want, on the day you want: the villa, the slot and the price fill themselves in. Pick the customer, confirm.
The booking is refused if the slot falls outside the villa's hours, if its duration is absent from the rate grid, or if a confirmed booking already overlaps it.
Account → API Keys → New key. A key belongs to one organization and carries your own rights in it. Copy it when it is shown — it is not shown again.
curl -H "x-api-key: $VILLASLOT_API_KEY" \
"https://villaslot.app/api/v1/me"That first call turns a bare key into a context: which organization it opens, which role it carries, the timezone and currency every other call depends on, and how much room your plan leaves.
Everything above has an HTTP equivalent, and a page that details it. The full map is in API.