docs.catquery.com
← DocsBase URL: https://api.catquery.com
Endpoints with a permission require authentication and that permission. Public endpoints require neither.
GET /admin/audit?category=http
Authorization: Bearer <your-api-token>
{
"generatedAt": "2026-08-18T12:00:00.000Z",
"from": "2026-08-17T12:00:00.000Z",
"to": "2026-08-18T12:00:00.000Z",
"summary": {
"totalEvents": 0,
"requests": 0,
"uniqueIps": 0,
"clientErrors": 0,
"serverErrors": 0,
"rateLimited": 0,
"bansIssued": 0,
"firehoseOpened": 0,
"firehoseRejected": 0
},
"breakdowns": {
"services": [],
"countries": [],
"statuses": [],
"reasons": [],
"eventTypes": []
},
"events": [],
"eventPage": {
"nextCursor": null,
"pageSize": 25
}
}
GET /admin/bans
Authorization: Bearer <your-api-token>
{
"total": 1,
"bans": [
{
"id": "42",
"bannedAt": "2026-08-21T12:00:00.000Z",
"channelUserId": "123",
"channelName": "somechannel",
"targetUserId": "456",
"targetUsername": "badactor",
"reason": "Spam",
"durationSeconds": null,
"source": "crossban"
}
],
"nextCursor": null,
"pageSize": 50
}
POST /admin/channel/setting
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"setting": "commands_allowed",
"value": 1
}
{
"success": true,
"userId": "123456789",
"setting": "commands_allowed",
"value": 1
}
POST /admin/crossban
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"reason": "chatter evasion"
}
{
"success": true,
"userId": "123456789",
"action": "ban",
"result": {
"totalChannels": 50,
"successCount": 47,
"alreadyBannedCount": 2,
"notBannedCount": 0,
"errorCount": 1
}
}
POST /admin/crossban
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"action": "unban"
}
{
"success": true,
"userId": "123456789",
"action": "unban",
"result": {
"totalChannels": 50,
"successCount": 47,
"alreadyBannedCount": 0,
"notBannedCount": 3,
"errorCount": 0
}
}
DELETE /admin/ipBans?ip=192.168.1.1
Authorization: Bearer <your-api-token>
{
"success": true,
"ip": "192.168.1.1"
}
GET /admin/ipBans?search=192.168.1.1
Authorization: Bearer <your-api-token>
{
"total": 1,
"bans": [
{
"ip": "192.168.1.1",
"permanent": false,
"iteration": 2,
"bannedAt": "2026-08-20T12:00:00.000Z",
"expiresAt": "2026-08-20T12:05:00.000Z"
}
],
"nextCursor": null,
"pageSize": 100
}
PATCH /admin/ipBans
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"ip": "192.168.1.1",
"durationMinutes": 30
}
{
"success": true,
"ip": "192.168.1.1",
"iteration": 2,
"expiresAt": "2026-08-20T12:30:00.000Z"
}
POST /admin/ipBans
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"ip": "192.168.1.1"
}
{
"success": true,
"ip": "192.168.1.1",
"created": true
}
GET /admin/live-chatter-candidates?channel=examplechannel
Authorization: Bearer <your-api-token>
{
"channel": "examplechannel",
"messagesScanned": 1000,
"uniqueChatters": 250,
"candidates": [
{
"userId": "123456789",
"username": "livechatter",
"channelUrl": "https://www.twitch.tv/livechatter"
}
],
"usernames": "livechatter"
}
POST /admin/monitor
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"reason": "Discord Scammer Bot"
}
{
"success": true,
"userId": "123456789",
"reason": "Discord Scammer Bot"
}
POST /admin/monitor
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"reason": "Discord Scammer Bot",
"crossban": true
}
{
"success": true,
"userId": "123456789",
"reason": "Discord Scammer Bot",
"crossban": {
"totalChannels": 50,
"successCount": 47,
"alreadyBannedCount": 2,
"notBannedCount": 0,
"errorCount": 1
}
}
POST /admin/monitor
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"action": "unmonitor"
}
{
"success": true,
"userId": "123456789",
"action": "unmonitor"
}
POST /admin/monitor/bulk
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"usernames": "bot1,bot2,bot3",
"reason": "Mass follow bot"
}
{
"success": true,
"requested": 3,
"monitored": 3,
"notFound": [],
"lookupIncomplete": false
}
DELETE /admin/rateLimits?apiKeyId=42
Authorization: Bearer <your-api-token>
{
"success": true,
"apiKeyId": 42
}
DELETE /admin/rateLimits?sessionId=9
Authorization: Bearer <your-api-token>
{
"success": true,
"sessionId": 9
}
DELETE /admin/rateLimits?userId=123456789
Authorization: Bearer <your-api-token>
{
"success": true,
"userId": "123456789"
}
POST /admin/rateLimits
Authorization: Bearer <your-api-token>
Content-Type: application/json
{"apiKeyId":42,"maxRequests":60}
{
"success": true,
"apiKeyId": 42,
"maxRequests": 60
}
POST /admin/rateLimits
Authorization: Bearer <your-api-token>
Content-Type: application/json
{"sessionId":9,"maxRequests":null}
{
"success": true,
"sessionId": 9,
"maxRequests": null
}
POST /admin/rateLimits
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"maxRequests": 500
}
{
"success": true,
"userId": "123456789",
"maxRequests": 500
}
POST /admin/rateLimits
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"maxRequests": null
}
{
"success": true,
"userId": "123456789",
"maxRequests": null
}
GET /admin/user?id=123456789
Authorization: Bearer <your-api-token>
{
"id": "123456789",
"username": "someuser",
"isSuperuser": false,
"isBanned": false,
"names": [],
"channel": null,
"monitored": null,
"apiKeys": [],
"sessions": [],
"rateLimit": "default"
}
POST /admin/user/ban
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"userId": "123456789",
"isBanned": false
}
{
"success": true,
"userId": "123456789",
"isBanned": false
}
GET /admin/users
Authorization: Bearer <your-api-token>
{
"users": [
{
"id": "123456789",
"username": "someuser",
"isSuperuser": false,
"isBanned": false,
"nameCount": 3,
"channelType": "permanent",
"joinEnabled": true,
"joinFailed": false,
"monitored": false
}
],
"total": 1,
"nextCursor": null,
"pageSize": 50
}
DELETE /apiKeys?id=42
Authorization: Bearer <your-api-token>
{
"success": true,
"revokedId": 42
}
GET /apiKeys?all=true
Authorization: Bearer <your-api-token>
{
"apiKeys": []
}
GET /apiKeys
Authorization: Bearer <your-api-token>
{
"apiKeys": [
{
"id": 42,
"name": "My integration",
"userId": "123456789",
"username": "someuser",
"level": 1,
"rateLimit": 60,
"rateLimitOverride": "default",
"rateLimitSource": "user",
"createdAt": "2026-09-08T12:00:00.000Z",
"lastUsedAt": null
}
]
}
POST /apiKeys
Authorization: Bearer <your-api-token>
Content-Type: application/json
{"name":"My integration"}
{
"id": 42,
"name": "My integration",
"apiKey": "3f1c...9e2a (64 hex characters)",
"createdAt": "2026-09-08T12:00:00.000Z"
}
GET /channel
Authorization: Bearer <your-api-token>
{
"channel": {
"settings": {
"commands_allowed": true,
"moderate": false,
"crossban": false
},
"defaults": {
"commands_allowed": true,
"moderate": false,
"crossban": false
}
}
}
GET /channel
Authorization: Bearer <your-api-token>
{
"channel": null
}
POST /channel/setting
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"setting": "commands_allowed",
"value": 1
}
{
"success": true,
"setting": "commands_allowed",
"value": 1
}
GET /eventBadges
{
"badges": [
{
"id": "ditto",
"name": "Ditto",
"streamdatabaseUrl": "https://www.streamdatabase.com/twitch/global-badges/ditto/1",
"imageUrl": "https://static-cdn.jtvnw.net/badges/v1/abc123/3",
"startAt": "2026-01-01T00:00:00.000Z",
"endAt": "2026-12-31T23:59:59.000Z",
"free": true
}
]
}
GET /health
{
"status": "healthy",
"services": {
"api": "healthy",
"chat-processor": "healthy",
"chat-coordinator": "healthy",
"chat-workers": "healthy",
"firehose": "healthy",
"streams": "healthy",
"redirects": "healthy",
"proxy": "healthy"
},
"dependencies": {
"database": "healthy",
"nats": "healthy",
"redis": "healthy"
},
"uptime": "2h 34m",
"memory": "156 MB",
"cpu": "2.5%",
"channelsJoined": 42,
"firehoseClients": 3,
"activeStreams": 2,
"proxiedRequests": 1042,
"msgsPerMin": 1234,
"sessionMessages": 50000,
"commandsExecuted": 312,
"bansIssued": 7,
"totalUsers": 280000,
"permanentChannels": 280000,
"temporaryChannels": 0,
"monitoredUsers": 12,
"liveChannels": 12,
"shards": [
{
"index": 0,
"joinedChannels": 42,
"wantedChannels": 42,
"desync": 0,
"messageCount": 18500,
"reconnectCount": 0,
"failedJoinCount": 0
}
],
"workers": [
{
"workerId": "chat-worker-1",
"uptimeMs": 9240000,
"memoryMb": 156,
"cpuPercent": 2.5,
"assigned": 42,
"joined": 42,
"retrying": 0,
"joinsFailed": 0,
"reconnectCount": 0,
"heartbeatStatus": "healthy",
"shards": [
{
"shardIndex": 0,
"joinedChannels": 42,
"wantedChannels": 42,
"desync": 0,
"messageCount": 18500,
"reconnectCount": 0,
"failedJoinCount": 0
}
]
}
]
}
GET /health
{
"status": "down",
"services": {
"api": "healthy",
"chat-processor": "down",
"chat-coordinator": "healthy",
"chat-workers": "healthy",
"firehose": "healthy",
"streams": "healthy",
"redirects": "healthy",
"proxy": "healthy"
},
"dependencies": {
"database": "healthy",
"nats": "healthy",
"redis": "healthy"
},
"uptime": "N/A",
"memory": "N/A",
"cpu": "N/A",
"channelsJoined": 42,
"firehoseClients": 3,
"activeStreams": 2,
"proxiedRequests": 1042,
"msgsPerMin": 0,
"sessionMessages": 0,
"commandsExecuted": 0,
"bansIssued": 0,
"totalUsers": 280000,
"permanentChannels": 280000,
"temporaryChannels": 0,
"monitoredUsers": 12,
"liveChannels": 12,
"shards": [
{
"index": 0,
"joinedChannels": 42,
"wantedChannels": 42,
"desync": 0,
"messageCount": 18500,
"reconnectCount": 0,
"failedJoinCount": 0
}
],
"workers": [
{
"workerId": "chat-worker-1",
"uptimeMs": 9240000,
"memoryMb": 156,
"cpuPercent": 2.5,
"assigned": 42,
"joined": 42,
"retrying": 0,
"joinsFailed": 0,
"reconnectCount": 0,
"heartbeatStatus": "healthy",
"shards": [
{
"shardIndex": 0,
"joinedChannels": 42,
"wantedChannels": 42,
"desync": 0,
"messageCount": 18500,
"reconnectCount": 0,
"failedJoinCount": 0
}
]
}
]
}
GET /joinedChannels?cursor=previous_channel
{
"channels": [
"channel_one",
"channel_two"
],
"nextCursor": "channel_two",
"pageSize": 5000
}
DELETE /proxy/urls
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"url": "https://example.com"
}
{
"success": true
}
GET /proxy/urls?all=true
Authorization: Bearer <your-api-token>
{
"urls": []
}
GET /proxy/urls
Authorization: Bearer <your-api-token>
{
"urls": [
{
"origin": "https://example.com",
"createdAt": "2026-01-01T00:00:00.000Z"
}
],
"nextCursor": null,
"pageSize": 50
}
POST /proxy/urls
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"url": "https://example.com/some/page"
}
{
"proxyUrl": {
"origin": "https://example.com",
"createdAt": "2026-01-01T00:00:00.000Z"
}
}
POST /reboot
Authorization: Bearer <your-api-token>
{
"status": "rebooting",
"message": "VM reboot initiated"
}
POST /reboot
{
"error": "Unauthorized"
}
DELETE /redirects
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"slug": "my-link"
}
{
"success": true
}
GET /redirects?all=true
Authorization: Bearer <your-api-token>
{
"redirects": []
}
GET /redirects?cursor=my-link
Authorization: Bearer <your-api-token>
{
"redirects": [
{
"slug": "my-link",
"url": "https://r.example.com/my-link",
"targetUrl": "https://example.com",
"createdAt": "2026-01-01T00:00:00.000Z"
}
],
"nextCursor": null,
"pageSize": 50
}
POST /redirects
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"url": "https://example.com"
}
{
"redirect": {
"slug": "a1b2c3d4",
"url": "https://r.example.com/a1b2c3d4",
"targetUrl": "https://example.com",
"createdAt": "2025-01-01T00:00:00.000Z"
}
}
POST /redirects
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"url": "https://example.com",
"slug": "my-link"
}
{
"redirect": {
"slug": "my-link",
"url": "https://r.example.com/my-link",
"targetUrl": "https://example.com",
"createdAt": "2025-01-01T00:00:00.000Z"
}
}
POST /redirects
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"url": "https://example.com"
}
{
"redirect": {
"slug": "a1b2c3d4",
"url": "https://r.example.com/a1b2c3d4",
"targetUrl": "https://example.com",
"createdAt": "2025-01-01T00:00:00.000Z"
}
}
POST /restart
Authorization: Bearer <your-api-token>
{
"status": "restarting",
"message": "Chat fleet restart initiated"
}
POST /restart?service=chat-worker-3
Authorization: Bearer <your-api-token>
{
"status": "restarting",
"message": "chat-worker-3 restart initiated"
}
POST /restart
Authorization: Bearer <your-api-token>
{
"error": "Chat fleet unreachable"
}
DELETE /sessions?id=42
Authorization: Bearer <your-api-token>
{
"success": true,
"revokedId": 42
}
GET /sessions?all=true
Authorization: Bearer <your-api-token>
{
"sessions": []
}
GET /sessions
Authorization: Bearer <your-api-token>
{
"sessions": [
{
"id": 42,
"userId": "123456789",
"username": "someuser",
"level": 1,
"rateLimit": 60,
"rateLimitOverride": "default",
"rateLimitSource": "user",
"createdAt": "2026-09-08T12:00:00.000Z",
"lastUsedAt": null,
"expiresAt": "2026-09-15T12:00:00.000Z",
"userAgent": "Mozilla/5.0",
"createdIp": "203.0.113.1",
"isCurrent": true
}
]
}
GET /stream
Authorization: Bearer <your-api-token>
{
"stream": null,
"refreshedAt": "2026-01-01T00:00:00.000Z"
}
POST /stream/action
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"action": "start"
}
{
"success": true,
"action": "start",
"video": "myvideo-abc123"
}
DELETE /streamKey
Authorization: Bearer <your-api-token>
{
"success": true
}
DELETE /streamKey
Authorization: Bearer <your-api-token>
{
"error": "No stream key found."
}
POST /streamKey
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"streamKey": "live_abc123..."
}
{
"success": true
}
PUT /streamKey
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"streamKey": "live_xyz789..."
}
{
"success": true
}
PUT /streamKey
Authorization: Bearer <your-api-token>
Content-Type: application/json
{
"streamKey": "live_xyz789..."
}
{
"error": "No stream key found. Use POST to create one."
}
GET /user?id=123456789
{
"id": "123456789",
"login": "farty",
"createdAt": "2011-03-16T17:06:00Z",
"knownNameCount": 2
}
GET /user?name=farty
{
"id": "123456789",
"login": "farty",
"createdAt": "2011-03-16T17:06:00Z",
"knownNameCount": 0
}
GET /user
{
"error": "id or name parameter is required"
}
GET /user/live?id=123456789
{
"live": true
}
GET /user/live?name=testuser
{
"live": false
}
GET /user/live
{
"error": "id or name parameter is required"
}
GET /user/missingEventBadges?name=farty
{
"badges": [
{
"id": "ditto",
"name": "Ditto",
"streamdatabaseUrl": "https://www.streamdatabase.com/twitch/global-badges/ditto/1",
"imageUrl": "https://static-cdn.jtvnw.net/badges/v1/abc123/3",
"startAt": "2026-01-01T00:00:00.000Z",
"endAt": "2026-12-31T23:59:59.000Z",
"free": true
}
]
}
GET /user/monitored?id=123456789
{
"monitored": true,
"reason": "Discord Scammer Bot"
}
GET /user/monitored?name=testuser
{
"monitored": false,
"reason": null
}
GET /user/monitored
{
"error": "id or name parameter is required"
}
GET /user/names?id=123456789
{
"names": [
{
"id": "1",
"user_id": "123456789",
"name": "oldusername",
"first_timestamp": "2024-01-01T00:00:00.000Z",
"last_timestamp": "2025-11-22T10:00:00.000Z"
}
]
}
GET /user/names?name=farty
{
"names": []
}
GET /user/names
{
"error": "id or name parameter is required"
}
POST /users/live
Content-Type: application/json
{
"ids": [
"123456789"
],
"names": [
"catquery"
]
}
{
"users": [
{
"id": "123456789",
"login": "catquery",
"live": false,
"stream": null
}
],
"notFound": {
"ids": [],
"names": []
}
}