Skip to content
reforgermods.net
API v2

Reforger Mods API V2

Last updated:

V2 is the recommended API for new clients. It provides direct Reforger server discovery data from the ReforgerMods index, player history, reported server mods, typed Workshop metadata, and cleaner response schemas.

Base URL:https://api.reforgermods.net/v2

All V2 resources use plural routes. Use /v2/servers for server discovery, /v2/servers/{id} for server details, /v2/mods?search=radio for Workshop search, and /v2/mods/{id} for mod detail.

GET

/v2/health

Returns process health only. It does not request Workshop data.

200 OK
{
  "status": "success",
  "data": { "code": 200, "alive": true }
}

serversReportingNoMods is the honest interpretation of a zero reported mod count. It does not prove a vanilla configuration. vanillaServers remains temporarily as a deprecated compatibility alias with the same value.

GET

/v2/mods

Returns V2 mod previews. Pagination, search, sorting, and tag filters are query parameters on this endpoint.

ParameterDescription
pageOptional positive page number. Defaults to 1.
searchPreferred V2 search text parameter.
query, q, sAccepted search aliases for compatibility.
sortOptional sort value. Valid values are popularity, most-rated, newest, created, recently-updated, highest-rated, subscribers, version_size, largest, and name.
tagsOptional Workshop tag filter. Repeat for multiple tags, for example ?tags=SCENARIOS&tags=TERRAIN.
categoryCompatibility alias for a single tags value. New clients should prefer tags.
Request
curl -H "User-Agent: my-bot/2.0.0" \
  "https://api.reforgermods.net/v2/mods?page=2&search=radio&sort=newest"
Tag filter
curl -H "User-Agent: my-bot/2.0.0" \
  "https://api.reforgermods.net/v2/mods?search=map&tags=SCENARIOS&tags=TERRAIN"
200 OK
{
  "status": "success",
  "meta": {
    "totalPages": 2593,
    "currentPage": 2,
    "totalMods": 41478,
    "shownMods": 16,
    "modsIndexStart": 17,
    "modsIndexEnd": 32
  },
  "data": [
    {
      "id": "5965550F24A0C152",
      "name": "Example Mod",
      "type": "addon",
      "summary": "Short Workshop summary",
      "authorId": "author_id",
      "author": "Example Author",
      "version": "1.2.3",
      "versionId": 123,
      "gameVersion": "1.7.0.54",
      "size": 203434353,
      "sizeFormatted": "194 MiB",
      "rating": 0.88,
      "ratingCount": 9178,
      "subscriberCount": 31995,
      "createdAt": "2022-05-18T22:02:44Z",
      "updatedAt": "2026-07-30T07:10:47Z",
      "unlisted": false,
      "private": false,
      "tags": ["VEHICLES", "WEAPONS"],
      "imageUrl": "https://example.com/image.png",
      "workshopUrl": "https://reforger.armaplatform.com/workshop/5965550F24A0C152",
      "apiUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152"
    }
  ],
  "links": {
    "next": "https://api.reforgermods.net/v2/mods?page=3&search=radio&sort=newest",
    "prev": "https://api.reforgermods.net/v2/mods?page=1&search=radio&sort=newest"
  }
}

The response uses the V2 list response shape with typed V2 mod preview objects.

GET

/v2/mods/{id}

Canonical V2 detail endpoint for one Workshop mod. It uses Workshop asset-detail metadata, includes direct dependencies and scenarios for convenience, keeps version history behind subresource URLs, and exposes machine-native values.

Request
curl -H "User-Agent: my-bot/2.0.0" \
  "https://api.reforgermods.net/v2/mods/5965550F24A0C152"
200 OK
{
  "status": "success",
  "mod": {
    "id": "5965550F24A0C152",
    "name": "Example Mod",
    "type": "addon",
    "summary": "Short Workshop summary",
    "description": "Long Workshop description",
    "authorId": "author_id",
    "author": "Example Author",
    "version": "1.2.3",
    "versionId": 123,
    "gameVersion": "1.7.0.54",
    "size": 203434353,
    "sizeFormatted": "194 MiB",
    "rating": 0.88,
    "ratingCount": 9178,
    "subscriberCount": 31995,
    "downloadCount": 1866382,
    "createdAt": "2022-05-18T22:02:44Z",
    "updatedAt": "2026-07-30T07:10:47Z",
    "unlisted": false,
    "private": false,
    "obsolete": false,
    "license": "Custom license",
    "tags": ["VEHICLES", "WEAPONS"],
    "imageUrl": "https://example.com/image.png",
    "previewImages": ["https://example.com/image.png"],
    "screenshots": ["https://example.com/screenshot.png"],
    "versionCount": 10,
    "dependencyCount": 2,
    "scenarioCount": 11,
    "dependencySize": 8342292061,
    "dependencySizeFormatted": "7.77 GiB",
    "totalSize": 8545726414,
    "totalSizeFormatted": "7.96 GiB",
    "dependencies": [
      {
        "id": "DEP123",
        "name": "Dependency Mod",
        "version": "1.0.0",
        "size": 8342292061,
        "sizeFormatted": "7.77 GiB",
        "published": true,
        "private": false,
        "dependencyCount": 0,
        "workshopUrl": "https://reforger.armaplatform.com/workshop/DEP123",
        "apiUrl": "https://api.reforgermods.net/v2/mods/DEP123"
      }
    ],
    "scenarios": [
      {
        "name": "Conflict - Everon",
        "gameId": "{ABC}Missions/Conflict.conf",
        "gameMode": "#AR-Scenario_GameMode_Campaign",
        "author": "#AR-Author_BI",
        "description": "#AR-Campaign_GamemodeDesc",
        "playerCount": 64
      }
    ],
    "workshopUrl": "https://reforger.armaplatform.com/workshop/5965550F24A0C152",
    "apiUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152",
    "versionsUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152/versions",
    "dependenciesUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152/dependencies",
    "scenariosUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152/scenarios",
    "licenseUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152/license"
  }
}
FieldNote
sizeRaw byte count for the current Workshop version.
dependencySizeRaw byte count for known direct dependencies.
totalSizesize plus known direct dependency bytes.
dependenciesDirect dependencies for the current mod version. The dedicated /dependencies endpoint returns the same list with dependency totals.
scenariosScenarios included with the mod. The dedicated /scenarios endpoint remains available for clients that want only scenario data.
versionsNot included in mod detail. Use /versions or /versions/{version} for version history and version-specific changelogs.
*FormattedDisplay-ready IEC values derived from the matching byte fields.
downloadCountOmitted when unknown. It is not fabricated as 0.
blocked, reportedNot exposed in V2. Full license text is only returned by the dedicated /license subresource.
GET

/v2/mods/{id}/versions

Returns a lightweight version history from Workshop asset-detail metadata. This endpoint does not fetch each historical version, so it is suitable for listing available versions without expensive per-version lookups.

Request
curl "https://api.reforgermods.net/v2/mods/5965550F24A0C152/versions"
200 OK
{
  "status": "success",
  "data": {
    "modId": "5965550F24A0C152",
    "count": 10,
    "versions": [
      {
        "version": "1.2.3",
        "gameVersion": "1.7.0.54",
        "size": 203434353,
        "sizeFormatted": "194 MiB",
        "approved": true,
        "published": true,
        "createdAt": "2026-07-30T07:09:00Z",
        "updatedAt": "2026-07-30T07:10:47Z",
        "scenarioCount": 11,
        "dependencyCount": 2,
        "apiUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152/versions/1.2.3"
      }
    ]
  }
}

Entries in versions use the mod version object shape, not the V2 mod detail object. Changelog text is available from /v2/mods/{id}/versions/{version} when the Workshop provides it.

GET

/v2/mods/{id}/versions/{version}

Returns richer metadata for one specific mod version. This endpoint uses Workshop version-detail data and can include the author's changelog and version-specific scenarios.

Request
curl "https://api.reforgermods.net/v2/mods/5965550F24A0C152/versions/1.2.3"
200 OK
{
  "status": "success",
  "data": {
    "modId": "5965550F24A0C152",
    "version": "1.2.3",
    "gameVersion": "1.7.0.54",
    "size": 203434353,
    "sizeFormatted": "194 MiB",
    "approved": true,
    "published": true,
    "changelog": "[Improved] Tweaked deployment points\n[Fixed] Corrected loadout issue",
    "createdAt": "2026-07-30T07:09:00Z",
    "updatedAt": "2026-07-30T07:10:47Z",
    "scenarioCount": 11,
    "dependencyCount": 2,
    "scenarios": [
      {
        "name": "Conflict - Everon",
        "gameId": "{ABC}Missions/Conflict.conf",
        "gameMode": "#AR-Scenario_GameMode_Campaign",
        "author": "#AR-Author_BI",
        "description": "#AR-Campaign_GamemodeDesc",
        "playerCount": 64
      }
    ],
    "apiUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152/versions/1.2.3"
  }
}

size is a raw byte count. Use sizeFormatted when you want a display-ready IEC value.

The version path segment is URL-escaped when requested upstream. Dots are valid in versions. Use normal URL encoding for any other path-significant characters.

GET

/v2/mods/{id}/dependencies

Returns direct dependencies reported for the current mod version. Dependency totals are based on known direct dependency sizes only.

Request
curl "https://api.reforgermods.net/v2/mods/5965550F24A0C152/dependencies"
200 OK
{
  "status": "success",
  "data": {
    "modId": "5965550F24A0C152",
    "count": 2,
    "size": 8342292061,
    "sizeFormatted": "7.77 GiB",
    "totalSizeWithMod": 8545726414,
    "totalSizeWithModFormatted": "7.96 GiB",
    "dependencies": [ { "...": "dependency objects" } ]
  }
}

size and totalSizeWithMod are raw byte counts. Use the matching *Formatted fields for display text.

If an upstream dependency is missing size data, known totals remain accurate and unknownSizeCount may be included.

GET

/v2/mods/{id}/scenarios

Returns scenarios included with the Workshop mod. Localization keys such as #AR-* are returned as-is.

Request
curl "https://api.reforgermods.net/v2/mods/5965550F24A0C152/scenarios"
200 OK
{
  "status": "success",
  "data": {
    "modId": "5965550F24A0C152",
    "count": 11,
    "scenarios": [ { "...": "scenario objects" } ]
  }
}
GET

/v2/mods/{id}/license

Returns the license label and full license text when the Workshop provides it. Normal mod detail intentionally only includes the short license label.

Request
curl "https://api.reforgermods.net/v2/mods/5965550F24A0C152/license"
200 OK
{
  "status": "success",
  "data": {
    "modId": "5965550F24A0C152",
    "license": "Custom license",
    "licenseText": "Full license text…"
  }
}
GET

/v2/servers

Returns a paginated Arma Reforger server snapshot from the ReforgerMods server index. Discovery data is retrieved from the backend used by Arma Reforger's server browser, then normalized for web and API clients.

Each row may carry a nested analytics object with the server's current ReforgerMods-derived ranking. It is filled for the whole page in one lookup, is omitted for servers with no current ranking, and disappears entirely while analytics are warming up. It is additive: the server list never fails because analytics are unavailable. See /v2/analytics/servers for the field meanings.

ParameterDescription
page, perPageOptional pagination. perPage is capped at 500.
searchCase-insensitive search across server and scenario names.
sortplayers, name, newest, or lastSeen.
region, platformFilter by ping site or supported client platform. Friendly platforms are pc, xbox, and psn.
official, hasMods, includeOfflineBoolean filters for official servers, modded servers, and offline entries.
battleye, lockedBoolean filters for BattlEye-protected servers and password-protected servers.
Request
curl "https://api.reforgermods.net/v2/servers?sort=players&hasMods=true"
200 OK
{
  "status": "success",
  "dataset": {
    "warming": false,
    "stale": false,
    "snapshotAgeSeconds": 18,
    "lastCollectionAt": "2026-08-28T18:42:10Z",
    "serverCount": 5300,
    "onlineServerCount": 2400,
    "offlineServerCount": 2900
  },
  "meta": {
    "totalPages": 53,
    "currentPage": 1,
    "totalServers": 5300,
    "shownServers": 100,
    "serverIndexStart": 1,
    "serverIndexEnd": 100
  },
  "data": [ { "...": "server preview objects" } ],
  "links": {
    "next": "https://api.reforgermods.net/v2/servers?page=2&sort=players&hasMods=true"
  }
}
GET

/v2/servers/{id}

Returns one server with live status fields, scenario data, queue size, supported clients, reported mods, and an activity summary when history has been collected. A nested analytics object is included when the server has a current ReforgerMods ranking.

positionAvgWaitTime is the lobby's reported average wait in seconds for one queue position. sessionId is the current upstream lobby session identifier. Both are optional and are omitted when the collected lobby response does not provide them.

Request
curl "https://api.reforgermods.net/v2/servers/{room_id}"
200 OK
{
  "status": "success",
  "dataset": {
    "warming": false,
    "stale": false,
    "snapshotAgeSeconds": 18,
    "lastCollectionAt": "2026-08-28T18:42:10Z",
    "serverCount": 5300,
    "onlineServerCount": 2400,
    "offlineServerCount": 2900
  },
  "server": {
    "id": "8d7f1b9c-6a28-42a1-8d3f-25f2f7c3f431",
    "name": "Example Conflict Server",
    "scenarioId": "{ECC61978EDCC2B5A}Missions/23_Campaign.conf",
    "scenarioName": "Conflict - Everon",
    "scenarioImageUrl": "https://example.com/scenario.jpg",
    "scenarioImageWidth": 1920,
    "scenarioImageHeight": 1080,
    "scenarioThumbnailUrl": "https://example.com/scenario-thumb.jpg",
    "scenarioThumbnailWidth": 480,
    "scenarioThumbnailHeight": 270,
    "gameVersion": "1.7.0.54",
    "official": false,
    "passwordProtected": false,
    "battlEye": true,
    "crossPlay": true,
    "players": 48,
    "maxPlayers": 64,
    "queue": 3,
    "queueMax": 50,
    "positionAvgWaitTime": 51,
    "region": "frankfurt",
    "platform": "LINUX",
    "platforms": ["pc", "xbox", "psn"],
    "modCount": 18,
    "scenarioModId": "5965550F24A0C152",
    "online": true,
    "firstSeen": "2026-08-11T03:14:20Z",
    "lastSeen": "2026-08-28T18:42:10Z",
    "present": true,
    "hostType": "CommunityDs",
    "joinable": true,
    "visible": true,
    "host": "203.0.113.42",
    "port": 2001,
    "directJoinCode": "ABC123",
    "sessionId": "0-000000000030",
    "supportedClients": ["PLATFORM_PC", "PLATFORM_XBL", "PLATFORM_PSN"],
    "hostedScenarioModId": "5965550F24A0C152",
    "fps": 60,
    "lastChanged": "2026-08-28T18:36:02Z",
    "activity": {
      "peak24h": 64,
      "avg24h": 41,
      "median24h": 44,
      "low24h": 12,
      "peak7d": 64,
      "samples24h": 288,
      "samples7d": 168,
      "trackingSince": "2026-08-11T03:14:20Z"
    },
    "modSummary": {
      "count": 18,
      "knownSize": 0,
      "unresolvedCount": 0
    },
    "mods": [
      {
        "id": "5965550F24A0C152",
        "name": "Example Mod",
        "version": "1.2.3",
        "sizeKnown": false,
        "apiModURL": "https://api.reforgermods.net/v2/mods/5965550F24A0C152",
        "modURL": "https://api.reforgermods.net/mods/5965550F24A0C152/",
        "dependentCount": 0
      },
      {
        "id": "5A1B2C3D4E5F6789",
        "name": "Example Dependency",
        "version": "4.5.6",
        "sizeKnown": false,
        "apiModURL": "https://api.reforgermods.net/v2/mods/5A1B2C3D4E5F6789",
        "modURL": "https://api.reforgermods.net/mods/5A1B2C3D4E5F6789/",
        "dependentCount": 0
      }
    ]
  }
}

The detail response includes the reported mod list. Use /v2/servers/{id}/history for chart-friendly activity buckets.

GET

/v2/servers/{id}/mods

Returns the server-to-Workshop mod relationship as reported by the server. By default ReforgerMods also attempts exact-version size enrichment; use ?sizes=false to skip that best-effort lookup.

Request
curl "https://api.reforgermods.net/v2/servers/{room_id}/mods"
GET

/v2/servers/{id}/history

Returns historical player activity buckets for one server. Valid ranges are 6h, 24h, 72h, 7d, 30d, 90d, 1y, and all. A point includes positionAvgWaitTime only when at least one source observation in that bucket reported a wait estimate; the value is the rounded average of those reported estimates.

Request
curl "https://api.reforgermods.net/v2/servers/{room_id}/history?range=24h"
History point
{ "t": 1790299800, "avg": 124, "min": 119, "max": 128, "cap": 128, "positionAvgWaitTime": 51 }
GET

/v2/servers/history

Returns fleet-wide population: how many players were on tracked Arma Reforger servers over time, plus the current totals. This is the data behind the public player count page.

Each point sums every server's average population for that bucket, so it is a player count rather than a per-server figure. Servers with no samples in a bucket contribute nothing rather than pulling the total down. Figures cover servers visible in the public server list; they are not published by Bohemia Interactive and are not Steam concurrent users.

ParameterDescription
range6h, 24h (default), 72h, 7d, 30d, 90d, 1y, or all. Bucket width follows the range: 5 minutes up to 24h, hourly to 30d, daily beyond.
200 OK
{
  "status": "success",
  "range": "24h",
  "bucket": "5m",
  "now": {
    "onlineServers": 5071,
    "trackedServers": 23686,
    "players": 17186,
    "capacity": 225303,
    "queue": 872,
    "observedAt": "2026-09-02T18:04:00Z"
  },
  "points": [
    { "t": 1788390000, "players": 18915, "capacity": 230347, "servers": 5283, "sumOfServerPeaks": 20110, "peak": 20110 }
  ]
}

now is read live from the server index, so it is as fresh as the last collection rather than as fresh as the newest history bucket.

sumOfServerPeaks adds each server's independently sampled maximum within the bucket. Those maxima may occur at different moments, so this field is explicitly not a concurrent fleet peak.

peak is a deprecated compatibility alias with the same value. Historically it also represented the sum of independently observed per-server bucket peaks, not a simultaneous fleet peak.

GET

/v2/analytics

Returns the latest ReforgerMods-derived global analytics snapshot and an analytics freshness envelope. Analytics are derived from observed server and mod activity. If analytics are warming up, analytics.available is false and normal server/mod endpoints remain usable.

200 OK
{
  "status": "success",
  "analytics": {
    "available": true,
    "sourceSnapshotId": 5399,
    "calculatedAt": "2026-09-02T18:05:00Z",
    "modelVersion": "analytics-2026-09-1",
    "stale": false
  },
  "data": {
    "onlineServers": 2400,
    "trackedServers": 5300,
    "totalPlayers": 42000,
    "totalQueue": 180,
    "moddedServers": 1800,
    "serversReportingNoMods": 600,
    "vanillaServers": 600,
    "uniqueModsDeployed": 12200,
    "totalModDeployments": 91000,
    "sourceSnapshotId": 5399,
    "observedAt": "2026-09-02T18:04:00Z",
    "calculatedAt": "2026-09-02T18:05:00Z"
  }
}
GET

/v2/analytics/servers

Returns server analytics leaderboard rows ordered by the chosen score. Scores are ecosystem-relative ReforgerMods analytics; they are not uptime guarantees or trust ratings. Each row also carries the server's current list row under server — the same object /v2/servers returns — so a client can render a full server card from one leaderboard request instead of looking each server up. server is absent when a ranked server is no longer in the current index.

Every analytics response carries the same analytics envelope: available (a published dataset exists), stale (the newest published dataset is behind the current server index or older than the freshness window), sourceSnapshotId, calculatedAt, and modelVersion. Stale analytics are still returned — decide for yourself whether the timestamp is fresh enough.

ParameterDescription
sortoverall (default), activity, reliability, demand, rising, or falling. Rising and falling are the two directions of momentumScore, the only trend column published for servers; momentum is accepted as an alias for rising.
page, limitOptional pagination. limit is capped at 500.
search, region, platformNarrow the ranked population. These behave exactly as they do on /v2/servers.
online, includeOffline, official, hasMods, battleye, lockedThe same boolean filters /v2/servers accepts. Filtering narrows which ranked servers are returned; it never renumbers them, so rank stays each server's position across the whole ecosystem. As on /v2/servers, the default is currently-listed servers only.
Response row
{
  "serverId": "8d7f1b9c-6a28-42a1-8d3f-25f2f7c3f431",
  "rank": 12,
  "modelVersion": "analytics-2026-09-1",
  "activityScore": 94.2,
  "observedAvailabilityScore": 89.4,
  "reliabilityScore": 89.4,
  "demandScore": 91.8,
  "momentumScore": 73.1,
  "confidence": 0.87,
  "overallScore": 91.4,
  "calculatedAt": "2026-09-02T18:05:00Z",
  "sourceSnapshotId": 5399,
  "server": {
    "id": "8d7f1b9c-6a28-42a1-8d3f-25f2f7c3f431",
    "name": "Example Conflict Server",
    "scenarioName": "Conflict Everon",
    "online": true,
    "players": 48,
    "maxPlayers": 64,
    "region": "frankfurt",
    "modCount": 27
  }
}

GET /v2/analytics/servers/{id} returns one current server analytics row. If the server has no analytics ranking, the response is 404 ANALYTICS_NOT_AVAILABLE.

FieldMeaning
activityScoreObserved player activity relative to the rest of the tracked fleet.
observedAvailabilityScoreHow consistently the server was present in successful collection checks. This is not process uptime or an SLA. reliabilityScore is a deprecated compatibility alias.
demandScoreObserved queue frequency and queue size relative to the fleet; it is not a fullness score.
momentumScoreDirection of recent change in the above. Describes what was observed, not what will happen next.
confidenceModel confidence in this row given how much history exists for the server. It is not a trust or safety rating.
overallScore, rankCombined ecosystem-relative score and its position across all ranked servers.
GET

/v2/analytics/mods

Returns ReforgerMods-derived mod analytics for discovery. Use this endpoint for Popular, Rising, and Falling lists rather than Workshop sorting.

ParameterDescription
sortpopular (default), rising, falling, or deployments. Rising and falling lists exclude unranked rows where the corresponding rank is 0. deployments orders by totalDeployments, the number of currently listed servers reporting the mod, and is a raw count rather than a model rank.
page, limitOptional pagination. limit is capped at 500.

Analytics carry no Workshop metadata, so each row also includes the indexed Workshop preview under mod — name, artwork, author, tags, version — attached in one batch lookup. It is absent for mods the local Workshop index has not seen.

Response row
{
  "modId": "5965550F24A0C152",
  "name": "Example Mod",
  "totalDeployments": 2305,
  "confirmedRootDeployments": 1400,
  "dependencyDeployments": 700,
  "unclassifiedDeployments": 205,
  "dependencyClassificationCoverage": 0.91,
  "currentPlayerExposure": 10309,
  "playerHoursExposure7d": 88240.5,
  "playerHoursExposureCoverage7d": 0.96,
  "deploymentScore": 96.2,
  "activityScore": 93.1,
  "popularityScore": 98.8,
  "trendSignal": 1.4,
  "risingScore": 88.0,
  "fallingScore": 0,
  "popularityRank": 3,
  "risingRank": 12,
  "fallingRank": 0,
  "calculatedAt": "2026-09-02T18:05:00Z",
  "sourceSnapshotId": 5399,
  "modelVersion": "analytics-2026-09-1"
}

GET /v2/analytics/mods/{id} returns one complete mod analytics row, read straight from the analytics dataset. /v2/mods/{id} also carries a nested analytics object when analytics are available, but that copy is cached alongside the Workshop mod metadata and can therefore be older than this endpoint's — use calculatedAt to tell, and prefer this endpoint when you need the current numbers.

FieldMeaning
totalDeploymentsHow many tracked servers currently report this mod, split into confirmedRootDeployments (loaded directly), dependencyDeployments (pulled in by another mod), and unclassifiedDeployments.
dependencyClassificationCoverageFraction of deployments that could be classified as root or dependency, between 0 and 1.
currentPlayerExposurePlayers currently observed on servers reporting this mod. This is exposure, not unique users or individual usage.
playerHoursExposure7dEstimated player-hours observed on servers reporting this mod in the same sampled intervals over the last seven days. It is not unique users or proof that an individual used the mod.
playerHoursExposureCoverage7dPer-mod fraction of the requested seven-day wall-clock window covered by complete population buckets intersecting trusted observation intervals that report the mod. Missing, uncertain, and partial intervals are excluded; unrelated mods cannot increase it.
popularityScore, popularityRankEcosystem-relative popularity and its leaderboard position.
trendSignal, risingScore, fallingScoreDirection and strength of recent observed change. These describe the recent past and imply nothing about future adoption.
risingRank, fallingRankDirectional modpack-change leaderboards; 0 means the signal did not point in that direction or evidence was insufficient. These ranks describe recent additions/removals, not predicted growth.
GET

/v2/rate-limits

Returns the rate-limit tier resolved for the request. This route uses the same utility response shape as V1.

200 OK
{
  "authenticated": true,
  "rate_limit": {
    "plan": "pro",
    "limit_per_minute": 1200,
    "burst": 300,
    "limit_per_day": 500000,
    "window": "1 minute",
    "daily_window": "UTC day",
    "shared_by": "account",
    "daily_shared_by": "account",
    "active_key_limit": 10
  }
}
GET

/v2/refresh/jobs/{id}

Inspects background refresh progress when a refresh job is created. This route uses the same utility response shape as V1.

200 OK
{
  "id": "9f0b7d0f6fd4f88a8bb0e455f0b640247a93",
  "status": "queued",
  "resource_url": "/v2/mods?search=radio",
  "retry_after_seconds": 2
}
POST

/v2/tools/storage-plan

Plans mod storage for a current and a desired mod set. Sizes are always resolved server-side from real Workshop package bytes, so a client cannot influence the accounting. Exact and estimated bytes are carried separately through every subtotal and are never merged into one unqualified figure. No API key required.

mode decides how desired relates to current, and the two answer different questions. replace (the default) treats desired as the complete end state, so anything installed it does not reference becomes removable. add treats desired as mods to install on top of current, keeping installed mods the wish list never mentions.

includeRemovalImpact adds a removal block when a budget is set and the plan does not fit. It is opt-in because it costs dependency resolution for every mod in the request. Each candidate carries a three-valued status: safe, blocked (with requiredBy naming what would break), or unknown when dependency data was incomplete. Blocked and unknown candidates never count toward the running savings total.

Request
{
  "current": [{ "id": "5965550F24A0C152", "version": "1.0.0" }],
  "desired": [{ "id": "597706D1E4C7BAAD" }],
  "mode": "add",
  "budgetBytes": 107374182400,
  "includeRemovalImpact": true
}
200 OK (abridged)
{
  "status": "success",
  "data": {
    "mode": "add",
    "current": { "totalBytes": 16106127360, "totalText": "15 GiB", "exactCount": 42, "estimatedCount": 0, "coverage": 1 },
    "download": { "totalBytes": 2147483648, "totalText": "2 GiB", "exactCount": 3, "estimatedCount": 0 },
    "projected": { "totalBytes": 18253611008, "totalText": "17 GiB" },
    "peak": { "totalBytes": 18253611008, "totalText": "17 GiB" },
    "budget": { "set": true, "text": "100 GiB", "verdict": "fits", "headroomText": "83 GiB" },
    "downloads": [{ "id": "597706D1E4C7BAAD", "name": "Example Mod", "bytes": 2147483648, "exact": true, "source": "workshop-download-list" }],
    "removal": {
      "neededText": "0 B",
      "recommendedCount": 0,
      "candidates": [],
      "dependencyDataAvailable": true
    },
    "coverage": 1,
    "unsizedCount": 0,
    "notes": []
  },
  "resolution": { "requested": 45, "resolved": 45, "unresolved": 0, "exactSizes": 45, "sizeCoverage": 1 },
  "model": "reforgermods.net storage model 2026.08-1"
}

The Storage Planner is this endpoint with a UI on top.

POST

/v2/tools/dependency-analysis

Answers "what breaks if I remove this?" for a modpack. Send targetId for one mod or targetIds for a whole removal set; the two are unioned. No API key required.

A set is not the same question as its members one at a time: a mod inside the removal set is never counted as a blocker for another mod in the set, because both are going away together. coveredBySelection counts the mods that only break because of another selected mod. missingTargets lists requested IDs absent from the supplied pack; the ones present are still analysed.

A mod whose dependency metadata could not be fetched is reported in unresolvedMods, and its empty dependency list means unknown, not none — the verdict says so rather than claiming a removal is safe. includeAll is a drawing option that adds every remaining mod to the returned graph with role related; it never changes the verdict.

Request
{
  "mods": [
    { "id": "5965550F24A0C152", "version": "1.0.0" },
    { "id": "597706D1E4C7BAAD", "version": "2.1.0" }
  ],
  "targetIds": ["5965550F24A0C152"],
  "includeAll": false
}
200 OK (abridged)
{
  "status": "success",
  "data": {
    "status": "blocked",
    "reason": "Example Mod directly requires Core Framework and would break.",
    "targets": [{ "id": "5965550F24A0C152", "name": "Core Framework", "role": "selected" }],
    "missingTargets": [],
    "coveredBySelection": 0,
    "directBlockers": [{ "id": "597706D1E4C7BAAD", "name": "Example Mod", "depth": 1, "chainNames": ["Example Mod", "Core Framework"] }],
    "transitiveBlockers": [],
    "affectedCount": 1,
    "orphanedIfRemoved": [],
    "reclaimable": { "totalBytes": 943718400, "totalText": "900 MiB", "exactCount": 1, "estimatedCount": 0 },
    "unresolvedMods": [],
    "missingDependencies": [],
    "cycles": [],
    "graph": { "nodes": [], "edges": [], "minLayer": -1, "maxLayer": 0, "truncated": false }
  },
  "mods": [{ "id": "5965550F24A0C152", "name": "Core Framework", "bytes": 943718400, "exact": true }],
  "resolution": { "requested": 2, "resolved": 2, "unresolved": 0 },
  "model": "reforgermods.net dependency model 2026.08-1"
}

The Dependency Blockers tool is this endpoint with a UI on top.

POST

/v2/tools/hosting-estimate

Estimates RAM, CPU, and disk for a modded dedicated server. Supply mods for exact byte-based sizing; without it the estimate falls back to modCount and the median size of the mods indexed by reforgermods.net, and says so. No API key required.

Every figure is returned with the components that produced it and the calibration constants behind them. calibrationBasis is the weakest basis among the constants used — the honest confidence ceiling for the whole result. These are reforgermods.net's own planning estimates, not measurements published by any vendor, and most constants are currently provisional.

Request
{
  "slots": 64,
  "concurrentPlayers": 48,
  "scenario": "heavy",
  "logRetentionDays": 14,
  "backupCopies": 1,
  "mods": [{ "id": "5965550F24A0C152", "version": "1.0.0" }]
}
200 OK (abridged)
{
  "status": "success",
  "data": {
    "inputs": { "slots": 64, "concurrentPlayers": 48, "modCount": 1, "modBytesText": "900 MiB", "modBytesKnown": true, "scenario": "heavy" },
    "memory": { "recommendedGiB": 8, "minimumGiB": 6, "workingSetMiB": 4608, "components": [{ "label": "Dedicated server baseline", "text": "2.0 GiB", "why": "An idle, unmodded server process before anyone connects.", "exact": false }] },
    "cpu": { "recommendedCores": 4, "clockClass": "high-clock", "clockNote": "Reforger's simulation loop is single-threaded." },
    "disk": { "recommendedGiB": 50, "withMarginText": "38 GiB", "modBytesExact": true },
    "workload": { "players": "high", "mods": "light", "scenario": "heavy", "driver": "players" },
    "assumptions": [{ "key": "baseServerMemory", "label": "Idle server memory", "value": "2048 MiB", "basis": "provisional", "note": "Starting assumption pending measurement." }],
    "estimate": true,
    "calibrationVersion": "2026.08-1",
    "calibrationBasis": "provisional"
  },
  "mods": [{ "id": "5965550F24A0C152", "name": "Core Framework", "bytes": 943718400, "exact": true }],
  "model": "reforgermods.net hosting model 2026.08-1"
}

The Hosting Calculator is this endpoint with a UI on top.

List Response Structure

V2 list response
{
  "status": "success",
  "meta": {
    "totalPages": 2593,
    "currentPage": 2,
    "totalMods": 41478,
    "shownMods": 16,
    "modsIndexStart": 17,
    "modsIndexEnd": 32
  },
  "data": [ { "...": "V2 mod preview objects" } ],
  "links": {
    "next": "https://api.reforgermods.net/v2/mods?page=3&search=radio",
    "prev": "https://api.reforgermods.net/v2/mods?page=1&search=radio"
  }
}

V2 Mod Preview Object

List/search previews avoid long fields such as full descriptions, scenarios, dependency lists, and large preview-image arrays.

V2 preview
{
  "id": "5965550F24A0C152",
  "name": "Example Mod",
  "type": "addon",
  "summary": "Short Workshop summary",
  "authorId": "author_id",
  "author": "Example Author",
  "version": "1.2.3",
  "versionId": 123,
  "size": 203434353,
  "sizeFormatted": "194 MiB",
  "rating": 0.88,
  "ratingCount": 9178,
  "subscriberCount": 31995,
  "createdAt": "2022-05-18T22:02:44Z",
  "updatedAt": "2026-07-30T07:10:47Z",
  "unlisted": false,
  "private": false,
  "tags": ["VEHICLES", "WEAPONS"],
  "imageUrl": "https://example.com/image.png",
  "workshopUrl": "https://reforger.armaplatform.com/workshop/5965550F24A0C152",
  "apiUrl": "https://api.reforgermods.net/v2/mods/5965550F24A0C152"
}

V2 Mod Detail Object

size is raw bytes. sizeFormatted is derived from size using IEC units: B, KiB, MiB, GiB, and TiB. rating is a number from 0.0 to 1.0. Timestamps are RFC3339.

dependencySize and totalSize use direct dependencies reported for the current mod version. The detail object includes direct dependencies and scenarios arrays for convenience; version history remains available from the version subresource endpoints.

Upstream-only moderation, processing, access, blocked, reported, and platform bitfield data is not exposed. Giant license text is kept out of normal detail and available from /v2/mods/{id}/license.

Version History Object

The version-history response is a version collection for one mod. It does not repeat the full V2 mod detail fields.

Version history
{
  "modId": "{mod_id}",
  "count": 10,
  "versions": [ { "...": "mod version objects" } ]
}

Mod Version Object

A version row represents one lightweight Workshop asset version entry. size is raw bytes, sizeFormatted uses IEC units, and timestamps are returned as RFC3339 strings when available.

Mod version
{
  "id": "1040033",
  "version": "1.2.3",
  "gameVersion": "1.7.0.54",
  "size": 203434353,
  "sizeFormatted": "194 MiB",
  "approved": true,
  "published": true,
  "createdAt": "2026-07-30T07:09:00Z",
  "updatedAt": "2026-07-30T07:10:47Z",
  "scenarioCount": 11,
  "dependencyCount": 2,
  "apiUrl": "https://api.reforgermods.net/v2/mods/{mod_id}/versions/1.2.3"
}

Optional fields are omitted when the Workshop data does not include them. The list object does not include changelog text.

Version Detail Object

A version detail object represents one specific Workshop version. It adds author-provided changelog text and version-specific scenario/dependency data when available.

Version detail
{
  "modId": "{mod_id}",
  "id": "1040033",
  "version": "1.2.3",
  "gameVersion": "1.7.0.54",
  "size": 203434353,
  "sizeFormatted": "194 MiB",
  "approved": true,
  "published": true,
  "changelog": "Author changelog text",
  "createdAt": "2026-07-30T07:09:00Z",
  "updatedAt": "2026-07-30T07:10:47Z",
  "scenarioCount": 11,
  "dependencyCount": 2,
  "scenarios": [ { "...": "scenario objects" } ],
  "dependencies": [ { "...": "dependency objects" } ],
  "apiUrl": "https://api.reforgermods.net/v2/mods/{mod_id}/versions/1.2.3"
}

changelog preserves the Workshop text, including line breaks. It may be an empty string when the Workshop has no changelog for that version.

V2 Dependency Object

Dependency
{
  "id": "{dep_id}",
  "name": "Mod Dependency",
  "version": "1.2.3",
  "size": 6339694503,
  "sizeFormatted": "5.9 GiB",
  "published": true,
  "private": false,
  "dependencyCount": 0,
  "workshopUrl": "https://reforger.armaplatform.com/workshop/{dep_id}",
  "apiUrl": "https://api.reforgermods.net/v2/mods/{dep_id}"
}

Dependencies are direct dependencies for the current mod version. V2 does not expose dependency-level blocked.

V2 Scenario Object

Scenario
{
  "name": "Some Scenario",
  "description": "Scenario description",
  "gameId": "{mod_id}Missions/SomeScenario.conf",
  "gameMode": "#AR-Scenario_GameMode_Campaign",
  "author": "#AR-Author_BI",
  "playerCount": 64
}

Scenario objects do not include image URLs. Use mod-level imageUrl, previewImages, or screenshots for visual assets.

V1 Migration Notes

V1V2
/v1/mods/{page}/v2/mods?page={page}
/v1/search?query={query}/v2/mods?search={query}
/v1/mod/{id}/v2/mods/{id}
/v1/mod/{id}/versions/v2/mods/{id}/versions
Detail dependencies array/v2/mods/{id}/dependencies
Detail scenarios array/v2/mods/{id}/scenarios
size: "5.90 GB"size: 6335076761, sizeFormatted: "5.9 GiB"
rating: "88%"rating: 0.88
created: "18.05.2022"createdAt: "2022-05-18T22:02:44Z"

V2 mod data is normalized from Arma Reforger Workshop metadata and may be temporarily unavailable if the Workshop data shape changes.