{"openapi":"3.0.0","info":{"title":"Simmer API","description":"Checks roblox group membership against a flagged database and RAB logs.","version":"1.0.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{}},"servers":[{"url":"https://api.simmer.icu/","description":"API server (99.9% uptime)"}],"tags":[{"name":"User Checking","description":"Check users and group memberships"},{"name":"RAB","description":"Check Roblox users against RAB studio activity logs"},{"name":"Miscellaneous","description":"Other uncategorized endpoints"}],"externalDocs":{"url":"https://discord.com/invite/tgp","description":"TGP Discord"},"paths":{"/checkuser/{id}":{"get":{"operationId":"getCheckuserById","summary":"Check a single user","description":"Check if a user exists and retrieve their group memberships or group count","tags":["User Checking"],"security":[{"xApiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"User ID to check","schema":{"type":"string"}}],"responses":{"200":{"description":"User found successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"userId":{"type":"string","example":"123456789"},"username":{"type":"string","example":"JohnDoe"},"groupCount":{"type":"number","example":3,"description":"Only included if canViewGroupId is false"},"lastSeen":{"type":"string","format":"date-time"}}}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Invalid API key"}}}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"User not found"}}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Rate limit exceeded: 1000 requests per minute"}}}}}}}}},"/checkusers":{"post":{"parameters":[],"operationId":"postCheckusers","summary":"Check multiple users","description":"Batch check multiple users and retrieve their group memberships or group counts","tags":["User Checking"],"security":[{"xApiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Batch check completed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"total":{"type":"number","example":5,"description":"Total number of user IDs checked"},"found":{"type":"number","example":3,"description":"Number of users found"},"notFound":{"type":"number","example":2,"description":"Number of users not found"},"users":{"type":"array","items":{"type":"object","properties":{"success":{"type":"boolean"},"userId":{"type":"string","example":"123456789"},"username":{"type":"string","example":"JohnDoe"},"groupCount":{"type":"number","example":3,"description":"Only included if canViewGroupId is false"},"lastSeen":{"type":"string","format":"date-time"},"found":{"type":"boolean"}}}}}}}}},"400":{"description":"Bad Request - Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"userIds must be an array of strings or ints"}}}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Invalid API key"}}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Rate limit exceeded or batch size too large"}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"description":"Array of user IDs to check (strings or numbers)","examples":[["123456","789012"],[123456,789012]],"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["userIds"]}},"multipart/form-data":{"schema":{"type":"object","properties":{"userIds":{"description":"Array of user IDs to check (strings or numbers)","examples":[["123456","789012"],[123456,789012]],"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["userIds"]}},"text/plain":{"schema":{"type":"object","properties":{"userIds":{"description":"Array of user IDs to check (strings or numbers)","examples":[["123456","789012"],[123456,789012]],"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["userIds"]}}}}}},"/v2/checkuser/{id}":{"get":{"operationId":"getV2CheckuserById","summary":"Check a single user","description":"Check if a user exists and retrieve their group memberships, group counts, and group types.","tags":["User Checking"],"security":[{"xApiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"User ID to check","schema":{"type":"string"}}],"responses":{"200":{"description":"User found successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"userId":{"type":"string","example":"123456789"},"username":{"type":"string","example":"JohnDoe"},"groupCount":{"type":"number","example":3},"groupTypes":{"type":"object","description":"Breakdown of the groups by their type (keys are the group type names)","additionalProperties":{"type":"object","properties":{"count":{"type":"number","example":2}}},"example":{"Condo Hosting":{"count":2},"NSFW Clothing":{"count":1}}},"lastSeen":{"type":"string","format":"date-time"}}}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Invalid API key"}}}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"User not found"}}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Rate limit exceeded: 1000 requests per minute"}}}}}}}}},"/v2/checkusers":{"post":{"parameters":[],"operationId":"postV2Checkusers","summary":"Check multiple users","description":"Batch check multiple users and retrieve group counts, types, and memberships.","tags":["User Checking"],"security":[{"xApiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Batch check completed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"total":{"type":"number","example":5},"found":{"type":"number","example":3},"notFound":{"type":"number","example":2},"users":{"type":"array","items":{"type":"object","properties":{"success":{"type":"boolean"},"found":{"type":"boolean"},"userId":{"type":"string","example":"123456789"},"username":{"type":"string","example":"JohnDoe"},"groupCount":{"type":"number","example":3},"groupTypes":{"type":"object","additionalProperties":{"type":"object","properties":{"count":{"type":"number","example":1}}},"example":{"Condo Hosting":{"count":2}}},"lastSeen":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Bad Request - Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"userIds must be an array of strings or ints"}}}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Invalid API key"}}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Rate limit exceeded or batch size too large"}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userIds":{"description":"Array of user IDs to check (strings or numbers)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["userIds"]}},"multipart/form-data":{"schema":{"type":"object","properties":{"userIds":{"description":"Array of user IDs to check (strings or numbers)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["userIds"]}},"text/plain":{"schema":{"type":"object","properties":{"userIds":{"description":"Array of user IDs to check (strings or numbers)","type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["userIds"]}}}}}},"/checkuser/rab/{id}":{"get":{"operationId":"getCheckuserRabById","summary":"Check a single user against RAB","description":"Check if a user exists in the RAB studio activity database and retrieve their session, message and playtime stats.","tags":["RAB"],"security":[{"xApiKey":[]},{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Roblox user ID to check","schema":{"type":"string"}}],"responses":{"200":{"description":"RAB check completed successfully. Users not found in the RAB database return flagType 0.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"number","example":123456789},"username":{"type":"string","example":"JohnDoe"},"flagType":{"type":"number","example":2,"description":"0 = not found in RAB database, 2 = detected"},"confidence":{"type":"number","example":1},"reasons":{"type":"object","description":"Evidence grouped by category","additionalProperties":{"type":"object","properties":{"message":{"type":"string","example":"User has joined 12 studio sessions"},"confidence":{"type":"number","example":1},"evidence":{"type":"string","nullable":true,"example":null}}}},"stats":{"type":"object","properties":{"totalSessions":{"type":"number","example":12},"messages":{"type":"number","example":87},"totalPlaytime":{"type":"string","example":"3d 4h 12m"},"totalLeaves":{"type":"number","example":7},"totalJoins":{"type":"number","example":5},"firstSeen":{"type":"string","format":"date-time","nullable":true},"lastSeen":{"type":"string","format":"date-time","nullable":true}}},"message":{"type":"string","example":"User detected in RAB database"},"engineVersion":{"type":"string","example":"1.0"},"isReportable":{"type":"boolean","example":false},"processed":{"type":"boolean","example":true},"lastUpdated":{"type":"number","example":1731000000}}}}}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Invalid API key"}}}}}},"403":{"description":"Forbidden - API key lacks the canCheckUser permission","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"API key does not have permission to check individual users"}}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Rate limit exceeded: 1000 requests per minute"}}}}}}}}},"/checkuser/rab/batch":{"post":{"parameters":[],"operationId":"postCheckuserRabBatch","summary":"Check multiple users against RAB","description":"Batch check multiple users against the RAB studio activity database. Results are keyed by user ID and each entry uses the same shape as the data object returned by /checkuser/rab/{id}.","tags":["RAB"],"security":[{"xApiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Batch RAB check completed successfully. Users not found in the RAB database return flagType 0.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","description":"Map of user ID to RAB result","additionalProperties":{"type":"object","properties":{"id":{"type":"number","example":123456789},"username":{"type":"string","example":"JohnDoe"},"flagType":{"type":"number","example":2,"description":"0 = not found in RAB database, 2 = detected"},"confidence":{"type":"number","example":1},"reasons":{"type":"object","description":"Evidence grouped by category","additionalProperties":{"type":"object","properties":{"message":{"type":"string","example":"User has joined 12 studio sessions"},"confidence":{"type":"number","example":1},"evidence":{"type":"string","nullable":true,"example":null}}}},"stats":{"type":"object","properties":{"totalSessions":{"type":"number","example":12},"messages":{"type":"number","example":87},"totalPlaytime":{"type":"string","example":"3d 4h 12m"},"totalLeaves":{"type":"number","example":7},"totalJoins":{"type":"number","example":5},"firstSeen":{"type":"string","format":"date-time","nullable":true},"lastSeen":{"type":"string","format":"date-time","nullable":true}}},"message":{"type":"string","example":"User detected in RAB database"},"engineVersion":{"type":"string","example":"1.0"},"isReportable":{"type":"boolean","example":false},"processed":{"type":"boolean","example":true},"lastUpdated":{"type":"number","example":1731000000}}},"example":{"123456789":{"id":123456789,"username":"JohnDoe","flagType":2,"confidence":1,"reasons":{"Session Joins":{"message":"User has joined 12 studio sessions","confidence":1,"evidence":null},"Messages":{"message":"User has sent 87 messages across 12 sessions","confidence":1,"evidence":"contact support@simmer.icu for evidence"},"Playtime":{"message":"User has 3d 4h 12m total playtime in studio files","confidence":1,"evidence":null}},"stats":{"totalSessions":12,"messages":87,"totalPlaytime":"3d 4h 12m","totalLeaves":7,"totalJoins":5,"firstSeen":"2025-01-15T10:30:00.000Z","lastSeen":"2025-02-20T18:45:00.000Z"},"message":"User detected in RAB database","engineVersion":"1.0","isReportable":false,"processed":true,"lastUpdated":1731000000}}}}}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Invalid API key"}}}}}},"403":{"description":"Forbidden - API key lacks the canCheckUsers permission","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"API key does not have permission to check multiple users"}}}}}},"429":{"description":"Rate limit exceeded or batch size too large","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"message":{"type":"string","example":"Rate limit exceeded: 1000 requests per minute"}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["ids"],"additionalProperties":false}},"multipart/form-data":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["ids"],"additionalProperties":false}},"text/plain":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["ids"],"additionalProperties":false}}}}}}}}