REST API for the Nova concierge operations platform. Used by Orbis AI and internal tools.
These are the main endpoints Orbis uses to push data into the Command Center.
Log a WhatsApp message into the member's chat history.
| Field | Type | Required | Description |
|---|---|---|---|
| sender | string | required | "member", "concierge", or "system" |
| message | string | required | The message text |
| channel | string | optional | Default: "whatsapp" |
| metadata | object | optional | JSON: sentiment, action items, extracted prefs |
| timestamp | string | optional | ISO datetime. Defaults to now. |
{
"sender": "member",
"message": "Hey, we just landed in Osaka!",
"channel": "whatsapp",
"metadata": { "sentiment": "positive", "action_items": ["ceramics workshop"] }
}
Create a task or suggestion for the concierge team. Orbis AI suggestions appear with confidence scores.
| Field | Type | Required | Description |
|---|---|---|---|
| type | string | required | "disruption", "planning", "request", "logistics", "proactive", "feedback" |
| description | string | required | What needs attention |
| priority | string | optional | "critical", "high", "normal" (default), "low" |
| member_id | integer | optional | Which member this relates to |
| trip_id | integer | optional | Which trip this relates to |
| ai_suggestion | string | optional | What Orbis recommends doing |
| ai_confidence | float | optional | 0.0 to 1.0 confidence score |
{
"type": "disruption",
"priority": "critical",
"member_id": 1,
"trip_id": 1,
"description": "JAL flight delayed 45 min — dinner reservation at risk",
"ai_suggestion": "Push Kikunoi reservation to 19:15. Notify driver.",
"ai_confidence": 0.92
}
Add or update a member preference. Automatically tracks history (old → new value) and writes a timeline entry.
| Field | Type | Required | Description |
|---|---|---|---|
| category | string | required | "travel_style", "dining", "accommodation", "interests", "pace", "surprise_tolerance" |
| key | string | required | e.g. "cuisine_preference", "hotel_style" |
| value | string | required | e.g. "Japanese, French" |
| confidence | float | optional | 0.0 to 1.0. Default: 1.0 |
| source | string | optional | "inferred", "explicit", "feedback". Default: "explicit" |
| trigger_description | string | optional | What triggered this insight, e.g. "After Kyoto trip" |
{
"category": "dining",
"key": "cuisine_preference",
"value": "Japanese, French, Indian",
"confidence": 0.85,
"source": "inferred",
"trigger_description": "Mentioned in WhatsApp chat on Mar 10"
}
Add an event to a member's timeline. This is the memory log that concierges read for context.
| Field | Type | Required | Description |
|---|---|---|---|
| event_type | string | required | "chat", "preference_change", "insight", "note", "milestone", "trip_created", "booking_confirmed" |
| title | string | required | Short summary of the event |
| detail | string | optional | Longer description |
| source | string | optional | "orbis", "concierge", "system", "member". Default: "concierge" |
{
"event_type": "insight",
"title": "Arjun prefers morning-free itineraries",
"detail": "3 out of 4 trips had no bookings before 10am. High confidence pattern.",
"source": "orbis"
}
Endpoints for Orbis to pull member context and trip data.
Query params: ?q=search, ?status=on_trip, ?tier=Patron
// Response
[
{ "id": 1, "name": "Arjun Mehta", "tier": "Patron", "status": "on_trip", ... },
{ "id": 2, "name": "Elena Rossi", "tier": "Insider", "status": "planning", ... }
]
Returns everything about a member in one call — ideal for Orbis context loading.
// Response
{
"id": 1, "name": "Arjun Mehta", "tier": "Patron",
"status": "on_trip", "status_detail": "Kyoto, Japan",
"notes": "Founding member. Loves Japanese cuisine...",
"preferences": [
{ "category": "dining", "key": "cuisine_preference", "value": "Japanese, French", "confidence": 1.0 }
],
"trips": [
{ "id": 1, "destination": "Kyoto, Japan", "status": "active", "total_bookings": 6, "confirmed_bookings": 5 }
],
"chat": [
{ "sender": "member", "message": "Hey, we just landed...", "timestamp": "2026-03-10T14:30:00" }
]
}
Query params: ?limit=30, ?before=2026-03-10T00:00:00, ?type=chat
// Response
[
{ "event_type": "chat", "title": "Arjun landed in Osaka", "source": "orbis", "created_at": "2026-03-10T14:35:00" },
{ "event_type": "booking_confirmed", "title": "Kikunoi kaiseki dinner", "source": "concierge", "created_at": "2026-02-10T14:00:00" }
]
// Response — current preferences only
[
{ "id": 1, "category": "travel_style", "key": "pace", "value": "Slow and immersive", "confidence": 1.0, "source": "conversation" }
]Query params: ?category=dining
// Response — every preference change
[
{ "category": "dining", "key": "cuisine_preference", "old_value": "Japanese", "new_value": "Japanese, French", "trigger_description": "After Paris trip" }
]
Query params: ?limit=50, ?before=timestamp
// Response
{
"id": 1, "destination": "Kyoto, Japan", "status": "active",
"member_name": "Arjun Mehta",
"bookings": [
{ "type": "flight", "provider": "JAL", "status": "confirmed", "confirmation_number": "JAL-2847", ... },
{ "type": "hotel", "provider": "Hoshinoya Kyoto", "status": "confirmed", ... }
]
}Query params: ?member_id=1, ?status=active
Query params: ?status=pending, ?priority=critical, ?member_id=1
// Response
{
"stats": { "total_members": 5, "active_members": 4, "active_trips": 3, "pending_actions": 6, "total_gmv": 28000 },
"pending_actions": [ ... ],
"active_trips": [ ... ]
}| Field | Type | Required |
|---|---|---|
| name | string | required |
| string | optional | |
| string | optional | |
| tier | string | optional |
| status | string | optional |
| notes | string | optional |
Send only the fields you want to update.
| Field | Type | Required |
|---|---|---|
| member_id | integer | required |
| destination | string | required |
| start_date | string | optional |
| end_date | string | optional |
| budget_estimate | float | optional |
| Field | Type | Required |
|---|---|---|
| type | string | required |
| provider | string | optional |
| status | string | optional |
| confirmation_number | string | optional |
| scheduled_date | string | optional |
| scheduled_time | string | optional |
| cost | float | optional |
| details | object | optional |
{
"overall_rating": 5,
"highlights": "The kaiseki dinner was transcendent",
"improvements": "Transfer from airport was a bit rushed",
"would_return": true,
"concierge_rating": 5,
"booking_feedback": [
{ "booking_id": 1, "rating": 5 },
{ "booking_id": 4, "rating": 5, "comment": "Best meal of the trip" }
]
}
{ "status": "done" } // or "in_progress", "dismissed"