Saltar al contenido
Iniciar sesión

Hemos renovado SOTF Mods. Inicia sesión de nuevo: tu contraseña es la misma.

Desarrolladores

API de SOTF Mods para desarrolladores

Última actualización:

Visión general

La API de SOTF Mods es pública y de solo lectura para clientes anónimos: todo el catálogo de mods, librerías, builds y Kits de Sons of the Forest, con versiones, dependencias y compatibilidad por build del juego.

  • URL base: https://api.sotf-mods.com/api/v2 para clientes de terceros (también se sirve en https://sotf-mods.com/api/v2).
  • Referencia: cada endpoint, parámetro y esquema está en la referencia interactiva, generada desde los mismos contratos con los que funciona el servidor. La especificación está en /api/v2/openapi.json (OpenAPI 3.1).
  • No necesitas clave para las lecturas públicas. Envía un User-Agent descriptivo con una URL de contacto, para que podamos avisarte antes de bloquear un cliente que se porte mal.

Formato

  • JSON en UTF-8 con campos en camelCase.
  • Las fechas son ISO 8601 en UTC con Z (2026-09-30T12:00:00.000Z); las fechas de calendario son YYYY-MM-DD.
  • Los ids de mods, versiones y usuarios son enteros y estables. El id del manifest.json de un mod se expone como manifestId.
  • Dentro de v2 los cambios son solo aditivos: pueden aparecer campos y endpoints nuevos, pero los existentes no cambian de significado. Ignora los campos que no conozcas. Un cambio incompatible saldría como /api/v3.

Errores

Los errores siguen la RFC 9457 (application/problem+json):

{"type":"https://sotf-mods.com/developers/errors#not-found","title":"Not found","status":404,"detail":"No mod with id 99999","code":"NOT_FOUND","requestId":"01J…"}

Decide según code (estable), no según title o detail (texto para personas). Códigos habituales: VALIDATION_FAILED (422, con una lista errors), NOT_FOUND (404), GONE (410), RATE_LIMITED (429, con Retry-After) y UNAVAILABLE (503). Indica el requestId cuando nos reportes un problema.

Paginación

  • Listados del catálogo por páginas: ?page=1&pageSize=24 (hasta 100); responden { items, page, pageSize, total, totalPages }.
  • Feeds (comentarios, reseñas) por cursor: ?limit=20&cursor=…; responden { items, nextCursor }. Trata el cursor como opaco y para cuando nextCursor sea null.

Caché

Las respuestas públicas llevan Cache-Control y un ETag, y se cachean en nuestro borde. Envía If-None-Match con el último ETag y recibirás un 304 Not Modified vacío si nada cambió: apenas cuenta para tus límites y hace tu cliente rápido. No consultes más de una vez cada pocos minutos; los datos del catálogo rara vez cambian más rápido.

El CORS está abierto (Access-Control-Allow-Origin: *, sin credenciales) en las lecturas públicas, así que las apps de navegador pueden llamar a la API directamente.

Integrar un gestor de mods

El flujo típico de un launcher o gestor de mods:

  1. Listar y buscar con GET /mods (q, type, category, sort, page). Cada elemento es una tarjeta con latestVersion, compatStatus y canonicalPath.
  2. Mostrar el detalle con GET /mods/{id} o GET /mods/by-slug/{user}/{slug}; para reconocer un mod ya instalado en disco, usa GET /mods/by-manifest/{manifestId} con el id de su manifest.json.
  3. Resolver dependencias con GET /mods/{id}/dependencies. Instala primero las required, de forma recursiva, y avisa de los conflicts. Las librerías son elementos normales con kind: "library".
  4. Elegir versión con GET /mods/{id}/versions. Prefiere la última versión estable; ofrece betas solo si el usuario lo activa.
  5. Comprobar la compatibilidad con GET /mods/{id}/compat y GET /game-builds o GET /ecosystem para decir al usuario si un mod funciona en su build del juego antes de instalarlo.
  6. Descargar con la URL de descarga del mod (ver abajo), extraer en la carpeta del juego y guardar la versión instalada.
  7. Buscar actualizaciones comparando la versión instalada con latestVersion (semver), como mucho unas pocas veces al día.

Enlaza a la página del mod (https://sotf-mods.com + canonicalPath) para que los usuarios puedan leer la descripción, reportar problemas y apoyar al creador.

Descargas

Descarga una versión con GET https://sotf-mods.com/mods/{user}/{slug}/download/{version}. Responde 302 al archivo en nuestro almacenamiento; sigue las redirecciones. Las descargas nunca se limitan con un 429: por encima del umbral de uso razonable siguen funcionando pero no cuentan en las estadísticas. Descarga una vez por instalación, no en cada arranque.

Mantente al día

Los cambios de la API se anuncian en Novedades y en su feed RSS. Las rutas deprecadas responden con las cabeceras Deprecation y Sunset y un Link a esta página meses antes de retirarse.

Soporte

¿Encontraste un error o necesitas un endpoint? Pregunta en el canal de desarrolladores de nuestro Discord o abre un issue en GitHub. Reporta los problemas de seguridad de forma privada con los GitHub Security Advisories.

Endpoints públicos de lectura

Anónimos, cacheables y con CORS. La referencia documenta parámetros, respuestas y errores de cada uno.

buildViewer

Endpoints públicos: buildViewer
Método Ruta Qué hace
GET /api/v2/builds/:id/preview Top-down SVG preview of a build (latest version)
GET /api/v2/builds/:id/geometry Packed geometry of a build for the 3D viewer

bundles

Endpoints públicos: bundles
Método Ruta Qué hace
GET /api/v2/mods/:id/bundles Official bundles of a mod that are ready to download
GET /api/v2/bundles/:id/download Download the bundle zip (302 to R2)

catalog

Endpoints públicos: catalog
Método Ruta Qué hace
GET /api/v2/mods Explore mods, libraries and builds
GET /api/v2/mods/:id Mod detail by id
GET /api/v2/mods/by-slug/:user/:slug Mod detail by user handle and slug (exact)
GET /api/v2/mods/by-manifest/:manifestId Mod detail by manifest id (case-sensitive)
GET /api/v2/mods/:id/dependencies Resolved dependencies (required, optional, conflicts)
GET /api/v2/mods/:id/dependents Published mods that require this one ("Required by")
GET /api/v2/mods/:id/related Related mods (same category or tags + text similarity)
GET /api/v2/categories Categories with i18n names and counts
GET /api/v2/tags Curated tags with i18n names and counts
GET /api/v2/creators Creators directory with stats and tier
GET /api/v2/users/:handle Public profile
GET /api/v2/users/:handle/mods Published mods and libraries of a user
GET /api/v2/users/:handle/builds Published builds of a user
GET /api/v2/users/:handle/reviews Visible reviews written by a user
GET /api/v2/users/:handle/activity 12-month contribution heatmap (respects privacy)

comments

Endpoints públicos: comments
Método Ruta Qué hace
GET /api/v2/mods/:id/comments Comments of a mod (Top = Wilson on positive reactions, or New)
GET /api/v2/comments/:id Permalink with the whole thread

compat

Endpoints públicos: compat
Método Ruta Qué hace
GET /api/v2/mods/:id/compat Compatibility of a mod per version and game build
GET /api/v2/ecosystem RedLoader / RedManager status per game build
GET /api/v2/game-builds Registered game builds
GET /api/v2/patch-radar Patch Radar for a game build (top 50 by downloads in 30 days)
GET /api/v2/compat/uptime Uptime series of the platform components (Patch Radar)

discovery

Endpoints públicos: discovery
Método Ruta Qué hace
GET /api/v2/scout/status Whether Scout (AI mod finder) is available
GET /api/v2/mods/:id/recommendations Players also downloaded, and similar mods

downloads

Endpoints públicos: downloads
Método Ruta Qué hace
GET /api/v2/versions/:id/download Download a version (302 to R2)

events

Endpoints públicos: events
Método Ruta Qué hace
GET /api/v2/mods/:id/live/stream Live counters of a mod over server-sent events

gamification

Endpoints públicos: gamification
Método Ruta Qué hace
GET /api/v2/badges Badge catalog with unlock share, ranks and tiers
GET /api/v2/awards/current Mod of the Week and current staff picks
GET /api/v2/users/:handle/badges Badges of a user (field notebook)

kits

Endpoints públicos: kits
Método Ruta Qué hace
GET /api/v2/kits Public kits
GET /api/v2/kits/:id Kit detail (unlisted only by link, private only for the owner)
GET /api/v2/kits/by-slug/:user/:slug Kit detail by owner handle and slug
GET /api/v2/kits/by-code/:code Kit by share code (`KIT-XXXX-XX` or the 6-character short code)
GET /api/v2/users/:handle/kits Public kits of a user (respects privacy)
GET /api/v2/mods/:id/kits Public kits that contain a mod (most followed first)

kitSocial

Endpoints públicos: kitSocial
Método Ruta Qué hace
GET /api/v2/kits/:id/live/stream Live follower and comment counts of a kit over server-sent events
GET /api/v2/kits/:id/comments Comments of a kit (newest first, replies embedded)

modKnowledge

Endpoints públicos: modKnowledge
Método Ruta Qué hace
GET /api/v2/mods/:id/knowledge Known issues, author FAQ and co-authors of a mod
GET /api/v2/mods/:id/diff Difference between two versions of a mod (files, manifest, changelog range)
GET /api/v2/users/:handle/coauthored Published mods a user co-authors

oauth

Endpoints públicos: oauth
Método Ruta Qué hace
GET /api/v2/auth/providers OAuth providers available on this server
GET /api/v2/auth/oauth/:provider/start Start an OAuth sign-in or link
GET /api/v2/auth/oauth/:provider/callback OAuth callback

requests

Endpoints públicos: requests
Método Ruta Qué hace
GET /api/v2/requests Mod requests (top voted or newest)
GET /api/v2/requests/:id A mod request
GET /api/v2/requests/:id/comments Comments of a request, oldest first

reviews

Endpoints públicos: reviews
Método Ruta Qué hace
GET /api/v2/mods/:id/reviews Reviews of a mod
GET /api/v2/mods/:id/reviews/summary Histogram, mean and Bayesian mean of a mod

search

Endpoints públicos: search
Método Ruta Qué hace
GET /api/v2/search Full-text + fuzzy search across mods, builds, kits, users and pages
GET /api/v2/search/index Compact Cmd+K index for a locale

seo

Endpoints públicos: seo
Método Ruta Qué hace
GET /api/v2/resolve Resolve a public path (history, case, owner changes, tombstones)

stats

Endpoints públicos: stats
Método Ruta Qué hace
GET /api/v2/site/stats Site-wide figures
GET /api/v2/live/pulse Live readout of the landing
GET /api/v2/mods/:id/live Live counters of a mod
GET /api/v2/mods/:id/badge/:kind SVG badge of a mod (downloads, version, rating, followers, compat)
GET /api/v2/mods/:id/stats/public Public download series of a mod

translations

Endpoints públicos: translations
Método Ruta Qué hace
GET /api/v2/mods/:id/translation Translated short description of a mod

versions

Endpoints públicos: versions
Método Ruta Qué hace
GET /api/v2/mods/:id/versions Versions of a mod (semver order)
GET /api/v2/mods/:id/versions/:version One version by id, version string or `latest`

Códigos de error

El campo code de un error es uno de estos. La URI type de cada problema apunta a su fila aquí.

Códigos de error
Código Estado Significado
VALIDATION_FAILED 422 The request is not valid
UNAUTHENTICATED 401 Sign in required
INVALID_CREDENTIALS 401 Wrong email, handle or password
FORBIDDEN 403 You cannot do this
EMAIL_NOT_VERIFIED 403 Verify your email first
TURNSTILE_REQUIRED 403 Complete the human check
REAUTH_REQUIRED 403 Sign in again to continue
SUSPENDED 403 Your account is suspended
NOT_FOUND 404 Not found
CONFLICT 409 This conflicts with the current state
GONE 410 This is gone
PAYLOAD_TOO_LARGE 413 The upload is too large
UNSUPPORTED_MEDIA_TYPE 415 Unsupported content type
RATE_LIMITED 429 Too many requests
INTERNAL 500 Something went wrong
UNAVAILABLE 503 Temporarily unavailable

Límites de uso

Por encima de un límite la API responde 429 con la cabecera Retry-After. Cachea las respuestas y respeta los ETag; rara vez te acercarás.

Límites de uso
Ámbito Límite Notas
Lecturas de la API v2 300 / 1 minute · por IP —
Lecturas de la API legacy 600 / 1 minute · por IP —
Descargas 60 / 1 minute · por IP never 429: above the limit the download redirects but does not count

API legacy y deprecaciones

La API de la primera versión del sitio sigue respondiendo en api.sotf-mods.com/api/* y sotf-mods.com/api/*, para que RedManager, UpdatesChecker y los mods del juego sigan funcionando. Las integraciones nuevas deberían usar la v2.

Soportadas (compatibles byte a byte)

Soportadas (compatibles byte a byte)
Método Ruta Qué hace
GET /api/mods List mods (legacy, byte-compatible; RedManager and UpdatesChecker)
GET /api/mods/:mod_id Mod by manifest id (legacy, byte-compatible)
GET /api/mods/:mod_id/check Update check with node-semver `gt` (legacy, byte-compatible)

Congeladas y deprecadas

Estas rutas siguen respondiendo hasta el 31 de diciembre de 2027; después se retirarán. Sus respuestas llevan estas cabeceras:

Deprecation: true
Sunset: Fri, 31 Dec 2027 00:00:00 GMT
Link: <https://sotf-mods.com/developers>; rel="deprecation"
Congeladas y deprecadas
Método Ruta Qué hace
GET /api/mods/slug/:userSlug/:mod_slug Mod by user and slug (legacy, frozen)
GET /api/mods/find Manifest id by user and slug (legacy, frozen)
GET /api/mods/featured 12 featured mods (legacy, frozen)
GET /api/builds/featured 4 featured builds (legacy, frozen)
GET /api/stats Site stats (legacy, frozen; downloads include orphan rows)
GET /api/stats/builds Build stats (legacy, frozen)
GET /api/categories Categories by type (legacy, frozen)
GET /api/users/:userSlug User (legacy, frozen)
GET /api/users/:userSlug/stats User stats (legacy, frozen)
GET /api/comments Comments of a mod by numeric id (legacy, frozen; hidden ones excluded)
GET /api/mods/:mod_id/download-stats Daily downloads (legacy, frozen; unknown mod → 200 `{status:false}`)
GET /api/mods/:mod_id/download/:version Download alias (302 to R2; `?ip=&agent=` ignored)
GET /api/mods/slug/:userSlug/:mod_slug/download/:version Download alias by slug (302 to R2)

Retiradas

Cualquier método en estas rutas responde 410 Gone con este cuerpo:

Las rutas de escritura retiradas (subidas, ediciones, comentarios, votos) también responden 410 con el mismo sobre: status false, error GONE. Usa la API v2 con un token.

{"status":false,"error":"GONE","message":"This endpoint was retired in sotf-mods v2. See https://sotf-mods.com/developers"}
  • ANY /api/auth/*
  • ANY /api/favorites
  • ANY /api/favorites/*
  • GET /api/mods/:mod_id/favorite
  • GET /api/mods/:mod_id/approve
  • GET /api/mods/:mod_id/unapprove
  • POST /api/mods/:mod_id/release
  • PATCH /api/mods/:mod_id/details
  • POST /api/files/presigned-url
  • POST /api/mods/upload
  • POST /api/mods/publish
  • POST /api/builds/upload
  • POST /api/builds/publish
  • POST /api/users/avatar
  • POST /api/comments
  • ANY /api/kelvin-gpt/*

Diferencias intencionales con el comportamiento anterior

  1. approved=false only returns pending mods whose checks passed
  2. approved=true returns published only (archived, unlisted and removed are excluded)
  3. Without approved: published, pending with checks, archived and unlisted
  4. The detail by mod_id returns everything except rejected and removed (404)
  5. The 19 mods with type = null come out as "Mod" or "Library" (backfill B4)
  6. Validation errors answer 422 with the envelope instead of 500
  7. GET /api/comments excludes hidden comments
  8. Every sort has id as tie-breaker (stable pagination)
  9. Responses add Cache-Control, Deprecation (Tier 2) and X-Request-Id
  10. Downloads answer 302 to R2 instead of streaming the file