How to build: Marketplace and Search
Browse listings, then check availability before checkout.
Winner for list/detail: Middleware Backend properties (live).
Winner for dates: Middleware Backend availability/check (live).
The Next app currently still GETs Core Backend smart-meta-manager/entity/property in services/property.ts. Switch to Middleware. Availability is already services/availability.ts → Middleware.
Home / hotels / shortlets → filters → property detail → rooms + rate plans → availability → checkoutExplorer: Middleware Backend.
Marketplace Home
implemented / — app/(marketplace)/page.tsx.
Marketing shell. Search submits into /search or listing pages. No booking write on this screen.
Destination Page
implemented /[destination] — app/(marketplace)/[destination]/page.tsx.
Filter the property list by city / destination. Winner: same list API as Hotel Listing.
Hotel Listing / Shortlet Listing
Middleware Backend · winner · liveimplemented (UI) · partial (app still on Core)
GET https://middleware-dev.bookdirect.live/api/v1/nellalink/properties?propertyType=hotel&page=1&limit=20
GET https://middleware-dev.bookdirect.live/api/v1/nellalink/properties?propertyType=shortlet&city=Lagos
GET https://middleware-dev.bookdirect.live/api/v1/nellalink/properties?city=Lagos&propertyType=hotel&amenities=swimming_pool,free_parking
Routes: /hotels, /shortlets (legacy Convex list may still appear on home cards).
Optional query: city, country, propertyType (hotel | shortlet | apartment | villa | guesthouse), amenities (comma slugs from the tick list), page, limit.
Public browse — no Bearer required. IDOR: Middleware returns active listings only; counts/PII stay off this GET.
Search Results / Search Filters
implemented /search, /search/[slug].
Same winner as listing. Amenity ticks: local catalog slugs (swimming_pool, free_wifi, free_parking) — Amenity tick list. Send ?amenities=swimming_pool,free_parking. Do not use wifi / pool or display labels.
Do not invent a Core date query. Dates belong in UI state, then availability. Middleware narrows Core with search_by=meta_key.city + tags=amenity_{slug} — Search indexes.
Hotel Details / Shortlet Details
Middleware Backend · winner · live
GET https://middleware-dev.bookdirect.live/api/v1/nellalink/properties/{id}
Routes: /hotel/[slug], /shortlet/[slug]
Then rate plans:
GET https://middleware-dev.bookdirect.live/api/v1/nellalink/rates-packages/property/{propertyId}
Room Selection / Rate Plan Selection / Availability Results
Middleware Backend · winner · live
POST https://middleware-dev.bookdirect.live/api/v1/bookdirect/availability/check
{
"property_uuid": "{property_uuid}",
"check_in": "2026-10-01",
"check_out": "2026-10-03",
"units_needed": 1
}Show only plans where remaining units ≥ units_needed. Middleware must return counts only (no guest PII).
Called by Middleware Backend, not by frontend
GET https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/property
GET .../entity/room and .../entity/rate_plan — Middleware reads these to compute availability.