SuperAwesome

Developer documentation

The SuperAwesome API

Build around the Minecraft community. Explore players, servers and network information, or connect your server store.

27 documented endpoints · 17 without authentication

Your first request
Quick start
curl --request GET 'https://api.superawesome.dk/information' \
  --header 'Accept: application/json'

Use HTTPS. The network information endpoint needs no API key.

Base URL

https://api.superawesome.dk

Responses are usually JSON. See each endpoint for exceptions and time formats.

Authentication

Public lookups need no key. Store plugins send their raw server key as the entire Authorization header value.

Keep server keys in your server or plugin; the snippets contain placeholders.

Response handling

Check the HTTP status and response body. Some legacy errors use 200. Preserve decimal price strings and respect privacy-filtered player data.

Examples are illustrative and use synthetic player and order data.

API reference

27 endpoints

Players/players

Find players, public profiles, staff and leaderboards.

GET
/players

Player list

The current player list is a placeholder and always returns an empty array. Use search or a direct lookup to find a player.

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • This route does not support pagination or filtering.
  • Player routes return Cache-Control: no-store.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/players' \
  --header 'Accept: application/json'

Response example

An empty array; this endpoint does not provide a player directory yet.

200 · application/json
[]
GET
/players/staff

Staff players

Get the username, UUID, role and visible status of staff Minecraft accounts.

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • Includes the admin, seniormod, developer, mod, support and bygger roles. CONSOLE is excluded.
  • Hidden presence is reported as offline. Cache-Control: no-store.
  • This route has no separate status code for a failed database read; the response may be null.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/players/staff' \
  --header 'Accept: application/json'

Response example

An array of staff members.

200 · application/json
[
  {
    "username": "ExampleStaff",
    "uuid": "22222222-2222-4222-8222-222222222222",
    "role": "support",
    "status": "offline"
  }
]
GET
/players/leaderboards

Player leaderboards

Get leaderboards for playtime, player points, lobby points and ratings, plus playtime over the last 30, 90, 180 and 365 days.

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • value is measured in seconds for playtime, points for playerPoints/lobbyPoints and a weighted score for ratings. rank starts at 1.
  • All periods are returned under playtimePeriods; this route does not accept period or limit parameters.
  • Playtime from a single session is capped at seven days. Only a valid, current open session can continue accruing time.
  • Totals normally refresh every 300 seconds. During a refresh or a temporary failure, a response may be up to 900 seconds old; check updatedAt.
  • Hidden players are excluded on every request, including when leaderboard totals come from cache. The HTTP response uses Cache-Control: no-store.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/players/leaderboards' \
  --header 'Accept: application/json'

Response example

All leaderboards in one response, with up to 100 players per leaderboard.

200 · application/json
{
  "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
      }
    ]
  }
}
GET
/players/{lookup}/profile

Player profile

Get a public profile with rank, points, ban status, playtime, ratings, activity, servers, badges and friends. lookup is a username or UUID.

Permalink
No authentication required

Parameters

lookuppath · stringrequired

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.

Behavior

  • activity contains daily session counts and playtime from the start of the day 182 days ago. favoriteServers and recentSessions contain up to eight results each.
  • Playtime is measured in seconds, with each session capped at seven days. The current loginStreak determines today and yesterday in Europe/Copenhagen.
  • When 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.
  • Badges 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.
  • favoriteServers contains name, status, category, version, motdFavicon, sessions, playtimeSeconds and lastSeen. recentSessions contains name, type, joinedAt, leftAt and playtimeSeconds.
  • ownedServers contains name, status, category, version, created, descriptionLong, motdFavicon, players and maxPlayers. badges contains name, description, color, symbol, active and created.
  • serverBoosts contains name and since. friends contains username, uuid, role, friendsSince, status and currentServer.
  • cached 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.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/players/ExamplePlayer/profile' \
  --header 'Accept: application/json'

Response example

A public player profile. Some fields may be null, and activity may be hidden.

200 · application/json
{
  "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"
}
GET
/players/{lookup}

Compact player lookup

Look up a player by username or UUID. With type=discord, lookup matches a Discord ID instead and may return multiple linked Minecraft accounts.

Permalink
No authentication required

Parameters

lookuppath · stringrequired

Username or UUID; with type=discord, use a Discord ID. This route does not explicitly validate the length or UUID format.

typequery · stringoptional

Only the exact value discord enables Discord lookup. If omitted or set to another value, lookup uses username/UUID.

Behavior

  • No match returns HTTP 200 with {"error":"Spilleren blev ikke fundet"}, not HTTP 404. A failed data read can also return this error.
  • With type=discord, a successful response is an array of player objects without cached and cachedAt. Example: /players/123456789012345678?type=discord.
  • rates contains each rater’s username, uuid, role, points, type and created. rate is the sum of points. lobbyAccess is an array of lobby names.
  • badges contains name, color, symbol, active and created; serverBoosts contains name and since. servers lists owned servers with name, status and version.
  • If the player owns no servers, servers may contain an object with null fields instead of an empty array.
  • Hidden 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.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/players/ExamplePlayer' \
  --header 'Accept: application/json'

Response example

A player object for a normal lookup, an array for type=discord, or an error object if the player is not found.

200 · application/json
{
  "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/servers

Discover servers, player counts, statistics and server storefronts.

GET
/servers

Find servers

Paginated server list with owners, visible online players, MOTD and ratings. Online servers appear first, followed by player count descending and name ascending.

Permalink
No authentication required

Parameters

sizequery · integeroptional

Servers per page. Positive integers above 100 are capped at 100; invalid or non-positive values use the default.

Default: 3

pagequery · integeroptional

Page number, starting at 1. Capped at 10,000; invalid values use the default.

Default: 1

queryquery · stringoptional

Server-name search, trimmed and limited to 100 characters. Omit it to match all names.

Default:

categoryquery · stringoptional

Exact category name, trimmed and limited to 100 characters. An empty value includes all categories.

Default:

statusquery · "online" | "offline" | "all"optional

Status filter. Other values fall back to online.

Default: online

Behavior

  • Cache-Control: no-store. X-Has-More contains the string true/false and is exposed through CORS; another page exists only when it is true.
  • vip, 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.
  • descriptionLong, 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.
  • The 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.
  • query is used as a SQL LIKE pattern; % and _ can act as wildcards. The response does not include a total page count.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/servers?size=20&page=1&query=Eksempel&status=all' \
  --header 'Accept: application/json'

Response example

Array of servers; [] when the page has no results.

200 · application/json
[
  {
    "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
  }
]
GET
/servers/stats

Player history for all servers

Minute samples from the last 24 hours for servers with statistics and a linked owner.

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • No path or query parameters. An empty dataset is []. players may be [] when legacy statistics are missing or cannot be parsed.
  • This is the legacy aggregate statistics format. Use /servers/stats/{serverName} for history, topPlayers and votes over a selected range.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/servers/stats' \
  --header 'Accept: application/json'

Response example

Array containing serverName, serverOwnerUUID, serverOwner, maxPlayers and players. players maps Unix timestamps in seconds to player counts.

200 · application/json
[
  {
    "serverName": "EksempelSMP",
    "serverOwnerUUID": "123e4567-e89b-42d3-a456-426614174000",
    "serverOwner": "EksempelEjer",
    "maxPlayers": 50,
    "players": {
      "1790856000": 3,
      "1790856060": 5
    }
  }
]
GET
/servers/stats/montly

30-day player history for all servers

Daily playersOnline samples from the last 30 days. The existing URL is spelled montly.

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • No query parameters. Servers without samples or an owner are excluded; players may be [] when data cannot be parsed.
  • Use /montly, not /monthly. The literal montly route is matched before the dynamic serverName segment.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/servers/stats/montly' \
  --header 'Accept: application/json'

Response example

Same object structure as the 24-hour statistics; players keys are Unix timestamps in seconds for daily samples.

200 · application/json
[
  {
    "serverName": "EksempelSMP",
    "serverOwnerUUID": "123e4567-e89b-42d3-a456-426614174000",
    "serverOwner": "EksempelEjer",
    "maxPlayers": 50,
    "players": {
      "1790769600": 4,
      "1790856000": 6
    }
  }
]
GET
/servers/stats/{serverName}

Statistics for one server

Player history, the ten players with the most recorded playtime, and vote counts over a selected range.

Permalink
No authentication required

Parameters

serverNamepath · stringrequired

The server name as a single URL-encoded path segment.

rangequery · "24h" | "7d" | "30d"optional

24h uses minute samples; 7d/30d use daily samples. Omitting range selects 30d.

Default: 30d

Behavior

  • history 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.
  • maxPlayers is the server's explicitly stored capacity or 0; this endpoint does not use the VIP/PRO default capacity from the server list.
  • topPlayers 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.
  • Cache-Control: public, max-age=60, stale-while-revalidate=240. The API process may reuse the same server/range payload for five minutes.
  • An existing server with no activity returns empty arrays and zero votes. The aggregate statistics router is mounted before /servers/{name}.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/servers/stats/EksempelSMP?range=7d' \
  --header 'Accept: application/json'

Response example

serverName/range are strings, maxPlayers is a number, history and topPlayers are arrays, and votes contains total and uniqueVoters.

200 · application/json
{
  "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
  }
}
GET
/servers/{name}

Server profile

A server's public profile with its owner, players, ratings, boosts, vote counts and links.

Permalink
No authentication required

Parameters

namepath · stringrequired

The server name. URL-encode it as a single path segment.

Behavior

  • A missing server returns {"error":"Server not found."} with HTTP 200. Cache-Control: no-store.
  • Base 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.
  • dailyVotes 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.
  • The player list uses the same public-presence and vanish filters as the server list. MOTD may contain Minecraft formatting codes.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/servers/EksempelSMP' \
  --header 'Accept: application/json'

Response example

Server object, or an error object if the name was not found. Missing servers also use HTTP 200.

200 · application/json
{
  "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
}
GET
/servers/{name}/favicon

Server icon

Streams the server's MOTD favicon as PNG, using the configured default icon when needed.

Permalink
No authentication required

Parameters

namepath · stringrequired

The server name. URL-encode it as a single path segment.

Behavior

  • Missing server: {"error":"Server not found."}. Missing icon: {"error":"No favicon found."}. Check Content-Type before interpreting the body.
  • The default icon may be cached in the API process for five minutes. This is not a guaranteed HTTP cache duration for the whole endpoint.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/servers/EksempelSMP/favicon' \
  --header 'Accept: image/png, application/json'

Response example

Binary PNG when the server and an icon exist.

GET
/servers/{name}/store

Server store catalog

Categories, enabled products, EMS price quotes and buyer activity where public sharing is enabled. Reading the catalog does not make a purchase.

Permalink
No authentication required

Parameters

namepath · stringrequired

The server name. URL-encode it as a single path segment.

Behavior

  • An unknown server returns HTTP 200 with {"error":"Server not found."}. Cache-Control: no-store ensures current buyer privacy settings are respected.
  • categories 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.
  • Product types include standard, bulk, subscription and upgrade. A subscription's duration is measured in days; duration may be null for other products.
  • volumeDiscounts is {minimumQuantity,discountPercent}[] and is [] for non-bulk products. automaticDiscount is null or {discountPercent,label}. priceQuote is null when no valid EMS price exists.
  • priceQuote 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.
  • showBuyers 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.
  • Catalog quotes include volume and automatic discounts, but not a user-entered discount code.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/servers/EksempelSMP/store' \
  --header 'Accept: application/json'

Response example

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.

200 · application/json
{
  "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
      }
    }
  ]
}

Information/information

Network status, player counts and community rules.

GET
/information

Network information

Get the network’s active MOTD, favicon, online count and total number of server and lobby joins.

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • The snapshot normally refreshes every minute. If several MOTDs are active, a different one may be selected on the next refresh.
  • players is the total number of accounts marked online, not the number of publicly visible profiles.
  • totalJoins counts recorded server and lobby joins, not unique players.
  • ip is null in the current implementation. favicon, totalJoins, line1 and line2 start as null; players starts at 0.
  • If a refresh fails, the previous snapshot may remain available. The response does not include an update timestamp.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/information' \
  --header 'Accept: application/json'

Response example

A snapshot of network information. Fields may be null at startup or when data is unavailable.

200 · application/json
{
  "favicon": null,
  "ip": null,
  "players": 12,
  "totalJoins": 12000,
  "line1": "Velkommen til Example-netværket",
  "line2": "Spil med dine venner"
}
GET
/information/rules

Network rules

Get the shared network rules as HTML in a JSON object.

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • The rules are retrieved from the shared document source and cached for five minutes after a successful fetch.
  • If the fetch fails, the response contains previous HTML or html: null with HTTP 200. There is no separate status code for an upstream failure.
  • The response is application/json even though the html field contains an HTML document.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/information/rules' \
  --header 'Accept: application/json'

Response example

html is an HTML string, or null if the rules have not been retrieved yet.

200 · application/json
{
  "html": "<html><body><h1>Eksempel på regler</h1><p>Vis respekt for andre spillere.</p></body></html>"
}

Lobbies/lobbies

Shoppylobby shops, item offers and historical market prices.

GET
/lobbies/shoppylobby/market

Shoppylobby shops and offers

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: [].

Permalink
No authentication required

This endpoint has no request parameters.

Behavior

  • No parameters are required. The server is fixed to shoppylobby. The response includes both trade directions; this route has no item or plot filter.
  • B/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.
  • Prices 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.
  • SOLD/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.
  • The 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.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/lobbies/shoppylobby/market' \
  --header 'Accept: application/json'

Response example

A catalog containing the server, fetch time, and shops.

200 · application/json
{
  "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"
        }
      ]
    }
  ]
}
GET
/lobbies/shoppylobby/market/items/{itemId}/history

An item's best historical prices

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.

Permalink
No authentication required

Parameters

itemIdpath · stringrequired

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.

directionquery · stringoptional

buy or sell, from the player's perspective.

Default: buy

rangequery · stringoptional

1m, 3m, or all. Months are UTC calendar months, with the day clamped to the last day of the target month.

Default: 1m

Behavior

  • Only direction and range are accepted as query parameters; each must be a single string. Unknown and repeated parameters are rejected.
  • The 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.
  • points 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.
  • through 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.
  • price/amount describe the original trade. numerator/denominator give the exact unit price as integer strings; avoid floating-point comparisons.
  • At 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.
  • HTTP: Cache-Control: no-store. The backend may reuse the same history response for 120 seconds. All timestamp fields are UTC.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/lobbies/shoppylobby/market/items/1111111111111111111111111111111111111111111111111111111111111111/history?direction=sell&range=1m' \
  --header 'Accept: application/json'

Response example

Price history with its observation cutoff and any recorded price changes.

200 · application/json
{
  "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"
    }
  ]
}

Store API/storeapi

Connect a server plugin to purchases, delivery, payments and votes.

GET
/storeapi/v2/settings

Server resource reporting interval

Get the backend's resource settings for the server integration.

Permalink
Authorization: YOUR_SERVER_API_KEY

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Several errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/storeapi/v2/settings' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY'

Response example

Resource interval in seconds; the existing backend returns 300 or 600.

200 · application/json
{
  "intervals": {
    "resources": 300
  }
}
GET
/storeapi/v2/purchases

Fetch and renew pending purchases

Poll the server's pending orders. This call renews subscriptions first, so it can change state even though it uses GET.

Permalink
Authorization: YOUR_SERVER_API_KEYChanges 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.

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • amount is the order total; product.price is total/quantity. Preserve the total without unnecessary floating-point rounding.
  • The recipient's uuid is used for delivery. The list includes all pending orders for the server; it has no pagination or date-filter parameters.
  • Use this call from the server integration. Avoid browser/CDN caching and automatic link previews: this GET can change balances and subscription status.
  • Items and commands are delivered by the server integration; this response does not itself confirm delivery.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/storeapi/v2/purchases' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY'

Response example

Pending purchases for the key's server; product is a JSON object.

200 · application/json
[
  {
    "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
    }
  }
]
PUT
/storeapi/v2/purchases

Accept a pending purchase

Process one pending EMS order after the server's delivery flow. The order is looked up and processed under transaction locks.

Permalink
Authorization: YOUR_SERVER_API_KEYChanges 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.

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

purchasebody · stringrequired

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.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Several errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.
  • There 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.
  • This route does not deliver Minecraft items itself. It cannot process payout orders or DKK payments.

Request example

cURL request
curl --request PUT 'https://api.superawesome.dk/storeapi/v2/purchases' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data-raw '{"purchase":"EXAMPLE_ORDER_UID"}'

Response example

The order was processed.

200 · text/html
success
PUT
/storeapi/purchases/decline

Decline and refund a pending purchase

Decline one pending EMS order for the server. The active decline route does not include /v2.

Permalink
Authorization: YOUR_SERVER_API_KEYChanges 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.

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

purchasebody · stringrequired

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.

reasonbody · stringoptional

Optional decline reason. A non-empty string is stored; a missing or non-string value becomes null.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Several errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.
  • The refund comes from pending escrow. Payout orders, DKK orders, and already processed orders are rejected.
  • Use only example UIDs when reading the documentation. A real purchase id affects a real order and balance.

Request example

cURL request
curl --request PUT 'https://api.superawesome.dk/storeapi/purchases/decline' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data-raw '{"purchase":"EXAMPLE_ORDER_UID","reason":"Example: the item could not be delivered"}'

Response example

The order was processed.

200 · text/html
success
POST
/storeapi/pay

Pay EMS from the server owner

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.

Permalink
Authorization: YOUR_SERVER_API_KEYChanges data

Creates a payout order and EMS log entry, debits the server owner, and credits the recipient's balance.

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

targetbody · stringrequired

A UUID string validated by Zod; the recipient must exist.

amountbody · numberrequired

EMS amount as a JSON number. Send a positive amount; the existing validator specifies no minimum or maximum.

titlebody · stringrequired

3–255 characters. The payout order's title.

descriptionbody · stringrequired

3–255 characters. The payout order's reason.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Several errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.
  • The server owner's active global/temp ban blocks the payout; the owner must have sufficient funds.
  • There is no idempotency key or replay protection on this route. Repeating a successful request can transfer funds again.
  • The example body is synthetic. Only make this call for an intended payout from a trusted server integration.

Request example

cURL request
curl --request POST 'https://api.superawesome.dk/storeapi/pay' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data-raw '{"target":"00000000-0000-4000-8000-000000000001","amount":10,"title":"ExamplePayout","description":"Synthetic example, not a real payout"}'

Response example

The payout completed.

200 · text/html
success
GET
/storeapi/v2/votes

Get the server's pending votes

Get unprocessed votes for the key's server within the current vote window.

Permalink
Authorization: YOUR_SERVER_API_KEY

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Includes 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.
  • This GET does not mark votes as processed. Use PUT /storeapi/v2/votes after the server's reward flow.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/storeapi/v2/votes' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY'

Response example

A list of vote UIDs, players, and timestamps.

200 · application/json
[
  {
    "id": "EXAMPLE_VOTE_UID",
    "username": "ExamplePlayer",
    "uuid": "00000000-0000-4000-8000-000000000001",
    "date": 1893499200000
  }
]
PUT
/storeapi/v2/votes

Mark votes as processed

Set processed on vote UIDs belonging to the key's server. This endpoint does not give the player a reward itself.

Permalink
Authorization: YOUR_SERVER_API_KEYChanges data

Sets processed to the current time on matching server votes. Repeating the call can change the processed timestamp again.

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

votesbody · arrayrequired

A non-empty list of vote UIDs. Send UID strings; the route validates the array and its length, but not each element's type.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Several errors are returned with HTTP 200 as JSON or text. Check the response body even when the HTTP status is 200.
  • Votes belonging to other servers are unchanged. Unknown UIDs can still return success: true because affectedRows is not checked.

Request example

cURL request
curl --request PUT 'https://api.superawesome.dk/storeapi/v2/votes' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data-raw '{"votes":["EXAMPLE_VOTE_UID"]}'

Response example

The update completed; the response does not report the number of matches.

200 · application/json
{
  "success": true
}
GET
/storeapi/v2/votes/players/{uuid}

Get a player's votes on the server

Get all known votes for the player and the key's server, including processed votes. This route has no day filter or pagination.

Permalink
Authorization: YOUR_SERVER_API_KEY

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

uuidpath · stringrequired

The player's UUID. The player must exist; these vote routes use a database lookup without a separate UUID format validator.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • date is a Unix timestamp in milliseconds. No sort order is guaranteed, and there is no parameter for limiting the history.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/storeapi/v2/votes/players/00000000-0000-4000-8000-000000000001' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY'

Response example

The vote list.

200 · application/json
[
  {
    "id": "EXAMPLE_VOTE_UID",
    "username": "ExamplePlayer",
    "uuid": "00000000-0000-4000-8000-000000000001",
    "date": 1893499200000
  }
]
GET
/storeapi/v2/votes/players/{uuid}/pending

Find a player's pending vote

Get one unprocessed vote for the player on the server within the current vote window.

Permalink
Authorization: YOUR_SERVER_API_KEY

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

uuidpath · stringrequired

The player's UUID. The player must exist; these vote routes use a database lookup without a separate UUID format validator.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Includes 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.
  • If 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.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/storeapi/v2/votes/players/00000000-0000-4000-8000-000000000001/pending' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY'

Response example

One matching vote.

200 · application/json
{
  "id": "EXAMPLE_VOTE_UID",
  "username": "ExamplePlayer",
  "uuid": "00000000-0000-4000-8000-000000000001",
  "date": 1893499200000
}
GET
/storeapi/v2/votes/players/{uuid}/hasvoted

Has the player voted on the server?

Check whether a vote exists in the current vote window. Processed votes also count.

Permalink
Authorization: YOUR_SERVER_API_KEY

Parameters

Authorizationheader · stringrequired

The server API key as the entire header value. Do not prefix it with Bearer or use an account token.

uuidpath · stringrequired

The player's UUID. The player must exist; these vote routes use a database lookup without a separate UUID format validator.

Behavior

  • The API key determines the server. These routes do not enforce an IP restriction. Keep the key in server-side code.
  • Includes 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.
  • This response does not indicate reward delivery or processed status.

Request example

cURL request
curl --request GET 'https://api.superawesome.dk/storeapi/v2/votes/players/00000000-0000-4000-8000-000000000001/hasvoted' \
  --header 'Accept: application/json' \
  --header 'Authorization: YOUR_SERVER_API_KEY'

Response example

Vote status.

200 · application/json
{
  "hasVoted": true
}