API

Základ: https://scryglass.win. Chyby jsou {"error": "..."}; 403 znamená chybějící oprávnění, 401 neplatný token.

Veřejné

Metoda Cesta Poznámka
GET /health {"status":"ok"}
GET /, /app, /admin, /docs/ HTML stránky (admin i aplikace si data načítají s tokenem)
POST /auth/anon Anonymní účet pro novou instalaci (omezeno na IP)
POST /auth/login/start, /auth/login/verify Přihlášení kódem z e-mailu
POST /auth/passkey/login/{start,finish}, /auth/password/login Passkey / heslo
GET/POST /auth/magic, /authorize, /auth/token Odkaz z e-mailu a přihlášení aplikace (PKCE)

Přihlášený uživatel

Metoda Cesta Oprávnění
POST /ingest telemetrie (limit těla 8 MB)
GET /bundle, /artifacts, /stats, /jobs čtení
GET /me, /me/matches, /me/decks (+PUT) vlastní data
GET/DELETE /me/sessions, /me/passkeys správa přihlášení
POST /guide/jobs GuideGenerate
GET /download/{platform} AppDownload

Administrace

Metoda Cesta Oprávnění
GET /admin/users (+/{id}, /{id}/matches, /{id}/event-kinds) AdminRead
GET /admin/replays?after=<RFC3339>&limit=N AdminRead nebo CorpusRead
GET /admin/corpus-events?after=<RFC3339>&after_id=<id>&limit=N AdminRead nebo CorpusRead; jen kind=decision_context
GET /admin/events, /admin/flagged, /admin/kinds, /admin/audit AdminRead
GET /admin/roles RoleAdmin
POST /admin/roles/grant, /admin/roles/revoke RoleAdmin; tělo {email, role?} (admin výchozí, nebo corpus_reader)
POST /admin/corpus-token RoleAdmin; tělo {email}
POST /admin/alpha, /admin/merge-anon AdminWrite
POST /admin/guide/{grant,credit} Billing

/admin/users – pole řádku

Pole Význam
last_app_version, last_engine_sha build klienta z posledních událostí
last_replay_schema, last_replay_at schéma a čas nejnovějšího replay záznamu
current_replay_schema schéma, kterému rozumí tento server
last_event_at, days_since_last_event, matches aktivita

/admin/corpus-events

Vrací {"events": [{id, match_id, kind, game_number, turn_number, ts, created_at, data, user_id, email?, is_anon?}]} od nejstaršího, jen druh decision_context (pozice a legální akce, které poradce viděl). Jiný kind nebo exclude_kind je 400 — trasa se nerozšiřuje potichu. Kurzor je dvojice (created_at, id) (after + after_id), limit je 1–5000, výchozí 1000. email/is_anon dostane jen AdminRead; user_id (pseudonymní UUID) zůstává, aby šlo shlukovat podle hráče. Každé čtení zapíše corpus_read s route=corpus-events. Úplný proud /admin/events zůstává pro čtenáře korpusu zavřený.

/admin/replays

Vrací {"replays": [{id, match_id, created_at, record, email?, is_anon?}]} od nejstaršího. Stránkuj hodnotou created_at posledního řádku jako after (URL-kódovanou: + v +00:00 se jinak změní na mezeru — neplatný kurzor server odmítne místo návratu na první stránku). limit je 1–100, výchozí 10. email/is_anon dostane jen AdminRead.