Öffentliche API
Die TRS-API bedient den Launcher, den TRS Client und die Website. Ein Teil davon ist öffentlich: Du kannst ihn ohne Konto lesen, zum Beispiel für einen Bot, ein Widget oder ein Werkzeug. Diese Seite listet nur diese öffentlichen, lesenden Endpunkte.
Grundlagen
| Basis-URL | https://trs-launcher.theredstonee.de |
| Präfix | /v1 |
| Transport | nur HTTPS |
| Format | JSON (UTF-8), außer Bildern und Datei-Downloads |
| UUIDs in Antworten | 32 kleine Hex-Ziffern ohne Bindestriche |
| Zeitstempel | ISO 8601 in UTC, z. B. 2026-09-23T18:04:59.167Z |
Jede Antwort hat einen Header X-Request-Id. Gib ihn an, wenn du ein Problem meldest.
Fehler
Jeder Fehler hat dieselbe Form. Werte code aus, nicht message:
{ "error": { "code": "not_found", "message": "Not found" } }
| HTTP | Code | Bedeutung |
|---|---|---|
| 400 | invalid_request | Ein Parameter ist ungültig. |
| 404 | not_found (oder ein genauerer Code) | Unbekannte Route oder unbekanntes Objekt. |
| 429 | rate_limited | Zu viele Anfragen. Warte Retry-After Sekunden. |
| 500 | internal_error | Serverfehler, ohne Details. |
| 503 | database_unavailable | Vorübergehend. Versuch es später erneut. |
Rate-Limits
Alle Grenzen gelten pro IP-Adresse und füllen sich gleichmäßig über die Minute auf.
| Bereich | Grenze |
|---|---|
| Jede Anfrage | 300 / min |
| Schaltungs-Bibliothek | 240 / min |
| Issues (Listen, Issues, Roadmap, Bilder) | 240 / min |
| Geteilte Screenshots | 240 / min |
| Modpack-Codes | 60 / min |
| Erfolgs-Katalog | 60 / min |
| Blog-Bilder | 600 / min |
Eine 429-Antwort hat den Header Retry-After und error.retryAfter (Sekunden).
Caching
Viele Antworten lassen sich zwischenspeichern. Beachte Cache-Control und nutze ETag mit If-None-Match, wo es
angeboten wird – eine unveränderte Ressource antwortet dann mit 304 und leerem Body.
Status
GET /v1/health
{ "status": "ok", "version": 1, "time": "2026-09-29T10:00:00.000Z" }
503 database_unavailable, wenn die Datenbank nicht erreichbar ist.
Releases
GET /v1/site/releases
Das neueste Launcher-Release auf GitHub mit seinen Download-Dateien. 5 Minuten zwischengespeichert.
{
"release": {
"version": "0.14.0",
"tag": "v0.14.0",
"publishedAt": "2026-09-28T…",
"pageUrl": "https://github.com/theredstonee/TRS-Launcher/releases/tag/v0.14.0",
"assets": [
{ "platform": "windows", "name": "TRS-Launcher_0.14.0_x64-setup.exe", "url": "https://github.com/…", "size": 12345678 }
]
}
}
platform ist windows, appimage, deb oder rpm. release ist null, wenn GitHub nicht erreichbar war und noch
nichts zwischengespeichert ist.
Umhänge
GET /v1/site/capes
Die mitgelieferten TRS-Umhänge. 5 Minuten zwischengespeichert.
{ "capes": [
{ "id": "redstone", "name": "Redstone", "unlock": "free", "url": "/v1/capes/redstone.png?v=0c1d…",
"scale": 2, "frames": 1, "frameTimeMs": null }
] }
unlock ist free, code oder admin. url ist relativ zur Basis-URL.
GET /v1/capes/{id}
Metadaten eines freigegebenen Umhangs: { "cape": { id, name, kind, unlock, status, url, width, height, scale, animated, frames, frameTimeMs } }.
Unbekannt oder nicht freigegeben: 404 cape_not_found.
GET /v1/capes/{id}.png
Die Textur eines freigegebenen Umhangs.
ETagmit dem SHA-256 des Bildes;If-None-Match→304.- Mit dem aktuellen
?v=(wie inurl):Cache-Control: public, max-age=31536000, immutable. Mit einem veralteten?v=:max-age=300. Nutz dieurlimmer genau so, wie sie kommt.
Textur-Aufbau: Ein Frame ist 64·scale × 32·scale Pixel groß, mit dem Umhang-Layout von Vanilla. Animierte Umhänge
stapeln alle Frames untereinander, Frame 0 oben. Zeig Frame floor(jetzt_ms / frameTimeMs) mod frames, dann sehen
alle denselben Frame.
Schaltungs-Bibliothek
Die Redstone-Schaltungen des TRS Clients. Das Format der Schaltungen beschreibt
docs/circuit-format.md.
GET /v1/circuits/index
Alle veröffentlichten Schaltungen mit ihrer Revision:
{ "version": "3b1f…", "circuits": [
{ "id": "not_gate", "rev": 1, "updatedAt": "2026-09-27T12:00:00.000Z", "minVersion": "1.8" },
{ "id": "t_flipflop_copper", "rev": 3, "updatedAt": "…", "minVersion": "1.21", "maxVersion": "1.21.4" }
] }
ETag: "<version>";If-None-Match→304.Cache-Control: public, max-age=60, stale-while-revalidate=600.revwächst mit jeder Änderung. Behandle es als undurchsichtigen Wert.maxVersionfehlt, wenn es keine Obergrenze gibt.
GET /v1/circuits/{id}?rev={rev}
Eine Schaltung im Client-Format plus rev, updatedAt und author ({ uuid, name } oder null für das TRS-Team).
| Anfrage | Antwort |
|---|---|
rev = aktuelle Revision | 200, Cache-Control: public, max-age=31536000, immutable |
rev = eine andere Zahl | 404 rev_mismatch mit der aktuellen Revision in details.rev – lade den Index neu |
ohne rev | 200, Cache-Control: public, max-age=60 |
| unbekannt oder nicht veröffentlicht | 404 circuit_not_found |
GET /v1/circuits/{id}/export?format=nbt|json
Eine Schaltung als Vanilla-Strukturdatei (.nbt, lässt sich mit einem Konstruktionsblock laden) oder als JSON
herunterladen.
GET /v1/site/circuits und GET /v1/site/circuits/{id}
Die Daten der Schaltungsseiten der Website: die Schaltung plus Größe, Blockanzahl, Materialien, Versionsbereich und Veröffentlichungsdatum.
Geteilte Modpacks
Spieler teilen Modpacks per Code (TRS-XXXX-XXXX) oder Link (https://trs-launcher.theredstonee.de/p/TRS-XXXX-XXXX).
GET /v1/packs/code/{code}
Groß- und Kleinschreibung ist egal, TRS- und Bindestriche sind optional (O wird als 0 gelesen, I und L als
1).
{ "pack": {
"code": "TRS-7K2M-Q9XA", "url": "https://trs-launcher.theredstonee.de/p/TRS-7K2M-Q9XA",
"name": "Redstone Pack", "summary": "Tech & Redstone", "packVersion": "1.2.0", "revision": 3,
"mcVersion": "1.21.1", "loader": { "kind": "fabric", "version": "0.16.9" },
"modrinthFiles": 42, "ownJars": 1, "otherFiles": 57, "bytes": 812345,
"owner": { "uuid": "…", "name": "Alex" }, "createdAt": "…", "updatedAt": "…", "expiresAt": null
} }
modrinthFiles zählt jede Datei im Index (ein Link von Modrinth, CurseForge oder GitHub). Der Name bleibt, damit ältere Clients weiter funktionieren. ownJars > 0 bedeutet Mod-Dateien, die im Pack selbst liegen. Unbekannt, abgelaufen oder entfernt:
404 pack_not_found.
GET /v1/packs/code/{code}/contents
Was drin ist: { "contents": { "mods": [], "resourcePacks": [], "shaderPacks": [] } }. Jeder Eintrag hat name,
file, source (modrinth, curseforge, github oder pack) und bei Modrinth-Dateien projectId, title, version und url.
.mrpack-Datei selbst herunterzuladen braucht ein Konto.Blog und News
| Anfrage | Antwort |
|---|---|
GET /v1/site/blog | Update-Beiträge (aus dem Changelog) und News-Beiträge, neueste zuerst |
GET /v1/site/blog/{version} | Ein Update-Beitrag mit Text als Markdown, oder 404 not_found |
GET /v1/site/news?limit=10 | News-Beiträge mit Markdown (limit 1–20) |
GET /v1/site/news/{slug} | Ein News-Beitrag, oder 404 post_not_found |
GET /v1/site/blog/media/{id}.{jpg|png} | Bilder veröffentlichter Beiträge ({id}.t.{ext} = Vorschau) |
GET /feed.xml | RSS-Feed aller Beiträge |
News-Texte kommen als { en, de?, es? }; fehlende Sprachen fallen auf Englisch zurück.
Issues und Roadmap
Der öffentliche Issue-Tracker.
| Anfrage | Antwort |
|---|---|
GET /v1/issues | Eine Seite Issues: { issues, total, page, pages, per, errors } |
GET /v1/issues/roadmap | Das Roadmap-Board mit sechs Spalten |
GET /v1/issues/summary | Zähler: { open, total, byStatus } |
GET /v1/issues/{number} | { issue, comments, history }, oder 404 issue_not_found |
GET /v1/issues/uploads/{id} | Ein Bild eines sichtbaren Issues oder Kommentars (?thumb=1 = Vorschau) |
Parameter von GET /v1/issues:
| Parameter | Werte |
|---|---|
sort | top (Standard), new, activity |
type | bug, feature |
area | launcher, client, website |
status | Komma-Liste aus open, planned, in_progress, in_review, done, rejected, duplicate |
closed | 1 = geschlossene Issues einbeziehen |
q | Suchtext (≤ 80 Zeichen); #57 findet auch Nummer 57 |
filter | Suchsyntax wie auf der Website, z. B. status:geplant,in-arbeit area:client |
page, per | Seite ab 1; per ≤ 50, Standard 20 |
Ohne Statusfilter werden nur offene Issues gelistet. Der Log-Auszug einer Bug-Meldung ist nie öffentlich.
{ "number": 57, "url": "https://trs-launcher.theredstonee.de/issues/57",
"type": "feature", "area": "launcher", "status": "planned", "title": "Share modpacks by code",
"author": { "uuid": "…", "name": "Alex" }, "score": 12, "up": 14, "down": 2, "comments": 3,
"priority": "low", "tags": ["ui"], "fixedIn": null, "createdAt": "…", "activityAt": "…" }
(gekürzt)
Team
GET /v1/site/team
Die öffentliche Team-Seite: Gruppen nach Rolle mit Mitgliedern (Name, Skin, TRS-Umhang, Titel, Links). 60 Sekunden zwischengespeichert.
Erfolge
GET /v1/achievements
Der Erfolgs-Katalog, sortiert nach order. Geheime Erfolge sind hier immer verborgen (hidden: true, ohne Titel und
Beschreibung).
{ "achievements": [
{ "id": "play_10h", "category": "playtime", "secret": false, "hidden": false,
"title": { "en": "Settling in", "de": "…", "es": "…" },
"description": { "en": "Play for 10 hours", "de": "…", "es": "…" },
"icon": "clock", "points": 20, "rarity": "uncommon", "goal": 600, "unit": "minutes",
"verified": true, "reward": null, "order": 5 }
] }
Geteilte Screenshots
Ein geteilter Screenshot-Link (/s/<id>) ist 30 Tage lang öffentlich.
| Anfrage | Antwort |
|---|---|
GET /v1/shares/{id} | { share: { id, url, imageUrl, mime, width, height, createdAt, expiresAt } }, oder 404 share_not_found |
GET /v1/shares/{id}/image | Das Bild (?thumb=1 = Vorschau), mit ETag |
Über den Besitzer ist nichts öffentlich.