{"openapi":"3.1.0","info":{"title":"StreamKit Public API","version":"v2","description":"Public streamer data for dashboards, overlays, bots and external tools."},"servers":[{"url":"http://bot.expanzor.cz/api/public/v1"}],"components":{"securitySchemes":{"ClientIdHeader":{"type":"apiKey","in":"header","name":"X-Client-Id"},"ClientSecretHeader":{"type":"apiKey","in":"header","name":"X-Client-Secret"},"BearerJwt":{"type":"http","scheme":"bearer"}}},"security":[{"ClientIdHeader":[],"ClientSecretHeader":[],"BearerJwt":[]}],"paths":{"/api/public/v2/overview":{"get":{"summary":"Overview","description":"Quick summary across stream status, subscriptions, coins, kicks and event totals.","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"version":"v2","generated_at":"2026-06-06T00:00:00+02:00","broadcaster":{"user_id":123,"name":"Streamer","primary_platform":"twitch","platforms":{"kick":{"username":"streamer_name","id":"84635624"},"twitch":{"username":"streamer_tv","id":"29958160"}},"kick_username":"streamer_name","kick_user_id":"84635624"},"data":{"stream_status":{"is_live":true,"platforms":{"kick":{"is_live":false},"twitch":{"is_live":true,"viewer_count":134,"stream_title":"Ranked grind","category_name":"League of Legends"}}},"subscriptions":{"active":42,"gifted":12,"new":7,"resubs":5,"all":24,"by_platform":{"kick":{"active_total":30},"twitch":{"active_total":12}}},"coins":{"total_coins":15320,"users_count":188},"kicks":{"total_kicks":342},"events":{"total":1389}}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/stream-status":{"get":{"summary":"Stream status","description":"Live/offline state for every connected platform (Kick + Twitch) plus a combined is_live flag.","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"is_live":true,"platforms":{"kick":{"is_live":false},"twitch":{"is_live":true,"viewer_count":134,"stream_title":"Ranked grind","category_name":"League of Legends"}}}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/subscriptions-summary":{"get":{"summary":"Subscription summary","description":"High-level counters for active subs, gifted subs, new subs, resubs and observed history, broken down per platform.","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"active":42,"gifted":12,"new":7,"resubs":5,"all":24,"by_platform":{"kick":{"active_total":30},"twitch":{"active_total":12}},"history_count":119}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/subscriptions-active":{"get":{"summary":"Active subscriptions","description":"Estimated active subscriber preview with expiration hints.","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"active_total":42,"preview":[{"username":"viewer123","expires_at":"2026-07-10T18:30:00+02:00"}]}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/subscriptions-history":{"get":{"summary":"Subscription history","description":"Historical subscription events including new, renewal and gifted records with a platform field.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Number of rows to return."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":[{"type":"channel.subscription.gifts","platform":"twitch","actor":"viewer123","count":5,"received_at":"2026-06-06T18:30:00+02:00"}]}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/coins":{"get":{"summary":"Coins","description":"Loyalty coin totals and leaderboard of top viewers.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Leaderboard size."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"summary":{"total_coins":15320,"users_count":188},"leaderboard":[{"username":"viewer123","coins":450}]}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/kicks":{"get":{"summary":"Kicks","description":"Kick gifting summary, top gifters and observed historical kick events (Kick-specific; Twitch cheers arrive via events-history as channel.cheered).","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"History size."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"summary":{"total_kicks":342,"gift_events":19},"top_gifters":[{"username":"viewer999","kicks":55}],"history":[{"actor":"viewer999","amount":5}]}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/song-request":{"get":{"summary":"Song Request queue","description":"Current queue of requested songs.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Queue size."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":[{"requester_username":"viewer123","provider":"youtube","song_url":"https://youtu.be/..."}]}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/giveaway":{"get":{"summary":"Giveaway state","description":"Current giveaway settings, entries and winner.","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"settings":{"title":"Giveaway","keyword":"!join"},"entries":[{"username":"viewer1"}]}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/wheel":{"get":{"summary":"Wheel state","description":"Wheel title, configured segments and last result.","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"title":"Wheel of Fortune","segments":["100 coins","Hydrate"],"last_result":"Hydrate"}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/gamble":{"get":{"summary":"Gamble history","description":"Latest gamble results for overlay widgets or dashboards.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"History size."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":[{"username":"viewer1","game_type":"coinflip","outcome":"win"}]}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/stream-info":{"post":{"summary":"Update stream info","description":"Updates title and/or category on the primary connected broadcaster account.","parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":{"updated":true,"title":"Just Chatting with chat","category":"Just Chatting"}}}}},"401":{"description":"Unauthorized"}}}},"/api/public/v2/events-history":{"get":{"summary":"Historical events","description":"Latest stored events (Kick + Twitch). You can optionally filter by event type.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Max number of items."},{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"Exact event type filter, e.g. chat.message.sent."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"example":{"ok":true,"data":[{"type":"chat.message.sent","platform":"twitch","actor":"viewer1","message":"!watchtime","received_at":"2026-06-06T18:35:00+02:00"}]}}}},"401":{"description":"Unauthorized"}}}}}}