STYGION API
Server status, releases, documentation, modpack performance and your own account, over plain HTTP. Every operation is also a tool for AI assistants over MCP, under the same name. This reference is generated from the OpenAPI document the API publishes, so it lists exactly what the API answers.
Base address
Every path below starts here. Answers are JSON; anything a person reads follows the accept-language header.
https://stygion.eu/api/v1 Sign-in and scopes
An operation with no scope answers anybody. Some of them answer a signed-in person differently, and a few need a sign-in at all (they say so with 401).
An operation with a scope acts on the account that asks. On this website it uses your sign-in; outside it, the way in is MCP, where you sign in with Discord and the assistant can do only what your account can.
We do not issue API keys for other projects. If you need one, write to us and say what you are building.
Errors
Every error, from every operation, has the same shape. The code is stable and meant for programs; the message is for people and follows accept-language.
| Field | Type and meaning |
|---|---|
code always | string Stable and machine readable. |
message always | string In the reader's language. |
requestId | string Quote this when reporting a problem. |
MCP for AI assistants
Connect an assistant to this address. It signs in with OAuth 2.1 through Discord, and sees only the tools your account may use. Each tool is named after the operation here: the reference page of an operation shows the same call as a tool.
https://mcp.stygion.eu/mcp/v1 OpenAPI
OpenAPI 3.1, API version dev.
Other APIs
- The local API of a Keystone server
Runs on every server with Keystone, not with us. Its own keys, scopes and OpenAPI.
- Play buttons for your website
An address and an image that install your pack and join your server.
Operations 104 operations
Worlds 4 operations
- GET Which of our worlds are up, and how many people are on them
/status/worlds - GET What a launcher needs to put somebody in a world: the pack, its version and the address
/worlds/{key}/join - GET How a world's season is going: what the whole server has finished together, who leads each craft, which chapters nobody has touched, and the teams
/worlds/{key}/leaders - GET One player's season on one world: their progress, chapter by chapter
/worlds/{key}/players/{player}
Releases and updates 12 operations
- GET Every released version, newest first
/releases - GET One version, with everything that changed in it
/releases/{id} - GET The highest channel each product actually has a build in
/status/products - GET Everything there is to download for one product, with sizes and systems in words
/updates/builds - GET The newest version of a product that installs from a script (STYGION OS): version, sha256 and pinned addresses of the tarball, its signature and install.sh
/updates/bundle/{app} - GET One file of the newest version of a script-installed product, under an address that never changes: install.sh, bundle.tar.gz or bundle.tar.gz.minisig
/updates/bundle/{app}/{file} - GET What changed between two versions, in the reader's language
/updates/changelog - GET The file itself
/updates/download - GET The oldest Keystone the launcher will install for a server
/updates/keystone-min-safe - GET The newest build worth offering a visitor, and where to get it
/updates/latest - GET Whether a desktop client should update, and the manifest if it should
/updates/update-check - GET The same question for a self-hosted build, which ships as a tarball
/updates/update-check-server
Documentation 5 operations
- GET One documentation page as the markdown it is written in, in the reader's language where we have it
/docs/markdown/{slug} - GET The tree of the documentation, as this reader is allowed to see it
/docs/outline - GET One documentation page, rendered, in the reader's language where we have it
/docs/pages/{slug} - POST Did this page help
/docs/rating - GET Search the documentation in both languages at once
/docs/search
Articles and artwork 6 operations
- GET What we have written, newest first, in the reader's language
/articles - GET One article, with everything it says
/articles/{slug} - GET The newest of everything we write and everything we release, in one list
/news - GET What supporting the project pays for, and the ways to do it
/support - GET Our artwork, in the sizes that were actually rendered
/wallpapers - GET One wallpaper, so it can be linked to rather than only browsed
/wallpapers/{id}
Product catalogue 1 operation
- GET What a product page says the thing does
/catalog/{product}/features
Modpack performance 14 operations
- POST Start a benchmark: a one-time nonce for perf.submit for this kind
/perf/begin - GET Processor models to pick from, with the single-thread speed we have measured for each — from the empty tick of the runs people send, never from somebody else's score table
/perf/cpus - GET How one modpack is likely to run on a machine like yours: an average frame-rate range, 1 % low, memory and load time, with how many runs and senders it stands on and whether it was measured on similar PCs or estimated from others
/perf/estimate - GET The same estimate for up to 50 modpacks at once ("portal:projectId" separated by commas), for a page of search results
/perf/estimates - GET Graphics cards to pick from, with how many accepted client runs were measured on each
/perf/gpus - GET The metric registry the performance page renders by: every figure's key, unit, which way is better, side, group, Czech and English label and one sentence of what it means
/perf/metrics - GET The benchmark runs you sent while signed in, newest first, with whether each was accepted and why not
/perf/mine - POST Join an instance's benchmark key (a launcher's or a server's, from perf.begin) to your account: the runs sent under it become yours (perf.mine) and every later run under the key is the account's
/perf/mine/claim - POST Take back benchmark runs you sent: the ones named by id, or all of them with all: true (an empty list is refused, never read as all)
/perf/mine/forget - GET What one modpack costs a server, on a machine like yours: how many players packs like it held, what gave out first, and the runs behind every number with how far off each one is
/perf/open - GET Search CurseForge and Modrinth for a modpack by name, to ask what it costs a server
/perf/packs - GET What one set of mods costs a server: how many players it holds, what gives out first, and what each mod in it costs — every number with the count of runs behind it, and no number at all where there are not enough
/perf/packs/{fingerprint} - GET The recommended preset for one modpack on a machine like yours, with the runs behind it — or none, when there is not enough evidence to recommend anything
/perf/recommend - POST Send one measurement of a modpack — a load test from a server, a benchmark from a client
/perf/runs
Play buttons 12 operations
- GET What one Play button says, for drawing the picture of it
/play/badge - POST A Play button's page was opened (view) or its button pressed (click)
/play/count - GET The Play buttons you have made, and how often each was used
/play/links - POST Makes a Play button for a server, to put on its own website
/play/links - POST Delete one of your Play buttons and its numbers for good
/play/links/delete - POST Changes a Play button that is already on somebody's page — where it goes, what it is called, which pack it installs
/play/links/edit - POST Takes one of your Play buttons down
/play/links/revoke - POST What a Play link means: which server, which pack
/play/open - GET A Play button's own page: the server, the pack, and how the server is doing when it is listed
/play/page - POST Report a Play button or a listed server: spam, scam, offensive, broken or other
/play/report - GET The public list of servers: name, description, address, pack, whether it is online and how many are playing
/play/servers - GET One button's views, clicks and launches: totals and the last thirty days
/play/stats
Feedback and tickets 11 operations
- GET The public half of the queue: what people asked us for, in the open
/feedback - POST Files a report
/feedback - GET One item with its whole conversation, if you may read it
/feedback/{id} - PATCH Changes what an item says or who may read it
/feedback/{id} - DELETE Takes an item back entirely
/feedback/{id} - POST Closes a ticket for good: the conversation is cut into a transcript that stays with it and its Discord channel is deleted
/feedback/{id}/close - POST Puts a picture on a report
/feedback/{id}/files - GET A file from a report, to whoever may read the report
/feedback/{id}/files/{fileId} - POST Adds a message to the conversation
/feedback/{id}/replies - GET What was said in a closed ticket, as plain text
/feedback/{id}/transcript - POST I want this too
/feedback/{id}/vote
STYGION ID and sign-in 17 operations
- POST Deletes the account that asked, for good
/account/delete - GET Everywhere this account is signed in
/account/devices - POST Lets a program in, as you
/account/devices/approve - POST The program collecting the token it was allowed, once
/account/devices/claim - POST A downloaded program asking to be connected to an account
/account/devices/link - POST Signs one device out
/account/devices/revoke - POST Signs out every device on this account, the launcher included
/account/devices/revoke-all - GET What a program is asking to be allowed, before you allow it
/account/devices/waiting - GET Everything we hold about the account that asked, in one object
/account/export - GET Which providers are joined to the account that asked
/account/links - POST Starts joining another provider to the account that asked
/account/links/begin - POST Takes a provider off the account, unless it is the last way in
/account/links/remove - POST Starts signing in with a provider and says where to send the person
/auth/begin - POST Finishes signing in and hands back a session
/auth/complete - POST Signs out the device that asked, and only that one
/auth/sign-out - GET The account making the request, or 401 for a stranger
/me - GET Somebody's picture, fetched from the provider they linked rather than by the reader's browser
/people/{id}/avatar
Notifications 4 operations
- GET What you have been told about, newest first
/notifications - POST Marks one as read, or all of them when no id is given
/notifications/read - GET What you want to hear about
/notifications/settings - PUT Switches kinds of notification off, or back on
/notifications/settings
Friends and chat 8 operations
- GET What you and one friend have said to each other
/social/chat - POST Sends one message to a friend
/social/chat - GET Who you know, whether they are on, and what they are playing
/social/friends - POST Asks somebody to be friends, or accepts if they asked first
/social/friends - POST Accepts a request somebody sent you
/social/friends/accept - POST Ends a friendship, declines a request, or takes back one you sent
/social/friends/remove - GET Finds somebody by name so you can ask to be friends
/social/people - PUT Tells your friends what you are playing, or that you stopped
/social/presence
STYGION Panel 1 operation
Badges 7 operations
- GET Every badge there is and what it asks for, with nobody's progress in it
/badges - GET The public badge board: who shares publicly, ranked by points for rare badges
/badges/leaderboard - GET Your badges, your progress and what you chose to show
/badges/mine - GET Somebody's badges, as far as they share them: public to anybody, friends-only to friends
/badges/people/{account} - GET The rare badges given by hand to whoever plays under a Minecraft name on our world, if they share their badges with you
/badges/players/{player} - POST Marks new badges as seen, which clears the dot
/badges/seen - PUT Switches counting on or off, says who sees your badges, pins up to three and keeps any back
/badges/settings
Presets 2 operations
- GET Which options.txt keys a preset may set, which graphics configuration files a player's preset may carry, and which performance mods the recommended preset may add
/presets/allowlist - GET Mods that do not run together (Sodium and OptiFine, Embeddium and Rubidium, …), each pair by portal project or mod id, with the reason in both languages
/presets/conflicts