Your stream.
Their record.
Use public, confirmed Kickback stats in your overlays, bots, and community tools. Read-only. No sign-in or API key. This is accumulated player history, not live match telemetry.
One endpoint. Every public player.
GET https://kickbackstats.com/api/v1/players.json
Open the JSON feed ↗. The response contains a players array. Find players by their 17-digit Steam ID string; names can change. This v1 endpoint returns the full snapshot: player selection, searching, and mode selection happen in your code. Query parameters do not filter it.
Each player has id, name, totals, weapons, maps, and modes. Top-level stats combine game modes. modes.ffa, modes.defuse, and modes.explore each contain their own totals, weapons, and maps.
JavaScript / browser overlays
The optional helper downloads the snapshot and selects one player locally. It shares concurrent requests and caches successful fetches for one minute. Use this inside your overlay's JavaScript module:
import { getPlayer } from
"https://kickbackstats.com/api/v1/client.js";
const result = await getPlayer("YOUR_17_DIGIT_STEAM_ID");
// Optional: getPlayer(id, { mode: "ffa" })
// Modes: all (default), ffa, defuse, explore.
if (!result.player) {
// No confirmed stats for this player yet.
} else if (result.isStale) {
// Show a "stats delayed" indicator.
} else {
const p = result.player;
const kdr = p.totals.kdrInfinite ? "∞" :
p.totals.kdr === null ? "—" : p.totals.kdr.toFixed(2);
// Use textContent, not innerHTML, for player/map/weapon names.
document.querySelector("#player-name").textContent = p.name;
document.querySelector("#kills").textContent = p.totals.kills;
document.querySelector("#kdr").textContent = kdr;
}
// Poll about once every 300 seconds, not every frame.
This API supplies data; it is not itself a finished OBS Browser Source overlay. Your overlay needs matching HTML elements. For plain JavaScript, use fetch(url).then(r => r.json()) and find the player in data.players. Browser GET requests work across origins without cookies or custom headers.
PowerShell / stream automation
$url = 'https://kickbackstats.com/api/v1/players.json'
$data = Invoke-RestMethod -Uri $url
$player = $data.players | Where-Object id -EQ 'YOUR_17_DIGIT_STEAM_ID'
$player.totals
$player.weapons
$player.maps
$player.modes.ffa.totals
Fields & calculations
| Record | Fields |
|---|---|
| Player totals & each map | kills, deaths, kdr, kdrInfinite, revives, teamkills, rounds, objectiveWins, defuses |
| Each weapon | id, kills, shots, successfulShots, damageMilli, damage, accuracyPercent |
| Each map's identity | id, name — group by stable ID, not display name. |
| Snapshot metadata | schemaVersion, generatedAt, refreshSeconds, staleAfterSeconds |
generatedAtis backend Unix time in seconds (UTC). The publisher runs every five minutes; caching can delay visibility further. Treat data older thanstaleAfterSeconds(900) as delayed. The helper computesisStaleusing your device clock.kdris kills divided by deaths, ornullwhen deaths are zero.kdrInfinitedistinguishes positive kills / zero deaths from 0 / 0. Ratios are rounded to six decimal places.accuracyPercentis 100 × successful shots / shots, ornullwith no shots. Raw counters are summed before calculating accuracy. Grenades count throws and successful throws, not individual victims.damageis enemy health damage;damageMilliretains the integer source units (divide by 1000).objectiveWinsmeans FFA last-player-standing wins. Bombdefusesremain separate; Explore has no objective wins.- Overall player totals come from the lifetime player record, not a sum of maps. Older rounds can lack map data. Mode weapon/map totals remain separately available; weapon-by-map cross-breakdowns are not part of v1.
Handle missing or delayed data
A missing player is absent from the array; the helper returns player: null. No confirmed rounds yet is not the same as an outage. An empty dataset is valid. Missing mode records have zero counters and empty weapon/map arrays.
On timeout, a non-200 response, or an unsupported schema, the helper throws. Catch errors, keep your last known values with an unavailable/delayed label, and retry with backoff. Do not turn a failed request into zero stats. Preserve timestamps and tolerate new optional fields within v1.
Only GET and HEAD are supported. Send no credentials, authentication tokens, custom request headers, or request body. Unsupported URLs/methods can return 403/404, not JSON errors. CORS is enabled for simple cross-origin reads. There is no per-key quota; poll at most once a minute per tool, preferably every five minutes, and share that snapshot across players.
Reports, moderation records, private Steam metadata, unconfirmed scores, and gameplay credentials are not exposed. This API cannot submit scores, change stats, or authenticate players.