Arma Reforger Mods API
A documented, read-only Arma Reforger Workshop metadata API for mod search, details, dependencies, versions, scenarios, and server-tool integrations.
What the API provides
The API exposes cached Workshop mod previews, search results, full mod details, dependencies, scenarios, refresh-job status, and rate-limit information. It is built for server panels, bots, dashboards, config tools, and community websites that need Workshop metadata without scraping pages directly.
Base URL
https://api.reforgermods.net/v1
First request
curl 'https://api.reforgermods.net/v1/mods?search=radio&sort=newest'
List and search responses return mod previews with names, authors, IDs, sizes, ratings, and links. Fetch full details, including dependencies and scenarios, for one mod:
curl 'https://api.reforgermods.net/v1/mod/5965550F24A0C152'
Authentication and API keys
Anonymous access is available for public cached reads. Paid API keys can be sent with X-API-Key or Authorization: Bearer and are managed from the account area after checkout.
Rate limits
Anonymous access currently allows 60 requests per minute per resolved client IP with a burst of 20. Developer plans use 300 requests per minute with a burst of 30, and Pro plans use 1,200 requests per minute with a burst of 120. Paid limits are shared across all active keys on the same account.
Cached and indexed data
Responses are cached to keep the API responsive and to reduce repeated Workshop requests. Cached data can be stale by design, so integrations should show update dates where useful and avoid treating the API as an ownership or moderation authority.
202 Accepted and refresh jobs
If a cold-cache request returns 202 Accepted, the API has accepted a background refresh job. Wait the number of seconds in Retry-After, then retry the same URL. You can also inspect the Location job URL, but most clients only need to retry the original request.
import time
import requests
def get_json(url, attempts=4):
headers = {"User-Agent": "my-tool/1.0 ([email protected])"}
for _ in range(attempts):
response = requests.get(url, headers=headers, timeout=15)
if response.status_code == 202:
time.sleep(int(response.headers.get("Retry-After", "2")))
continue
response.raise_for_status()
return response.json()
raise RuntimeError("Workshop data is still refreshing")
mods = get_json("https://api.reforgermods.net/v1/mods?search=radio")
Integration use cases
- Server hosting panels that need mod names, IDs, versions, and dependency hints.
- Discord bots that search Workshop mods or show detail cards.
- Config generators and validators that resolve mod IDs without scraping.
- Community dashboards that link back to official Workshop pages.
Code examples
The examples above cover basic search, mod detail fetches, and cold-cache retries. The full API reference includes every endpoint, parameter, response shape, header, and error code.
Be a good client
- Send an identifying
User-AgentorX-API-Clientheader with a contact hint, so traffic can be attributed and never mistaken for abuse. - Respect
Retry-Afteron202,429, and503responses, and cap your retries. - Anonymous clients get 60 requests per minute per IP by default; batch and cache instead of polling.
- Use the
ETagandCache-Controlheaders: sendIf-None-Matchto get cheap304 Not Modifiedresponses for unchanged data.
Go deeper
The API also powers the mod browser, config generator, and config validator on this site, so tool behavior and API behavior always match.
Frequently asked questions
Is the Reforger Mods API official?
No. It is an independent, unofficial API that normalizes metadata from public Arma Reforger Workshop pages. It links back to the official Workshop and is not affiliated with Bohemia Interactive.
Is the API free to use?
Yes. Anonymous clients get 60 requests per minute per IP by default. Cache responses on your side, respect Retry-After, and send an identifying User-Agent or X-API-Client header.
Why do some requests return 202 Accepted?
A 202 means the data was not cached yet and a background refresh job was queued. Wait the number of seconds in the Retry-After header, then retry the same URL. It is not an error.