{"openapi":"3.1.0","info":{"title":"TikTikLuck agent API","version":"1","description":"TikTikLuck is a free-to-play games site (18+). Everything runs on Luck Points (LP): play money with no cash value.\nYour API key acts as the player who made it, with their LP balance. Reading is always allowed; the player chose what else the key may do (tools you can't use aren't listed).\nLuck games are provably fair: each round commits to a hidden server seed, mixes in your client seed, and reveals the server seed after, so you can re-run it (verify_play, or @luckloop/core).\nSkill games are for people to play; agents can make them. Be a good guest: rate limits apply per second and per day."},"servers":[{"url":"https://www.tiktikluck.com"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Your key from Profile → API key (tkl_…)"}}},"security":[{"apiKey":[]}],"paths":{"/api/me":{"get":{"summary":"Your account: handle, pointsBalance, checkedInToday.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/points/checkin":{"post":{"summary":"Daily check-in bonus (once per UTC day).","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/points/summary":{"get":{"summary":"Balance, recent awards and ways to earn LP.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/explore":{"get":{"summary":"Browse live games. sort: latest (default) | trending | played | cheapest | priciest; window (for trending): 24h | 7d | 30d; type: all | luck | skill; free=1 for free-to-play only.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string"}},{"name":"window","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"}},{"name":"free","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}},{"name":"offset","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/feed":{"get":{"summary":"The feed: luck boards, skill games and invented games, in feed order.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/games/{hash}":{"get":{"summary":"A luck board with its live odds (certification.outcomes).","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/games/{hash}/config":{"get":{"summary":"A luck board's exact config bytes, for verifying.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/games/{hash}/status":{"get":{"summary":"certifying | live | rejected (report.errors) | …","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/commitments":{"post":{"summary":"Start a luck-board play: commit to a hidden server seed.","description":"Needs the key's \"luck_solo\" switch.","x-tiktikluck-permission":"luck_solo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"configHash":{"description":"string"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/plays":{"post":{"summary":"Play the round with your client seed: the result, payout and revealed seeds. Always Luck Points.","description":"Needs the key's \"luck_solo\" switch.","x-tiktikluck-permission":"luck_solo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"commitmentId":{"description":"string"},"outcomeIndex":{"description":"integer"},"stake":{"description":"integer, whole LP (0 = a free round where the stake menu offers it)"},"clientSeed":{"description":"string 1..64"},"expectedMultiplierX100":{"description":"integer (optional): the price you saw; a different current price answers 409 with currentMultiplierX100"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}},"get":{"summary":"Everything you've played, newest first: every kind, with stake, payout, state and lifetime totals. Luck-board plays carry `verify`, the body for POST /api/verify.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"before","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/me/activity":{"get":{"summary":"Every Luck Points movement, signed: bonuses, ads, earnings, stakes, wins, purchases.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/verify":{"post":{"summary":"Re-run a settled luck-board round from its seeds.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"configHash":{"description":"string"},"serverSeed":{"description":"string"},"clientSeed":{"description":"string"},"nonce":{"description":"integer"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/custom/templates":{"get":{"summary":"Live invented games.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}},"post":{"summary":"Save an invented template.","description":"Needs the key's \"invent\" switch.","x-tiktikluck-permission":"invent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"template":{"description":"GameTemplate"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/custom/templates/{id}":{"get":{"summary":"An invented game (with its code and outcomes).","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/custom/templates/{id}/commit":{"post":{"summary":"Start a round of a solo invented luck game.","description":"Needs the key's \"luck_solo\" switch.","x-tiktikluck-permission":"luck_solo","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/custom/templates/{id}/plays":{"post":{"summary":"Play the round.","description":"Needs the key's \"luck_solo\" switch.","x-tiktikluck-permission":"luck_solo","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"commitmentId":{"description":"string"},"stake":{"description":"integer, whole LP"},"clientSeed":{"description":"string 1..64"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/lobbies/multiplayer":{"get":{"summary":"Multiplayer games with live rooms.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/lobbies/{hash}/state":{"get":{"summary":"A room's current round.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/lobbies/{hash}/events":{"get":{"summary":"A room's live events (server-sent events).","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/lobbies/{hash}/join":{"post":{"summary":"Take a seat (stakes the room's seat price). Between rounds: 409 with nextRoundAt, opensInSec and Retry-After.","description":"Needs the key's \"luck_multi\" switch.","x-tiktikluck-permission":"luck_multi","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clientSeed":{"description":"string 1..64 (optional)"},"aimTurn":{"description":"integer 0..65535 (optional)"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/lobbies/{hash}/leave":{"post":{"summary":"Leave while the round is open (stake back).","description":"Needs the key's \"luck_multi\" switch.","x-tiktikluck-permission":"luck_multi","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/lobbies/rounds/{id}":{"get":{"summary":"A room round with its revealed seeds.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/arena/state":{"get":{"summary":"The Arena's current round.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/arena/events":{"get":{"summary":"The Arena's live events (server-sent events).","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/arena/join":{"post":{"summary":"Take an Arena seat. Between rounds: 409 with nextRoundAt, opensInSec and Retry-After.","description":"Needs the key's \"luck_multi\" switch.","x-tiktikluck-permission":"luck_multi","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"clientSeed":{"description":"string 1..64 (optional)"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/arena/leave":{"post":{"summary":"Leave the Arena while the round is open.","description":"Needs the key's \"luck_multi\" switch.","x-tiktikluck-permission":"luck_multi","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/arena/rounds/{id}":{"get":{"summary":"An Arena round with its revealed seeds.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/generate":{"post":{"summary":"Design a luck board (genre: luck) or a skill game (kind: …), or change one (baseConfig).","description":"Needs the key's \"create_luck or create_skill\" switch.","x-tiktikluck-permission":"create_luck or create_skill","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"description":"string 3..500"},"genre":{"description":"\"luck\" (optional)"},"kind":{"description":"skill kind (optional)"},"baseConfig":{"description":"object (optional)"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/generate/jobs/{id}":{"get":{"summary":"The AI's custom design, when designJobId came back.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/games":{"post":{"summary":"Publish a luck board (then poll /status).","description":"Needs the key's \"create_luck\" switch.","x-tiktikluck-permission":"create_luck","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"config":{"description":"GameConfig (stakeOptions, multiplayer.maxPlayers optional)"},"replaces":{"description":"string (optional)"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/skill/kinds":{"get":{"summary":"Skill game kinds.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/skill/games":{"post":{"summary":"Publish a skill game (live at once).","description":"Needs the key's \"create_skill\" switch.","x-tiktikluck-permission":"create_skill","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"config":{"description":"SkillConfig"},"replaces":{"description":"string (optional)"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/custom/design":{"post":{"summary":"Invent a game (returns jobId).","description":"Needs the key's \"invent\" switch.","x-tiktikluck-permission":"invent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"description":"string 10..2000"},"multiplayer":{"description":"boolean (optional)"},"base":{"description":"template (to change one)"},"change":{"description":"string"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/custom/design/{id}":{"get":{"summary":"An invent job: pending | ready (template) | failed (problems).","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/custom/games":{"post":{"summary":"Publish an invented game made with a template.","description":"Needs the key's \"invent\" switch.","x-tiktikluck-permission":"invent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"template":{"description":"GameTemplate"},"templateId":{"description":"string"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/creator/dashboard":{"get":{"summary":"Games you made, with plays and earnings.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/cosmetics":{"get":{"summary":"The Shop: catalog, owned, equipped.","description":"Allowed for every key.","x-tiktikluck-permission":"read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/cosmetics/purchase":{"post":{"summary":"Buy an item with LP.","description":"Needs the key's \"cosmetics\" switch.","x-tiktikluck-permission":"cosmetics","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"description":"string"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}},"/api/cosmetics/equip":{"post":{"summary":"Equip an owned item.","description":"Needs the key's \"cosmetics\" switch.","x-tiktikluck-permission":"cosmetics","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slot":{"description":"skin | trail | frame"},"itemId":{"description":"string | null"}}}}}},"responses":{"200":{"description":"OK"},"401":{"description":"Bad key"},"403":{"description":"Not allowed for this key"},"429":{"description":"Rate limit (Retry-After)"}}}}}}