{"name":"Spark Railway Backend","description":"WebRTC Signaling + Discovery Matching","version":"2.0.0","status":"running","timestamp":"2026-06-29T10:05:09.520Z","endpoints":{"health":"/health","stats":"/stats","callHistory":"/call-history/:callId","api":{"connections":{"list":"GET /api/connections","requests":"GET /api/connections/requests","search":"GET /api/connections/search?avatarUuid=...","send":"POST /api/connections","respond":"PATCH /api/connections/:id","end":"DELETE /api/connections/:id","block":"POST /api/connections/:id/block"},"messages":{"getMessages":"GET /api/messages/:conversationId","sendMessage":"POST /api/messages","markRead":"POST /api/messages/read"},"conversations":{"listConversations":"GET /api/conversations","getConversation":"GET /api/conversations/:conversationId","createGroup":"POST /api/conversations","updateConversation":"PATCH /api/conversations/:id","addMembers":"POST /api/conversations/:id/members"},"calls":{"invite":"POST /api/calls/invite","respondToInvitation":"PATCH /api/calls/invitations/:id","getPendingInvitations":"GET /api/calls/invitations","endCall":"POST /api/calls/:sessionId/end","submitFeedback":"POST /api/calls/:sessionId/feedback","getCallHistory":"GET /api/calls/history","getCallSession":"GET /api/calls/:sessionId"},"notifications":{"registerDevice":"POST /api/devices/register","unregisterDevice":"DELETE /api/devices/:token","testNotification":"POST /api/notifications/test"}},"discovery":{"joinQueue":"POST /api/discovery/join-queue","leaveQueue":"POST /api/discovery/leave-queue","heartbeat":"PATCH /api/discovery/heartbeat","queueStatus":"GET /api/discovery/queue-status","stats":"GET /api/discovery/stats"}},"websocket":{"url":"ws://0.0.0.0:3000","events":["identify","join-call","leave-call","signaling-message","ping","get-stats","get-call-history","call:invitation:received","call:invitation:accepted","call:invitation:declined","call:ended","match_found","session_started"]}}