One engine, two hostnames
Support.ng is the product brand. Bolrach Help is the Bolrach-facing brand. Both hit the same process. DGUMS omnichannel escalate creates tickets through /api/internal/bridge/tickets so staff work one ticket plane instead of a separate DGUMS-only ticket store.
# health (no auth)
curl "https://api.bolrach.help/api/health"
# → {"ok":true,"service":"support-api"}
# same process on the Support.ng hostname
curl "https://api.support.ng/api/health"Health
Unauthenticated liveness. Returns service name when the API is up.
curl "https://api.bolrach.help/api/health"Tickets (agent / console)
Agent routes need an Authvio bearer token for audience empire:support:web and the workspace UUID in x-workspace-id.
List tickets. Optional query: status, priority, query, page.
curl "https://api.bolrach.help/api/tickets?status=open" \
-H "Authorization: Bearer $AUTHVIO_ID_TOKEN" \
-H "x-workspace-id: WORKSPACE_UUID"Create a ticket with subject, body, optional priority and customer.
curl -X POST "https://api.bolrach.help/api/tickets" \
-H "Authorization: Bearer $AUTHVIO_ID_TOKEN" \
-H "x-workspace-id: WORKSPACE_UUID" \
-H "Content-Type: application/json" \
-d '{"subject":"Billing question","body":"Invoice looks wrong","priority":"medium","customer":{"name":"Ada","email":"[email protected]"}}'Ticket detail with messages, customer, and events.
curl "https://api.bolrach.help/api/tickets/TICKET_UUID" \
-H "Authorization: Bearer $AUTHVIO_ID_TOKEN" \
-H "x-workspace-id: WORKSPACE_UUID"Agent reply or internal note. Set internal: true for notes that stay off the customer channel.
curl -X POST "https://api.bolrach.help/api/tickets/TICKET_UUID/reply" \
-H "Authorization: Bearer $AUTHVIO_ID_TOKEN" \
-H "x-workspace-id: WORKSPACE_UUID" \
-H "Content-Type: application/json" \
-d '{"body":"We are looking into this.","internal":false}'Conversations
Inbox conversations. Filter with channel (email, chat, web, api, voice).
curl "https://api.bolrach.help/api/conversations?channel=chat" \
-H "Authorization: Bearer $AUTHVIO_ID_TOKEN" \
-H "x-workspace-id: WORKSPACE_UUID"Public intake (no agent JWT)
Start a public widget chat for a workspace slug.
curl -X POST "https://api.bolrach.help/api/public/chat/my-workspace/start" \
-H "Content-Type: application/json" \
-d '{"name":"Visitor","message":"Hi, I need help"}'Public contact form intake into a ticket.
curl -X POST "https://api.bolrach.help/api/public/intake/my-workspace/ticket" \
-H "Content-Type: application/json" \
-d '{"subject":"Website form","body":"Need a callback","email":"[email protected]"}'Estate bridge (DGUMS and internal services)
Service-to-service only. Header x-support-bridge-secret must match the secret installed on support-api and callers such as dgums-api. Do not ship this secret to browsers or third-party apps.
Bridge liveness for estate monitors.
curl "https://api.bolrach.help/api/internal/bridge/health" \
-H "x-support-bridge-secret: $SUPPORT_BRIDGE_SECRET"List tickets for a logical workspace key (default dgums).
curl "https://api.bolrach.help/api/internal/bridge/tickets?workspace=dgums&status=open" \
-H "x-support-bridge-secret: $SUPPORT_BRIDGE_SECRET"Create a ticket from an estate app. DGUMS omnichannel escalate uses this path so new tickets land in the shared Support.ng / Bolrach Help plane.
curl -X POST "https://api.bolrach.help/api/internal/bridge/tickets" \
-H "x-support-bridge-secret: $SUPPORT_BRIDGE_SECRET" \
-H "Content-Type: application/json" \
-d '{"workspace":"dgums","subject":"WA escalate #42","body":"Customer needs billing help","priority":"high","channel":"chat","source":"dgums-omni","customerName":"Chioma","customerPhone":"+2348012345678","tags":["omni","whatsapp"],"externalRef":"omni:conv-uuid"}'Related products
- support.ng agent console
- bolrach.com/support public Help entry
- DGUMS omnichannel at dgums.com/omnichannel (bridge-backed tickets)
Notes
Machine-readable OpenAPI: /openapi/help.json. Platform catalogue (Geo, AI, WhatsApp, …) remains at api.bolrach.dev/v1. Human mail on the estate stays on Stalwart; this API is the ticket / conversation engine, not the staff mailbox MTA.