Steam account bans
Steam ban API: VAC, game and trade bans
Read the ban signals Steam publishes for an account: VAC bans, game bans, community bans and economy bans, with the number of days since the last ban.
Updated
curl --fail-with-body \
-H "Authorization: Bearer $WOK_API_KEY" \
"https://woksteamapi.com/v1/player-security?steam_id=76561198000000001&include_details=1"Endpoints
A WOK key with all-purpose or Players access. Free Developer keeps its own quota, day and minute limits and the WOK Discord membership rule. Each single read uses one quota unit.
GET /v1/player-security | VAC, game and economy bans |
|---|---|
POST /v1/player-security/batch | VAC and ban signals for up to 100 Steam accounts |
Request
Parameters of GET /v1/player-security, as published in the OpenAPI description.
| Parameter | Required | Accepted values | Notes |
|---|---|---|---|
steam_id | Required | string | A 17-digit SteamID64. Profile URLs and vanity names are not accepted here. |
include_details | Optional | integer (default 0) | Adds nullable source-style ban_details from the same GetPlayerBans data; no additional Steam call. |
Response fields
Fields of a 200 response. A type that includes null means Steam may not publish that value.
| Field | Type | Meaning |
|---|---|---|
steam_id | string | The SteamID64 the response describes. |
bans | object | The public ban signals. Every value is null when Steam did not return it. |
bans.community_banned | boolean or null | Whether the account is banned from the Steam Community. |
bans.vac_banned | boolean or null | Whether Steam reports a VAC ban on the account. |
bans.vac_bans | integer or null | Number of VAC bans on record. |
bans.game_bans | integer or null | Number of game bans on record. |
bans.economy_ban | string or null | Steam's economy ban state for trading and the Community Market. |
bans.days_since_last_ban | integer or null | Days since the most recent ban, as Steam reports them. |
bans.last_ban_at | string or null | Always null: Steam does not publish the exact time of a ban. |
bans.last_ban_date_approx | string or null | Approximate date computed from days_since_last_ban. |
trade_eligibility | object | Public ban signals only. complete is always false because Steam does not expose every temporary trade hold here. |
trade_eligibility.status | string: no_public_restrictions, restricted, unknown | Summary of the public ban signals for trading. |
trade_eligibility.reasons | array of string | Which signals led to that status. |
trade_eligibility.basis | string: public_ban_signals | Always public_ban_signals. |
trade_eligibility.complete | boolean | Always false: temporary trade holds are not visible in this data. |
ban_details | object or null | Added with include_details=1: the source-style fields from the same Steam response. It causes no additional Steam call. |
What your code should handle
The cases that most often turn into wrong numbers in a product.
Unknown is not clean. A null value means Steam did not return that field. Show it as unknown, never as an account without bans.
Trade status is partial. trade_eligibility is built from public ban signals only. Its complete field is always false, because Steam does not expose every temporary trade hold.
Batch with SteamID64 strings. Send up to 100 IDs as strings. Duplicates are removed first, and each unique ID uses one quota unit, including cached results.
Free Steam ban checkerSteam profile APIError codes and retries
Status codes
Errors carry a typed code and, where it applies, Retry-After. Respect it on 429 and 503.
| Status | Meaning |
|---|---|
200 | OK |
400 | Invalid request |
401 | Missing or invalid API key |
402 | Quota exhausted or required add-on is not active |
403 | Resource is private or restricted; discord_required means free access requires current WOK Discord membership |
422 | Query or JSON body validation failed |
429 | Rate limit exceeded |
502 | Upstream service failed |
503 | Required upstream capability is unavailable; discord_unavailable means free membership verification should be retried |
Related requests
The same key reads these. Batches use one quota unit per unique account or pair, including cached results.
POST /v1/player-security/batch
VAC and ban signals for up to 100 Steam accounts.
| Field | Required | Accepted values | Notes |
|---|---|---|---|
steamids | Required | array of string (1 to 100 entries) | SteamID64 strings. Duplicates are removed while preserving first occurrence order. |
include_details | Optional | boolean (default False) | Adds ban_details for each account. |
Questions
Do I need a Valve Steam Web API key?
No. WOK holds the Steam Web API key on its servers and makes the Steam call for you. Your server sends a WOK key in the Authorization header.
Can I see why an account was banned, or in which game?
No. Steam publishes ban counts and the days since the last ban, not the reason or the game. WOK returns what Steam publishes and adds nothing to it.
Does it show trade holds and cooldowns?
Not fully. trade_eligibility reflects public ban signals; complete is always false because Steam does not expose every temporary trade hold through this data.
How many accounts can I check at once?
Up to 100 SteamID64 strings in POST /v1/player-security/batch. Each unique ID uses one quota unit, including cached results; sending one ID ten times costs one unit.
Steam friend listsSteam libraries and hoursSteam achievementsSteam level and badges