{"ok":true,"name":"NARCER API","version":"0.4","docs":"https://narcer.com/llms.txt","submit":{"method":"POST","url":"https://narcer.com/api/submit","auth":"optional: Authorization: Bearer <token>","forms":["multipart/form-data: file=@game.html or file=@game.zip (index.html inside; folded into one file on the server) (+ cover=@cover.png, title, author, ai, status, tags, desc, controls, playtime, version, jam, update_of, token)","application/json: {html | zip_b64, title, author, ..., token, update_of}","text/html: the file itself (meta from <meta name=\"narcer:*\">)"],"limits":{"bytes":10000000,"zip_bytes":12000000,"zip_files":400,"zip_unpacked_bytes":24000000,"cover_bytes":300000,"per10min":3},"states":["pending","approved","rejected"]},"fold":{"method":"POST","url":"https://narcer.com/api/fold","what":"same input as submit (file=@game.zip or html) -> {html, checks, fold}; folds a ZIP into one HTML and inlines allowed CDN files; stores nothing","per10min":30},"policy":{"max_html_bytes":10000000,"versions_budget_bytes":40000000,"zip":true,"max_zip_bytes":12000000,"cdn_hosts":["cdnjs.cloudflare.com","cdn.jsdelivr.net","unpkg.com","fonts.googleapis.com","fonts.gstatic.com"],"cdn_inline":"at submit time only; the page never loads from the network","eval":"warn","money":"none inside games or while playing: NARCER has no payment, tipping or support links. The only ads are small Amazon / Rakuten affiliate links in the page footer (labelled PR), never on or over a game.","upload_conditions":["the game must be playable to the end for free; no real-money mechanism inside the game (checkout, unlock codes, bank details, code sales, in-game tipping)","in-game fictional currency is unrestricted (gold, shops, items, gacha) — 100 gold is fine, 100 yen is not","games sold elsewhere (Steam / App Store / Roblox) may be listed as a page + link; NARCER does not host them so their price is their own rule"],"runtime_csp":"the page is served with a CSP the sandbox inherits: no network (connect-src/img-src), no navigation to other sites (frame-src 'self')","esm_import_from_url":"ng","multi_page":"index.html only","fetch_local_files":"not possible (single file)","indexedDB":"not available","doc":"https://narcer.com/llms.txt"},"game":{"page":"https://narcer.com/g/:id","embed":"https://narcer.com/embed/:id","get":"GET /api/games/:id -> {game, html, html_url, html_bytes} (?html=0 leaves html out; html_url is the same HTML as text/plain, cacheable forever — its URL changes when the game is updated)","play":"POST /api/games/:id/play","like":"POST /api/games/:id/like","comments":"GET|POST /api/games/:id/comments","score":"POST /api/games/:id/score {mode, score, pid, name} (from a game: parent.postMessage({narcer:\"score\", mode, score, pid}) -> parent replies {narcer:\"ranking\", mode, top, me, total})","ranking":"GET /api/games/:id/ranking?mode=&pid=  (the game owner and knarc are never ranked)","update":"POST /api/games/:id/update (owner)","meta":"POST /api/games/:id/meta (owner)","withdraw":"POST /api/games/:id/withdraw (owner)","cover":"POST /api/games/:id/cover multipart cover (owner)","devlog":"POST /api/games/:id/devlog {title, body} (owner)"},"author":{"register":"POST /api/register {name, email, pass}","login":"POST /api/login {name, pass}","me":"GET /api/me","profile":"POST /api/me/profile {bio, link, links:[{t,u}] (max 5, https only — your works elsewhere: Roblox / App Store / Steam …)}","page":"GET /api/authors/:name","follow":"POST /api/follow/:authorId","feed":"GET /api/feed","notes":"GET /api/me/notes","stats":"GET /api/me/stats","save":"games by registered authors can save via parent.postMessage bridge"},"external":{"method":"POST","url":"https://narcer.com/api/external","what":"register a game that lives elsewhere (Roblox / Steam / itch.io …) or is not playable yet — NARCER stores only the page, never the game","fields":{"title":"required","engine":["html","roblox","unity","godot","unreal","rpgmaker","gamemaker","scratch","other"],"hosting":["narcer","external","none"],"dest":["narcer","roblox","steam","appstore","googleplay","web","download","other","none"],"play_url":"https only (required when hosting=external)","desc":"","tags":"","status":["public","wip","lab"],"ai":["ChatGPT","Claude","Gemini","Copilot","Codex","Claude Code","その他","使っていない"],"cover":"multipart image (optional)"}},"browse":{"list":"GET /api/games?sort=new|popular|trending|updated&engine=&hosting=&tag=&q=&jam=&author=","counters":"GET /api/counters?ids=a,b","jams":"GET /api/jams"},"forum":{"list":"GET /api/threads?cat=&game=&q=","thread":"GET /api/threads/:id","create":"POST /api/threads","reply":"POST /api/threads/:id/posts","cats":["talk","made","bug","idea","wip","game","devlog"]},"ev":{"what":"Telemetry relay: a game cannot reach the network (the bundler blocks fetch/WebSocket), so it asks the parent page to count. From a game: parent.postMessage({narcer:\"ev\", k:\"first_clear\", n:1}, \"*\"). Counts only — no user id, no free text, no IP is stored. 24-char [a-z0-9_] keys, 40 kinds per game per day, kept 90 days.","read":"GET /api/ev?game=<id>&days=14 (Bearer, the game author only) -> { total: {k: n}, rows: [{k, day, n}] }"},"gift":{"what":"GIFT LINK: a game hands an item (JSON <= 24 KB, e.g. a raised monster) to the logged-in player's friend. From a game: parent.postMessage({narcer:\"gift\", op:\"create\", label, unit}) -> parent replies {narcer:\"gift\", op:\"created\", code, url} (6-char code + https://narcer.com/gift/<code>); the first logged-in visitor of that URL owns it (24 h, one claimer). Other ops from a game: status {codes} -> {list:[{code,status,claimed_by}]} (sender removes its copy when status=claimed, then ack {code}); cancel {code}; inbox -> {list:[{code,from,label,unit}]} (receiver adds the unit, then received {code}). Not logged in -> {narcer:\"gift\", op:\"error\", login:true}.","rest":"POST /api/gift {game,label,unit} | GET /api/gift/:code | POST /api/gift/:code/claim|cancel|ack|received | GET /api/gift/inbox?game= | GET /api/gift/mine?game=&codes="},"rules":["1 file of HTML/CSS/JS, or a ZIP with index.html (folded into 1 file on submit)","no external files or network at runtime (allowed CDN <script src>/<link> are inlined at submit time)","do not touch window.top / parent.location (parent.postMessage for save is ok)","localStorage works (NARCER shims it in the sandbox)","your own work; no personal data collection"]}