⚙ Tyttoot API

REST API for the Tyttoot platform — all requests JSON; admin routes require X-Admin-Token header.

MethodPathAuthDescription
POST /contact/submit public Submit contact form — name, email, subject, message, lang
POST /analytics/page public Log page view — page, lang, referrer
POST /analytics/project public Log project view — projectId, lang
POST /analytics/legacy-url public Log legacy URL hit before SPA redirect — legacyId, canonical
POST /analytics/ads-impression public Log interstitial show — projectId, adsId, deviceId (IP from server)
GET /leaderboard/{projectId} public Get leaderboard — ?season=&limit=&offset=
GET /leaderboard/{projectId}/seasons public List seasons for project leaderboard
POST /leaderboard/{projectId} public Submit score — name, score
POST /players/register public Register display name — X-Player-Token = previous identity on rename
GET /players/suggest public Random names from players table — ?limit= for nickname picks
POST /gameplay/shots public Log Battleship shot — gameId, r, c, hit
GET /gameplay/shots/heatmap public Shot heatmap — ?gameId=fleetGrid
GET /admin/session admin user+token Session — user, adminWrite, ownerAlias
GET /admin/projects admin user+token List merged registry (base + admin overlay)
POST /admin/projects admin user+token Save projects registry — write: owner alias only
GET /admin/contact admin user+token List recent contact submissions
GET /admin/contact/{YYYY-MM} admin user+token Submissions for specific month
POST /admin/contact/read admin user+token Mark submissions as read — {ids:[]} — write owner
DELETE /admin/contact/{id} admin user+token Delete a submission — write owner
GET /admin/analytics admin user+token Page + project view counts (last 3 months)
GET /admin/ads-impressions admin user+token Ads show counts / recent rows — ?projectId=&limit=&months=
GET /admin/project-action-acks admin user+token Pull ack-list — ?action=pull → {items:[{projectId,doneBy,tipSha,…}]}
POST /admin/project-action-acks/clear admin user+token Clear pull acks + ack self (any alias after push) — {projectId,action,tipSha?}
POST /admin/project-action-acks/ack admin user+token Ack self pulled — {projectId,action} (any alias)
POST /admin/project-action-acks/force admin user+token Force clear|ack — write owner — {op,projectId,action,alias?}
GET /admin/project-reviews admin user+token Review queue — ?status=&alias=&projectId= → {items,total}
GET /admin/project-reviews/{projectId} admin user+token Latest review row for projectId
POST /admin/project-reviews/upsert admin user+token Upsert review — any alias — {projectId,promptFile,status,…}
POST /admin/project-reviews/decide admin user+token tyt decide — {verdict:approve|changes_requested,promptFile|projectId,note?}
GET /admin/release-events admin user+token Release events + projects → {events:[{id,title,archived,projects:[{projectId,status,note,assignee}]}],statuses}
POST /admin/release-events/save admin user+token tyt — create/update event {id?,title,description?}
POST /admin/release-events/archive admin user+token tyt — {id,archived:bool}
POST /admin/release-events/delete admin user+token tyt — {id} (xoá cả project)
POST /admin/release-events/projects admin user+token tyt — add/update {eventId,projectIds[],status?,note?,assignee?}
POST /admin/release-events/remove-projects admin user+token tyt — {eventId,projectIds[]}
GET /admin/release-overview admin user+token Nguồn release chuẩn: store/AdMob/status từng nền tảng + events + gaps (?project=id&public=1)
POST /admin/projects/store admin user+token tyt — patch 1 project {projectId,android?,ios?,macos?,web?,publish?} (merge)
GET /admin/bot admin user+token Bot state: enabled, dailyLimit, today, byBot, runs
POST /admin/bot/settings admin user+token tyt — {enabled?,dailyLimit?}
POST /admin/bot/rotate-token admin user+token tyt — token mới (trả 1 lần), token cũ hết hiệu lực
POST /admin/bot/revoke-token admin user+token tyt — xoá token + tắt bot
GET /bot/overview admin user+token X-Bot-Token + X-Bot-Name — như release-overview (?project=&public=1)
GET /bot/me admin user+token Kiểm tra token + hạn mức hôm nay
POST /bot/release-events/projects admin user+token {eventId,projectIds[],status?,note?} (không assignee)
POST /bot/store-status admin user+token {projectId,android|ios|macos|web:{status,statusNote,storeVersion}}
POST /bot/log admin user+token {action,detail,ok} — bot tự báo cáo
Base URL — dev: http://127.0.0.1:8000/subdomain/api/public_html/ · prod: https://api.tyttoot.com/

Admin auth — headers X-Admin-User (machine alias) + X-Admin-Token (ADMIN_TOKEN / env TYTTOOT_ADMIN_TOKEN). Write mutations only for platform owner alias (tyt).

Config (registry): /home/u131129205/domains/tyttoot.com-bk/public_html/subdomain/api/public_html/config
MySQL: connected