{"openapi":"3.1.0","info":{"title":"SuperAwesome Public API","version":"1.0.0","description":"Public network endpoints and server-store integration. Examples are synthetic. Check individual response bodies as well as HTTP statuses; some legacy errors use HTTP 200."},"servers":[{"url":"https://api.superawesome.dk"}],"tags":[{"name":"players","description":"Find players, public profiles, staff and leaderboards."},{"name":"servers","description":"Discover servers, player counts, statistics and server storefronts."},{"name":"information","description":"Network status, player counts and community rules."},{"name":"lobbies","description":"Shoppylobby shops, item offers and historical market prices."},{"name":"store","description":"Connect a server plugin to purchases, delivery, payments and votes."}],"externalDocs":{"description":"Interactive documentation","url":"https://superawesome.dk/api-docs"},"components":{"securitySchemes":{"serverKey":{"type":"apiKey","in":"header","name":"Authorization","description":"Raw server API key. Do not prefix it with Bearer. Use only from your server or plugin."}}},"paths":{"/players":{"get":{"operationId":"players-list","tags":["players"],"summary":"Player list","description":"The current player list is a placeholder and always returns an empty array. Use search or a direct lookup to find a player.\n\nThis route does not support pagination or filtering.\n\nPlayer routes return Cache-Control: no-store.","security":[],"parameters":[],"responses":{"200":{"description":"An empty array; this endpoint does not provide a player directory yet.","content":{"application/json":{"examples":{"example1":{"summary":"An empty array; this endpoint does not provide a player directory yet.","value":[]}}}}}}}},"/players/staff":{"get":{"operationId":"players-staff","tags":["players"],"summary":"Staff players","description":"Get the username, UUID, role and visible status of staff Minecraft accounts.\n\nIncludes the admin, seniormod, developer, mod, support and bygger roles. CONSOLE is excluded.\n\nHidden presence is reported as offline. Cache-Control: no-store.\n\nThis route has no separate status code for a failed database read; the response may be null.","security":[],"parameters":[],"responses":{"200":{"description":"An array of staff members.","content":{"application/json":{"examples":{"example1":{"summary":"An array of staff members.","value":[{"username":"ExampleStaff","uuid":"22222222-2222-4222-8222-222222222222","role":"support","status":"offline"}]}}}}}}}},"/players/search":{"get":{"operationId":"players-search","tags":["players"],"summary":"Search players","description":"Search usernames or look up a UUID. The response contains up to eight players with their role and visible presence.\n\nUsernames use substring matching; UUIDs use an exact match. An exact username match is ordered first, followed by status and username.\n\nSearch text uses LIKE semantics: % and _ act as wildcards.\n\nHidden presence is reported as status: offline and currentServer: null. Cache-Control: no-store.\n\nAn empty result is not a 404 and can also occur when a database read fails.","security":[],"parameters":[{"name":"query","in":"query","required":false,"description":"Search text. Leading and trailing whitespace is removed; the remaining length must be 2–36 characters. An invalid or missing query returns an empty array.","schema":{"type":"string","examples":["Example"]}}],"responses":{"200":{"description":"Up to eight matches. A missing, too short or too long query returns [].","content":{"application/json":{"examples":{"example1":{"summary":"Up to eight matches. A missing, too short or too long query returns [].","value":[{"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","status":"online","currentServer":"Example-SMP"}]}}}}}}}},"/players/leaderboards":{"get":{"operationId":"players-leaderboards","tags":["players"],"summary":"Player leaderboards","description":"Get leaderboards for playtime, player points, lobby points and ratings, plus playtime over the last 30, 90, 180 and 365 days.\n\nvalue is measured in seconds for playtime, points for playerPoints/lobbyPoints and a weighted score for ratings. rank starts at 1.\n\nAll periods are returned under playtimePeriods; this route does not accept period or limit parameters.\n\nPlaytime from a single session is capped at seven days. Only a valid, current open session can continue accruing time.\n\nTotals normally refresh every 300 seconds. During a refresh or a temporary failure, a response may be up to 900 seconds old; check updatedAt.\n\nHidden players are excluded on every request, including when leaderboard totals come from cache. The HTTP response uses Cache-Control: no-store.","security":[],"parameters":[],"responses":{"200":{"description":"All leaderboards in one response, with up to 100 players per leaderboard.","content":{"application/json":{"examples":{"example1":{"summary":"All leaderboards in one response, with up to 100 players per leaderboard.","value":{"updatedAt":"2026-10-01T10:00:00.000Z","refreshIntervalSeconds":300,"leaderboards":{"playtime":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":7200}],"playerPoints":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":20}],"lobbyPoints":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":5}],"ratings":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":4,"ratings":{"positive":4,"negative":0,"neutral":0,"total":4}}]},"playtimePeriods":{"30":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":7200}],"90":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":7200}],"180":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":7200}],"365":[{"rank":1,"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","value":7200}]}}}}}}},"503":{"description":"The leaderboards could not be retrieved. Retry-After: 10 specifies the wait in seconds before retrying.","content":{"application/json":{"examples":{"example2":{"summary":"The leaderboards could not be retrieved. Retry-After: 10 specifies the wait in seconds before retrying.","value":{"error":"Ranglisterne kunne ikke hentes. Prøv igen om lidt."}}}}}}}}},"/players/{lookup}/profile":{"get":{"operationId":"players-profile","tags":["players"],"summary":"Player profile","description":"Get a public profile with rank, points, ban status, playtime, ratings, activity, servers, badges and friends. lookup is a username or UUID.\n\nactivity contains daily session counts and playtime from the start of the day 182 days ago. favoriteServers and recentSessions contain up to eight results each.\n\nPlaytime is measured in seconds, with each session capped at seven days. The current loginStreak determines today and yesterday in Europe/Copenhagen.\n\nWhen activity is hidden, activityVisible is false, status is offline, and current-server and last-seen fields are null. Playtime, votes and loginStreak are reset in the response; activity, favorites, recent sessions and boosts are empty.\n\nBadges and friends may still be listed, but their activity dates are null when the profile hides activity. Friends’ presence also follows their own visibility choices.\n\nfavoriteServers contains name, status, category, version, motdFavicon, sessions, playtimeSeconds and lastSeen. recentSessions contains name, type, joinedAt, leftAt and playtimeSeconds.\n\nownedServers contains name, status, category, version, created, descriptionLong, motdFavicon, players and maxPlayers. badges contains name, description, color, symbol, active and created.\n\nserverBoosts contains name and since. friends contains username, uuid, role, friendsSince, status and currentServer.\n\ncached is false; cachedAt is the response time. Player routes use Cache-Control: no-store. The profile route does not define a consistent status code for database failures.","security":[],"parameters":[{"name":"lookup","in":"path","required":true,"description":"Username or UUID. Leading and trailing whitespace is removed; an empty value or more than 64 characters is rejected. No specific UUID format is required.","schema":{"type":"string","examples":["ExamplePlayer"]}}],"responses":{"200":{"description":"A public player profile. Some fields may be null, and activity may be hidden.","content":{"application/json":{"examples":{"example1":{"summary":"A public player profile. Some fields may be null, and activity may be hidden.","value":{"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","rankLabel":null,"rankDisplayName":null,"rankColor":null,"vipDays":0,"proDays":0,"lobbyPoints":5,"playerPoints":20,"created":"2026-10-01T10:00:00.000Z","activityVisible":true,"lastJoined":"2026-10-01T10:00:00.000Z","lastSeen":"2026-10-01T10:00:00.000Z","status":"offline","currentServer":null,"banStatus":{"banned":false,"global":false,"lobby":false},"playtime":{"totalSeconds":0,"last7DaysSeconds":0,"last30DaysSeconds":0,"sessions":0,"serversPlayed":0,"averageSessionSeconds":0,"firstSession":null,"lastSession":null},"ratings":{"score":0,"total":0,"positive":0,"negative":0,"neutral":0},"votes":{"total":0,"last30Days":0},"loginStreak":{"current":0,"longest":0,"totalDays":0,"activeToday":false,"startedDate":null,"lastLoginDate":null},"activity":[],"favoriteServers":[],"recentSessions":[],"ownedServers":[],"badges":[],"serverBoosts":[],"friends":[],"cached":false,"cachedAt":"2026-10-01T10:00:00.000Z"}}}}}},"400":{"description":"lookup is empty or longer than 64 characters after trimming.","content":{"application/json":{"examples":{"example2":{"summary":"lookup is empty or longer than 64 characters after trimming.","value":{"error":"Ugyldig spiller"}}}}}},"404":{"description":"No player matches the username or UUID.","content":{"application/json":{"examples":{"example3":{"summary":"No player matches the username or UUID.","value":{"error":"Spilleren blev ikke fundet"}}}}}}}}},"/players/{lookup}":{"get":{"operationId":"players-lookup","tags":["players"],"summary":"Compact player lookup","description":"Look up a player by username or UUID. With type=discord, lookup matches a Discord ID instead and may return multiple linked Minecraft accounts.\n\nNo match returns HTTP 200 with {\"error\":\"Spilleren blev ikke fundet\"}, not HTTP 404. A failed data read can also return this error.\n\nWith type=discord, a successful response is an array of player objects without cached and cachedAt. Example: /players/123456789012345678?type=discord.\n\nrates contains each rater’s username, uuid, role, points, type and created. rate is the sum of points. lobbyAccess is an array of lobby names.\n\nbadges contains name, color, symbol, active and created; serverBoosts contains name and since. servers lists owned servers with name, status and version.\n\nIf the player owns no servers, servers may contain an object with null fields instead of an empty array.\n\nHidden presence is reported as offline with null in lastSeen/currentServer. Boosts are hidden, and activity dates in badges/ratings are null. Cache-Control: no-store.","security":[],"parameters":[{"name":"lookup","in":"path","required":true,"description":"Username or UUID; with type=discord, use a Discord ID. This route does not explicitly validate the length or UUID format.","schema":{"type":"string","examples":["ExamplePlayer"]}},{"name":"type","in":"query","required":false,"description":"Only the exact value discord enables Discord lookup. If omitted or set to another value, lookup uses username/UUID.","schema":{"type":"string","examples":["discord"]}}],"responses":{"200":{"description":"A player object for a normal lookup, an array for type=discord, or an error object if the player is not found.","content":{"application/json":{"examples":{"example1":{"summary":"A player object for a normal lookup, an array for type=discord, or an error object if the player is not found.","value":{"username":"ExamplePlayer","uuid":"11111111-1111-4111-8111-111111111111","role":"default","vipDays":0,"proDays":0,"lastSeen":"2026-10-01T10:00:00.000Z","discordID":null,"lobbyPoints":5,"playerPoints":20,"status":"offline","currentServer":null,"banned":false,"lobbyAccess":[],"rates":[],"badges":[],"serverBoosts":[],"servers":[{"name":"Example-SMP","status":"offline","version":"1.21.4"}],"rate":0,"cached":false,"cachedAt":"2026-10-01T10:00:00.000Z"}}}}}}}}},"/servers":{"get":{"operationId":"servers-list","tags":["servers"],"summary":"Find servers","description":"Paginated server list with owners, visible online players, MOTD and ratings. Online servers appear first, followed by player count descending and name ascending.\n\nCache-Control: no-store. X-Has-More contains the string true/false and is exposed through CORS; another page exists only when it is true.\n\nvip, pro and whitelist are database flags (typically 0/1). players and maxPlayers are numbers; serverPoints and rate are normalized to numbers. rate sums +1 for positive ratings and -2 for negative ratings.\n\ndescriptionLong, owner fields, MOTD fields and playersData may be null. Otherwise playersData is an array containing username, uuid, vip and pro; rates contains username, uuid, role, points, type and created.\n\nThe online count and playersData exclude vanished players and players whose presence is not public. A low count therefore does not necessarily mean few players are connected.\n\nquery is used as a SQL LIKE pattern; % and _ can act as wildcards. The response does not include a total page count.","security":[],"parameters":[{"name":"size","in":"query","required":false,"description":"Servers per page. Positive integers above 100 are capped at 100; invalid or non-positive values use the default. Default: 3.","schema":{"type":"integer","examples":[20]}},{"name":"page","in":"query","required":false,"description":"Page number, starting at 1. Capped at 10,000; invalid values use the default. Default: 1.","schema":{"type":"integer","examples":[1]}},{"name":"query","in":"query","required":false,"description":"Server-name search, trimmed and limited to 100 characters. Omit it to match all names. Default: .","schema":{"type":"string","examples":["Eksempel"]}},{"name":"category","in":"query","required":false,"description":"Exact category name, trimmed and limited to 100 characters. An empty value includes all categories. Default: .","schema":{"type":"string","examples":["Survival"]}},{"name":"status","in":"query","required":false,"description":"Status filter. Other values fall back to online. Default: online.","schema":{"type":"string","enum":["online","offline","all"],"examples":["all"]}}],"responses":{"200":{"description":"Array of servers; [] when the page has no results.","content":{"application/json":{"examples":{"example1":{"summary":"Array of servers; [] when the page has no results.","value":[{"name":"EksempelSMP","version":"1.21.4","descriptionLong":"En hyggelig survival-server.","vip":1,"pro":0,"maxPlayers":50,"status":"online","serverOwner":"123e4567-e89b-42d3-a456-426614174000","serverOwnerName":"EksempelEjer","category":"Survival","whitelist":0,"players":1,"playersData":[{"username":"EksempelSpiller","uuid":"123e4567-e89b-42d3-a456-426614174001","vip":0,"pro":0}],"serverPoints":120,"rates":[{"username":"EksempelSpiller","uuid":"123e4567-e89b-42d3-a456-426614174001","role":"player","points":1,"type":"positive","created":"2026-10-01T12:00:00.000Z"}],"motdLine1":"§6EksempelSMP","motdLine2":"§aVelkommen!","motdFavicon":null,"rate":1}]}}}}}}}},"/servers/stats":{"get":{"operationId":"servers-stats-day","tags":["servers"],"summary":"Player history for all servers","description":"Minute samples from the last 24 hours for servers with statistics and a linked owner.\n\nNo path or query parameters. An empty dataset is []. players may be [] when legacy statistics are missing or cannot be parsed.\n\nThis is the legacy aggregate statistics format. Use /servers/stats/{serverName} for history, topPlayers and votes over a selected range.","security":[],"parameters":[],"responses":{"200":{"description":"Array containing serverName, serverOwnerUUID, serverOwner, maxPlayers and players. players maps Unix timestamps in seconds to player counts.","content":{"application/json":{"examples":{"example1":{"summary":"Array containing serverName, serverOwnerUUID, serverOwner, maxPlayers and players. players maps Unix timestamps in seconds to player counts.","value":[{"serverName":"EksempelSMP","serverOwnerUUID":"123e4567-e89b-42d3-a456-426614174000","serverOwner":"EksempelEjer","maxPlayers":50,"players":{"1790856000":3,"1790856060":5}}]}}}}}}}},"/servers/stats/montly":{"get":{"operationId":"servers-stats-month","tags":["servers"],"summary":"30-day player history for all servers","description":"Daily playersOnline samples from the last 30 days. The existing URL is spelled montly.\n\nNo query parameters. Servers without samples or an owner are excluded; players may be [] when data cannot be parsed.\n\nUse /montly, not /monthly. The literal montly route is matched before the dynamic serverName segment.","security":[],"parameters":[],"responses":{"200":{"description":"Same object structure as the 24-hour statistics; players keys are Unix timestamps in seconds for daily samples.","content":{"application/json":{"examples":{"example1":{"summary":"Same object structure as the 24-hour statistics; players keys are Unix timestamps in seconds for daily samples.","value":[{"serverName":"EksempelSMP","serverOwnerUUID":"123e4567-e89b-42d3-a456-426614174000","serverOwner":"EksempelEjer","maxPlayers":50,"players":{"1790769600":4,"1790856000":6}}]}}}}}}}},"/servers/stats/{serverName}":{"get":{"operationId":"servers-stats-detail","tags":["servers"],"summary":"Statistics for one server","description":"Player history, the ten players with the most recorded playtime, and vote counts over a selected range.\n\nhistory is ordered chronologically. timestamp uses Unix seconds, not milliseconds. Daily players values may be fractional averages; minute samples use the same count for minPlayers/maxPlayers.\n\nmaxPlayers is the server's explicitly stored capacity or 0; this endpoint does not use the VIP/PRO default capacity from the server list.\n\ntopPlayers contains username, uuid, sessions, playtimeSeconds and lastSeen. Only sessions that started within the range are counted, and each session is capped at seven days. lastSeen is not a live online status.\n\nCache-Control: public, max-age=60, stale-while-revalidate=240. The API process may reuse the same server/range payload for five minutes.\n\nAn existing server with no activity returns empty arrays and zero votes. The aggregate statistics router is mounted before /servers/{name}.","security":[],"parameters":[{"name":"serverName","in":"path","required":true,"description":"The server name as a single URL-encoded path segment.","schema":{"type":"string","examples":["EksempelSMP"]}},{"name":"range","in":"query","required":false,"description":"24h uses minute samples; 7d/30d use daily samples. Omitting range selects 30d. Default: 30d.","schema":{"type":"string","enum":["24h","7d","30d"],"examples":["7d"]}}],"responses":{"200":{"description":"serverName/range are strings, maxPlayers is a number, history and topPlayers are arrays, and votes contains total and uniqueVoters.","content":{"application/json":{"examples":{"example1":{"summary":"serverName/range are strings, maxPlayers is a number, history and topPlayers are arrays, and votes contains total and uniqueVoters.","value":{"serverName":"EksempelSMP","range":"7d","maxPlayers":50,"history":[{"timestamp":1790856000,"players":5.5,"minPlayers":1,"maxPlayers":10}],"topPlayers":[{"username":"EksempelSpiller","uuid":"123e4567-e89b-42d3-a456-426614174001","sessions":3,"playtimeSeconds":7200,"lastSeen":"2026-10-01T12:00:00.000Z"}],"votes":{"total":12,"uniqueVoters":8}}}}}}},"404":{"description":"The server name was not found.","content":{"application/json":{"examples":{"example2":{"summary":"The server name was not found.","value":{"error":"Server not found"}}}}}}}}},"/servers/{name}":{"get":{"operationId":"servers-detail","tags":["servers"],"summary":"Server profile","description":"A server's public profile with its owner, players, ratings, boosts, vote counts and links.\n\nA missing server returns {\"error\":\"Server not found.\"} with HTTP 200. Cache-Control: no-store.\n\nBase fields and types match the server list. Additional fields: created/lastOnline are date strings|null, websiteURL/discordURL are string|null, vote counts are numbers, and serverBoosts is array|null containing uuid, username and since.\n\ndailyVotes uses the database day; weeklyVotes uses the current database week/year; monthlyVotes covers the last 30 days. serverPoints covers the last month, while totalVotes includes all votes.\n\nThe player list uses the same public-presence and vanish filters as the server list. MOTD may contain Minecraft formatting codes.","security":[],"parameters":[{"name":"name","in":"path","required":true,"description":"The server name. URL-encode it as a single path segment.","schema":{"type":"string","examples":["EksempelSMP"]}}],"responses":{"200":{"description":"Server object, or an error object if the name was not found. Missing servers also use HTTP 200.","content":{"application/json":{"examples":{"example1":{"summary":"Server object, or an error object if the name was not found. Missing servers also use HTTP 200.","value":{"name":"EksempelSMP","version":"1.21.4","descriptionLong":"En hyggelig survival-server.","vip":1,"pro":0,"maxPlayers":50,"status":"online","serverOwner":"123e4567-e89b-42d3-a456-426614174000","serverOwnerName":"EksempelEjer","category":"Survival","whitelist":0,"players":1,"playersData":[{"username":"EksempelSpiller","uuid":"123e4567-e89b-42d3-a456-426614174001","vip":0,"pro":0}],"serverPoints":120,"rates":[{"username":"EksempelSpiller","uuid":"123e4567-e89b-42d3-a456-426614174001","role":"player","points":1,"type":"positive","created":"2026-10-01T12:00:00.000Z"}],"motdLine1":"§6EksempelSMP","motdLine2":"§aVelkommen!","motdFavicon":null,"rate":1,"created":"2026-01-01T12:00:00.000Z","lastOnline":"2026-10-01T12:00:00.000Z","websiteURL":"https://example.com","discordURL":null,"serverBoosts":[{"uuid":"123e4567-e89b-42d3-a456-426614174001","username":"EksempelSpiller","since":"2026-10-01T12:00:00.000Z"}],"dailyVotes":2,"weeklyVotes":10,"monthlyVotes":35,"totalVotes":120}}}}}}}}},"/servers/{name}/favicon":{"get":{"operationId":"servers-favicon","tags":["servers"],"summary":"Server icon","description":"Streams the server's MOTD favicon as PNG, using the configured default icon when needed.\n\nMissing server: {\"error\":\"Server not found.\"}. Missing icon: {\"error\":\"No favicon found.\"}. Check Content-Type before interpreting the body.\n\nThe default icon may be cached in the API process for five minutes. This is not a guaranteed HTTP cache duration for the whole endpoint.","security":[],"parameters":[{"name":"name","in":"path","required":true,"description":"The server name. URL-encode it as a single path segment.","schema":{"type":"string","examples":["EksempelSMP"]}}],"responses":{"200":{"description":"Binary PNG when the server and an icon exist.\n\nHTTP 200 with a JSON error when the server is missing, or neither its icon nor the default icon exists.","content":{"image/png":{},"application/json":{"examples":{"example2":{"summary":"HTTP 200 with a JSON error when the server is missing, or neither its icon nor the default icon exists.","value":{"error":"No favicon found."}}}}}}}}},"/servers/{name}/store":{"get":{"operationId":"servers-store","tags":["servers"],"summary":"Server store catalog","description":"Categories, enabled products, EMS price quotes and buyer activity where public sharing is enabled. Reading the catalog does not make a purchase.\n\nAn unknown server returns HTTP 200 with {\"error\":\"Server not found.\"}. Cache-Control: no-store ensures current buyer privacy settings are respected.\n\ncategories contains uid/name/imageURL. products contains uid/type/name/price/priceDKK/intervals/volumeDiscounts/description/duration/categoryUID/imageURL/automaticDiscount/priceQuote. Image URLs and price fields may be null; imageUID is omitted from JSON.\n\nProduct types include standard, bulk, subscription and upgrade. A subscription's duration is measured in days; duration may be null for other products.\n\nvolumeDiscounts is {minimumQuantity,discountPercent}[] and is [] for non-bulk products. automaticDiscount is null or {discountPercent,label}. priceQuote is null when no valid EMS price exists.\n\npriceQuote contains unitPrice, quantity, subtotal, discountPercent, discountAmount and total (numbers), nextTier (discount tier|null), discountSource (volume|automatic|code|null), discountLabel and discountCode (string|null). Bulk quotes use intervals; other products use 1. Discounts do not stack: the largest monetary saving is selected.\n\nshowBuyers is a boolean. false produces empty topBuyers/recentBuyers. Otherwise the response includes up to five top buyers and six distinct recent buyers from the last 30 purchases. Only accepted EMS orders, excluding payouts, and publicly visible, non-vanished players are included.\n\nCatalog quotes include volume and automatic discounts, but not a user-entered discount code.","security":[],"parameters":[{"name":"name","in":"path","required":true,"description":"The server name. URL-encode it as a single path segment.","schema":{"type":"string","examples":["EksempelSMP"]}}],"responses":{"200":{"description":"Catalog object, or {error} for an unknown server. checkout.currency is EMS; product price/priceDKK values may be database decimal strings, while priceQuote uses numbers.","content":{"application/json":{"examples":{"example1":{"summary":"Catalog object, or {error} for an unknown server. checkout.currency is EMS; product price/priceDKK values may be database decimal strings, while priceQuote uses numbers.","value":{"checkout":{"version":1,"currency":"EMS","idempotency":true},"showBuyers":true,"topBuyers":[{"username":"EksempelSpiller","uuid":"123e4567-e89b-42d3-a456-426614174001","orders":4,"items":256,"spent":720,"spentCurrency":"EMS","lastPurchasedAt":"2026-10-01T12:00:00.000Z"}],"recentBuyers":[{"username":"EksempelSpiller","uuid":"123e4567-e89b-42d3-a456-426614174001","productName":"Diamanter","amount":180,"currency":"EMS","purchasedAt":"2026-10-01T12:00:00.000Z"}],"categories":[{"uid":"resources","name":"Ressourcer","imageURL":null}],"products":[{"uid":"diamonds","name":"Diamanter","type":"bulk","duration":null,"intervals":8,"price":"3.125","priceDKK":null,"volumeDiscounts":[{"minimumQuantity":64,"discountPercent":10},{"minimumQuantity":128,"discountPercent":15}],"description":"Diamanter til dine byggeprojekter.","categoryUID":"resources","imageURL":null,"automaticDiscount":null,"priceQuote":{"unitPrice":3.125,"quantity":8,"subtotal":25,"discountPercent":0,"discountAmount":0,"total":25,"nextTier":{"minimumQuantity":64,"discountPercent":10},"discountSource":null,"discountLabel":null,"discountCode":null}}]}}}}}},"503":{"description":"The catalog could not be loaded.","content":{"application/json":{"examples":{"example2":{"summary":"The catalog could not be loaded.","value":{"error":"Data kunne ikke hentes. Prøv igen."}}}}}}}}},"/information":{"get":{"operationId":"information-summary","tags":["information"],"summary":"Network information","description":"Get the network’s active MOTD, favicon, online count and total number of server and lobby joins.\n\nThe snapshot normally refreshes every minute. If several MOTDs are active, a different one may be selected on the next refresh.\n\nplayers is the total number of accounts marked online, not the number of publicly visible profiles.\n\ntotalJoins counts recorded server and lobby joins, not unique players.\n\nip is null in the current implementation. favicon, totalJoins, line1 and line2 start as null; players starts at 0.\n\nIf a refresh fails, the previous snapshot may remain available. The response does not include an update timestamp.","security":[],"parameters":[],"responses":{"200":{"description":"A snapshot of network information. Fields may be null at startup or when data is unavailable.","content":{"application/json":{"examples":{"example1":{"summary":"A snapshot of network information. Fields may be null at startup or when data is unavailable.","value":{"favicon":null,"ip":null,"players":12,"totalJoins":12000,"line1":"Velkommen til Example-netværket","line2":"Spil med dine venner"}}}}}}}}},"/information/rules":{"get":{"operationId":"information-rules","tags":["information"],"summary":"Network rules","description":"Get the shared network rules as HTML in a JSON object.\n\nThe rules are retrieved from the shared document source and cached for five minutes after a successful fetch.\n\nIf the fetch fails, the response contains previous HTML or html: null with HTTP 200. There is no separate status code for an upstream failure.\n\nThe response is application/json even though the html field contains an HTML document.","security":[],"parameters":[],"responses":{"200":{"description":"html is an HTML string, or null if the rules have not been retrieved yet.","content":{"application/json":{"examples":{"example1":{"summary":"html is an HTML string, or null if the rules have not been retrieved yet.","value":{"html":"<html><body><h1>Eksempel på regler</h1><p>Vis respekt for andre spillere.</p></body></html>"}}}}}}}}},"/lobbies/shoppylobby/market":{"get":{"operationId":"lobbies-market","tags":["lobbies"],"summary":"Shoppylobby shops and offers","description":"Get active, owned AreaShop regions and their ChestShop offers. The owner is the AreaShop plot owner, independently of the sign owner. Empty active plots have listings: [].\n\nNo parameters are required. The server is fixed to shoppylobby. The response includes both trade directions; this route has no item or plot filter.\n\nB/buyPrice is what the player pays the shop. S/sellPrice is what the shop pays the player. The price covers amount items; divide exactly to calculate the price per item.\n\nPrices are decimal strings. null means that trade direction is unavailable; 0 is a real offer. itemVariantKey is an item fingerprint, not an image URL or necessarily the history endpoint's itemId.\n\nSOLD/RESELL and unexpired RENTED regions can be included. If no unambiguous player record matches the owner UUID, playerID/username are null while the valid owner UUID is retained.\n\nThe HTTP response uses Cache-Control: no-store. The backend normally reuses its catalog for 30 seconds and checks expiration on every request. Mirrored data does not guarantee stock availability.","security":[],"parameters":[],"responses":{"200":{"description":"A catalog containing the server, fetch time, and shops.","content":{"application/json":{"examples":{"example1":{"summary":"A catalog containing the server, fetch time, and shops.","value":{"server":"shoppylobby","fetchedAt":"2030-06-01T12:00:00.000Z","shops":[{"id":"3333333333333333333333333333333333333333333333333333333333333333","server":"shoppylobby","world":"world","regionName":"example_plot","regionType":"RENT","owner":{"playerID":42,"uuid":"00000000-0000-4000-8000-000000000001","username":"ExamplePlayer"},"expiresAt":"2030-06-10T12:00:00.000Z","min":{"x":0,"y":0,"z":0},"max":{"x":15,"y":255,"z":15},"syncedAt":"2030-06-01T11:00:00.000Z","listings":[{"id":"4444444444444444444444444444444444444444444444444444444444444444","server":"shoppylobby","world":"world","regionName":"example_plot","x":5,"y":64,"z":5,"item":"Coal","itemMaterial":"COAL","itemKey":"minecraft:coal","itemJson":{"schemaVersion":1,"id":"minecraft:coal","material":"COAL","iconKey":"coal","amount":64},"itemVariantKey":"2222222222222222222222222222222222222222222222222222222222222222","amount":64,"buyPrice":"8.00000000","sellPrice":"4.00000000","syncedAt":"2030-06-01T11:00:00.000Z"}]}]}}}}}},"503":{"description":"The market is temporarily unavailable. Retry-After: 5.","content":{"application/json":{"examples":{"example2":{"summary":"The market is temporarily unavailable. Retry-After: 5.","value":{"error":"Market temporarily unavailable"}}}}}}}}},"/lobbies/shoppylobby/market/items/{itemId}/history":{"get":{"operationId":"lobbies-market-item-history","tags":["lobbies"],"summary":"An item's best historical prices","description":"Get recorded changes in the best price for one exact frontend item variant. buy tracks the lowest B price; sell tracks the highest S price per item.\n\nOnly direction and range are accepted as query parameters; each must be a single string. Unknown and repeated parameters are rejected.\n\nThe history job checks every 6 hours and stores the first price and unit-price changes. A change of owner or quantity at the same unit price does not create another point.\n\npoints can be empty. The first point may be an earlier observation just before the selected period; its recordedAt is unchanged. from is null for all.\n\nthrough only extends to the last known history update. lastCheckedAt can be null. An offer disappearing is not a zero-price point and does not establish stock or continuous availability.\n\nprice/amount describe the original trade. numerator/denominator give the exact unit price as integer strings; avoid floating-point comparisons.\n\nAt most 2,001 points are returned, including a possible predecessor. Large ranges select the first, last, lowest, and highest changes in chronological buckets across the full period; sampled/totalChanges describe the selection.\n\nHTTP: Cache-Control: no-store. The backend may reuse the same history response for 120 seconds. All timestamp fields are UTC.","security":[],"parameters":[{"name":"itemId","in":"path","required":true,"description":"Exactly 64 lowercase hexadecimal characters: the SHA-256 of the frontend's semantic item identity. Use the item page's id, not the raw itemVariantKey, material, or Minecraft id.","schema":{"type":"string","examples":["1111111111111111111111111111111111111111111111111111111111111111"]}},{"name":"direction","in":"query","required":false,"description":"buy or sell, from the player's perspective. Default: buy.","schema":{"type":"string","examples":["sell"]}},{"name":"range","in":"query","required":false,"description":"1m, 3m, or all. Months are UTC calendar months, with the day clamped to the last day of the target month. Default: 1m.","schema":{"type":"string","examples":["1m"]}}],"responses":{"200":{"description":"Price history with its observation cutoff and any recorded price changes.","content":{"application/json":{"examples":{"example1":{"summary":"Price history with its observation cutoff and any recorded price changes.","value":{"server":"shoppylobby","itemId":"1111111111111111111111111111111111111111111111111111111111111111","direction":"sell","range":"1m","fetchedAt":"2030-06-01T12:30:00.000Z","from":"2030-05-01T12:30:00.000Z","through":"2030-06-01T12:00:00.000Z","lastCheckedAt":"2030-06-01T12:00:00.000Z","sampled":false,"totalChanges":1,"points":[{"recordedAt":"2030-06-01T06:00:00.000Z","price":"8.00000000","amount":64,"numerator":"1","denominator":"8","owner":{"playerID":42,"uuid":"00000000-0000-4000-8000-000000000001","username":"ExamplePlayer"},"world":"world","regionName":"example_plot"}]}}}}}},"400":{"description":"Invalid id, query name, value, or repeated/nested query parameter.","content":{"application/json":{"examples":{"example2":{"summary":"Invalid id, query name, value, or repeated/nested query parameter.","value":{"error":"Invalid market history request"}}}}}},"503":{"description":"History is temporarily unavailable. Retry-After: 5.","content":{"application/json":{"examples":{"example3":{"summary":"History is temporarily unavailable. Retry-After: 5.","value":{"error":"Market history temporarily unavailable"}}}}}}}}},"/storeapi/v2/settings":{"get":{"operationId":"store-settings","tags":["store"],"summary":"Server resource reporting interval","description":"Get the backend's resource settings for the server integration.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nSeveral errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.","security":[{"serverKey":[]}],"parameters":[],"responses":{"200":{"description":"Resource interval in seconds; the existing backend returns 300 or 600.\n\nThe server key could not be authenticated.","content":{"application/json":{"examples":{"example1":{"summary":"Resource interval in seconds; the existing backend returns 300 or 600.","value":{"intervals":{"resources":300}}},"example2":{"summary":"The server key could not be authenticated.","value":{"error":"Invalid server api key"}}}}}},"406":{"description":"The server owner's active ban blocks access.","content":{"application/json":{"examples":{"example3":{"summary":"The server owner's active ban blocks access.","value":{"error":"Du er bannet og kan ikke tilgå dette endpoint"}}}}}}}}},"/storeapi/v2/purchases":{"get":{"operationId":"store-purchases","tags":["store"],"summary":"Fetch and renew pending purchases","description":"Poll the server's pending orders. This call renews subscriptions first, so it can change state even though it uses GET.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\namount is the order total; product.price is total/quantity. Preserve the total without unnecessary floating-point rounding.\n\nThe recipient's uuid is used for delivery. The list includes all pending orders for the server; it has no pagination or date-filter parameters.\n\nUse this call from the server integration. Avoid browser/CDN caching and automatic link previews: this GET can change balances and subscription status.\n\nItems and commands are delivered by the server integration; this response does not itself confirm delivery.\n\nChanges data: May create pending subscription orders, debit the player's EMS into escrow, and clear the renewal marker. Expired subscriptions or subscriptions that cannot be paid may be cancelled.","security":[{"serverKey":[]}],"parameters":[],"responses":{"200":{"description":"Pending purchases for the key's server; product is a JSON object.\n\nNo pending purchases, or a missing/unknown key.","content":{"application/json":{"examples":{"example1":{"summary":"Pending purchases for the key's server; product is a JSON object.","value":[{"id":"EXAMPLE_ORDER_UID","amount":"100.00","uuid":"00000000-0000-4000-8000-000000000001","product":{"type":"bulk","id":"example_product","name":"ExampleBundle","price":25,"quantity":4,"duration":null}}]},"example2":{"summary":"No pending purchases, or a missing/unknown key.","value":[]}}}}},"503":{"description":"Renewal failed.","content":{"application/json":{"examples":{"example3":{"summary":"Renewal failed.","value":{"error":"Unable to renew purchases. Please retry."}}}}}}},"x-side-effects":"May create pending subscription orders, debit the player's EMS into escrow, and clear the renewal marker. Expired subscriptions or subscriptions that cannot be paid may be cancelled."},"put":{"operationId":"store-purchases-accept","tags":["store"],"summary":"Accept a pending purchase","description":"Process one pending EMS order after the server's delivery flow. The order is looked up and processed under transaction locks.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nSeveral errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.\n\nThere is no idempotency-key field. An already processed purchase is rejected with Purchase is not pending; repeating the call does not return another success confirmation.\n\nThis route does not deliver Minecraft items itself. It cannot process payout orders or DKK payments.\n\nChanges data: Changes the order to accepted, records processed, releases escrow to the shop owner and any revenue-share recipients, and updates the subscription's next renewal when applicable.","security":[{"serverKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"example":{"purchase":"EXAMPLE_ORDER_UID"},"schema":{"type":"object","properties":{"purchase":{"type":"string","examples":["EXAMPLE_ORDER_UID"],"description":"The order UID from the purchase list's id field, 1–255 characters. It must identify one pending EMS order belonging to the key's server. Payout orders cannot be processed here."}},"required":["purchase"]}}}},"responses":{"200":{"description":"The order was processed.\n\nInvalid key, missing purchase, or an order that cannot be processed.\n\nAuthorization is missing.","content":{"text/html":{"examples":{"example1":{"summary":"The order was processed.","value":"success"},"example4":{"summary":"Authorization is missing.","value":"Invalid api key"}}},"application/json":{"examples":{"example2":{"summary":"Invalid key, missing purchase, or an order that cannot be processed.","value":{"error":"Purchase is not pending"}}}}}},"503":{"description":"Processing could not complete. Check the order status before retrying.","content":{"application/json":{"examples":{"example3":{"summary":"Processing could not complete. Check the order status before retrying.","value":{"error":"Unable to process purchase. Please retry."}}}}}}},"x-side-effects":"Changes the order to accepted, records processed, releases escrow to the shop owner and any revenue-share recipients, and updates the subscription's next renewal when applicable."}},"/storeapi/purchases/decline":{"put":{"operationId":"store-purchases-decline","tags":["store"],"summary":"Decline and refund a pending purchase","description":"Decline one pending EMS order for the server. The active decline route does not include /v2.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nSeveral errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.\n\nThe refund comes from pending escrow. Payout orders, DKK orders, and already processed orders are rejected.\n\nUse only example UIDs when reading the documentation. A real purchase id affects a real order and balance.\n\nChanges data: Changes the order to denied, records the reason and processing time, returns the reserved EMS to the payer, and cancels the related subscription when applicable.","security":[{"serverKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"example":{"purchase":"EXAMPLE_ORDER_UID","reason":"Example: the item could not be delivered"},"schema":{"type":"object","properties":{"purchase":{"type":"string","examples":["EXAMPLE_ORDER_UID"],"description":"The order UID from the purchase list's id field, 1–255 characters. It must identify one pending EMS order belonging to the key's server. Payout orders cannot be processed here."},"reason":{"type":"string","examples":["Example: the item could not be delivered"],"description":"Optional decline reason. A non-empty string is stored; a missing or non-string value becomes null."}},"required":["purchase"]}}}},"responses":{"200":{"description":"The order was processed.\n\nInvalid key, missing purchase, or an order that cannot be processed.\n\nAuthorization is missing.","content":{"text/html":{"examples":{"example1":{"summary":"The order was processed.","value":"success"}}},"application/json":{"examples":{"example2":{"summary":"Invalid key, missing purchase, or an order that cannot be processed.","value":{"error":"Purchase is not pending"}},"example4":{"summary":"Authorization is missing.","value":[]}}}}},"503":{"description":"Processing could not complete. Check the order status before retrying.","content":{"application/json":{"examples":{"example3":{"summary":"Processing could not complete. Check the order status before retrying.","value":{"error":"Unable to process purchase. Please retry."}}}}}}},"x-side-effects":"Changes the order to denied, records the reason and processing time, returns the reserved EMS to the payer, and cancels the related subscription when applicable."}},"/storeapi/pay":{"post":{"operationId":"store-pay","tags":["store"],"summary":"Pay EMS from the server owner","description":"Transfer EMS from the server owner's balance to a known player and create an accepted payout order with a log entry. This call transfers funds.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nSeveral errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.\n\nThe server owner's active global/temp ban blocks the payout; the owner must have sufficient funds.\n\nThere is no idempotency key or replay protection on this route. Repeating a successful request can transfer funds again.\n\nThe example body is synthetic. Only make this call for an intended payout from a trusted server integration.\n\nChanges data: Creates a payout order and EMS log entry, debits the server owner, and credits the recipient's balance.","security":[{"serverKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"example":{"target":"00000000-0000-4000-8000-000000000001","amount":10,"title":"ExamplePayout","description":"Synthetic example, not a real payout"},"schema":{"type":"object","properties":{"target":{"type":"string","examples":["00000000-0000-4000-8000-000000000001"],"description":"A UUID string validated by Zod; the recipient must exist."},"amount":{"type":"number","examples":[10],"description":"EMS amount as a JSON number. Send a positive amount; the existing validator specifies no minimum or maximum."},"title":{"type":"string","examples":["ExamplePayout"],"description":"3–255 characters. The payout order's title."},"description":{"type":"string","examples":["Synthetic example, not a real payout"],"description":"3–255 characters. The payout order's reason."}},"required":["target","amount","title","description"]}}}},"responses":{"200":{"description":"The payout completed.\n\nMissing key; other validation errors are also returned as text.\n\nThe owner has insufficient funds.","content":{"text/html":{"examples":{"example1":{"summary":"The payout completed.","value":"success"},"example2":{"summary":"Missing key; other validation errors are also returned as text.","value":"Invalid api key (1)"},"example3":{"summary":"The owner has insufficient funds.","value":"Insufficent owner balance"}}}}}},"x-side-effects":"Creates a payout order and EMS log entry, debits the server owner, and credits the recipient's balance."}},"/storeapi/v2/votes":{"get":{"operationId":"store-votes","tags":["store"],"summary":"Get the server's pending votes","description":"Get unprocessed votes for the key's server within the current vote window.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nIncludes today's votes and votes from the last hour. The day boundary follows the database date; the response's date field is a Unix timestamp in milliseconds.\n\nThis GET does not mark votes as processed. Use PUT /storeapi/v2/votes after the server's reward flow.","security":[{"serverKey":[]}],"parameters":[],"responses":{"200":{"description":"A list of vote UIDs, players, and timestamps.\n\nNo matches, or a missing/unknown key.","content":{"application/json":{"examples":{"example1":{"summary":"A list of vote UIDs, players, and timestamps.","value":[{"id":"EXAMPLE_VOTE_UID","username":"ExamplePlayer","uuid":"00000000-0000-4000-8000-000000000001","date":1893499200000}]},"example2":{"summary":"No matches, or a missing/unknown key.","value":[]}}}}}}},"put":{"operationId":"store-votes-process","tags":["store"],"summary":"Mark votes as processed","description":"Set processed on vote UIDs belonging to the key's server. This endpoint does not give the player a reward itself.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nSeveral errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.\n\nVotes belonging to other servers are unchanged. Unknown UIDs can still return success: true because affectedRows is not checked.\n\nChanges data: Sets processed to the current time on matching server votes. Repeating the call can change the processed timestamp again.","security":[{"serverKey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"example":{"votes":["EXAMPLE_VOTE_UID"]},"schema":{"type":"object","properties":{"votes":{"type":"array","items":{},"examples":[["EXAMPLE_VOTE_UID"]],"description":"A non-empty list of vote UIDs. Send UID strings; the route validates the array and its length, but not each element's type."}},"required":["votes"]}}}},"responses":{"200":{"description":"The update completed; the response does not report the number of matches.\n\nThe body, array, or key is invalid.\n\nAuthorization is missing.","content":{"application/json":{"examples":{"example1":{"summary":"The update completed; the response does not report the number of matches.","value":{"success":true}},"example2":{"summary":"The body, array, or key is invalid.","value":{"error":"Invalid parameters"}},"example3":{"summary":"Authorization is missing.","value":[]}}}}}},"x-side-effects":"Sets processed to the current time on matching server votes. Repeating the call can change the processed timestamp again."}},"/storeapi/v2/votes/players/{uuid}":{"get":{"operationId":"store-player-votes","tags":["store"],"summary":"Get a player's votes on the server","description":"Get all known votes for the player and the key's server, including processed votes. This route has no day filter or pagination.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\ndate is a Unix timestamp in milliseconds. No sort order is guaranteed, and there is no parameter for limiting the history.","security":[{"serverKey":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"description":"The player's UUID. The player must exist; these vote routes use a database lookup without a separate UUID format validator.","schema":{"type":"string","examples":["00000000-0000-4000-8000-000000000001"]}}],"responses":{"200":{"description":"The vote list.\n\nNo matches, or a missing/unknown key.\n\nThe player does not exist.","content":{"application/json":{"examples":{"example1":{"summary":"The vote list.","value":[{"id":"EXAMPLE_VOTE_UID","username":"ExamplePlayer","uuid":"00000000-0000-4000-8000-000000000001","date":1893499200000}]},"example2":{"summary":"No matches, or a missing/unknown key.","value":[]},"example3":{"summary":"The player does not exist.","value":{"error":"Invalid player"}}}}}}}}},"/storeapi/v2/votes/players/{uuid}/pending":{"get":{"operationId":"store-player-pending-vote","tags":["store"],"summary":"Find a player's pending vote","description":"Get one unprocessed vote for the player on the server within the current vote window.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nIncludes today's votes and votes from the last hour. The day boundary follows the database date; the response's date field is a Unix timestamp in milliseconds.\n\nIf several votes match, one is returned without a guaranteed sort order. The response does not mark it as processed; an unknown server key can return No pending votes.","security":[{"serverKey":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"description":"The player's UUID. The player must exist; these vote routes use a database lookup without a separate UUID format validator.","schema":{"type":"string","examples":["00000000-0000-4000-8000-000000000001"]}}],"responses":{"200":{"description":"One matching vote.\n\nNo matching pending vote.\n\nThe player does not exist.\n\nAuthorization is missing.","content":{"application/json":{"examples":{"example1":{"summary":"One matching vote.","value":{"id":"EXAMPLE_VOTE_UID","username":"ExamplePlayer","uuid":"00000000-0000-4000-8000-000000000001","date":1893499200000}},"example2":{"summary":"No matching pending vote.","value":{"error":"No pending votes"}},"example3":{"summary":"The player does not exist.","value":{"error":"Invalid player"}},"example4":{"summary":"Authorization is missing.","value":[]}}}}}}}},"/storeapi/v2/votes/players/{uuid}/hasvoted":{"get":{"operationId":"store-player-has-voted","tags":["store"],"summary":"Has the player voted on the server?","description":"Check whether a vote exists in the current vote window. Processed votes also count.\n\nThe API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.\n\nIncludes today's votes and votes from the last hour. The day boundary follows the database date; the response's date field is a Unix timestamp in milliseconds.\n\nThis response does not indicate reward delivery or processed status.","security":[{"serverKey":[]}],"parameters":[{"name":"uuid","in":"path","required":true,"description":"The player's UUID. The player must exist; these vote routes use a database lookup without a separate UUID format validator.","schema":{"type":"string","examples":["00000000-0000-4000-8000-000000000001"]}}],"responses":{"200":{"description":"Vote status.\n\nNo matching vote, or an unknown key.\n\nThe player does not exist.\n\nAuthorization is missing.","content":{"application/json":{"examples":{"example1":{"summary":"Vote status.","value":{"hasVoted":true}},"example2":{"summary":"No matching vote, or an unknown key.","value":{"hasVoted":false}},"example3":{"summary":"The player does not exist.","value":{"error":"Invalid player"}},"example4":{"summary":"Authorization is missing.","value":[]}}}}}}}}}}