Core — Entities
Nellalink Smart Meta Manager is generic. BookDirect is a PMS: hotels, shortlets, and apartments are all property. v1 locks these entity_type values. The first POST creates nll_{type} and nll_{type}_meta_data.
Do not add nll_hotel, nll_shortlet, or nll_apartment.
property property_category: hotel | shortlet | apartment
├── room parent = property (hotel, or apartment by unit)
├── rate_plan parent = room (or property if sold as a whole)
├── inventory parent = rate_plan (optional; availability can compute)
├── booking parent = rate_plan (by unit) or property (whole place)
└── payment parent = bookingThe old desktop guide’s booking_package = room + rate_plan.
Winner URLs (pattern)
Replace {entity_type} with property, room, rate_plan, booking, or payment.
| Action | Method | Full URL |
|---|---|---|
| Create | POST | https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/{entity_type} |
| List | GET | https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/{entity_type} |
| Get uuid | GET | https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/{entity_type}/{entity_uuid} |
| Get slug | GET | https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/{entity_type}/slug/{slug} |
| Update | PUT | https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/{entity_type}/{entity_uuid} |
| Trash | DELETE | https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/{entity_type}/trash/{entity_uuid} |
| Restore | PATCH | https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/{entity_type}/restore/{entity_uuid} |
Examples:
- Create property:
POST https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/property - Create booking:
POST https://backend-dev.bookdirect.live/public/api/v1/nellalink/smart-meta-manager/entity/booking
Create body (all types)
Required: request_id, meta_key, owned_by (user uuid).
Optional: slug (defaults to meta_key), title_name, description, status, extra_data, parent_entity_type, parent_entity_uuid, categories[], tags[], co_owned_by[].
extra_data on PUT replaces the entire JSON. Always send the full object.
List query params
| Param | Example | Purpose |
|---|---|---|
owned_by | session user uuid | Required for private lists |
parent_entity_type | property | Children of a type |
parent_entity_uuid | uuid | Children of one parent |
status | active | Filter |
search | Lagos | Term |
search_by | title_name or meta_key.city | Column or metadata |
meta_key_to_retrieve | address,city | Limit metadata in response |
per_page / page | 20 / 1 | Pagination |
sort_by / sort_order | created_at / desc | Sort |
extra_data catalogs
property
| Key | Type | Notes |
|---|---|---|
gallery_urls | string[] | After file-manager upload |
total_rooms_display | number | Hotel display only |
amenities | string[] | Optional mirror of amenity_* meta |
total_units | number | Whole-place inventory (shortlet / whole apartment) |
base_rate_ngn | number | Whole-place nightly |
currency | string | NGN |
max_occupancy | number | Whole-place |
blocked_dates | {from,to,reason}[] | Maintenance |
room
| Key | Type |
|---|---|
total_units | number |
room_numbers | string[] |
max_occupancy | number |
bed_type | string |
blocked_dates | array |
rate_plan
| Key | Type |
|---|---|
base_rate_ngn | number |
currency | string |
cancellation | string |
breakfast_included | boolean |
booking
| Key | Type |
|---|---|
property_uuid | string — always |
room_uuid / rate_plan_uuid | hotel |
check_in / check_out | YYYY-MM-DD |
nights | number |
units_booked | number |
guest_count | number |
rate_per_night_ngn / total_amount_ngn | number |
currency | string |
guest_name / guest_email / guest_phone | string |
Statuses: pending → confirmed → cancelled | checked_in | checked_out.
payment
Written mainly by Middleware, not the guest UI.
| Key | Type |
|---|---|
provider | paystack | squad | tsara |
reference | PSP reference |
amount_kobo | number |
currency | string |
booking_uuid | string |
Statuses: initialized | paid | failed | refunded | partially_refunded.
Tags and categories
On create/update you may send tags: ["hotel"] and categories: [{ "name": "Hotel" }]. Assignment is additive (not a full replace). Catalog:
POST https://backend-dev.bookdirect.live/public/api/v1/nellalink/tagGET https://backend-dev.bookdirect.live/public/api/v1/nellalink/tagsPOST https://backend-dev.bookdirect.live/public/api/v1/nellalink/categoryGET https://backend-dev.bookdirect.live/public/api/v1/nellalink/categories
Tag names: ^[a-z0-9_]+$.
What Core must not do
No Paystack/Squad/Tsara calls. No Resend. No GuestTraction. No availability date engine. Those are Middleware.
Roles (staff on a property)
PUT https://backend-dev.bookdirect.live/public/api/v1/nellalink/role/entity/property/{property_uuid}/{user_uuid}
Use for owner staff. Document exact permission strings from the live explorer when you add team UI.