{"name":"haxzero-api","message":"API compatible con main-app.js","port":5000,"endpoints":["GET /health","GET /user?discord_id=...","GET /users/search?q=...","GET /vip/status?discord_id=...","POST /presence","GET /friends?discord_id=...","GET /teams/user?discord_id=...","GET /teams/members?team_id=...","GET /teams/invites?discord_id=...","POST /teams (crear; JSON name, tag, color?, image? data URL, owner_discord_id inyectado por proxy)","POST /teams/logo (JSON image o logo_url; discord_id inyectado por proxy)","POST /teams/update","POST /teams/invite (username o to_discord_id; offered_role member|moderator)","GET /teams/join-link?team_id=&discord_id= (dueño: token y rol del enlace)","POST /teams/join-link/create (dueño: genera token; offered_role)","POST /teams/join-link/disable (dueño: borra token)","POST /teams/join-link/accept (token; discord_id une al equipo)","POST /teams/member-role (owner_discord_id; member_discord_id; role member|moderator)","POST /teams/kick","POST /teams/leave","POST /teams/invites/accept","POST /teams/invites/reject","POST /teams/by-nicks","GET /teams/chat?team_id=&discord_id=&after_id=","POST /teams/chat (JSON team_id, text; discord_id inyectado por proxy)","DELETE /teams?team_id=&owner_discord_id=","GET /speed/leaderboard (Shuffle ON por defecto; desactivar con SHUFFLE_ENABLED=0|false; start/end o startTime/endTime como DD/MM/YYYY; también acepta startTime/endTime numéricos epoch seconds; timezone SHUFFLE_TIMEZONE)","GET /speed/leaderboard/chancer (CHANCER_AFFILIATE_SECRET; mismos query start/end o startTime/endTime; opcional ?currency=USD; proxy Fungamess Nux leaderboard)","GET /app/update (latest_build / min_supported_build opcionales; maintenance_mode + maintenance_message; launcher_blocked + launcher_block_message + launcher_block_kind; query opcional discord_id)","POST /app/heartbeat (JSON { discord_id, discord_name? }; actualiza users.ip y presencia \"en la app\")","POST /app/offline (JSON { discord_id }; borra la fila en app_client_presence al cerrar sesión o la app)","GET /app/clients (players_in_app + lista discord_id/discord_name con heartbeat reciente; ventana APP_CLIENT_ONLINE_WINDOW_SEC, default 180)","POST /internal/launcher-ban (header X-Admin-Secret = LAUNCHER_ADMIN_SECRET; JSON { discord_id?, ip?, reason? })","GET /ranked/profile?discord_id=...","GET /ranked/queue/status?discord_id=...","POST /ranked/queue/join { discord_id, discord_name, invite_opponent_id? }","POST /ranked/queue/leave { discord_id }","POST /ranked/match/room { discord_id, match_id, room_link }","POST /ranked/match/result { discord_id, match_id, winner_discord_id }","POST /ranked/match/forfeit { discord_id, match_id }","POST /ranked/report { discord_id, target_discord_id, match_id?, reason? }","GET /ranked/leaderboard?limit=50","GET /ranked/history?discord_id=...&limit=20","GET /ranked/bot/pending (x-ranked-bot-secret o ?secret=; RANKED_BOT_SECRET)","GET /ranked/bot/match?match_id=...","POST /ranked/bot/room { match_id, room_link, secret? }","POST /ranked/bot/result { match_id, winner_discord_id, secret? }"]}