Entwickler

Öffentliche API

Endpunkte der TRS-API, die du ohne Konto lesen kannst – Status, Releases, Umhänge, Schaltungen, Modpack-Codes, Blog, Issues, Team und Erfolge.

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.

Alles andere – Anmeldung, Profile, Freunde, Chat, Synchronisierung, Uploads, Moderation und der Team-Bereich – braucht ein TRS-Konto und ist nur für den TRS Launcher, den TRS Client und die Website gedacht. Es ist keine öffentliche Schnittstelle und kann sich jederzeit ändern.

Grundlagen

Basis-URLhttps://trs-launcher.theredstonee.de
Präfix/v1
Transportnur HTTPS
FormatJSON (UTF-8), außer Bildern und Datei-Downloads
UUIDs in Antworten32 kleine Hex-Ziffern ohne Bindestriche
ZeitstempelISO 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" } }
HTTPCodeBedeutung
400invalid_requestEin Parameter ist ungültig.
404not_found (oder ein genauerer Code)Unbekannte Route oder unbekanntes Objekt.
429rate_limitedZu viele Anfragen. Warte Retry-After Sekunden.
500internal_errorServerfehler, ohne Details.
503database_unavailableVorübergehend. Versuch es später erneut.

Rate-Limits

Alle Grenzen gelten pro IP-Adresse und füllen sich gleichmäßig über die Minute auf.

BereichGrenze
Jede Anfrage300 / min
Schaltungs-Bibliothek240 / min
Issues (Listen, Issues, Roadmap, Bilder)240 / min
Geteilte Screenshots240 / min
Modpack-Codes60 / min
Erfolgs-Katalog60 / min
Blog-Bilder600 / 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.

  • ETag mit dem SHA-256 des Bildes; If-None-Match → 304.
  • Mit dem aktuellen ?v= (wie in url): Cache-Control: public, max-age=31536000, immutable. Mit einem veralteten ?v=: max-age=300. Nutz die url immer 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.
  • rev wächst mit jeder Änderung. Behandle es als undurchsichtigen Wert.
  • maxVersion fehlt, 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).

AnfrageAntwort
rev = aktuelle Revision200, Cache-Control: public, max-age=31536000, immutable
rev = eine andere Zahl404 rev_mismatch mit der aktuellen Revision in details.rev – lade den Index neu
ohne rev200, Cache-Control: public, max-age=60
unbekannt oder nicht veröffentlicht404 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.

Die .mrpack-Datei selbst herunterzuladen braucht ein Konto.

Blog und News

AnfrageAntwort
GET /v1/site/blogUpdate-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=10News-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.xmlRSS-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.

AnfrageAntwort
GET /v1/issuesEine Seite Issues: { issues, total, page, pages, per, errors }
GET /v1/issues/roadmapDas Roadmap-Board mit sechs Spalten
GET /v1/issues/summaryZä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:

ParameterWerte
sorttop (Standard), new, activity
typebug, feature
arealauncher, client, website
statusKomma-Liste aus open, planned, in_progress, in_review, done, rejected, duplicate
closed1 = geschlossene Issues einbeziehen
qSuchtext (≤ 80 Zeichen); #57 findet auch Nummer 57
filterSuchsyntax wie auf der Website, z. B. status:geplant,in-arbeit area:client
page, perSeite 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.

AnfrageAntwort
GET /v1/shares/{id}{ share: { id, url, imageUrl, mime, width, height, createdAt, expiresAt } }, oder 404 share_not_found
GET /v1/shares/{id}/imageDas Bild (?thumb=1 = Vorschau), mit ETag

Über den Besitzer ist nichts öffentlich.