İçeriğe atla
Giriş yap

SOTF Mods’u yeniden inşa ettik. Tekrar giriş yap; şifren aynı.

Geliştiriciler

SOTF Mods API for developers

Son güncelleme:

Overview

The SOTF Mods API is public and read-only for anonymous clients: the whole catalogue of Sons of the Forest mods, libraries, builds and Kits, with versions, dependencies and compatibility per game build.

  • Base URL: https://api.sotf-mods.com/api/v2 for third-party clients (also served on https://sotf-mods.com/api/v2).
  • Reference: every endpoint, parameter and schema is in the interactive reference, generated from the same contracts the server runs on. The raw spec is at /api/v2/openapi.json (OpenAPI 3.1).
  • No key needed for public reads. Please send a descriptive User-Agent with a contact URL, so we can reach you before blocking a misbehaving client.

Format

  • JSON in UTF-8 with camelCase fields.
  • Dates are ISO 8601 in UTC with a Z (2026-09-30T12:00:00.000Z); calendar dates are YYYY-MM-DD.
  • Ids of mods, versions and users are integers and stable. The id from a mod's manifest.json is exposed as manifestId.
  • Changes inside v2 are additive only: new fields and endpoints may appear, existing ones don't change meaning. Ignore fields you don't know. A breaking change would ship as /api/v3.

Errors

Errors follow 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…"}

Branch on code (stable), not on title or detail (human text). Common codes: VALIDATION_FAILED (422, with an errors list), NOT_FOUND (404), GONE (410), RATE_LIMITED (429, with Retry-After) and UNAVAILABLE (503). Quote the requestId when you report a problem.

Pagination

  • Catalogue lists use pages: ?page=1&pageSize=24 (up to 100) and answer { items, page, pageSize, total, totalPages }.
  • Feeds (comments, reviews) use cursors: ?limit=20&cursor=… and answer { items, nextCursor }. Treat the cursor as opaque and stop when nextCursor is null.

Caching

Public responses carry Cache-Control, an ETag and are cached at our edge. Send If-None-Match with the last ETag and you get an empty 304 Not Modified when nothing changed — it doesn't count against your limits in any meaningful way and makes your client fast. Don't poll more often than every few minutes; catalogue data rarely changes faster than that.

CORS is open (Access-Control-Allow-Origin: *, without credentials) on public reads, so browser apps can call the API directly.

Integrate a mod manager

The typical flow for a launcher or mod manager:

  1. List and search with GET /mods (q, type, category, sort, page). Each item is a card with latestVersion, compatStatus and canonicalPath.
  2. Show the details with GET /mods/{id} or GET /mods/by-slug/{user}/{slug}; to match a mod already installed on disk, use GET /mods/by-manifest/{manifestId} with the id from its manifest.json.
  3. Resolve dependencies with GET /mods/{id}/dependencies. Install required ones first, recursively, and warn about conflicts. Libraries are regular items with kind: "library".
  4. Pick a version with GET /mods/{id}/versions. Prefer the latest stable version; offer betas only if the user opts in.
  5. Check compatibility with GET /mods/{id}/compat and GET /game-builds or GET /ecosystem to tell users whether a mod works on their game build before they install it.
  6. Download through the mod's download URL (see below), extract into the game folder and record the version you installed.
  7. Check for updates by comparing the installed version with latestVersion (semver), a few times a day at most.

Link users back to the mod page (https://sotf-mods.com + canonicalPath) so they can read the description, report problems and support the creator.

Downloads

Download a version with GET https://sotf-mods.com/mods/{user}/{slug}/download/{version}. It answers 302 to the file on our storage; follow redirects. Downloads are never rate-limited with a 429: above the fair-use threshold they still work but are not counted in the statistics. Please download once per install, not on every launch.

Staying up to date

Changes to the API are announced in News and in its RSS feed. Deprecated routes answer with Deprecation and Sunset headers and a Link to this page months before they are retired.

Support

Found a bug or need an endpoint? Ask in the developers channel of our Discord or open an issue on GitHub. Report security issues privately through GitHub Security Advisories.

Herkese açık okuma uç noktaları

Anonim, önbelleğe alınabilir ve CORS destekli. Başvuru her birinin parametrelerini, yanıtlarını ve hatalarını belgeler.

buildViewer

Herkese açık uç noktalar: buildViewer
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: bundles
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: catalog
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: comments
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: compat
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: discovery
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: downloads
Yöntem Yol Ne yapar
GET /api/v2/versions/:id/download Download a version (302 to R2)

events

Herkese açık uç noktalar: events
Yöntem Yol Ne yapar
GET /api/v2/mods/:id/live/stream Live counters of a mod over server-sent events

gamification

Herkese açık uç noktalar: gamification
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: kits
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: kitSocial
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: modKnowledge
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: oauth
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: requests
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: reviews
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: search
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: seo
Yöntem Yol Ne yapar
GET /api/v2/resolve Resolve a public path (history, case, owner changes, tombstones)

stats

Herkese açık uç noktalar: stats
Yöntem Yol Ne yapar
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

Herkese açık uç noktalar: translations
Yöntem Yol Ne yapar
GET /api/v2/mods/:id/translation Translated short description of a mod

versions

Herkese açık uç noktalar: versions
Yöntem Yol Ne yapar
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`

Hata kodları

Bir hatanın code alanı bunlardan biridir. Her sorunun type URI’si buradaki satırını gösterir.

Hata kodları
Kod Durum Anlamı
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

Hız sınırları

Bir sınırın üzerinde API, Retry-After başlığıyla 429 yanıtı verir. Yanıtları önbelleğe al ve ETag’lere uy; nadiren yaklaşırsın.

Hız sınırları
Kapsam Sınır Notlar
API v2 okumaları 300 / 1 minute · IP başına —
Eski API okumaları 600 / 1 minute · IP başına —
İndirmeler 60 / 1 minute · IP başına never 429: above the limit the download redirects but does not count

Eski API ve kullanımdan kaldırmalar

Sitenin ilk sürümünün API’si, RedManager, UpdatesChecker ve oyun içi modlar çalışmaya devam etsin diye api.sotf-mods.com/api/* ve sotf-mods.com/api/* adreslerinde yanıt vermeye devam ediyor. Yeni entegrasyonlar v2 kullanmalı.

Destekleniyor (bayt düzeyinde uyumlu)

Destekleniyor (bayt düzeyinde uyumlu)
Yöntem Yol Ne yapar
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)

Dondurulmuş ve kullanımdan kalkıyor

Bu rotalar 31 Aralık 2027 tarihine kadar yanıt verir, sonra kapatılır. Yanıtlarında şu başlıklar bulunur:

Deprecation: true
Sunset: Fri, 31 Dec 2027 00:00:00 GMT
Link: <https://sotf-mods.com/developers>; rel="deprecation"
Dondurulmuş ve kullanımdan kalkıyor
Yöntem Yol Ne yapar
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)

Kapatıldı

Bu rotalardaki her yöntem şu gövdeyle 410 Gone yanıtı verir:

Kaldırılan yazma rotaları (yüklemeler, düzenlemeler, yorumlar, oylar) da aynı zarfla 410 döner: status false, error GONE. Bunun yerine belirteçle v2 API’sini kullanın.

{"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/*

Eski davranıştan bilinçli farklar

  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