Authenticated API
WebSocket connections require a valid JWT Bearer token. Connect via the API gateway at /v1/ws.
WebSocket Events
Reference for all real-time events.
Overview
Events are organized by channel:
| Channel | Events | Description |
|---|---|---|
orders | Order lifecycle events | Order created, updated, completed |
kds | Kitchen display events | Tickets, bumps, alerts |
inventory | Stock events | Low stock, received |
analytics | Metrics updates | Real-time KPIs |
tables | Table status | Seated, cleared |
notifications | User notifications | Alerts, messages |
Event Format
All events follow this structure:
{
"type": "event",
"channel": "orders",
"event": "order.created",
"data": {
...event payload
},
"timestamp": "2026-01-18T14:30:00Z",
"location_id": "loc-xyz789"
}
Order Events
order.created
New order created.
{
"event": "order.created",
"data": {
"id": "order-12345",
"number": "1234",
"type": "dine_in",
"status": "open",
"table": "Table 7",
"server": "Sarah",
"items": [
{
"id": "line-001",
"name": "Classic Burger",
"quantity": 2,
"price": 25.98
}
],
"subtotal": 25.98,
"created_at": "2026-01-18T14:30:00Z"
}
}
order.updated
Order modified.
{
"event": "order.updated",
"data": {
"id": "order-12345",
"changes": ["items_added", "subtotal_changed"],
"items_added": [
{
"id": "line-002",
"name": "Fries",
"quantity": 2,
"price": 9.98
}
],
"subtotal": 35.96,
"updated_at": "2026-01-18T14:32:00Z"
}
}
order.sent_to_kitchen
Order sent to kitchen.
{
"event": "order.sent_to_kitchen",
"data": {
"id": "order-12345",
"tickets_created": ["ticket-001", "ticket-002"],
"sent_at": "2026-01-18T14:32:30Z"
}
}
order.status_changed
Order status updated.
{
"event": "order.status_changed",
"data": {
"id": "order-12345",
"previous_status": "preparing",
"status": "ready",
"changed_at": "2026-01-18T14:45:00Z"
}
}
order.paid
Payment completed.
{
"event": "order.paid",
"data": {
"id": "order-12345",
"payment": {
"id": "payment-001",
"method": "card",
"amount": 42.50,
"tip": 6.50,
"total": 49.00
},
"paid_at": "2026-01-18T15:00:00Z"
}
}
order.closed
Order completed.
{
"event": "order.closed",
"data": {
"id": "order-12345",
"total": 49.00,
"duration_minutes": 45,
"closed_at": "2026-01-18T15:15:00Z"
}
}
KDS Events
kds.ticket.created
New kitchen ticket.
{
"event": "kds.ticket.created",
"data": {
"id": "ticket-001",
"order_id": "order-12345",
"order_number": "1234",
"station": "grill",
"items": [
{
"name": "Classic Burger",
"quantity": 2,
"modifiers": ["Medium", "No Onions"],
"seat": 1
}
],
"priority": "normal",
"created_at": "2026-01-18T14:32:30Z"
}
}
kds.ticket.bumped
Ticket marked complete.
{
"event": "kds.ticket.bumped",
"data": {
"id": "ticket-001",
"order_id": "order-12345",
"station": "grill",
"next_station": "expo",
"prep_time_seconds": 420,
"bumped_by": "user-chef01",
"bumped_at": "2026-01-18T14:39:30Z"
}
}
kds.ticket.late
Ticket exceeded target time.
{
"event": "kds.ticket.late",
"data": {
"id": "ticket-001",
"order_id": "order-12345",
"station": "grill",
"target_time_seconds": 600,
"elapsed_time_seconds": 650,
"late_at": "2026-01-18T14:43:20Z"
}
}
kds.ticket.recalled
Ticket brought back.
{
"event": "kds.ticket.recalled",
"data": {
"id": "ticket-001",
"order_id": "order-12345",
"station": "grill",
"reason": "Customer modification",
"recalled_at": "2026-01-18T14:45:00Z"
}
}
Inventory Events
inventory.low_stock
Item below par level.
{
"event": "inventory.low_stock",
"data": {
"id": "inv-chicken",
"name": "Chicken Breast",
"current_quantity": 25,
"par_level": 50,
"unit": "lb",
"reorder_point": 30,
"severity": "warning"
}
}
inventory.out_of_stock
Item depleted.
{
"event": "inventory.out_of_stock",
"data": {
"id": "inv-chicken",
"name": "Chicken Breast",
"affected_menu_items": [
{"id": "item-chicken-sandwich", "name": "Chicken Sandwich"},
{"id": "item-chicken-salad", "name": "Chicken Salad"}
],
"auto_86ed": true
}
}
inventory.received
Stock delivered.
{
"event": "inventory.received",
"data": {
"purchase_order": "po-12345",
"supplier": "Sysco",
"items": [
{
"id": "inv-chicken",
"name": "Chicken Breast",
"quantity_received": 100,
"new_quantity": 125
}
],
"received_at": "2026-01-18T08:00:00Z"
}
}
Table Events
table.seated
Guests seated.
{
"event": "table.seated",
"data": {
"table_id": "table-07",
"table_name": "Table 7",
"party_size": 4,
"server": {
"id": "user-sarah",
"name": "Sarah"
},
"order_id": "order-12345",
"seated_at": "2026-01-18T14:30:00Z"
}
}
table.cleared
Table available.
{
"event": "table.cleared",
"data": {
"table_id": "table-07",
"table_name": "Table 7",
"previous_order": "order-12345",
"turn_time_minutes": 52,
"cleared_at": "2026-01-18T15:22:00Z"
}
}
table.reserved
Reservation assigned.
{
"event": "table.reserved",
"data": {
"table_id": "table-07",
"reservation": {
"id": "res-abc123",
"name": "Smith Party",
"party_size": 4,
"time": "18:00"
}
}
}
Analytics Events
analytics.metric_update
Real-time metric change.
{
"event": "analytics.metric_update",
"data": {
"metrics": {
"revenue_today": 4250.00,
"orders_today": 145,
"avg_ticket": 29.31,
"guests_today": 312
},
"changes": {
"revenue_today": {
"previous": 4185.00,
"change": 65.00
}
}
}
}
analytics.hourly_summary
Hourly rollup.
{
"event": "analytics.hourly_summary",
"data": {
"hour": "14:00",
"revenue": 650.00,
"orders": 18,
"avg_ticket": 36.11,
"vs_last_week": {
"revenue_change": 12.5,
"orders_change": 8.3
}
}
}
Notification Events
notification.alert
System alert.
{
"event": "notification.alert",
"data": {
"id": "alert-001",
"type": "kitchen_backed_up",
"severity": "warning",
"title": "Kitchen Queue Alert",
"message": "Kitchen has 15+ tickets in queue",
"action_required": true,
"action_url": "/kitchen/queue"
}
}
notification.message
User message.
{
"event": "notification.message",
"data": {
"id": "msg-001",
"from": {
"id": "user-manager",
"name": "John Manager"
},
"message": "Please check table 5, customer has a question",
"priority": "normal"
}
}
Delivery Events
delivery.order_received
New delivery order.
{
"event": "delivery.order_received",
"data": {
"id": "del-12345",
"platform": "doordash",
"platform_order_id": "dd-abc123",
"customer": {
"name": "John Smith"
},
"items_count": 3,
"total": 46.37,
"prep_time_minutes": 20
}
}
delivery.driver_assigned
Driver on the way.
{
"event": "delivery.driver_assigned",
"data": {
"id": "del-12345",
"driver": {
"name": "Mike D.",
"eta_minutes": 8
}
}
}
delivery.picked_up
Order collected.
{
"event": "delivery.picked_up",
"data": {
"id": "del-12345",
"picked_up_at": "2026-01-18T12:32:00Z",
"estimated_delivery": "2026-01-18T12:55:00Z"
}
}
Voice AI Events
voice.session_started
Voice session began.
{
"event": "voice.session_started",
"data": {
"session_id": "voice-sess-abc123",
"channel": "drive_thru",
"lane": 1,
"started_at": "2026-01-18T14:30:00Z"
}
}
voice.order_completed
Voice order finished.
{
"event": "voice.order_completed",
"data": {
"session_id": "voice-sess-abc123",
"order_id": "order-12345",
"total": 32.60,
"duration_seconds": 145
}
}
Error Events
error
Connection or subscription error.
{
"type": "error",
"code": "subscription_failed",
"message": "Not authorized for channel",
"channel": "orders",
"subscription_id": "sub-001"
}
Related Documentation
- WebSocket Connection - Connection setup
- WebSocket Subscriptions - Subscribe to channels
- Orders API - Order management