{"openapi":"3.1.0","info":{"title":"Bolrach Help API (Support.ng engine)","version":"1.0.0","description":"Multi-tenant customer support API used by Support.ng and Bolrach Help. Public base URLs `https://api.bolrach.help` and `https://api.support.ng` reverse-proxy the same Nest service (`support-api`) and `supportng` schema. Console/agent calls use Authvio JWT + `x-workspace-id`. DGUMS and other estate apps can use the internal bridge (`/api/internal/bridge/*`) with a shared secret. Not metered under api.bolrach.dev platform keys today; documented here so the Bolrach API catalogue is complete.","contact":{"url":"https://docs.bolrach.dev/help"}},"servers":[{"url":"https://api.bolrach.help","description":"Bolrach Help (canonical for Help product)"},{"url":"https://api.support.ng","description":"Support.ng brand alias (identical engine)"}],"security":[{"bearerAuthvio":[]}],"components":{"securitySchemes":{"bearerAuthvio":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Authvio id_token for audience empire:support:web. Send workspace as header x-workspace-id."},"bridgeSecret":{"type":"apiKey","in":"header","name":"x-support-bridge-secret","description":"Estate service bridge (DGUMS etc.). Not for third-party apps."}},"schemas":{"Ticket":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"number":{"type":"integer"},"subject":{"type":"string"},"status":{"type":"string","enum":["open","pending","on_hold","resolved","closed"]},"priority":{"type":"string","enum":["low","medium","high","urgent"]},"source":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"conversationId":{"type":"string","format":"uuid","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}},"paths":{"/api/health":{"get":{"operationId":"helpHealth","summary":"Health","security":[],"responses":{"200":{"description":"Service up","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string"}}},"example":{"ok":true,"service":"support-api"}}}}}}},"/api/tickets":{"get":{"operationId":"listTickets","summary":"List tickets in the workspace","parameters":[{"name":"x-workspace-id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"priority","in":"query","schema":{"type":"string"}},{"name":"query","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}}],"responses":{"200":{"description":"Ticket page","content":{"application/json":{"schema":{"type":"object","properties":{"tickets":{"type":"array","items":{"$ref":"#/components/schemas/Ticket"}},"page":{"type":"integer"},"pageSize":{"type":"integer"}}}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}},"post":{"operationId":"createTicket","summary":"Create a ticket","parameters":[{"name":"x-workspace-id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"body":{"type":"string"},"priority":{"type":"string"},"customer":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}}}},"required":["subject","body"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"$ref":"#/components/schemas/Ticket"}}}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}},"/api/tickets/{id}":{"get":{"operationId":"getTicket","summary":"Get ticket, messages, customer, events","parameters":[{"name":"x-workspace-id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Ticket detail"},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}},"/api/tickets/{id}/reply":{"post":{"operationId":"replyTicket","summary":"Agent reply or internal note","parameters":[{"name":"x-workspace-id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string"},"internal":{"type":"boolean","default":false}},"required":["body"]}}}},"responses":{"200":{"description":"Message stored (email channel may send mail)"},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}},"/api/conversations":{"get":{"operationId":"listConversations","summary":"Inbox conversations (filter by channel)","parameters":[{"name":"x-workspace-id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"channel","in":"query","schema":{"type":"string","enum":["email","chat","web","api","voice"]}}],"responses":{"200":{"description":"Conversation list"},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}},"/api/public/chat/{workspaceSlug}/start":{"post":{"operationId":"publicChatStart","summary":"Start a public widget chat (no agent JWT)","security":[],"parameters":[{"name":"workspaceSlug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Conversation started"},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}},"/api/public/intake/{workspaceSlug}/ticket":{"post":{"operationId":"publicIntakeTicket","summary":"Public contact form intake","security":[],"parameters":[{"name":"workspaceSlug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ticket created"},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}},"/api/internal/bridge/health":{"get":{"operationId":"bridgeHealth","summary":"Estate service bridge health (DGUMS etc.)","security":[{"bridgeSecret":[]}],"responses":{"200":{"description":"Bridge up","content":{"application/json":{"example":{"ok":true,"engine":"supportng","bridge":"v1"}}}},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}},"/api/internal/bridge/tickets":{"get":{"operationId":"bridgeListTickets","summary":"List tickets for a workspace (service)","security":[{"bridgeSecret":[]}],"parameters":[{"name":"workspace","in":"query","schema":{"type":"string","default":"dgums"}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Tickets"},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}},"post":{"operationId":"bridgeCreateTicket","summary":"Create ticket (service — used by DGUMS omni escalate)","security":[{"bridgeSecret":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workspace":{"type":"string","default":"dgums"},"subject":{"type":"string"},"body":{"type":"string"},"priority":{"type":"string"},"channel":{"type":"string","enum":["email","chat","web","api","voice"]},"source":{"type":"string"},"customerName":{"type":"string"},"customerEmail":{"type":"string"},"customerPhone":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"externalRef":{"type":"string"}},"required":["subject","body"]}}}},"responses":{"200":{"description":"Created"},"400":{"description":"Bad input.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"401":{"description":"Missing or invalid Authvio bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"403":{"description":"Not a member of the workspace (or bad bridge secret on internal routes).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}},"404":{"description":"Ticket or workspace not found.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"}},"required":["code","message","status"]}},"required":["error"]}}}}}}}}}