{"openapi":"3.0.0","paths":{"/api/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"Service is healthy"}},"summary":"Health check endpoint","tags":["Health"]}},"/api/health/ready":{"get":{"operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":"Service is ready"}},"summary":"Readiness check endpoint","tags":["Health"]}},"/api/health/live":{"get":{"operationId":"HealthController_live","parameters":[],"responses":{"200":{"description":"Service is alive"}},"summary":"Liveness check endpoint","tags":["Health"]}},"/api/health/status":{"get":{"operationId":"HealthController_status","parameters":[],"responses":{"200":{"description":"Service health status"}},"summary":"Health status endpoint","tags":["Health"]}},"/api/v1/health":{"get":{"operationId":"V1HealthController_check","parameters":[],"responses":{"200":{"description":""}},"tags":["V1Health"]}},"/api/v1/auth/register":{"post":{"operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":"User registered successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponseDto"}}}},"400":{"description":"User already exists"}},"summary":"Register a new user","tags":["Auth"]}},"/api/v1/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":"Login successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponseDto"}}}},"401":{"description":"Invalid credentials"}},"summary":"Login user and get tokens","tags":["Auth"]}},"/api/v1/auth/admin/login":{"post":{"operationId":"AuthController_adminLogin","parameters":[],"responses":{"200":{"description":"Admin login successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponseDto"}}}},"401":{"description":"Invalid credentials or not an admin"}},"summary":"Admin login with email and password","tags":["Auth"]}},"/api/v1/auth/verify":{"post":{"operationId":"AuthController_verify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyTokenDto"}}}},"responses":{"200":{"description":"Token verification result"}},"summary":"Verify JWT token","tags":["Auth"]}},"/api/v1/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenDto"}}}},"responses":{"200":{"description":"New tokens generated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"401":{"description":"Invalid refresh token"}},"summary":"Refresh access token","tags":["Auth"]}},"/api/v1/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":"Logged out successfully"}},"security":[{"JWT-auth":[]}],"summary":"Logout user","tags":["Auth"]}},"/api/v1/auth/me":{"get":{"operationId":"AuthController_getMe","parameters":[],"responses":{"200":{"description":"Current user profile","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponseDto"}}}}},"security":[{"JWT-auth":[]}],"summary":"Get current user profile","tags":["Auth"]},"patch":{"operationId":"AuthController_updateMe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":"Profile updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponseDto"}}}},"400":{"description":"Username or email already taken"}},"security":[{"JWT-auth":[]}],"summary":"Update current user profile","tags":["Auth"]}},"/api/v1/auth/signin":{"post":{"operationId":"AuthController_otpSignin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpSigninDto"}}}},"responses":{"200":{"description":"OTP sent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpSigninResponseDto"}}}},"401":{"description":"Account banned or deactivated"}},"summary":"Send OTP to phone number for login","tags":["Auth"]}},"/api/v1/auth/verify-otp":{"post":{"operationId":"AuthController_otpVerify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpVerifyDto"}}}},"responses":{"200":{"description":"OTP verified successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpVerifyResponseDto"}}}},"401":{"description":"Invalid or expired OTP"}},"summary":"Verify OTP and get tokens","tags":["Auth"]}},"/api/v1/auth/upload/avatar":{"post":{"operationId":"AuthController_uploadAvatar","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Image file (jpeg, png, gif, webp) max 5MB"}}}}}},"responses":{"200":{"description":"Avatar uploaded successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string","description":"Public S3 URL of the avatar"}}}}}},"400":{"description":"Invalid file type or size"}},"security":[{"JWT-auth":[]}],"summary":"Upload profile avatar","tags":["Auth"]}},"/api/v1/auth/upload":{"post":{"operationId":"AuthController_uploadFile","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"File uploaded successfully"}},"security":[{"JWT-auth":[]}],"summary":"Upload a file (general purpose)","tags":["Auth"]}},"/api/v1/coins/balance":{"get":{"operationId":"CoinsController_balance","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get my coin balance","tags":["Coins"]}},"/api/v1/coins/rate":{"get":{"operationId":"CoinsController_rate","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get KES → coin conversion rate","tags":["Coins"]}},"/api/v1/coins/history":{"get":{"operationId":"CoinsController_history","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"offset","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get coin transaction history","tags":["Coins"]}},"/api/v1/admin/financial-policy/limits":{"get":{"operationId":"FinancialPolicyController_listLimits","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] List withdrawal limits per tier","tags":["Financial Policy"]}},"/api/v1/admin/financial-policy/fees":{"get":{"operationId":"FinancialPolicyController_listFees","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] List fee schedules","tags":["Financial Policy"]}},"/api/v1/admin/risk/users":{"get":{"operationId":"RiskController_list","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] List users with medium/high risk scores","tags":["Risk"]}},"/api/v1/admin/risk/user/{id}":{"get":{"operationId":"RiskController_details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Get risk details for a single user","tags":["Risk"]}},"/api/v1/referral/me":{"get":{"operationId":"ReferralController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get my referral code and stats","tags":["Referrals"]}},"/api/v1/referral/apply":{"post":{"operationId":"ReferralController_apply","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyReferralDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Apply a referral code to my account","tags":["Referrals"]}},"/api/v1/subscription/plans":{"get":{"operationId":"SubscriptionController_plans","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"List available subscription plans","tags":["Subscriptions"]}},"/api/v1/subscription/me":{"get":{"operationId":"SubscriptionController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get my active subscription","tags":["Subscriptions"]}},"/api/v1/subscription/subscribe":{"post":{"operationId":"SubscriptionController_subscribe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Subscribe to a plan (charges the wallet)","tags":["Subscriptions"]}},"/api/v1/subscription/cancel":{"post":{"operationId":"SubscriptionController_cancel","parameters":[],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Cancel my active subscription","tags":["Subscriptions"]}},"/api/v1/notifications/push/public-key":{"get":{"operationId":"PushController_publicKey","parameters":[],"responses":{"200":{"description":""}},"tags":["Push Notifications"]}},"/api/v1/notifications/push/subscribe":{"post":{"operationId":"PushController_subscribe","parameters":[{"name":"user-agent","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Push Notifications"]},"delete":{"operationId":"PushController_unsubscribeByEndpoint","parameters":[],"responses":{"200":{"description":""}},"tags":["Push Notifications"]}},"/api/v1/notifications/push/subscribe/{id}":{"delete":{"operationId":"PushController_unsubscribeById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Push Notifications"]}},"/api/v1/notifications":{"get":{"operationId":"NotificationsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/api/v1/notifications/unread-count":{"get":{"operationId":"NotificationsController_unreadCount","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/api/v1/notifications/{id}/read":{"patch":{"operationId":"NotificationsController_markRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/api/v1/notifications/read-all":{"patch":{"operationId":"NotificationsController_markAllRead","parameters":[],"responses":{"200":{"description":""}},"tags":["Notifications"]}},"/api/v1/friends":{"get":{"operationId":"FriendsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Friends"]}},"/api/v1/friends/invite":{"post":{"operationId":"FriendsController_invite","parameters":[],"responses":{"201":{"description":""}},"tags":["Friends"]}},"/api/v1/friends/accept":{"post":{"operationId":"FriendsController_accept","parameters":[],"responses":{"201":{"description":""}},"tags":["Friends"]}},"/api/v1/friends/decline":{"post":{"operationId":"FriendsController_decline","parameters":[],"responses":{"201":{"description":""}},"tags":["Friends"]}},"/api/v1/friends/block":{"post":{"operationId":"FriendsController_block","parameters":[],"responses":{"201":{"description":""}},"tags":["Friends"]}},"/api/v1/friends/unblock":{"post":{"operationId":"FriendsController_unblock","parameters":[],"responses":{"201":{"description":""}},"tags":["Friends"]}},"/api/v1/friends/import-contacts":{"post":{"operationId":"FriendsController_importContacts","parameters":[],"responses":{"201":{"description":""}},"tags":["Friends"]}},"/api/v1/friends/{id}":{"delete":{"operationId":"FriendsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Friends"]}},"/api/v1/tickets":{"get":{"operationId":"TicketsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Support Tickets"]},"post":{"operationId":"TicketsController_create","parameters":[],"responses":{"201":{"description":""}},"tags":["Support Tickets"]}},"/api/v1/tickets/{id}":{"get":{"operationId":"TicketsController_detail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Support Tickets"]}},"/api/v1/tickets/{id}/reply":{"post":{"operationId":"TicketsController_reply","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Support Tickets"]}},"/api/v1/tickets/{id}/resolve":{"post":{"operationId":"TicketsController_resolve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Support Tickets"]}},"/api/v1/chat/{friendId}/messages":{"get":{"operationId":"ChatController_messages","parameters":[{"name":"friendId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Chat"]},"post":{"operationId":"ChatController_send","parameters":[{"name":"friendId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Chat"]}},"/api/v1/invites":{"post":{"operationId":"InvitesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"tags":["Invites"]}},"/api/v1/invites/{id}":{"get":{"operationId":"InvitesController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"tags":["Invites"]}},"/api/v1/invites/{id}/accept":{"post":{"operationId":"InvitesController_accept","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"tags":["Invites"]}},"/api/v1/gift-cards/catalog":{"get":{"operationId":"GiftCardsController_catalog","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"List available gift-card vouchers","tags":["Gift Cards"]}},"/api/v1/gift-cards/mine":{"get":{"operationId":"GiftCardsController_mine","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"List my previous redemptions","tags":["Gift Cards"]}},"/api/v1/gift-cards/redeem":{"post":{"operationId":"GiftCardsController_redeem","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Redeem a voucher by id — debits wallet","tags":["Gift Cards"]}},"/api/v1/wallet/balance":{"get":{"operationId":"WalletController_getBalance","parameters":[],"responses":{"200":{"description":"Wallet balance"}},"security":[{"JWT-auth":[]}],"summary":"Get wallet balance","tags":["Wallet"]}},"/api/v1/wallet/transactions":{"get":{"operationId":"WalletController_getTransactionHistory","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"type","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get transaction history","tags":["Wallet"]}},"/api/v1/wallet/earnings":{"get":{"operationId":"WalletController_getEarnings","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get total earnings","tags":["Wallet"]}},"/api/v1/wallet/escrow/{escrowId}":{"get":{"operationId":"WalletController_getEscrowStatus","parameters":[{"name":"escrowId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get escrow status","tags":["Wallet"]}},"/api/v1/wallet/deposit":{"post":{"operationId":"WalletController_deposit","parameters":[{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositDto"}}}},"responses":{"200":{"description":"Deposit initiated"},"400":{"description":"Invalid deposit request"}},"security":[{"JWT-auth":[]}],"summary":"Deposit funds — KCB Buni STK or sandbox credit","tags":["Wallet"]}},"/api/v1/wallet/deposit/{id}/status":{"get":{"operationId":"WalletController_depositStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Poll deposit status","tags":["Wallet"]}},"/api/v1/wallet/withdraw":{"post":{"operationId":"WalletController_withdraw","parameters":[{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawDto"}}}},"responses":{"200":{"description":"Withdrawal initiated"},"400":{"description":"Insufficient balance or invalid request"}},"security":[{"JWT-auth":[]}],"summary":"Withdraw funds via KCB Buni B2C","tags":["Wallet"]}},"/api/v1/wallet/escrow":{"post":{"operationId":"WalletController_getOrCreateEscrow","parameters":[],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get or create wallet escrow agreement","tags":["Wallet"]}},"/api/v1/wallet/test/credit":{"post":{"operationId":"WalletController_creditTestFunds","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"Amount in KES"}}}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[SANDBOX] Credit test funds to wallet","tags":["Wallet"]}},"/api/v1/wallet/sandbox/credit/{externalUserId}":{"post":{"operationId":"WalletSandboxController_creditByExternalId","parameters":[{"name":"externalUserId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"Amount in KES","default":1000}}}}}},"responses":{"201":{"description":""}},"summary":"[SANDBOX] Credit test funds by external user ID - NO AUTH","tags":["Wallet - Sandbox"]}},"/api/v1/wallet/sandbox/credit-all":{"post":{"operationId":"WalletSandboxController_creditAllUsers","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","description":"Amount in KES to credit each user","default":1000000}}}}}},"responses":{"201":{"description":""}},"summary":"[SANDBOX] Credit ALL users — staging only","tags":["Wallet - Sandbox"]}},"/api/v1/wallets":{"get":{"operationId":"WalletsController_getWallets","parameters":[],"responses":{"200":{"description":"List of wallets"}},"security":[{"JWT-auth":[]}],"summary":"Get user wallets (wasaa-wallet-v2 compatible)","tags":["Wallets"]},"post":{"operationId":"WalletsController_createWallet","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWalletDto"}}}},"responses":{"201":{"description":"Wallet created"}},"security":[{"JWT-auth":[]}],"summary":"Create wallet (wasaa-wallet-v2 compatible)","tags":["Wallets"]}},"/api/v1/wallets/{walletId}/balance":{"get":{"operationId":"WalletsController_getWalletBalance","parameters":[{"name":"walletId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Wallet balance"}},"security":[{"JWT-auth":[]}],"summary":"Get wallet balance (wasaa-wallet-v2 compatible)","tags":["Wallets"]}},"/api/v1/wallets/{walletId}/transactions":{"get":{"operationId":"WalletsController_getWalletTransactions","parameters":[{"name":"walletId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Transaction list"}},"security":[{"JWT-auth":[]}],"summary":"Get wallet transactions (wasaa-wallet-v2 compatible)","tags":["Wallets"]}},"/api/v1/wallets/{walletId}/credit":{"post":{"operationId":"WalletsController_creditWallet","parameters":[{"name":"walletId","required":true,"in":"path","schema":{"type":"string"}},{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditDto"}}}},"responses":{"200":{"description":"Credit initiated"}},"security":[{"JWT-auth":[]}],"summary":"Credit wallet / Topup (wasaa-wallet-v2 compatible)","tags":["Wallets"]}},"/api/v1/wallets/{walletId}/debit":{"post":{"operationId":"WalletsController_debitWallet","parameters":[{"name":"walletId","required":true,"in":"path","schema":{"type":"string"}},{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DebitDto"}}}},"responses":{"200":{"description":"Debit initiated"}},"security":[{"JWT-auth":[]}],"summary":"Debit wallet / Withdraw (wasaa-wallet-v2 compatible)","tags":["Wallets"]}},"/api/v1/webhooks/kcb-buni/stk-callback":{"post":{"operationId":"KcbBuniWebhookController_handleStkCallback","parameters":[{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"KCB Buni STK / Vooma P2P deposit callback","tags":["Webhooks"]}},"/api/v1/webhooks/kcb-buni/b2c-callback":{"post":{"operationId":"KcbBuniWebhookController_handleB2CCallback","parameters":[{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"KCB Buni B2C / Vooma withdrawal callback","tags":["Webhooks"]}},"/api/v1/promo/campaigns":{"get":{"operationId":"PromoController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"List active promo campaigns","tags":["Promotions"]}},"/api/v1/promo/claim":{"post":{"operationId":"PromoController_claim","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Claim a promo campaign once per user","tags":["Promotions"]}},"/api/v1/matchmaking/join":{"post":{"operationId":"MatchmakingController_joinQueue","parameters":[],"responses":{"201":{"description":"Joined queue or match found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchFoundResponseDto"}}}},"400":{"description":"Already in queue or active game"}},"summary":"Join matchmaking queue","tags":["Matchmaking"]}},"/api/v1/matchmaking/cancel":{"post":{"operationId":"MatchmakingController_cancelQueue","parameters":[],"responses":{"200":{"description":"Left queue successfully"},"404":{"description":"Not in queue"}},"summary":"Cancel matchmaking queue","tags":["Matchmaking"]}},"/api/v1/matchmaking/status":{"get":{"operationId":"MatchmakingController_getQueueStatus","parameters":[{"name":"gameType","required":false,"in":"query","schema":{"type":"string"}},{"name":"playerId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Current queue status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatusResponseDto"}}}}},"summary":"Get current queue status","tags":["Matchmaking"]}},"/api/v1/matchmaking/invite":{"post":{"operationId":"MatchmakingController_invitePlayer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitePlayerDto"}}}},"responses":{"201":{"description":"Invite sent successfully"},"404":{"description":"Player not found"}},"summary":"Invite a player to play","tags":["Matchmaking"]}},"/api/v1/matchmaking/invite/accept":{"post":{"operationId":"MatchmakingController_acceptInvite","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteDto"}}}},"responses":{"200":{"description":"Invite accepted, game created"},"404":{"description":"Invite not found or expired"}},"summary":"Accept a game invite","tags":["Matchmaking"]}},"/api/v1/matchmaking/invite/{inviteId}/status":{"get":{"operationId":"MatchmakingController_getInviteStatus","parameters":[{"name":"inviteId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Invite status"},"404":{"description":"Invite not found"}},"summary":"Get invite status","tags":["Matchmaking"]}},"/api/v1/matchmaking/invite/{inviteId}":{"delete":{"operationId":"MatchmakingController_declineInvite","parameters":[{"name":"inviteId","required":true,"in":"path","schema":{"type":"string"}},{"name":"playerId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Invite declined"}},"summary":"Decline a game invite","tags":["Matchmaking"]}},"/api/v1/matchmaking/invites":{"get":{"operationId":"MatchmakingController_getPendingInvites","parameters":[{"name":"playerId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"List of pending invites"}},"summary":"Get pending invites (received)","tags":["Matchmaking"]}},"/api/v1/matchmaking/invites/sent":{"get":{"operationId":"MatchmakingController_getSentInvites","parameters":[{"name":"playerId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"List of sent invites"}},"summary":"Get sent invites","tags":["Matchmaking"]}},"/api/v1/matchmaking/stats":{"get":{"operationId":"MatchmakingController_getStats","parameters":[{"name":"gameType","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Matchmaking statistics"}},"summary":"Get matchmaking statistics","tags":["Matchmaking"]}},"/api/v1/session/{sessionId}":{"get":{"operationId":"GameSessionController_getSession","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}},{"name":"playerId","required":false,"in":"query","description":"Player ID (optional)","schema":{"type":"string"}}],"responses":{"200":{"description":"Session details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponseDto"}}}},"404":{"description":"Session not found"}},"summary":"Get session details","tags":["Sessions"]}},"/api/v1/session/{sessionId}/state":{"get":{"operationId":"GameSessionController_getSessionState","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}},{"name":"playerId","required":false,"in":"query","description":"Player ID (optional)","schema":{"type":"string"}}],"responses":{"200":{"description":"Current game state"}},"summary":"Get current game state","tags":["Sessions"]}},"/api/v1/session/{sessionId}/ready":{"post":{"operationId":"GameSessionController_playerReady","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadyDto"}}}},"responses":{"200":{"description":"Ready status updated"}},"summary":"Signal ready to start game","tags":["Sessions"]}},"/api/v1/session/{sessionId}/submit-move":{"post":{"operationId":"GameSessionController_submitMove","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitMoveDto"}}}},"responses":{"200":{"description":"Move processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveResponseDto"}}}},"400":{"description":"Invalid move or not your turn"}},"summary":"Submit a game move","tags":["Sessions"]}},"/api/v1/session/{sessionId}/forfeit":{"post":{"operationId":"GameSessionController_forfeitGame","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForfeitDto"}}}},"responses":{"200":{"description":"Game forfeited"}},"summary":"Forfeit the game","tags":["Sessions"]}},"/api/v1/session/{sessionId}/complete":{"post":{"operationId":"GameSessionController_completeGame","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Game completed"}},"summary":"Complete a game with winner (for games like Word that track score locally)","tags":["Sessions"]}},"/api/v1/session/{sessionId}/word-game/score":{"post":{"operationId":"GameSessionController_updateWordGameScore","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Score updated and current game state returned"}},"summary":"Update word game score for current player","tags":["Sessions"]}},"/api/v1/session/{sessionId}/word-game/state":{"get":{"operationId":"GameSessionController_getWordGameState","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}},{"name":"playerId","required":false,"in":"query","description":"Player ID (optional)","schema":{"type":"string"}},{"name":"isHost","required":false,"in":"query","description":"Is host/inviter (true=player1, false=player2)","schema":{"type":"string"}}],"responses":{"200":{"description":"Word game state"}},"summary":"Get word game state including both scores and current word","tags":["Sessions"]}},"/api/v1/session/{sessionId}/replay":{"get":{"operationId":"GameSessionController_getReplay","parameters":[{"name":"sessionId","required":true,"in":"path","description":"Session ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Game replay data"}},"summary":"Get game replay","tags":["Sessions"]}},"/api/v1/session":{"get":{"operationId":"GameSessionController_getActiveSessions","parameters":[{"name":"playerId","required":true,"in":"query","description":"Player ID","schema":{"type":"string"}}],"responses":{"200":{"description":"List of active sessions"}},"summary":"Get active sessions for current user","tags":["Sessions"]}},"/api/v1/session/history/list":{"get":{"operationId":"GameSessionController_getHistory","parameters":[{"name":"playerId","required":true,"in":"query","description":"Player ID","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"gameType","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Session history"}},"summary":"Get session history","tags":["Sessions"]}},"/api/v1/games":{"get":{"operationId":"GamesController_getGames","parameters":[],"responses":{"200":{"description":"List of games"}},"summary":"Get all available games","tags":["Games"]}},"/api/v1/games/{gameId}":{"get":{"operationId":"GamesController_getGame","parameters":[{"name":"gameId","required":true,"in":"path","description":"Game ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Game details"},"404":{"description":"Game not found"}},"summary":"Get game by ID","tags":["Games"]}},"/api/v1/games/cleanup/stale":{"post":{"operationId":"GamesController_cleanupStaleSessions","parameters":[{"name":"maxAgeHours","required":false,"in":"query","description":"Max age in hours (default 24)","schema":{"type":"number"}}],"responses":{"200":{"description":"Cleanup results"}},"summary":"Clean up stale game sessions (admin use)","tags":["Games"]}},"/api/v1/games/cleanup/user/{userId}":{"post":{"operationId":"GamesController_cancelUserSessions","parameters":[{"name":"userId","required":true,"in":"path","description":"User ID (external or internal)","schema":{"type":"string"}}],"responses":{"200":{"description":"Sessions cancelled"}},"summary":"Cancel all active sessions for a user","tags":["Games"]}},"/api/v1/player-stats/me":{"get":{"operationId":"PlayerStatsController_myStats","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get my stats and analytics","tags":["Player Stats"]}},"/api/v1/player-stats/leaderboard":{"get":{"operationId":"PlayerStatsController_leaderboard","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Top players by wins","tags":["Player Stats"]}},"/api/v1/player-stats/{userId}":{"get":{"operationId":"PlayerStatsController_userStats","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get stats for any user","tags":["Player Stats"]}},"/api/v1/achievements":{"get":{"operationId":"AchievementsController_listAll","parameters":[],"responses":{"200":{"description":""}},"summary":"List all achievements","tags":["Achievements"]}},"/api/v1/achievements/me":{"get":{"operationId":"AchievementsController_myAchievements","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get my achievements with progress","tags":["Achievements"]}},"/api/v1/achievements/users/{userId}":{"get":{"operationId":"AchievementsController_forUser","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get achievements for a user","tags":["Achievements"]}},"/api/v1/tournaments":{"get":{"operationId":"TournamentController_getTournaments","parameters":[{"name":"status","required":false,"in":"query","schema":{"enum":["DRAFT","REGISTRATION_OPEN","REGISTRATION_CLOSED","IN_PROGRESS","COMPLETED","CANCELLED"],"type":"string"}},{"name":"gameType","required":false,"in":"query","schema":{"enum":["LUDO","CHESS","CHECKERS","DRAFTS","MANCALA","FOUR_IN_A_ROW","GOMOKU","REVERSI","DOTS_AND_BOXES","UNO","UNO_FLIP","CRAZY_8","SIMPLE_CARDS","FILLER","WORD","WORD_HUNT","WORD_BITES","ANAGRAMS","TWENTY_QUESTIONS","POOL","EIGHT_BALL","NINE_BALL","SNOOKER","DARTS","ARCHERY","BASKETBALL","MINI_GOLF","CUP_PONG","SOCCER","SHUFFLEBOARD","SHOOTER","RACING","TANKS","SEA_BATTLE","KNOCKOUT","KENYA_AT_50","TIC_TAC_TOE","SNAKE","WHACK_A_MOLE","COLOR_MATCH","MEMORY_CARDS","REACTION_TIME","NUMBER_GUESS","MIND_MAZE","MATCH_THREE","SPACE_SHOOTER"],"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"List of tournaments"}},"summary":"Get all tournaments","tags":["Tournaments"]},"post":{"operationId":"TournamentController_createTournament","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTournamentDto"}}}},"responses":{"201":{"description":"Tournament created"}},"security":[{"JWT-auth":[]}],"summary":"Create a new tournament (Admin)","tags":["Tournaments"]}},"/api/v1/tournaments/{id}":{"get":{"operationId":"TournamentController_getTournament","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Tournament details"}},"summary":"Get tournament by ID","tags":["Tournaments"]},"patch":{"operationId":"TournamentController_updateTournament","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTournamentDto"}}}},"responses":{"200":{"description":"Tournament updated"}},"security":[{"JWT-auth":[]}],"summary":"Update tournament (Admin)","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/register":{"post":{"operationId":"TournamentController_registerForTournament","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Registered successfully"}},"security":[{"JWT-auth":[]}],"summary":"Register for a tournament","tags":["Tournaments"]},"delete":{"operationId":"TournamentController_unregisterFromTournament","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Unregistered successfully"}},"security":[{"JWT-auth":[]}],"summary":"Unregister from a tournament","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/start":{"post":{"operationId":"TournamentController_startTournament","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Tournament started"}},"security":[{"JWT-auth":[]}],"summary":"Start a tournament (Admin)","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/open-registration":{"post":{"operationId":"TournamentController_openRegistration","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Registration opened"}},"security":[{"JWT-auth":[]}],"summary":"Open tournament registration","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/close-registration":{"post":{"operationId":"TournamentController_closeRegistration","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Registration closed"}},"security":[{"JWT-auth":[]}],"summary":"Close tournament registration","tags":["Tournaments"]}},"/api/v1/tournaments/my/entries":{"get":{"operationId":"TournamentController_getMyTournaments","parameters":[],"responses":{"200":{"description":"My tournament entries"}},"security":[{"JWT-auth":[]}],"summary":"Get my tournament entries","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/brackets/{bracketId}/result":{"post":{"operationId":"TournamentController_recordBracketResult","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"bracketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Match result recorded"}},"security":[{"JWT-auth":[]}],"summary":"Record match result for a tournament bracket","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/claim-prize":{"post":{"operationId":"TournamentController_claimPrize","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Prize claimed"}},"security":[{"JWT-auth":[]}],"summary":"Claim tournament prize","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/prizes":{"get":{"operationId":"TournamentController_getPrizeDistribution","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Prize distribution"}},"summary":"Get tournament prize distribution","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/bracket":{"get":{"operationId":"TournamentController_getBracket","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Bracket data"}},"summary":"Get tournament bracket","tags":["Tournaments"]}},"/api/v1/tournaments/{id}/participants":{"get":{"operationId":"TournamentController_getParticipants","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get tournament participants","tags":["Tournaments"]}},"/api/v1/leaderboard":{"get":{"operationId":"LeaderboardController_listTopPlayers","parameters":[{"name":"period","required":false,"in":"query","schema":{"type":"string"}},{"name":"gameType","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Top players (aggregate or per-game)","tags":["Leaderboards"]}},"/api/v1/leaderboard/global/{gameType}":{"get":{"operationId":"LeaderboardController_getGlobalLeaderboard","parameters":[{"name":"gameType","required":true,"in":"path","schema":{"enum":["LUDO","CHESS","CHECKERS","DRAFTS","MANCALA","FOUR_IN_A_ROW","GOMOKU","REVERSI","DOTS_AND_BOXES","UNO","UNO_FLIP","CRAZY_8","SIMPLE_CARDS","FILLER","WORD","WORD_HUNT","WORD_BITES","ANAGRAMS","TWENTY_QUESTIONS","POOL","EIGHT_BALL","NINE_BALL","SNOOKER","DARTS","ARCHERY","BASKETBALL","MINI_GOLF","CUP_PONG","SOCCER","SHUFFLEBOARD","SHOOTER","RACING","TANKS","SEA_BATTLE","KNOCKOUT","KENYA_AT_50","TIC_TAC_TOE","SNAKE","WHACK_A_MOLE","COLOR_MATCH","MEMORY_CARDS","REACTION_TIME","NUMBER_GUESS","MIND_MAZE","MATCH_THREE","SPACE_SHOOTER"],"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Global leaderboard"}},"summary":"Get global leaderboard","tags":["Leaderboards"]}},"/api/v1/leaderboard/country/{countryCode}/{gameType}":{"get":{"operationId":"LeaderboardController_getCountryLeaderboard","parameters":[{"name":"countryCode","required":true,"in":"path","description":"Country code (e.g., KE)","schema":{"type":"string"}},{"name":"gameType","required":true,"in":"path","schema":{"enum":["LUDO","CHESS","CHECKERS","DRAFTS","MANCALA","FOUR_IN_A_ROW","GOMOKU","REVERSI","DOTS_AND_BOXES","UNO","UNO_FLIP","CRAZY_8","SIMPLE_CARDS","FILLER","WORD","WORD_HUNT","WORD_BITES","ANAGRAMS","TWENTY_QUESTIONS","POOL","EIGHT_BALL","NINE_BALL","SNOOKER","DARTS","ARCHERY","BASKETBALL","MINI_GOLF","CUP_PONG","SOCCER","SHUFFLEBOARD","SHOOTER","RACING","TANKS","SEA_BATTLE","KNOCKOUT","KENYA_AT_50","TIC_TAC_TOE","SNAKE","WHACK_A_MOLE","COLOR_MATCH","MEMORY_CARDS","REACTION_TIME","NUMBER_GUESS","MIND_MAZE","MATCH_THREE","SPACE_SHOOTER"],"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Country leaderboard"}},"summary":"Get country leaderboard","tags":["Leaderboards"]}},"/api/v1/leaderboard/friends/{gameType}":{"get":{"operationId":"LeaderboardController_getFriendsLeaderboard","parameters":[{"name":"gameType","required":true,"in":"path","schema":{"enum":["LUDO","CHESS","CHECKERS","DRAFTS","MANCALA","FOUR_IN_A_ROW","GOMOKU","REVERSI","DOTS_AND_BOXES","UNO","UNO_FLIP","CRAZY_8","SIMPLE_CARDS","FILLER","WORD","WORD_HUNT","WORD_BITES","ANAGRAMS","TWENTY_QUESTIONS","POOL","EIGHT_BALL","NINE_BALL","SNOOKER","DARTS","ARCHERY","BASKETBALL","MINI_GOLF","CUP_PONG","SOCCER","SHUFFLEBOARD","SHOOTER","RACING","TANKS","SEA_BATTLE","KNOCKOUT","KENYA_AT_50","TIC_TAC_TOE","SNAKE","WHACK_A_MOLE","COLOR_MATCH","MEMORY_CARDS","REACTION_TIME","NUMBER_GUESS","MIND_MAZE","MATCH_THREE","SPACE_SHOOTER"],"type":"string"}},{"name":"friendIds","required":true,"in":"query","description":"Comma-separated friend IDs","schema":{"type":"string"}}],"responses":{"200":{"description":"Friends leaderboard"}},"security":[{"JWT-auth":[]}],"summary":"Get friends leaderboard","tags":["Leaderboards"]}},"/api/v1/leaderboard/rank/{gameType}":{"get":{"operationId":"LeaderboardController_getMyRank","parameters":[{"name":"gameType","required":true,"in":"path","schema":{"enum":["LUDO","CHESS","CHECKERS","DRAFTS","MANCALA","FOUR_IN_A_ROW","GOMOKU","REVERSI","DOTS_AND_BOXES","UNO","UNO_FLIP","CRAZY_8","SIMPLE_CARDS","FILLER","WORD","WORD_HUNT","WORD_BITES","ANAGRAMS","TWENTY_QUESTIONS","POOL","EIGHT_BALL","NINE_BALL","SNOOKER","DARTS","ARCHERY","BASKETBALL","MINI_GOLF","CUP_PONG","SOCCER","SHUFFLEBOARD","SHOOTER","RACING","TANKS","SEA_BATTLE","KNOCKOUT","KENYA_AT_50","TIC_TAC_TOE","SNAKE","WHACK_A_MOLE","COLOR_MATCH","MEMORY_CARDS","REACTION_TIME","NUMBER_GUESS","MIND_MAZE","MATCH_THREE","SPACE_SHOOTER"],"type":"string"}}],"responses":{"200":{"description":"User rank"}},"security":[{"JWT-auth":[]}],"summary":"Get my rank in a game","tags":["Leaderboards"]}},"/api/v1/leaderboard/stats":{"get":{"operationId":"LeaderboardController_getMyStats","parameters":[],"responses":{"200":{"description":"User stats"}},"security":[{"JWT-auth":[]}],"summary":"Get my stats across all games","tags":["Leaderboards"]}},"/api/v1/leaderboard/seasonal/{seasonId}/{gameType}":{"get":{"operationId":"LeaderboardController_getSeasonalLeaderboard","parameters":[{"name":"seasonId","required":true,"in":"path","description":"Season identifier","schema":{"type":"string"}},{"name":"gameType","required":true,"in":"path","schema":{"enum":["LUDO","CHESS","CHECKERS","DRAFTS","MANCALA","FOUR_IN_A_ROW","GOMOKU","REVERSI","DOTS_AND_BOXES","UNO","UNO_FLIP","CRAZY_8","SIMPLE_CARDS","FILLER","WORD","WORD_HUNT","WORD_BITES","ANAGRAMS","TWENTY_QUESTIONS","POOL","EIGHT_BALL","NINE_BALL","SNOOKER","DARTS","ARCHERY","BASKETBALL","MINI_GOLF","CUP_PONG","SOCCER","SHUFFLEBOARD","SHOOTER","RACING","TANKS","SEA_BATTLE","KNOCKOUT","KENYA_AT_50","TIC_TAC_TOE","SNAKE","WHACK_A_MOLE","COLOR_MATCH","MEMORY_CARDS","REACTION_TIME","NUMBER_GUESS","MIND_MAZE","MATCH_THREE","SPACE_SHOOTER"],"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Seasonal leaderboard"}},"summary":"Get seasonal leaderboard","tags":["Leaderboards"]}},"/api/v1/admin/login":{"post":{"operationId":"AdminController_adminLogin","parameters":[],"responses":{"200":{"description":"Login successful"},"401":{"description":"Invalid credentials or not an admin"}},"summary":"Admin login with email and password","tags":["Admin"]}},"/api/v1/admin/me":{"get":{"operationId":"AdminController_getAdminMe","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get current admin user","tags":["Admin"]}},"/api/v1/admin/dashboard":{"get":{"operationId":"AdminController_getDashboard","parameters":[],"responses":{"200":{"description":"Dashboard stats"}},"security":[{"JWT-auth":[]}],"summary":"Get admin dashboard statistics","tags":["Admin"]}},"/api/v1/admin/dashboard/stats":{"get":{"operationId":"AdminController_getDashboardStats","parameters":[],"responses":{"200":{"description":"Dashboard stats"}},"security":[{"JWT-auth":[]}],"summary":"Get admin dashboard statistics","tags":["Admin"]}},"/api/v1/admin/dashboard/game-stats":{"get":{"operationId":"AdminController_getGameStats","parameters":[],"responses":{"200":{"description":"Game stats by type"}},"security":[{"JWT-auth":[]}],"summary":"Get game type statistics","tags":["Admin"]}},"/api/v1/admin/dashboard/revenue":{"get":{"operationId":"AdminController_getRevenueData","parameters":[{"name":"days","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Revenue data"}},"security":[{"JWT-auth":[]}],"summary":"Get revenue data","tags":["Admin"]}},"/api/v1/admin/users":{"get":{"operationId":"AdminController_getUsers","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"role","required":false,"in":"query","schema":{"enum":["PLAYER","MODERATOR","ADMIN","SUPER_ADMIN"],"type":"string"}},{"name":"isBanned","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get users list","tags":["Admin"]}},"/api/v1/admin/users/{userId}":{"get":{"operationId":"AdminController_getUserDetails","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get user details","tags":["Admin"]}},"/api/v1/admin/users/{userId}/ban":{"post":{"operationId":"AdminController_banUser","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BanUserDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Ban a user","tags":["Admin"]},"delete":{"operationId":"AdminController_unbanUser","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Unban a user","tags":["Admin"]}},"/api/v1/admin/users/{userId}/role":{"patch":{"operationId":"AdminController_updateUserRole","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Update user role","tags":["Admin"]}},"/api/v1/admin/users/{userId}/suspend":{"post":{"operationId":"AdminController_suspendUser","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuspendUserDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Suspend a user","tags":["Admin"]}},"/api/v1/admin/users/{userId}/unsuspend":{"post":{"operationId":"AdminController_unsuspendUser","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Unsuspend a user","tags":["Admin"]}},"/api/v1/admin/sessions":{"get":{"operationId":"AdminController_getActiveSessions","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"gameType","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get active sessions","tags":["Admin"]}},"/api/v1/admin/sessions/{sessionId}/force-close":{"post":{"operationId":"AdminController_forceEndSession","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForceEndSessionDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Force end a session","tags":["Admin"]}},"/api/v1/admin/sessions/{sessionId}/replay":{"get":{"operationId":"AdminController_getSessionReplay","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get session replay","tags":["Admin"]}},"/api/v1/admin/games/sessions":{"get":{"operationId":"AdminController_getAllSessions","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"gameType","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get all game sessions","tags":["Admin"]}},"/api/v1/admin/games/sessions/{sessionId}/cancel":{"post":{"operationId":"AdminController_cancelSession","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSessionDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Cancel a game session","tags":["Admin"]}},"/api/v1/admin/reports":{"get":{"operationId":"AdminController_getReports","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"enum":["PENDING","UNDER_REVIEW","RESOLVED","DISMISSED"],"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get reports","tags":["Admin"]}},"/api/v1/admin/reports/{reportId}/review":{"post":{"operationId":"AdminController_reviewReport","parameters":[{"name":"reportId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReportDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Review a report","tags":["Admin"]}},"/api/v1/admin/anticheat":{"get":{"operationId":"AdminController_getAntiCheatEvents","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"severity","required":false,"in":"query","schema":{"enum":["LOW","MEDIUM","HIGH","CRITICAL"],"type":"string"}},{"name":"isReviewed","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get anti-cheat events","tags":["Admin"]}},"/api/v1/admin/anticheat/{eventId}/review":{"post":{"operationId":"AdminController_reviewAntiCheatEvent","parameters":[{"name":"eventId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewAntiCheatDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Review anti-cheat event","tags":["Admin"]}},"/api/v1/admin/games":{"get":{"operationId":"AdminController_getGameConfigs","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get game configurations","tags":["Admin"]}},"/api/v1/admin/games/{gameId}":{"patch":{"operationId":"AdminController_updateGameConfig","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGameConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Update game configuration","tags":["Admin"]}},"/api/v1/admin/transactions":{"get":{"operationId":"AdminController_getTransactions","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"type","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get all transactions","tags":["Admin"]}},"/api/v1/admin/transactions/{transactionId}":{"get":{"operationId":"AdminController_getTransactionById","parameters":[{"name":"transactionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get transaction details","tags":["Admin"]}},"/api/v1/admin/transactions/{transactionId}/approve":{"post":{"operationId":"AdminController_approveTransaction","parameters":[{"name":"transactionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveTransactionDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Approve a pending transaction","tags":["Admin"]}},"/api/v1/admin/transactions/{transactionId}/reject":{"post":{"operationId":"AdminController_rejectTransaction","parameters":[{"name":"transactionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectTransactionDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Reject a pending transaction","tags":["Admin"]}},"/api/v1/admin/tournaments":{"get":{"operationId":"AdminController_getAdminTournaments","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"gameType","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get all tournaments","tags":["Admin"]}},"/api/v1/admin/tournaments/{tournamentId}/cancel":{"post":{"operationId":"AdminController_cancelTournament","parameters":[{"name":"tournamentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelTournamentDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Cancel a tournament","tags":["Admin"]}},"/api/v1/admin/tournaments/{tournamentId}/complete":{"post":{"operationId":"AdminController_completeTournament","parameters":[{"name":"tournamentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Complete a tournament","tags":["Admin"]}},"/api/v1/admin/actions":{"get":{"operationId":"AdminController_getAdminActions","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"adminId","required":false,"in":"query","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get admin action logs","tags":["Admin"]}},"/api/v1/admin/config":{"get":{"operationId":"AdminController_getAllSystemConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get all system configuration","tags":["Admin"]}},"/api/v1/admin/config/{key}":{"get":{"operationId":"AdminController_getSystemConfig","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get system configuration by key","tags":["Admin"]},"patch":{"operationId":"AdminController_updateSystemConfig","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSystemConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Update system configuration","tags":["Admin"]}},"/api/v1/admin/announcements":{"post":{"operationId":"AdminController_createAnnouncement","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnnouncementDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Create announcement","tags":["Admin"]}},"/api/v1/admin/cache/leaderboard/clear":{"post":{"operationId":"AdminController_clearLeaderboardCache","parameters":[],"responses":{"200":{"description":"Cache cleared successfully"}},"security":[{"JWT-auth":[]}],"summary":"Clear leaderboard cache","tags":["Admin"]}},"/api/v1/admin/users/search":{"get":{"operationId":"AdminController_searchUsers","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"kycStatus","required":false,"in":"query","schema":{"enum":["PENDING","VERIFIED","REJECTED"],"type":"string"}},{"name":"riskLevel","required":false,"in":"query","schema":{"enum":["LOW","MEDIUM","HIGH"],"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Search users with KYC and risk filters","tags":["Admin"]}},"/api/v1/admin/users/{id}/activity":{"get":{"operationId":"AdminController_getUserActivity","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Get user activity snapshot (logins, devices, wallet)","tags":["Admin"]}},"/api/v1/admin/stats/overview":{"get":{"operationId":"AdminController_getStatsOverview","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Platform-wide overview stats","tags":["Admin"]}},"/api/v1/admin/audit-logs":{"get":{"operationId":"AdminController_listAuditLogs","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"actor","required":false,"in":"query","schema":{"type":"string"}},{"name":"action","required":false,"in":"query","schema":{"type":"string"}},{"name":"entityType","required":false,"in":"query","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[SuperAdmin] List audit log entries","tags":["Admin"]}},"/api/v1/admin/seed-demo":{"post":{"operationId":"AdminController_seedDemo","parameters":[],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[SuperAdmin] Seed full demo data for all dashboard sections","tags":["Admin"]}},"/api/v1/admin/audit-logs/export":{"get":{"operationId":"AdminController_exportAuditLogs","parameters":[{"name":"actor","required":true,"in":"query","schema":{"type":"string"}},{"name":"action","required":true,"in":"query","schema":{"type":"string"}},{"name":"entityType","required":true,"in":"query","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[SuperAdmin] Export audit logs as CSV","tags":["Admin"]}},"/api/v1/admin/roles":{"get":{"operationId":"AdminExtrasController_listRoles","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]},"post":{"operationId":"AdminExtrasController_createRole","parameters":[],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/permissions":{"get":{"operationId":"AdminExtrasController_listPermissions","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/roles/{id}":{"patch":{"operationId":"AdminExtrasController_updateRole","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]},"delete":{"operationId":"AdminExtrasController_deleteRole","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/payouts":{"get":{"operationId":"AdminExtrasController_listPayouts","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]},"post":{"operationId":"AdminExtrasController_createManualPayout","parameters":[],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/payouts/{id}/retry":{"post":{"operationId":"AdminExtrasController_retryPayout","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/payouts/{id}/approve":{"post":{"operationId":"AdminExtrasController_approvePayout","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/disputes":{"get":{"operationId":"AdminExtrasController_listDisputes","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/tickets":{"post":{"operationId":"AdminExtrasController_createTicket","parameters":[],"responses":{"201":{"description":""}},"tags":["Admin Extras"]},"get":{"operationId":"AdminExtrasController_listTickets","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/tickets/{id}":{"get":{"operationId":"AdminExtrasController_getTicket","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/tickets/{id}/reply":{"post":{"operationId":"AdminExtrasController_replyTicket","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/tickets/{id}/escalate":{"post":{"operationId":"AdminExtrasController_escalateTicket","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/tickets/{id}/close":{"post":{"operationId":"AdminExtrasController_closeTicket","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/risk/overview":{"get":{"operationId":"AdminExtrasController_riskOverview","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/risk/alerts":{"get":{"operationId":"AdminExtrasController_riskAlerts","parameters":[{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/stats/revenue":{"get":{"operationId":"AdminExtrasController_revenueSeries","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/stats/user-growth":{"get":{"operationId":"AdminExtrasController_userGrowthSeries","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/stats/game-performance":{"get":{"operationId":"AdminExtrasController_gamePerformance","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/stats/retention":{"get":{"operationId":"AdminExtrasController_retention","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/feature-flags":{"get":{"operationId":"AdminExtrasController_listFlags","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin Extras"]},"post":{"operationId":"AdminExtrasController_createFlag","parameters":[],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/feature-flags/{key}":{"patch":{"operationId":"AdminExtrasController_updateFlag","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]},"delete":{"operationId":"AdminExtrasController_deleteFlag","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/dev/seed-notifications":{"post":{"operationId":"AdminExtrasController_seedNotifications","parameters":[],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/users/{userId}/coins":{"get":{"operationId":"AdminExtrasController_getUserCoins","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/users/{userId}/coins/history":{"get":{"operationId":"AdminExtrasController_getUserCoinHistory","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/users/{userId}/coins/credit":{"post":{"operationId":"AdminExtrasController_creditUserCoins","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/users/{userId}/coins/debit":{"post":{"operationId":"AdminExtrasController_debitUserCoins","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/admin/coins/bulk-credit":{"post":{"operationId":"AdminExtrasController_bulkCreditCoins","parameters":[],"responses":{"201":{"description":""}},"tags":["Admin Extras"]}},"/api/v1/kyc/submit":{"post":{"operationId":"KycController_submit","parameters":[{"name":"user-agent","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitKycDto"}}}},"responses":{"201":{"description":"KYC submitted"}},"security":[{"JWT-auth":[]}],"summary":"Submit KYC documents for review","tags":["KYC"]}},"/api/v1/kyc/status":{"get":{"operationId":"KycController_status","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get current KYC status for authenticated user","tags":["KYC"]}},"/api/v1/admin/kyc/pending":{"get":{"operationId":"KycController_listPending","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] List pending KYC submissions","tags":["KYC"]}},"/api/v1/admin/kyc/{id}/approve":{"post":{"operationId":"KycController_approve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"user-agent","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Approve a KYC submission","tags":["KYC"]}},"/api/v1/admin/kyc/{id}/reject":{"post":{"operationId":"KycController_reject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"user-agent","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewKycDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Reject a KYC submission","tags":["KYC"]}},"/api/v1/admin/disputes/{id}/resolve":{"post":{"operationId":"DisputeController_resolve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveDisputeDto"}}}},"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Resolve a dispute (Report)","tags":["Disputes"]}},"/api/v1/admin/reconciliation/runs":{"get":{"operationId":"ReconciliationController_runs","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] List reconciliation runs","tags":["Reconciliation"]}},"/api/v1/admin/reconciliation/run":{"post":{"operationId":"ReconciliationController_run","parameters":[],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"[Admin] Trigger a reconciliation run manually","tags":["Reconciliation"]}},"/api/v1/challenges/active":{"get":{"operationId":"DailyChallengesController_active","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get active challenges with my progress","tags":["Daily Challenges"]}},"/api/v1/challenges":{"post":{"operationId":"DailyChallengesController_create","parameters":[],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Create a new challenge (admin)","tags":["Daily Challenges"]}},"/api/v1/challenges/{id}/claim":{"post":{"operationId":"DailyChallengesController_claim","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Claim reward for completed challenge","tags":["Daily Challenges"]}},"/api/v1/game-challenges":{"post":{"operationId":"GameChallengesController_send","parameters":[],"responses":{"201":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Send a 1v1 challenge","tags":["Game Challenges"]}},"/api/v1/game-challenges/mine":{"get":{"operationId":"GameChallengesController_mine","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get my challenges (sent + received)","tags":["Game Challenges"]}},"/api/v1/game-challenges/incoming":{"get":{"operationId":"GameChallengesController_incoming","parameters":[],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Get pending challenges sent to me","tags":["Game Challenges"]}},"/api/v1/game-challenges/{id}/accept":{"patch":{"operationId":"GameChallengesController_accept","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Accept a challenge","tags":["Game Challenges"]}},"/api/v1/game-challenges/{id}/decline":{"patch":{"operationId":"GameChallengesController_decline","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"JWT-auth":[]}],"summary":"Decline a challenge","tags":["Game Challenges"]}}},"info":{"title":"Wasaa Games P2P Service","description":"Real-Time Peer-to-Peer Gaming Platform API","version":"1.0.0","contact":{}},"tags":[{"name":"Auth","description":"Authentication endpoints"},{"name":"Games","description":"Game configuration endpoints"},{"name":"Matchmaking","description":"Matchmaking queue endpoints"},{"name":"Sessions","description":"Game session endpoints"},{"name":"Wallet","description":"Wallet integration endpoints"},{"name":"Tournaments","description":"Tournament management endpoints"},{"name":"Leaderboards","description":"Leaderboard endpoints"},{"name":"Notifications","description":"Notification endpoints"},{"name":"Admin","description":"Admin moderation endpoints"}],"servers":[],"components":{"securitySchemes":{"JWT-auth":{"scheme":"bearer","bearerFormat":"JWT","type":"http","name":"Authorization","description":"Enter JWT token","in":"header"}},"schemas":{"RegisterDto":{"type":"object","properties":{"username":{"type":"string","example":"john_doe"},"password":{"type":"string","example":"Passw0rd!"},"email":{"type":"string","example":"john@example.com"},"phoneNumber":{"type":"string","example":"0712345678 or 254712345678"},"externalUserId":{"type":"string","example":"ext-user-123"}},"required":["username","password"]},"UserDto":{"type":"object","properties":{"id":{"type":"string","example":"uuid-123"},"externalUserId":{"type":"string","example":"ext-user-123"},"username":{"type":"string","example":"john_doe"},"email":{"type":"object","example":"john@example.com"},"role":{"type":"string","example":"PLAYER"}},"required":["id","externalUserId","username","role"]},"AuthResponseDto":{"type":"object","properties":{"accessToken":{"type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"refreshToken":{"type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"user":{"$ref":"#/components/schemas/UserDto"}},"required":["accessToken","refreshToken","user"]},"LoginDto":{"type":"object","properties":{"username":{"type":"string","example":"john_doe"},"externalUserId":{"type":"string","example":"ext-user-123"},"phoneNumber":{"type":"string","example":"254712345678"},"password":{"type":"string","example":"Passw0rd!"}}},"VerifyTokenDto":{"type":"object","properties":{"token":{"type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}},"required":["token"]},"RefreshTokenDto":{"type":"object","properties":{"refreshToken":{"type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}},"required":["refreshToken"]},"TokenResponseDto":{"type":"object","properties":{"accessToken":{"type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"refreshToken":{"type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}},"required":["accessToken","refreshToken"]},"UserResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"uuid-123"},"externalUserId":{"type":"string","example":"ext-user-123"},"username":{"type":"string","example":"john_doe"},"email":{"type":"string","example":"john@example.com"},"role":{"type":"string","example":"PLAYER"},"isActive":{"type":"boolean","example":true},"isBanned":{"type":"boolean","example":false},"createdAt":{"format":"date-time","type":"string","example":"2024-01-01T00:00:00.000Z"},"elo":{"type":"array"}},"required":["id","externalUserId","username","role","isActive","isBanned","createdAt","elo"]},"UpdateProfileDto":{"type":"object","properties":{"username":{"type":"string","example":"john_doe"},"displayName":{"type":"string","example":"John Doe"},"email":{"type":"string","example":"john@example.com"},"avatarUrl":{"type":"string","example":"https://example.com/avatar.jpg"},"country":{"type":"string","example":"Kenya"},"bio":{"type":"string","example":"I love playing games!"}}},"OtpSigninDto":{"type":"object","properties":{"phone_number":{"type":"string","example":"254712345678"},"country_code":{"type":"string","example":"+254"},"country":{"type":"string","example":"Kenya"},"login_type":{"type":"string","example":"phone_number"},"source":{"type":"string","example":"mobile"},"fcm_token":{"type":"string"},"app_id":{"type":"string"}},"required":["phone_number"]},"OtpSigninResponseDto":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"OTP sent successfully"},"status":{"type":"string","example":"otp_sent"},"user_id":{"type":"string","example":"user-uuid-123"},"otp_length":{"type":"number","example":6},"expiry_minutes":{"type":"number","example":10},"delivery_method":{"type":"string","example":"sms"},"masked_contact":{"type":"string","example":"****5678"}},"required":["success","message","status","user_id","otp_length","expiry_minutes","delivery_method","masked_contact"]},"OtpVerifyDto":{"type":"object","properties":{"otp":{"type":"object","example":"123456"},"user_id":{"type":"string","example":"user-uuid-123"},"source":{"type":"string","example":"mobile"}},"required":["otp","user_id"]},"OtpVerifyResponseDto":{"type":"object","properties":{"success":{"type":"boolean","example":true},"tokens":{"type":"object"},"user":{"type":"object"}},"required":["success","tokens","user"]},"ApplyReferralDto":{"type":"object","properties":{"code":{"type":"string","example":"ABCD1234"},"deviceFingerprint":{"type":"string","example":"a1b2c3d4","description":"Device fingerprint from client for self-referral detection"}},"required":["code"]},"SubscribeDto":{"type":"object","properties":{"planId":{"type":"string","example":"subscription-plan-uuid"}},"required":["planId"]},"CreateInviteDto":{"type":"object","properties":{"gameType":{"type":"string","example":"LUDO"},"stake":{"type":"number","example":50,"minimum":10,"maximum":10000},"toUserId":{"type":"string","example":"uuid-user-id","description":"Optional direct recipient user id (internal or external)"}},"required":["gameType","stake"]},"RedeemDto":{"type":"object","properties":{}},"DepositDto":{"type":"object","properties":{}},"WithdrawDto":{"type":"object","properties":{}},"CreateWalletDto":{"type":"object","properties":{}},"CreditDto":{"type":"object","properties":{}},"DebitDto":{"type":"object","properties":{}},"ClaimDto":{"type":"object","properties":{}},"MatchPlayerDto":{"type":"object","properties":{"sessionId":{"type":"string","example":"uuid-session-id"},"gameType":{"type":"string","example":"CHESS"},"stakeAmount":{"type":"number","example":50},"players":{"example":["uuid-player-1","uuid-player-2"],"type":"array","items":{"type":"string"}},"status":{"type":"string","example":"matched"}},"required":["sessionId","gameType","stakeAmount","players","status"]},"MatchFoundResponseDto":{"type":"object","properties":{"status":{"type":"string","example":"matched","enum":["queued","matched"]},"queueId":{"type":"string","example":"uuid-queue-id"},"match":{"$ref":"#/components/schemas/MatchPlayerDto"},"message":{"type":"string","example":"Searching for opponent..."},"estimatedWait":{"type":"string","example":"30-60 seconds"}},"required":["status","queueId"]},"QueueEntryDto":{"type":"object","properties":{"queueId":{"type":"string","example":"uuid-queue-id"},"gameType":{"type":"string","example":"CHESS"},"stakeAmount":{"type":"number","example":50},"region":{"type":"string","example":"GLOBAL"},"status":{"type":"string","example":"QUEUED"},"queuedAt":{"format":"date-time","type":"string","example":"2024-01-01T00:00:00.000Z"},"expiresAt":{"format":"date-time","type":"string","example":"2024-01-01T00:02:00.000Z"},"timeInQueue":{"type":"number","example":30}},"required":["queueId","gameType","stakeAmount","region","status","queuedAt","expiresAt","timeInQueue"]},"QueueStatusResponseDto":{"type":"object","properties":{"inQueue":{"type":"boolean","example":true},"queues":{"type":"array","items":{"$ref":"#/components/schemas/QueueEntryDto"}}},"required":["inQueue","queues"]},"InvitePlayerDto":{"type":"object","properties":{"inviterId":{"type":"string","example":"inviter-user-id","description":"ID of the player sending the invite"},"inviterName":{"type":"string","example":"Alice","description":"Username of the inviter (used for auto-registration)"},"playerId":{"type":"string","example":"invitee-player-id","description":"ID of the player being invited"},"playerName":{"type":"string","example":"JohnDoe","description":"Username of the player being invited (used for auto-registration)"},"gameType":{"type":"string","example":"CHESS","enum":["LUDO","CHESS","CHECKERS","DRAFTS","MANCALA","FOUR_IN_A_ROW","GOMOKU","REVERSI","DOTS_AND_BOXES","UNO","CRAZY_8","FILLER","WORD","WORD_HUNT","WORD_BITES","ANAGRAMS","TWENTY_QUESTIONS","POOL","NINE_BALL","SNOOKER","DARTS","ARCHERY","BASKETBALL","MINI_GOLF","CUP_PONG","SHUFFLEBOARD","SHOOTER","RACING","TANKS","SEA_BATTLE","KNOCKOUT","KENYA_AT_50"]},"stakeAmount":{"type":"number","example":50,"minimum":10,"maximum":10000}},"required":["inviterId","playerId","gameType","stakeAmount"]},"AcceptInviteDto":{"type":"object","properties":{"inviteId":{"type":"string","example":"uuid-invite-id"},"acceptorId":{"type":"string","example":"+254700000001","description":"External user ID of the acceptor (phone number)"}},"required":["inviteId","acceptorId"]},"SessionResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"uuid-session-id"},"gameType":{"type":"string","example":"CHESS"},"game":{"type":"object"},"players":{"type":"object"},"currentTurn":{"type":"object","example":"uuid-player-id"},"status":{"type":"string","example":"ACTIVE"},"stakeAmount":{"type":"number","example":50},"moveCount":{"type":"number","example":10},"turnNumber":{"type":"number","example":5},"gameState":{"type":"object"},"isRanked":{"type":"boolean","example":true},"isTournament":{"type":"boolean","example":false},"startedAt":{"type":"object","example":"2024-01-01T00:00:00.000Z"},"endedAt":{"type":"object","example":null},"createdAt":{"format":"date-time","type":"string","example":"2024-01-01T00:00:00.000Z"},"recentMoves":{"type":"array"}},"required":["id","gameType","game","players","currentTurn","status","stakeAmount","moveCount","turnNumber","gameState","isRanked","isTournament","startedAt","endedAt","createdAt","recentMoves"]},"ReadyDto":{"type":"object","properties":{"playerId":{"type":"string","example":"uuid-player-id","description":"Player ID (for auth-disabled mode)"},"ready":{"type":"boolean","example":true}}},"SubmitMoveDto":{"type":"object","properties":{"playerId":{"type":"string","example":"uuid-player-id","description":"Player ID (for auth-disabled mode)"},"move":{"type":"object","example":{"from":"e2","to":"e4"},"description":"Move data specific to game type"},"moveNumber":{"type":"number","example":1,"description":"Sequential move number"}},"required":["move","moveNumber"]},"MoveResponseDto":{"type":"object","properties":{"valid":{"type":"boolean","example":true},"statePatch":{"type":"object"},"newState":{"type":"object"},"nextTurn":{"type":"string","example":"uuid-player-id"},"moveNumber":{"type":"number","example":1},"moveHash":{"type":"string","example":"abc123hash"},"gameEnded":{"type":"boolean","example":false},"winner":{"type":"string","example":"uuid-winner-id"},"reason":{"type":"string","example":"checkmate"},"error":{"type":"string","example":"Invalid move"},"code":{"type":"number","example":40001}},"required":["valid"]},"ForfeitDto":{"type":"object","properties":{"playerId":{"type":"string","example":"uuid-player-id","description":"Player ID (for auth-disabled mode)"},"reason":{"type":"string","example":"Player resigned"}}},"CreateTournamentDto":{"type":"object","properties":{"name":{"type":"string","example":"Weekend Chess Championship"},"description":{"type":"string","example":"Compete for glory and prizes!"},"gameType":{"type":"string","example":"CHESS","enum":["LUDO","CHESS","CHECKERS","POOL","SNOOKER","UNO","SHOOTER","RACING","WORD"]},"format":{"type":"string","example":"SINGLE_ELIMINATION","enum":["SINGLE_ELIMINATION","DOUBLE_ELIMINATION","ROUND_ROBIN","SWISS"]},"entryFee":{"type":"number","example":100,"minimum":0},"prizePool":{"type":"number","example":5000},"maxParticipants":{"type":"number","example":32,"minimum":2,"maximum":256},"minParticipants":{"type":"number","example":4},"region":{"type":"string","example":"GLOBAL"},"registrationStart":{"type":"string","example":"2024-12-01T10:00:00Z"},"registrationEnd":{"type":"string","example":"2024-12-07T10:00:00Z"},"tournamentStart":{"type":"string","example":"2024-12-08T14:00:00Z"},"config":{"type":"object"},"rules":{"type":"object"},"prizes":{"type":"object","example":{"1":2500,"2":1500,"3":1000}}},"required":["name","gameType","entryFee","maxParticipants","registrationStart","registrationEnd","tournamentStart"]},"UpdateTournamentDto":{"type":"object","properties":{"name":{"type":"string","example":"Updated Championship Name"},"description":{"type":"string"},"entryFee":{"type":"number"},"prizePool":{"type":"number"},"maxParticipants":{"type":"number"},"registrationStart":{"type":"string"},"registrationEnd":{"type":"string"},"tournamentStart":{"type":"string"},"config":{"type":"object"},"rules":{"type":"object"},"prizes":{"type":"object"}}},"BanUserDto":{"type":"object","properties":{"reason":{"type":"string","example":"Cheating detected"},"duration":{"type":"number","example":86400,"description":"Ban duration in seconds (null for permanent)"}},"required":["reason"]},"SuspendUserDto":{"type":"object","properties":{"reason":{"type":"string","example":"Suspicious activity"},"duration":{"type":"number","example":86400,"description":"Suspension duration in seconds"}},"required":["reason"]},"ForceEndSessionDto":{"type":"object","properties":{"reason":{"type":"string","example":"Suspicious activity detected"},"refundPlayers":{"type":"boolean","example":true,"description":"Whether to refund both players"}},"required":["reason"]},"CancelSessionDto":{"type":"object","properties":{"reason":{"type":"string","example":"Session cancelled by admin"},"refundPlayers":{"type":"boolean","example":true}},"required":["reason"]},"ReviewReportDto":{"type":"object","properties":{"status":{"type":"string","example":"RESOLVED","enum":["PENDING","UNDER_REVIEW","RESOLVED","DISMISSED"]},"resolution":{"type":"string","example":"Warning issued to the player"},"banUser":{"type":"boolean","example":false},"banDuration":{"type":"number","example":86400}},"required":["status","resolution"]},"ReviewAntiCheatDto":{"type":"object","properties":{"action":{"type":"string","example":"Warning issued"},"banUser":{"type":"boolean","example":true},"banDuration":{"type":"number","example":604800}},"required":["action"]},"UpdateGameConfigDto":{"type":"object","properties":{"name":{"type":"string","example":"Chess"},"description":{"type":"string","example":"Classic chess game"},"isActive":{"type":"boolean","example":true},"minStake":{"type":"number","example":10},"maxStake":{"type":"number","example":10000},"turnTimeout":{"type":"number","example":60},"rules":{"type":"object"}}},"ApproveTransactionDto":{"type":"object","properties":{"notes":{"type":"string","example":"Verified user identity"}}},"RejectTransactionDto":{"type":"object","properties":{"reason":{"type":"string","example":"Failed identity verification"}},"required":["reason"]},"CancelTournamentDto":{"type":"object","properties":{"reason":{"type":"string","example":"Insufficient participants"},"refundEntries":{"type":"boolean","example":true}},"required":["reason"]},"UpdateSystemConfigDto":{"type":"object","properties":{"value":{"type":"object","example":{"value":true}}},"required":["value"]},"CreateAnnouncementDto":{"type":"object","properties":{"title":{"type":"string","example":"System Maintenance"},"message":{"type":"string","example":"Scheduled maintenance on Saturday"},"type":{"type":"string","example":"info"},"broadcast":{"type":"boolean","example":true}},"required":["title","message"]},"SubmitKycDto":{"type":"object","properties":{"idType":{"type":"string","enum":["NATIONAL_ID","PASSPORT","DRIVER_LICENSE"],"example":"NATIONAL_ID"},"idNumber":{"type":"string","example":"12345678"},"firstName":{"type":"string","example":"Jane"},"lastName":{"type":"string","example":"Doe"},"dob":{"type":"string","example":"1995-06-15","description":"ISO date string"},"frontImageUrl":{"type":"string","example":"https://cdn.example.com/kyc/front.jpg"},"backImageUrl":{"type":"string","example":"https://cdn.example.com/kyc/back.jpg"},"selfieUrl":{"type":"string","example":"https://cdn.example.com/kyc/selfie.jpg"}},"required":["idType","idNumber","firstName","lastName","dob","frontImageUrl","selfieUrl"]},"ReviewKycDto":{"type":"object","properties":{"rejectionReason":{"type":"string","example":"Document unclear","description":"Required when rejecting"}}},"ResolveDisputeDto":{"type":"object","properties":{"resolution":{"type":"string","enum":["UPHELD","REJECTED","PARTIAL"],"example":"UPHELD"},"refundAmount":{"type":"number","example":500,"description":"Refund amount in KES (required for UPHELD/PARTIAL where refund applies)"},"decisionNotes":{"type":"string","example":"Evidence supports the complainant; refunding full stake."}},"required":["resolution","decisionNotes"]}}}}