DiscordSign inAccount

FOBDROP API

Build with public WARDOGS data

Build a community dashboard, Discord bot or companion tool with public WARDOGS data served by FOBDROP. Each response identifies its source and collection credit. Start with one JSON request.

Version
v1
Access
No key required
Limit
120 requests / minute / IP
Format
JSON · UTC timestamps

01 // First request

Quick start

Base URL: https://fobdrop.com/api/v1/. All routes are read-only. Use GET for JSON, HEAD for headers, or OPTIONS for browser preflight.

Terminal · curl
curl --fail-with-body \
  "https://fobdrop.com/api/v1/population/"
Browser · JavaScript
const response = await fetch(
  "https://fobdrop.com/api/v1/population/",
  { credentials: "omit" }
);

if (response.status === 429) {
  const wait = response.headers.get("Retry-After");
  throw new Error("Rate limited; retry after " + wait + " seconds");
}

const result = await response.json();
if (!response.ok) {
  throw new Error(result.error?.message ?? "Data unavailable");
}

console.log(result.data.players, result.data.observedAt);

Cross-origin requests are allowed. Omit cookies and credentials; the public API does not use your FOBDROP account or game session.

02 // Reference

Endpoints

Open any route to inspect its current response. Field lists below describe the data object inside the shared response envelope.

GETEndpoint catalog

/api/v1/

The available routes and request limit. /api/v1/catalog/ is an alias.

data: { endpoints: [{ path, description }], rateLimit: { requests, periodSeconds } }

GETCurrent population

/api/v1/population/

The latest official Steam player count for WARDOGS (app 1867240), collected by FOBDROP. A measurement must be no more than 30 minutes old.

data: { appId, players, observedAt }

GETPopulation history

/api/v1/population/history/?hours=24

Use hours=6, 24, 72 or 168. The default is 24. Returns up to 1,008 collected points, oldest first. An empty window returns an empty points array.

data: { appId, hours, points: [{ observedAt, players }] }

GETServer snapshot

/api/v1/servers/

Official and community server reports served by FOBDROP. Returns 503 when the directory is more than seven minutes old. Each server has its own observedAt; reports older than ten minutes are omitted and coverage becomes partial.

data: { asOf, coverage: "complete" | "partial", servers: [...] }

GETServer details

/api/v1/servers/{id}/

Replace {id} with a server id from /api/v1/servers/. Encode it as one URL path segment.

One server from the current directory, including its join code and reported settings. Uses the same seven-minute directory limit. Returns 404 when a fresh directory omits the ID, or 503 when the directory is unavailable.

data: { asOf, coverage, server: { id, joinCode, observedAt, ... } }

GETPublic game profile

/api/v1/players/steam/{id}/

Replace {id} with the player’s 17-digit SteamID64. The linked player must share their verified game profile.

Verified levels, XP, season, cash and gold bars shared by a linked player. No FOBDROP sign-in is needed to read a public profile. Returns 404 when no shared verified profile exists. These reads do not contact the player or trigger a game refresh. Responses use no-store so sharing changes take effect immediately.

data: { steamId, game: { levels, wardog, mastery, totalCumulativeXp, seasonNumber, cash, goldBars, asOf: { levels, progression, wallet } } }

GETTool catalog

/api/v1/tools/

The live FOBDROP tools, with their names, descriptions and links. Feedback actions and future placeholders are excluded.

data: { tools: [{ id, name, description, url, version, status: "live" }] }

GETData availability

/api/v1/health/

Reports availability separately for population and servers. Partial coverage returns 200 with status "partial". If both feeds are unavailable, it returns 503 with status "unavailable".

data: { status, checks: { population, servers } }

03 // Read the result

One response shape

Illustrative response · not live measurements
{
  "meta": {
    "provider": "FOBDROP",
    "version": "1",
    "generatedAt": "2026-10-27T12:01:00.000Z",
    "source": {
      "name": "Steam",
      "collectedBy": "FOBDROP"
    },
    "docs": "https://fobdrop.com/developers/"
  },
  "data": {
    "appId": 1867240,
    "players": 1234,
    "observedAt": "2026-10-27T12:00:00.000Z"
  }
}
meta.generatedAt
When the response was generated. It is not the measurement time.
meta.source
The original source and collection credit; a source URL may also be present.
data.observedAt
When the population was measured. History points each carry their own timestamp; server snapshots use asOf.
data
The requested data. Ordinary errors return null plus an error object. Health responses retain their availability checks.
error
A stable code and a readable message. Missing measurements are unavailable, never substituted with a zero.

A measured count of 0 is valid. Treat unavailable data separately so your dashboard does not show a false population drop.

04 // Request responsibly

Freshness, caching and errors

  • Cache ordinary successful responses for at least 60 seconds. History responses use a 300-second cache lifetime. Check Cache-Control rather than polling more often.
  • The shared request budget is 120 requests per IP per minute across the public API. A 429 response includes Retry-After: 60; wait before retrying.
  • On 503, keep your last known value with its timestamp or show unavailable. Use backoff instead of a tight retry loop.
  • History is a record of collected observations, not a promise of uninterrupted coverage. Gaps and empty windows can occur.
400 · invalid_hours
Use a single supported hours value.
404 · not_found
The versioned endpoint does not exist.
405 · method_not_allowed
Use GET, HEAD or OPTIONS.
429 · rate_limited
Wait for the Retry-After interval.
503
data_unavailable means measurements are missing or stale; api_unavailable means the service cannot currently accept the request.

Server reference

Reported server fields

Each server has a persistent id. Its current gameInstanceId can change after a restart. Open /servers/<id>/ for its reported details. A joinCode is supplied only when verified; it is never inferred from either ID.

Missing values are null. Zero and false are known values. A partial directory does not establish the total number of servers worldwide. Unknown password status or free public slots does not remove a server from the directory.

Identity
id, gameInstanceId, joinCode, name, region, official, serverNumber
Players and access
players, capacity, available, reserved, reservedCapacity, passworded, level, cash, maxPing. Reserved occupancy and reserved capacity are separate. Free public slots are not guessed from player counts. Limits are reported minimum/maximum pairs.
Match
map, gameMode, experiences, combined, infantry, hardcore, started. A known started uses Unix milliseconds; otherwise it is null.
Attributes
attributes contains only these typed, nullable public fields: sessionType, sessionMap, advertisedMap, sessionMode, gameModeClass, maxSpectators, persistProgression, build, compatibleBuild, buildConfiguration, scenarioState, sky, experience, variantMapName, scorePeriod, matchStartTicks. Map labels are preserved separately; raw match-start ticks are a decimal string and are not treated as a verified timestamp.

Passwords, player rosters, private host addresses and arbitrary provider attributes are excluded.

05 // Public data

Sources and scope

Population comes from Steam’s official player-count API. FOBDROP collects the history and provides tool metadata. Server measurements retain the original source, observation times and directory coverage. Missing or stale readings remain unavailable.

Public game profiles contain only verified values that linked players share. They include the public SteamID, levels, XP, season and wallet readings. Account records, private progression, authentication assertions and game tokens are never exposed.

When showing these measurements, credit FOBDROP and keep the original source and observation time visible. FOBDROP is independent and not affiliated with or endorsed by BULKHEAD or Team17.

Found a problem or need another public field? Talk to us in the FOBDROP Discord.