ETR API
ETR API documentation
ETR #
ETR (Eblan Trouble Register) — центральный реестр блокировок во всех сервисах (Discord, игровые серверы и др.). Удаление из реестра недоступно.
Серверы передают базу банов через API ETR. Администрация верифицирует каждый сервер; только верифицированные серверы отправляют feed, эти данные участвуют в подсчёте очков. Голоса идут от пользователей (на сайте) и от верифицированных серверов (через API); голос сервера имеет больший вес. У каждого игрока считается сумма взвешенных голосов «за» минус «против». При достижении текущего порога игрок вносится в ETR. Порог динамический: растёт с числом верифицированных серверов и активных голосующих — чем больше сообщество, тем больше доказательств требуется. Базовый порог низкий, чтобы первые голосования могли приводить к внесению в реестр; при росте сообщества планка поднимается.
Centralized status checks by SteamID. Entries are added by authorized personnel and apply to related services.
Accepts SteamID formats including STEAM_0:X:XXXXXX with automatic conversion to SteamID64.
ETR Endpoints #
| Method | Path | Access | Purpose |
|---|---|---|---|
| GET | /etr/list/{apiKey} | Keys with list permission | Return registry entries, with optional fields, formats, pagination |
| GET/POST | /etr/add/{apiKey}/{steamId?} | Keys with add permission | Add a SteamID to the registry |
| GET | /etr/status/{apiKey}/{steamId?} | Any valid key | Check if SteamID is in ETR. Use on player connect: if status true → ban or kick. |
| GET | /etr/key-info/{apiKey} | Any valid key (verified) | Key permissions: can_add_users, can_check_list, verified. Addon uses this to decide add-bulk vs feed. |
| POST | /etr/add-bulk/{apiKey} | Keys with add permission | Add multiple Steam IDs to ETR (permanent bans). Body: steam_ids (array), optional reason. Returns added, already_in_etr, invalid. Max same as feed. |
| GET | /etr/votings/{apiKey} | Any valid key (verified) | List active votings: target_steam_id, for_count, against_count, points. Optional ?limit=100. |
| POST | /etr/vote/{apiKey}/{steamId?} | Any valid key (verified) | Vote for/against adding a player. Same unified score as feed (see above). Body: vote_type (for|against), reason_id or reason, comment (max 500). steamId in path or steam_id in body. Web: daily vote limit per user; API: daily limit. |
| POST | /etr/feed/{apiKey} | Any valid key (verified) | Bulk submit Steam IDs from server ban lists. Each ID counts as vote For (or start of vote For) for that player — same score as web votes; when threshold reached, player is auto-added to ETR. Body: steam_ids, reason_id or reason, comment. Max 200 IDs per request. Response: created, skipped, invalid. |
| POST | /etr/server/register/{apiKey} | Any valid key (verified) | Register a server. Required: name, ip. Optional: app_id (Steam App ID, e.g. 4020 = GMod), description. Creates a server record and links the API key. Returns server_id, name, ip, app_id. |
| POST | /etr/server/{server_id}/link-key/{apiKey} | Any valid key (verified) | Link the API key to an existing server (by server_id). Server must belong to the key's user. |
| POST | /etr/server/{server_id}/update/{apiKey} | Any valid key (verified) | Update server: name, ip, app_id, or description (all optional). Returns server_id, name, ip, app_id. |
GET https://sellingvika.party/etr/status/[KEY]/[SteamID]
GET https://sellingvika.party/etr/key-info/[KEY]
POST https://sellingvika.party/etr/add-bulk/[KEY] Body: steam_ids=["7656119...",...], reason=optional
GET https://sellingvika.party/etr/votings/[KEY]?limit=100
GET https://sellingvika.party/etr/list/[KEY]
GET https://sellingvika.party/etr/add/[KEY]/[SteamID]
POST https://sellingvika.party/etr/add/[KEY]/[SteamID]
POST https://sellingvika.party/etr/vote/[KEY]/[SteamID] Body: vote_type=for|against, reason_id=1 or reason=cheating, comment=optional POST https://sellingvika.party/etr/vote/[KEY] (steam_id in body)
POST https://sellingvika.party/etr/feed/[KEY] Body: steam_ids=["7656119...",...] or comma-separated, reason_id or reason, comment, source or server_name
POST https://sellingvika.party/etr/server/register/[KEY] Body: name=..., ip=... (required), app_id=4020 (optional), description=optional
POST https://sellingvika.party/etr/server/[SERVER_ID]/link-key/[KEY]
POST https://sellingvika.party/etr/server/[SERVER_ID]/update/[KEY] Body: name=..., ip=..., app_id=..., description=... (all optional)
200 OK
{"status":true,"steam_id":"7656119XXXXXXXXXX"}
201 Created
{"status":"added","steam_id":"7656119XXXXXXXXXX"}
200 OK
{"status":"already_exists","steam_id":"7656119XXXXXXXXXX"}
200 OK
{"etr_list":[{"steam_id":"7656119..."},...],"total":123,"full":true,"fields":["steam_id","created_at","created_from"]}
201 Created (vote_started)
{"status":"vote_started","steam_id":"7656119...","for_count":1,"against_count":0,"points":1,"added_to_etr":false}
201 Created (voted)
{"status":"voted","steam_id":"7656119...","for_count":2,"against_count":0,"points":2,"added_to_etr":false}
200 OK (vote_updated)
{"status":"vote_updated","steam_id":"7656119...","for_count":2,"against_count":1,"points":1}
403 starter_immutable / not_eligible / steamid_blocked / cannot_vote_self 422 only_for_starts / reason_missing / invalid_reason / invalid_steamid
200 OK (feed)
{"created":5,"skipped":0,"invalid":1}
201 Created (server register)
{"server_id":123,"name":"My Server","ip":"1.2.3.4","app_id":4020,"message":"Server registered. ..."}
200 OK (server update)
{"server_id":123,"name":"My Server","ip":"1.2.3.4","app_id":4020,"message":"Server updated."}
200 OK (key-info)
{"verified":true,"can_add_users":true,"can_check_list":true}
200 OK (add-bulk)
{"added":["7656119..."],"already_in_etr":[],"invalid":[],"message":"1 added, 0 already in ETR, 0 invalid."}
200 OK (votings)
{"votings":[{"target_steam_id":"7656119...","for_count":2,"against_count":0,"points":2},...]}
Addon flow (GMod etc.)
User enters API key. On startup the addon:
- Register server — POST /etr/server/register/[KEY] with name, ip, app_id (e.g. 4020). Save server_id. Key is linked to this server.
- Key permissions — GET /etr/key-info/[KEY]. If can_add_users true: permanently banned players can be added directly to ETR. Otherwise only voting.
- Permanent bans — If can_add_users: POST /etr/add-bulk/[KEY] with body steam_ids = list of permanent ban Steam IDs. They are added to ETR immediately.
- Ban list → voting — POST /etr/feed/[KEY] with steam_ids from server bans. Each ID adds to that player’s score; at threshold they are auto-added to ETR. Run periodically.
- Player connect — Do not share DB. Call GET /etr/status/[KEY]/[SteamID]. If response status is true (user is in ETR), ban or kick the player (per addon settings).
Optional: GET /etr/votings/[KEY] for active votings; POST /etr/vote/[KEY] to vote for a target by steam_id.
Server registration and management
Register with name and ip. Optional app_id (Steam App ID). The same key is used for feed: submitted Steam IDs contribute to the unified score (see How it works).
| Field | Required | Description |
|---|---|---|
| name | yes | Server display name (or server_name) |
| ip | yes | Server IP or host:port (or server_ip) |
| app_id | no | Steam App ID — game/server type (see table below) |
| description | no | Optional text |
Use the App ID from Steam / SteamCMD to identify the game. Examples:
| App ID | Game / server |
|---|---|
| 4020 | Garry's Mod (GMod) |
| 730 | Counter-Strike 2 (CS2) |
| 240 | Counter-Strike: Source |
| 232250 | Rust (dedicated) |
| 440 | Team Fortress 2 (TF2) |
You can look up App IDs in SteamDB or from your server / SteamCMD. The same app_id can be sent when updating the server.
/etr/list query parameters #
| Param | Type | Allowed | Default | Description |
|---|---|---|---|---|
| fields | string (CSV) | steam_id, created_at, created_from | steam_id,created_at,created_from | Subset of fields to return. Empty value equals default. Invalid names are ignored. If empty after filtering, falls back to steam_id. |
| format | string | json, lines | json | lines returns newline-separated steam_id values with Content-Type text/plain. Works only when fields equals steam_id. |
| page | int | ≥ 1 | 1 | Used only with pagination. Combined with per_page or limit. |
| per_page | int | 1–100 | 100 | Page size. If not provided, limit is used as fallback. |
| limit | int | 1–100 | 100 | Alias for per_page when pagination is requested. |
- No pagination params: returns full list, includes full=true and total.
- With pagination: returns page, per_page, total, has_more.
- Format lines adds headers X-Page, X-Per-Page, X-Total, X-Has-More on paginated responses.
GET /etr/list/[KEY]?fields=steam_id,created_at
GET /etr/list/[KEY]?format=lines&fields=steam_id
GET /etr/list/[KEY]?per_page=50&page=2
GET /etr/list/[KEY]?limit=25&format=json&fields=steam_id,created_from
API Keys #
- 64-character alphanumeric string
- Key must be active
- Status: any valid key
- List: key with list permission
- Add: key with add permission
- Daily rate limits may apply per key
Errors and codes #
422 Unprocessable Entity validation_error
403 Forbidden invalid_key
429 Too Many Requests daily_limit_exceeded
400 Bad Request missing_parameter: apiKey
400 Bad Request
{"error":"steamid_missing"}
422 Unprocessable Entity
{"error":"invalid_steamid"}
403 Forbidden
{"error":"unauthorized"}