API pública
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.
Conceptos básicos
| URL base | https://trs-launcher.theredstonee.de |
| Prefijo | /v1 |
| Transporte | solo HTTPS |
| Formato | JSON (UTF-8), salvo imágenes y descargas de archivos |
| UUID en las respuestas | 32 dígitos hexadecimales en minúscula sin guiones |
| Marcas de tiempo | ISO 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" } }
| HTTP | Código | Significado |
|---|---|---|
| 400 | invalid_request | Un parámetro no es válido. |
| 404 | not_found (o un código más concreto) | Ruta u objeto desconocido. |
| 429 | rate_limited | Demasiadas peticiones. Espera Retry-After segundos. |
| 500 | internal_error | Error del servidor, sin detalles. |
| 503 | database_unavailable | Temporal. 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.
| Ámbito | Límite |
|---|---|
| Cualquier petición | 300 / min |
| Biblioteca de circuitos | 240 / min |
| Incidencias (listas, incidencias, hoja de ruta, imágenes) | 240 / min |
| Capturas compartidas | 240 / min |
| Códigos de modpack | 60 / min |
| Catálogo de logros | 60 / min |
| Imágenes del blog | 600 / 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.
ETagcon el SHA-256 de la imagen;If-None-Match→304.- Con el
?v=actual (como enurl):Cache-Control: public, max-age=31536000, immutable. Con un?v=antiguo:max-age=300. Usa siempre laurltal 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.revcrece con cada cambio. Trátalo como un valor opaco.maxVersionfalta 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ón | Respuesta |
|---|---|
rev = revisión actual | 200, Cache-Control: public, max-age=31536000, immutable |
rev = otro número | 404 rev_mismatch con la revisión actual en details.rev: vuelve a cargar el índice |
sin rev | 200, Cache-Control: public, max-age=60 |
| desconocido o no publicado | 404 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.
.mrpack necesita una cuenta.Blog y noticias
| Petición | Respuesta |
|---|---|
GET /v1/site/blog | Entradas 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=10 | Noticias 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.xml | Feed 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ón | Respuesta |
|---|---|
GET /v1/issues | Una página de incidencias: { issues, total, page, pages, per, errors } |
GET /v1/issues/roadmap | El tablero de la hoja de ruta con seis columnas |
GET /v1/issues/summary | Contadores: { 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ámetro | Valores |
|---|---|
sort | top (por defecto), new, activity |
type | bug, feature |
area | launcher, client, website |
status | lista separada por comas de open, planned, in_progress, in_review, done, rejected, duplicate |
closed | 1 = incluir las incidencias cerradas |
q | texto de búsqueda (≤ 80 caracteres); #57 también encuentra el número 57 |
filter | sintaxis de búsqueda como en la web, p. ej. status:planned,in-progress area:client |
page, per | pá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ón | Respuesta |
|---|---|
GET /v1/shares/{id} | { share: { id, url, imageUrl, mime, width, height, createdAt, expiresAt } }, o 404 share_not_found |
GET /v1/shares/{id}/image | La imagen (?thumb=1 = vista previa), con ETag |
No se publica nada sobre el propietario.