NŌVA Command Center API

REST API for the Nova concierge operations platform. Used by Orbis AI and internal tools.

https://nova-command-api.kevin-a83.workers.dev
Auth: No authentication required currently. All endpoints accept and return JSON. CORS is open.

Orbis Integration (Primary)

These are the main endpoints Orbis uses to push data into the Command Center.

POST /api/members/:id/chat Push chat messages from WhatsApp

Log a WhatsApp message into the member's chat history.

FieldTypeRequiredDescription
senderstringrequired"member", "concierge", or "system"
messagestringrequiredThe message text
channelstringoptionalDefault: "whatsapp"
metadataobjectoptionalJSON: sentiment, action items, extracted prefs
timestampstringoptionalISO datetime. Defaults to now.
{
  "sender": "member",
  "message": "Hey, we just landed in Osaka!",
  "channel": "whatsapp",
  "metadata": { "sentiment": "positive", "action_items": ["ceramics workshop"] }
}
POST /api/actions Push AI suggestions to the action queue

Create a task or suggestion for the concierge team. Orbis AI suggestions appear with confidence scores.

FieldTypeRequiredDescription
typestringrequired"disruption", "planning", "request", "logistics", "proactive", "feedback"
descriptionstringrequiredWhat needs attention
prioritystringoptional"critical", "high", "normal" (default), "low"
member_idintegeroptionalWhich member this relates to
trip_idintegeroptionalWhich trip this relates to
ai_suggestionstringoptionalWhat Orbis recommends doing
ai_confidencefloatoptional0.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
}
POST /api/members/:id/preferences Push inferred Travel DNA preferences

Add or update a member preference. Automatically tracks history (old → new value) and writes a timeline entry.

FieldTypeRequiredDescription
categorystringrequired"travel_style", "dining", "accommodation", "interests", "pace", "surprise_tolerance"
keystringrequirede.g. "cuisine_preference", "hotel_style"
valuestringrequirede.g. "Japanese, French"
confidencefloatoptional0.0 to 1.0. Default: 1.0
sourcestringoptional"inferred", "explicit", "feedback". Default: "explicit"
trigger_descriptionstringoptionalWhat 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"
}
POST /api/members/:id/timeline Push timeline events

Add an event to a member's timeline. This is the memory log that concierges read for context.

FieldTypeRequiredDescription
event_typestringrequired"chat", "preference_change", "insight", "note", "milestone", "trip_created", "booking_confirmed"
titlestringrequiredShort summary of the event
detailstringoptionalLonger description
sourcestringoptional"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"
}

Read Data

Endpoints for Orbis to pull member context and trip data.

GET /api/members List all members

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", ... }
]
GET /api/members/:id Full member profile with preferences, trips, chat

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" }
  ]
}
GET /api/members/:id/timeline Chronological event feed

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" }
]
GET /api/members/:id/preferences Current Travel DNA
// Response — current preferences only
[
  { "id": 1, "category": "travel_style", "key": "pace", "value": "Slow and immersive", "confidence": 1.0, "source": "conversation" }
]
GET /api/members/:id/preferences/history Travel DNA evolution over time

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" }
]
GET /api/members/:id/chat Chat log history

Query params: ?limit=50, ?before=timestamp

GET /api/trips/:id Trip with all bookings
// 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", ... }
  ]
}
GET /api/trips List trips

Query params: ?member_id=1, ?status=active

GET /api/actions List action queue items

Query params: ?status=pending, ?priority=critical, ?member_id=1

GET /api/dashboard Dashboard summary stats
// Response
{
  "stats": { "total_members": 5, "active_members": 4, "active_trips": 3, "pending_actions": 6, "total_gmv": 28000 },
  "pending_actions": [ ... ],
  "active_trips": [ ... ]
}

Create & Update

POST /api/members Create a member
FieldTypeRequired
namestringrequired
whatsappstringoptional
emailstringoptional
tierstringoptional
statusstringoptional
notesstringoptional
PUT /api/members/:id Update a member

Send only the fields you want to update.

POST /api/trips Create a trip
FieldTypeRequired
member_idintegerrequired
destinationstringrequired
start_datestringoptional
end_datestringoptional
budget_estimatefloatoptional
POST /api/trips/:id/bookings Add a booking to a trip
FieldTypeRequired
typestringrequired
providerstringoptional
statusstringoptional
confirmation_numberstringoptional
scheduled_datestringoptional
scheduled_timestringoptional
costfloatoptional
detailsobjectoptional
POST /api/trips/:id/feedback Submit post-trip feedback
{
  "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" }
  ]
}
PUT /api/actions/:id Update action status
{ "status": "done" }  // or "in_progress", "dismissed"