A clean and production-ready Node.js wrapper for the kickbans.app API.
Fetch recent moderation actions, user profiles, user history, global stats, and graph data from one package.
- π Simple function-based API for
kickbans.app - π Full TypeScript support with rich IntelliSense
- π§ VS Code-friendly hints: autocomplete, parameter help, return types
- π¦ Dual module support: CommonJS (
require) and ESM (import) - π‘οΈ Built-in errors for HTTP failures and request timeouts
- β‘ Zero dependencies, uses native
fetch
npm install kickbansconst kickbans = require("kickbans");
kickbans.getRecentActions().then((actions) => {
console.log(actions[0]);
});import kickbans from "kickbans";
const stats = await kickbans.getStats();
const overview = await kickbans.getOverviewStats();
const profile = await kickbans.getUserProfileStats("seoyoon1o1");
console.log(stats);
console.log(overview.newVerifiedLast30Days?.stat);
console.log(profile.longestBan, profile.lastBanAgo);Calls GET /actions/recent.
CommonJS:
const kickbans = require("kickbans");
(async () => {
const actions = await kickbans.getRecentActions();
console.log(actions[0]);
})();ESM:
import kickbans from "kickbans";
const actions = await kickbans.getRecentActions();
console.log(actions[0]);Calls GET /users/:usernameOrSlug.
CommonJS:
const kickbans = require("kickbans");
(async () => {
const user = await kickbans.getUser("seoyoon1o1");
console.log(user.user.username, user.actions.length);
})();ESM:
import kickbans from "kickbans";
const user = await kickbans.getUser("seoyoon1o1");
console.log(user.user.username, user.actions.length);Calls GET /users?query=...&limit=....
queryis requiredoptions.limitis optional but must be an integer between1and10
CommonJS:
const kickbans = require("kickbans");
(async () => {
const users = await kickbans.searchUsers("seo", { limit: 5 });
console.log(users.map((u) => u.username));
})();ESM:
import kickbans from "kickbans";
const users = await kickbans.searchUsers("seo", { limit: 5 });
console.log(users.map((u) => u.username));Calls GET /stats.
CommonJS:
const kickbans = require("kickbans");
(async () => {
const stats = await kickbans.getStats();
console.log(stats);
})();ESM:
import kickbans from "kickbans";
const stats = await kickbans.getStats();
console.log(stats);Calls GET /actions/graph/all.
CommonJS:
const kickbans = require("kickbans");
(async () => {
const graph = await kickbans.getActionGraphAll();
console.log(graph[0], graph[graph.length - 1]);
})();ESM:
import kickbans from "kickbans";
const graph = await kickbans.getActionGraphAll();
console.log(graph[0], graph[graph.length - 1]);Returns homepage-style overview cards using /stats:
totalVerifiednewVerifiedLast30Days
CommonJS:
const kickbans = require("kickbans");
(async () => {
const overview = await kickbans.getOverviewStats();
console.log(overview.totalVerified?.stat, overview.newVerifiedLast30Days?.stat);
})();ESM:
import kickbans from "kickbans";
const overview = await kickbans.getOverviewStats();
console.log(overview.totalVerified?.stat, overview.newVerifiedLast30Days?.stat);Returns computed global values from /actions/graph/all:
totalBanstotalUnbansaverageDailyBansaverageDailyUnbansnetChange
CommonJS:
const kickbans = require("kickbans");
(async () => {
const globalStats = await kickbans.getGlobalActivityStats();
console.log(globalStats.totalBans, globalStats.totalUnbans, globalStats.netChange);
})();ESM:
import kickbans from "kickbans";
const globalStats = await kickbans.getGlobalActivityStats();
console.log(globalStats.totalBans, globalStats.totalUnbans, globalStats.netChange);Returns computed profile metrics from /users/:usernameOrSlug:
totalActionslongestBan(example:6 days)lastBanAgo(example:1 day ago)isCurrentlyBanned
CommonJS:
const kickbans = require("kickbans");
(async () => {
const profile = await kickbans.getUserProfileStats("seoyoon1o1");
console.log(profile.totalActions, profile.longestBan, profile.lastBanAgo);
})();ESM:
import kickbans from "kickbans";
const profile = await kickbans.getUserProfileStats("seoyoon1o1");
console.log(profile.totalActions, profile.longestBan, profile.lastBanAgo);Thrown when API responds with non-2xx status.
statusdataurl
Thrown when a request exceeds timeout.
timeoutMsurl
- Node.js
>=18.0.0
MIT Β© 2026