Desarrolladores

API pública

Endpoints de la API de TRS que puedes leer sin cuenta: estado, versiones, capas, circuitos, códigos de modpack, blog, incidencias, equipo y logros.

La API de TRS da servicio al launcher, al TRS Client y a la web. Una parte es pública: puedes leerla sin cuenta, por ejemplo para un bot, un widget o una herramienta. Esta página solo recoge esos endpoints públicos de lectura.

Todo lo demás (inicio de sesión, perfiles, amigos, chat, sincronización, subidas, moderación y el área del equipo) necesita una cuenta de TRS y solo está pensado para el TRS Launcher, el TRS Client y la web. No es una interfaz pública y puede cambiar en cualquier momento.

Conceptos básicos

URL basehttps://trs-launcher.theredstonee.de
Prefijo/v1
Transportesolo HTTPS
FormatoJSON (UTF-8), salvo imágenes y descargas de archivos
UUID en las respuestas32 dígitos hexadecimales en minúscula sin guiones
Marcas de tiempoISO 8601 en UTC, p. ej. 2026-09-23T18:04:59.167Z

Cada respuesta tiene la cabecera X-Request-Id. Indícala si reportas un problema.

Errores

Todos los errores tienen la misma forma. Decide según code, no según message:

{ "error": { "code": "not_found", "message": "Not found" } }
HTTPCódigoSignificado
400invalid_requestUn parámetro no es válido.
404not_found (o un código más concreto)Ruta u objeto desconocido.
429rate_limitedDemasiadas peticiones. Espera Retry-After segundos.
500internal_errorError del servidor, sin detalles.
503database_unavailableTemporal. Inténtalo más tarde.

Límites de peticiones

Todos los límites son por dirección IP y se recargan de forma uniforme a lo largo del minuto.

ÁmbitoLímite
Cualquier petición300 / min
Biblioteca de circuitos240 / min
Incidencias (listas, incidencias, hoja de ruta, imágenes)240 / min
Capturas compartidas240 / min
Códigos de modpack60 / min
Catálogo de logros60 / min
Imágenes del blog600 / min

Una respuesta 429 lleva la cabecera Retry-After y error.retryAfter (segundos).

Caché

Muchas respuestas se pueden guardar en caché. Respeta Cache-Control y usa ETag con If-None-Match donde se ofrezca: un recurso sin cambios responde entonces 304 con el cuerpo vacío.

Estado

GET /v1/health

{ "status": "ok", "version": 1, "time": "2026-09-29T10:00:00.000Z" }

503 database_unavailable si la base de datos no está disponible.

Versiones

GET /v1/site/releases

La versión más reciente del launcher en GitHub con sus archivos de descarga. En caché 5 minutos.

{
  "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 es windows, appimage, deb o rpm. release es null si no se pudo contactar con GitHub y aún no hay nada en caché.

Capas

GET /v1/site/capes

Las capas de TRS incluidas. En caché 5 minutos.

{ "capes": [
  { "id": "redstone", "name": "Redstone", "unlock": "free", "url": "/v1/capes/redstone.png?v=0c1d…",
    "scale": 2, "frames": 1, "frameTimeMs": null }
] }

unlock es free, code o admin. url es relativa a la URL base.

GET /v1/capes/{id}

Metadatos de una capa aprobada: { "cape": { id, name, kind, unlock, status, url, width, height, scale, animated, frames, frameTimeMs } }. Desconocida o no aprobada: 404 cape_not_found.

GET /v1/capes/{id}.png

La textura de una capa aprobada.

  • ETag con el SHA-256 de la imagen; If-None-Match → 304.
  • Con el ?v= actual (como en url): Cache-Control: public, max-age=31536000, immutable. Con un ?v= antiguo: max-age=300. Usa siempre la url tal como llega.

Estructura de la textura: un fotograma mide 64·scale × 32·scale píxeles, con la disposición de capa de vanilla. Las capas animadas apilan todos los fotogramas en vertical, el fotograma 0 arriba. Muestra el fotograma floor(ahora_ms / frameTimeMs) mod frames para que todos vean el mismo.

Biblioteca de circuitos

Los circuitos de redstone del TRS Client. El formato de los circuitos se describe en docs/circuit-format.md.

GET /v1/circuits/index

Todos los circuitos publicados con su revisión:

{ "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 crece con cada cambio. Trátalo como un valor opaco.
  • maxVersion falta si no hay límite superior.

GET /v1/circuits/{id}?rev={rev}

Un circuito en el formato del cliente más rev, updatedAt y author ({ uuid, name }, o null para el equipo de TRS).

PeticiónRespuesta
rev = revisión actual200, Cache-Control: public, max-age=31536000, immutable
rev = otro número404 rev_mismatch con la revisión actual en details.rev: vuelve a cargar el índice
sin rev200, Cache-Control: public, max-age=60
desconocido o no publicado404 circuit_not_found

GET /v1/circuits/{id}/export?format=nbt|json

Descarga un circuito como archivo de estructura de vanilla (.nbt, se puede cargar con un bloque de estructuras) o como JSON.

GET /v1/site/circuits y GET /v1/site/circuits/{id}

Los datos de las páginas de circuitos de la web: el circuito más tamaño, número de bloques, materiales, rango de versiones y fecha de publicación.

Modpacks compartidos

Los jugadores comparten modpacks con un código (TRS-XXXX-XXXX) o un enlace (https://trs-launcher.theredstonee.de/p/TRS-XXXX-XXXX).

GET /v1/packs/code/{code}

No distingue mayúsculas y funciona con o sin TRS- y guiones (O se lee como 0, I y L como 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 cuenta cada archivo del índice (un enlace de Modrinth, CurseForge o GitHub). El nombre se mantiene para que los clientes antiguos sigan funcionando. ownJars > 0 significa archivos de mods guardados en el pack. Desconocido, caducado o eliminado: 404 pack_not_found.

GET /v1/packs/code/{code}/contents

Qué contiene: { "contents": { "mods": [], "resourcePacks": [], "shaderPacks": [] } }. Cada entrada tiene name, file, source (modrinth, curseforge, github o pack) y, en los archivos de Modrinth, projectId, title, version y url.

Descargar el propio .mrpack necesita una cuenta.

Blog y noticias

PeticiónRespuesta
GET /v1/site/blogEntradas de actualización (del changelog) y noticias, las más nuevas primero
GET /v1/site/blog/{version}Una entrada de actualización con el texto en Markdown, o 404 not_found
GET /v1/site/news?limit=10Noticias con Markdown (limit 1–20)
GET /v1/site/news/{slug}Una noticia, o 404 post_not_found
GET /v1/site/blog/media/{id}.{jpg|png}Imágenes de entradas publicadas ({id}.t.{ext} = vista previa)
GET /feed.xmlFeed RSS de todas las entradas

Los textos de las noticias llegan como { en, de?, es? }; los idiomas que faltan usan el inglés.

Incidencias y hoja de ruta

El gestor de incidencias público.

PeticiónRespuesta
GET /v1/issuesUna página de incidencias: { issues, total, page, pages, per, errors }
GET /v1/issues/roadmapEl tablero de la hoja de ruta con seis columnas
GET /v1/issues/summaryContadores: { open, total, byStatus }
GET /v1/issues/{number}{ issue, comments, history }, o 404 issue_not_found
GET /v1/issues/uploads/{id}Una imagen de una incidencia o comentario visible (?thumb=1 = vista previa)

Parámetros de GET /v1/issues:

ParámetroValores
sorttop (por defecto), new, activity
typebug, feature
arealauncher, client, website
statuslista separada por comas de open, planned, in_progress, in_review, done, rejected, duplicate
closed1 = incluir las incidencias cerradas
qtexto de búsqueda (≤ 80 caracteres); #57 también encuentra el número 57
filtersintaxis de búsqueda como en la web, p. ej. status:planned,in-progress area:client
page, perpágina desde 1; per ≤ 50, por defecto 20

Sin filtro de estado solo se listan las incidencias abiertas. El extracto del registro de un reporte nunca es público.

{ "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": "…" }

(abreviado)

Equipo

GET /v1/site/team

La página pública del equipo: grupos por rol con sus miembros (nombre, skin, capa de TRS, títulos, enlaces). En caché 60 segundos.

Logros

GET /v1/achievements

El catálogo de logros, ordenado por order. Los logros secretos aquí siempre están ocultos (hidden: true, sin título ni descripción).

{ "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 }
] }

Capturas compartidas

Un enlace de captura compartida (/s/<id>) es público durante 30 días.

PeticiónRespuesta
GET /v1/shares/{id}{ share: { id, url, imageUrl, mime, width, height, createdAt, expiresAt } }, o 404 share_not_found
GET /v1/shares/{id}/imageLa imagen (?thumb=1 = vista previa), con ETag

No se publica nada sobre el propietario.