Developer documentation

Wipe map voting API

Display your RustCommander map votes on your own website while RustCommander handles schedules, maps, results and verified Steam voting.

Base URL https://api.rustcommander.app
Every ballot requires a verified SteamID64.

RustCommander obtains it through Steam OpenID on the hosted page. Custom websites may submit a SteamID only from a trusted backend using a user-owned API key.

Quick start

  1. Create and enable a public voting page in RustCommander.
  2. Copy its slug, for example rust-community.
  3. Fetch the page endpoint from your server and render its servers and votes.
  4. Use each vote's returned publicUrl for the “Vote with Steam” action.
  5. For a custom voting UI, create an API key in Account → Developer API.
  6. Refresh open votes every 30–60 seconds if you display live results.
Node.js / server-side JavaScript
const API_URL = "https://api.rustcommander.app";

export async function getMapVotingPage(slug) {
  const response = await fetch(
    `https://api.rustcommander.app/servers/public/map-vote-pages/${encodeURIComponent(slug)}`,
    { headers: { Accept: "application/json" } }
  );

  if (!response.ok) {
    throw new Error(`RustCommander returned HTTP ${response.status}`);
  }

  return response.json();
}

Server-side requests are recommended. They avoid browser CORS differences and let your application cache the response before returning it to visitors.

Get an organization voting page

Returns every server assigned to the page and its scheduled, open and completed map votes. Cancelled votes are excluded.

GET /servers/public/map-vote-pages/:slug
Example response
{
  "name": "Rust community",
  "slug": "rust-community",
  "logoUrl": "https://example.com/logo.png",
  "accentColor": "#78a94b",
  "publicUrl": "https://panel.rustcommander.app/vote/rust-community",
  "servers": [
    {
      "id": "42",
      "name": "EU Main",
      "votes": [/* map vote objects */]
    }
  ]
}

Get one map vote

Use the vote's stable publicId when you only need a single voting event. This endpoint does not require an API key.

GET /servers/public/map-votes/:publicId
Example response
{
  "publicId": "58d13d9c-0d10-4b37-a114-6bb0388bb81d",
  "serverName": "EU Main",
  "title": "Next wipe map",
  "status": "open",
  "resultsVisibility": "live",
  "wipeAt": "2026-10-15T14:00:00.000Z",
  "opensAt": "2026-10-12T14:00:00.000Z",
  "closesAt": "2026-10-15T13:00:00.000Z",
  "winnerMapId": null,
  "totalVotes": 27,
  "publicUrl": "https://panel.rustcommander.app/map-vote/58d13d9c-...",
  "candidates": [
    {
      "mapId": "3bab51dee18b4170a96bd8dffd99bee4",
      "label": "Map 1",
      "seed": 546307982,
      "worldSize": 3750,
      "imageUrl": "https://api.rustcommander.app/storage/maps/...png",
      "votes": 18,
      "percentage": 66.7
    }
  ],
  "createdAt": "2026-10-12T12:00:00.000Z",
  "updatedAt": "2026-10-12T15:30:00.000Z"
}

Important fields

FieldDescription
publicIdStable public identifier for the voting event.
statusscheduled, open, closed or cancelled.
publicUrlSecure RustCommander page where the visitor signs in and votes.
candidatesMaps with seed, world size, preview image and any visible result.
votes / percentageNumbers when results are visible; otherwise null.
winnerMapIdWinning candidate after the vote closes, otherwise null.

API keys and voting

You can use the hosted RustCommander flow or register a ballot from your own backend. Both methods store one vote against a 17-digit SteamID64.

Option 1: hosted Steam verification

Use publicUrl as the target of your vote button. RustCommander redirects the visitor to Steam, verifies the OpenID response and saves the vote.

Vote button
<!-- Use publicUrl from the API. Do not build this URL manually. -->
<a href="https://panel.rustcommander.app/map-vote/VOTE_PUBLIC_ID">
  Vote with Steam
</a>

Option 2: custom voting UI

Create an API key from Account → Developer API. The secret is displayed once. It can register votes only for servers you currently own or where your account has the Wipes permission. Send it only from your backend.

POST /servers/public/map-votes/:publicId/integrations/ballot
Server-side JavaScript
const response = await fetch(
  "https://api.rustcommander.app/servers/public/map-votes/VOTE_PUBLIC_ID/integrations/ballot",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-RustCommander-API-Key": process.env.RUSTCOMMANDER_VOTE_API_KEY
    },
    body: JSON.stringify({
      mapId: "3bab51dee18b4170a96bd8dffd99bee4",
      steamId: "76561198000000000",
      displayName: "Player name"
    })
  }
);

if (!response.ok) throw new Error(`Vote failed: ${response.status}`);
const updatedVote = await response.json();
ValueRequirement
X-RustCommander-API-KeyRequired. Keep it in a server-side secret or environment variable.
mapIdRequired. Must match a candidate returned by the vote endpoint.
steamIdRequired. A valid 17-digit SteamID64 verified by your authentication system.
displayNameOptional. Stored with the ballot and limited to 120 characters.
  • One ballot is stored per Steam account and voting event.
  • Voting again changes the existing selection; it does not create a second vote.
  • The choice can be changed while the vote remains open.
  • Your backend must verify ownership of the SteamID before submitting the ballot.
  • Never expose an API key in browser JavaScript, HTML, a mobile binary or a public repository.
  • Revoking a key disables external writes immediately.
  • Access is checked on every request. Removing a server or its Wipes permission makes the key stop working for that server.

Results visibility

The organization controls when totals are returned:

  • live: totals and percentages are available while voting is open.
  • after_close: results remain null until the vote closes.
  • hidden: public totals remain null.

Integrations must handle totalVotes, candidate votes and percentage as nullable values. A hidden result is not zero votes.

Errors and caching

StatusMeaning
400The slug, map candidate or SteamID64 is invalid.
401The integration API key is missing, invalid or revoked.
403The key does not have access to the vote's server.
404The page is disabled, missing or the vote does not exist.
409The voting event is not open or has already closed.

Cache scheduled and closed data when practical. For an open vote, polling every 30–60 seconds is enough for a responsive UI without unnecessary traffic.