Introduction
The greatest resource available for Single Player Tarkov modifications. Where modding legends are made. Discover powerful tools, expert-written guides, and exclusive mods. Craft your vision. Transform the game.
This documentation aims to provide all the information you need to work with our API.
As you scroll, you will see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile). You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer YOUR_API_KEY".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can generate your own API token by logging into the Forge, clicking your profile picture, and clicking API Tokens.
General
APIs for general application status and information.
Check API Health
Returns a simple 'pong' message to indicate that the API endpoint is available and responding correctly. This endpoint is typically used for health checks or basic connectivity tests.
It does not require authentication.
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/ping" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/ping"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/ping';
$response = $client->get(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/ping'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Successful Ping):
{
"success": true,
"data": {
"message": "pong"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Authentication
Endpoints for user authentication and token management.
Login & Token Creation
Authenticates a user with email and password and returns an API token. Users who registered via OAuth (and haven't set a password) cannot use this endpoint.
Example request:
curl --request POST \
"https://forge.sp-tarkov.com/api/v0/auth/login" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"email\": \"[email protected]\",
\"password\": \"secretPassword\",
\"token_name\": \"my-data-script-token\",
\"abilities\": [
\"update\"
]
}"
const url = new URL(
"https://forge.sp-tarkov.com/api/v0/auth/login"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "[email protected]",
"password": "secretPassword",
"token_name": "my-data-script-token",
"abilities": [
"update"
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/auth/login';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'email' => '[email protected]',
'password' => 'secretPassword',
'token_name' => 'my-data-script-token',
'abilities' => [
'update',
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/auth/login'
payload = {
"email": "[email protected]",
"password": "secretPassword",
"token_name": "my-data-script-token",
"abilities": [
"update"
]
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (200, Successful Login):
{
"success": true,
"data": {
"token": "{YOUR_API_TOKEN}"
}
}
Example response (401, Invalid Credentials):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Invalid credentials provided."
}
Example response (403, OAuth User Attempt):
{
"success": false,
"code": "PASSWORD_LOGIN_UNAVAILABLE",
"message": "Password login is not available for accounts created via OAuth. Please use the original login method or set a password for your account."
}
Example response (422, Validation Error):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "Validation failed.",
"errors": {
"email": [
"The email field is required."
],
"password": [
"The password field is required."
],
"abilities.0": [
"The selected ability read-invalid is invalid. Allowed abilities are: create, read, update, delete"
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Logout & Delete Current Token
requires authentication
Revokes the specific API token that was used to make this request.
Example request:
curl --request POST \
"https://forge.sp-tarkov.com/api/v0/auth/logout" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/auth/logout"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/auth/logout';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/auth/logout'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers)
response.json()Example response (200, Successful Logout):
{
"success": true,
"data": {
"message": "Current token revoked successfully."
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Logout & Delete All Tokens
requires authentication
Revokes all API tokens associated with the authenticated user.
Example request:
curl --request POST \
"https://forge.sp-tarkov.com/api/v0/auth/logout/all" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/auth/logout/all"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/auth/logout/all';
$response = $client->post(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/auth/logout/all'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers)
response.json()Example response (200, Successful Logout All):
{
"success": true,
"data": {
"message": "All tokens revoked successfully."
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Registration
Creates a new user account. Email verification is still required.
Example request:
curl --request POST \
"https://forge.sp-tarkov.com/api/v0/auth/register" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"NewUser123\",
\"email\": \"[email protected]\",
\"password\": \"StrongP@ssw0rd!\",
\"timezone\": \"America\\/New_York\"
}"
const url = new URL(
"https://forge.sp-tarkov.com/api/v0/auth/register"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"name": "NewUser123",
"email": "[email protected]",
"password": "StrongP@ssw0rd!",
"timezone": "America\/New_York"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/auth/register';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'name' => 'NewUser123',
'email' => '[email protected]',
'password' => 'StrongP@ssw0rd!',
'timezone' => 'America/New_York',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/auth/register'
payload = {
"name": "NewUser123",
"email": "[email protected]",
"password": "StrongP@ssw0rd!",
"timezone": "America\/New_York"
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (201, Successful Registration):
{
"success": true,
"data": {
"id": 2,
"name": "NewUser123",
"profile_photo_url": "https://ui-avatars.com/api/?name=NewUser123&color=...",
"cover_photo_url": "https://picsum.photos/seed/NewUser123/...",
"timezone": "America/New_York",
"created_at": "2025-04-02T21:30:00.000000Z",
"updated_at": "2025-04-01T10:00:00.000000Z"
}
}
Example response (422, Validation Error):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "Validation failed.",
"errors": {
"name": [
"The name has already been taken."
],
"email": [
"The email must be a valid email address."
],
"password": [
"The password must be at least 8 characters."
],
"timezone": [
"The timezone field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Resend Email Verification
Allows anyone to request a verification email resend by providing an email address. Use this if a user registered but did not receive the initial email and cannot log in. For security, this endpoint always returns a success message, regardless of whether the email exists or is already verified, to prevent email enumeration.
This endpoint is heavily rate-limited.
Example request:
curl --request POST \
"https://forge.sp-tarkov.com/api/v0/auth/email/resend" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"email\": \"[email protected]\"
}"
const url = new URL(
"https://forge.sp-tarkov.com/api/v0/auth/email/resend"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "[email protected]"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/auth/email/resend';
$response = $client->post(
$url,
[
'headers' => [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'email' => '[email protected]',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/auth/email/resend'
payload = {
"email": "[email protected]"
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (200, Request Accepted):
{
"success": true,
"data": {
"message": "If an account matching that email exists and requires verification, a new link has been sent."
}
}
Example response (422, Validation Error):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "Validation failed.",
"errors": {
"email": [
"The email field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Authenticated User
requires authentication
Retrieves the details for the currently authenticated user based on the provided API token.
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/auth/user?include=role" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/auth/user"
);
const params = {
"include": "role",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/auth/user';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'include' => 'role',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/auth/user'
params = {
'include': 'role',
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200, Success (No Includes)):
{
"success": true,
"data": {
"id": 1,
"name": "Test User",
"email": "[email protected]",
"email_verified_at": "2025-04-02T20:44:38.000000Z",
"profile_photo_url": "https://example.com/path/to/profile.jpg",
"cover_photo_url": "https://example.com/path/to/cover.jpg",
"created_at": "2025-04-01T10:00:00.000000Z"
}
}
Example response (200, Success (Include Role)):
{
"success": true,
"data": {
"id": 1,
"name": "Test User",
"email": "[email protected]",
"email_verified_at": "2025-04-02T20:44:38.000000Z",
"profile_photo_url": "https://example.com/path/to/profile.jpg",
"cover_photo_url": "https://example.com/path/to/cover.jpg",
"role": {
"id": 2,
"name": "Moderator",
"short_name": "Mod",
"description": "Moderate user content.",
"color_class": "emerald",
},
"created_at": "2025-04-01T10:00:00.000000Z",
"updated_at": "2025-04-01T10:00:00.000000Z"
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Token Abilities
requires authentication
Get the current token's abilities.
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/auth/abilities" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/auth/abilities"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/auth/abilities';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/auth/abilities'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success):
{
"success": true,
"data": [
"read",
"create",
"update",
"delete"
]
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mods
Endpoints for managing and retrieving mods.
Get Mods
requires authentication
Retrieves a paginated list of mods, allowing filtering, sorting, and relationship inclusion.
Fields available:hub_id, guid, name, slug, teaser, thumbnail, downloads, detail_url,
fika_compatibility, featured, contains_ai_content, contains_ads, shows_profile_binding_notice, category_id,
published_at, created_at, updated_at
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/mods" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/mods"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/mods';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/mods'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (All fields)):
{
"success": true,
"data": [
{
"id": 1,
"hub_id": null,
"guid": "com.oconnell.recusandae-velit-incidunt",
"name": "Recusandae velit incidunt.",
"slug": "recusandae-velit-incidunt",
"teaser": "Minus est minima quibusdam necessitatibus inventore iste.",
"thumbnail": "",
"downloads": 55212644,
"owner": {
"id": 1,
"name": "ModAuthor",
"profile_photo_url": "https://example.com/profile.jpg",
"cover_photo_url": "https://example.com/cover.jpg"
},
"additional_authors": [],
"source_code_links": [
{
"url": "http://oconnell.com/earum-sed-fugit-corrupti",
"label": null
}
],
"detail_url": "https://forge.sp-tarkov.com/mods/1/recusandae-velit-incidunt",
"fika_compatibility": true,
"featured": true,
"contains_ads": true,
"contains_ai_content": false,
"shows_profile_binding_notice": false,
"published_at": "2025-01-09T17:48:53.000000Z",
"created_at": "2024-12-11T14:48:53.000000Z",
"updated_at": "2025-04-10T13:50:00.000000Z"
},
{
"id": 2,
"hub_id": null,
"guid": "com.baumbach.adipisci-iusto-voluptas-nihil",
"name": "Adipisci iusto voluptas nihil.",
"slug": "adipisci-iusto-voluptas-nihil",
"teaser": "Minima adipisci perspiciatis nemo maiores rem porro natus.",
"thumbnail": "",
"downloads": 219598104,
"owner": {
"id": 2,
"name": "AnotherAuthor",
"profile_photo_url": "https://example.com/profile2.jpg",
"cover_photo_url": "https://example.com/cover2.jpg"
},
"additional_authors": [],
"source_code_links": [
{
"url": "http://baumbach.net/",
"label": null
}
],
"detail_url": "https://forge.sp-tarkov.com/mods/2/adipisci-iusto-voluptas-nihil",
"fika_compatibility": false,
"featured": false,
"contains_ads": true,
"contains_ai_content": true,
"shows_profile_binding_notice": false,
"published_at": "2024-08-30T14:48:53.000000Z",
"created_at": "2024-06-22T04:48:53.000000Z",
"updated_at": "2025-04-10T13:50:21.000000Z"
}
],
"links": {
"first": "https://forge.test/api/v0/mods?page=1",
"last": "https://forge.test/api/v0/mods?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.test/api/v0/mods?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.test/api/v0/mods",
"per_page": 12,
"to": 2,
"total": 2
}
}
Example response (200, Success (Include Category)):
{
"success": true,
"data": [
{
"id": 1,
"hub_id": null,
"guid": "com.oconnell.recusandae-velit-incidunt",
"name": "Recusandae velit incidunt.",
"slug": "recusandae-velit-incidunt",
"teaser": "Minus est minima quibusdam necessitatibus inventore iste.",
"thumbnail": "",
"downloads": 55212644,
"owner": {
"id": 1,
"name": "ModAuthor",
"profile_photo_url": "https://example.com/profile.jpg",
"cover_photo_url": "https://example.com/cover.jpg"
},
"additional_authors": [],
"source_code_links": [
{
"url": "http://oconnell.com/earum-sed-fugit-corrupti",
"label": null
}
],
"category": {
"id": 1,
"name": "Gameplay",
"slug": "gameplay",
"color_class": "blue"
},
"detail_url": "https://forge.sp-tarkov.com/mods/1/recusandae-velit-incidunt",
"fika_compatibility": true,
"featured": true,
"contains_ads": true,
"contains_ai_content": false,
"shows_profile_binding_notice": false,
"published_at": "2025-01-09T17:48:53.000000Z",
"created_at": "2024-12-11T14:48:53.000000Z",
"updated_at": "2025-04-10T13:50:00.000000Z"
}
],
"links": {
"first": "https://forge.test/api/v0/mods?include=category&page=1",
"last": "https://forge.test/api/v0/mods?include=category&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.test/api/v0/mods?include=category&page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.test/api/v0/mods",
"per_page": 12,
"to": 1,
"total": 1
}
}
Example response (200, Success (Include Versions and License)):
{
"success": true,
"data": [
{
"id": 1,
"hub_id": null,
"guid": "com.oconnell.recusandae-velit-incidunt",
"name": "Recusandae velit incidunt.",
"slug": "recusandae-velit-incidunt",
"teaser": "Minus est minima quibusdam necessitatibus inventore iste.",
"thumbnail": "",
"downloads": 55212644,
"owner": {
"id": 1,
"name": "ModAuthor",
"profile_photo_url": "https://example.com/profile.jpg",
"cover_photo_url": "https://example.com/cover.jpg"
},
"additional_authors": [],
"source_code_links": [
{
"url": "http://oconnell.com/earum-sed-fugit-corrupti",
"label": null
}
],
"detail_url": "https://forge.sp-tarkov.com/mods/1/recusandae-velit-incidunt",
"fika_compatibility": true,
"featured": true,
"contains_ads": true,
"contains_ai_content": false,
"shows_profile_binding_notice": false,
"versions": [
{
"id": 1,
"version": "1.2.3",
"spt_version_constraint": "^3.8.0",
"downloads": 1523,
"published_at": "2025-01-09T17:48:53.000000Z"
},
{
"id": 2,
"version": "1.2.2",
"spt_version_constraint": "^3.8.0",
"downloads": 892,
"published_at": "2025-01-05T12:30:00.000000Z"
}
],
"license": {
"id": 1,
"name": "MIT",
"short_name": "MIT"
},
"published_at": "2025-01-09T17:48:53.000000Z",
"created_at": "2024-12-11T14:48:53.000000Z",
"updated_at": "2025-04-10T13:50:00.000000Z"
}
],
"links": {
"first": "https://forge.test/api/v0/mods?include=versions,license&page=1",
"last": "https://forge.test/api/v0/mods?include=versions,license&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.test/api/v0/mods?include=versions,license&page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.test/api/v0/mods",
"per_page": 12,
"to": 1,
"total": 1
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Mod Details
requires authentication
Retrieves details for a single mod, allowing relationship inclusion.
Fields available:hub_id, guid, name, slug, teaser, description, thumbnail, downloads,
detail_url, fika_compatibility, featured, contains_ai_content, contains_ads, shows_profile_binding_notice,
published_at, created_at, updated_at
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/mod/0" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/mod/0"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/mod/0';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/mod/0'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (All fields, No Includes)):
{
"success": true,
"data": {
"id": 2,
"hub_id": null,
"guid": "com.baumbach.adipisci-iusto-voluptas-nihil",
"name": "Adipisci iusto voluptas nihil.",
"slug": "adipisci-iusto-voluptas-nihil",
"teaser": "Minima adipisci perspiciatis nemo maiores rem porro natus.",
"thumbnail": "",
"downloads": 219598104,
"description": "Adipisci rerum minima maiores sed. Neque totam quia libero exercitationem ullam.",
"owner": {
"id": 1,
"name": "ModOwner",
"profile_photo_url": "https://example.com/owner.jpg",
"cover_photo_url": "https://example.com/owner-cover.jpg"
},
"additional_authors": [],
"source_code_links": [
{
"url": "http://baumbach.net/",
"label": null
}
],
"detail_url": "https://forge.sp-tarkov.com/mods/2/adipisci-iusto-voluptas-nihil",
"fika_compatibility": true,
"featured": false,
"contains_ads": true,
"contains_ai_content": true,
"shows_profile_binding_notice": false,
"published_at": "2024-08-30T14:48:53.000000Z",
"created_at": "2024-06-22T04:48:53.000000Z",
"updated_at": "2025-04-10T13:50:21.000000Z"
}
}
Example response (200, Success (Include License)):
{
"success": true,
"data": {
"id": 2,
"hub_id": null,
"guid": "com.baumbach.adipisci-iusto-voluptas-nihil",
"name": "Adipisci iusto voluptas nihil.",
"slug": "adipisci-iusto-voluptas-nihil",
"teaser": "Minima adipisci perspiciatis nemo maiores rem porro natus.",
"thumbnail": "",
"downloads": 219598104,
"description": "Adipisci rerum minima maiores sed. Neque totam quia libero exercitationem ullam.",
"owner": {
"id": 1,
"name": "ModOwner",
"profile_photo_url": "https://example.com/owner.jpg",
"cover_photo_url": "https://example.com/owner-cover.jpg"
},
"additional_authors": [
{
"id": 5,
"name": "ContributorOne",
"profile_photo_url": "https://example.com/contributor1.jpg",
"cover_photo_url": "https://example.com/cover1.jpg"
},
{
"id": 8,
"name": "ContributorTwo",
"profile_photo_url": "https://example.com/contributor2.jpg",
"cover_photo_url": "https://example.com/cover2.jpg"
}
],
"source_code_links": [
{
"url": "http://baumbach.net/",
"label": null
}
],
"detail_url": "https://forge.sp-tarkov.com/mods/2/adipisci-iusto-voluptas-nihil",
"fika_compatibility": true,
"featured": false,
"contains_ads": true,
"contains_ai_content": true,
"shows_profile_binding_notice": false,
"license": {
"id": 2,
"name": "GNU General Public License v3.0",
"short_name": "GPL-3.0"
},
"published_at": "2024-08-30T14:48:53.000000Z",
"created_at": "2024-06-22T04:48:53.000000Z",
"updated_at": "2025-04-10T13:50:21.000000Z"
}
}
Example response (200, Success (Include Versions, License, and Category)):
{
"success": true,
"data": {
"id": 2,
"hub_id": null,
"guid": "com.baumbach.adipisci-iusto-voluptas-nihil",
"name": "Adipisci iusto voluptas nihil.",
"slug": "adipisci-iusto-voluptas-nihil",
"teaser": "Minima adipisci perspiciatis nemo maiores rem porro natus.",
"thumbnail": "",
"downloads": 219598104,
"description": "Adipisci rerum minima maiores sed. Neque totam quia libero exercitationem ullam.",
"source_code_links": [
{
"url": "http://baumbach.net/",
"label": null
}
],
"detail_url": "https://forge.sp-tarkov.com/mods/2/adipisci-iusto-voluptas-nihil",
"fika_compatibility": true,
"featured": false,
"contains_ads": true,
"contains_ai_content": true,
"shows_profile_binding_notice": false,
"owner": {
"id": 1,
"name": "ModOwner",
"profile_photo_url": "https://example.com/owner.jpg",
"cover_photo_url": "https://example.com/owner-cover.jpg"
},
"additional_authors": [
{
"id": 5,
"name": "ContributorOne",
"profile_photo_url": "https://example.com/contributor1.jpg",
"cover_photo_url": "https://example.com/cover1.jpg"
}
],
"versions": [
{
"id": 45,
"version": "2.1.0",
"spt_version_constraint": "^3.9.0",
"downloads": 5234,
"published_at": "2025-02-15T10:30:00.000000Z"
},
{
"id": 44,
"version": "2.0.5",
"spt_version_constraint": "^3.8.0",
"downloads": 12456,
"published_at": "2025-01-20T08:15:00.000000Z"
}
],
"license": {
"id": 2,
"name": "GNU General Public License v3.0",
"short_name": "GPL-3.0"
},
"category": {
"id": 3,
"name": "Quality of Life",
"slug": "quality-of-life",
"color_class": "purple"
},
"published_at": "2024-08-30T14:48:53.000000Z",
"created_at": "2024-06-22T04:48:53.000000Z",
"updated_at": "2025-04-10T13:50:21.000000Z"
}
}
Example response (404, Mod Does Not Exist):
{
"success": false,
"code": "NOT_FOUND",
"message": "Resource not found."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Mod Versions
requires authentication
Retrieves a paginated list of mod versions, allowing filtering, sorting, and relationship inclusion.
Fields available:hub_id, version, description, link, content_length, spt_version_constraint,
downloads, fika_compatibility, published_at, created_at, updated_at
The content_length field contains the file size in bytes as determined by the Content-Length header
from the download link. This field may be null for versions created before file size validation was implemented.
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/mod/0/versions" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/mod/0/versions"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/mod/0/versions';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/mod/0/versions'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (All fields, No Includes)):
{
"success": true,
"data": [
{
"id": 938,
"hub_id": null,
"version": "0.2.9",
"description": "Magni eius ad temporibus similique accusamus assumenda aliquid. Quisquam placeat in necessitatibus ducimus quasi odit. Autem nulla ea minus itaque.",
"link": "http://kautzer.com/enim-ut-quis-suscipit-dolores.html",
"content_length": 52428800,
"spt_version_constraint": "^1.0.0",
"downloads": 8,
"fika_compatibility": "unknown",
"published_at": "2024-05-09T10:49:41.000000Z",
"created_at": "2024-12-19T04:49:41.000000Z",
"updated_at": "2025-02-18T11:49:41.000000Z"
},
{
"id": 660,
"hub_id": null,
"version": "8.2.8",
"description": "Mollitia voluptatem quia et ex aut. Qui libero tempore ut. Suscipit a eius recusandae aut pariatur soluta necessitatibus.",
"link": "http://lockman.net/",
"spt_version_constraint": "<4.0.0",
"downloads": 3332503,
"fika_compatibility": "compatible",
"published_at": "2024-07-03T05:49:25.000000Z",
"created_at": "2024-10-06T23:49:25.000000Z",
"updated_at": "2024-10-15T03:49:25.000000Z"
},
{
"id": 2,
"hub_id": null,
"version": "6.5.2",
"description": "Consequatur modi et labore ea neque id. Natus sapiente amet rerum quia in molestiae autem. Eligendi molestiae blanditiis voluptatem earum.",
"link": "https://auer.com/ipsum-ratione-sint-eveniet-aut-porro-qui-in-odio.html",
"spt_version_constraint": "<4.0.0",
"downloads": 40217550,
"fika_compatibility": "incompatible",
"published_at": "2024-12-23T14:48:58.000000Z",
"created_at": "2024-09-26T13:48:58.000000Z",
"updated_at": "2025-03-21T01:48:58.000000Z"
},
{
"id": 363,
"hub_id": null,
"version": "5.9.5",
"description": "Aut ut inventore aut ex tempora a aspernatur asperiores. A laborum ullam ex rerum illo dolorem cupiditate. Veritatis id dolor qui quam et.",
"link": "http://kreiger.com/ut-voluptas-doloremque-natus-dolorem-odit-facilis",
"spt_version_constraint": "^1.0.0",
"downloads": 11236658,
"fika_compatibility": "unknown",
"published_at": "2025-03-18T23:49:12.000000Z",
"created_at": "2024-09-04T16:49:12.000000Z",
"updated_at": "2024-05-26T13:49:12.000000Z"
},
{
"id": 1217,
"hub_id": null,
"version": "2.6.8",
"description": "Aut in rerum est labore omnis. Voluptatem est velit doloribus expedita et. Illo error ut aspernatur quia quo repellat tenetur.",
"link": "http://www.becker.org/eum-laboriosam-ut-voluptates-voluptatibus-voluptates-nihil",
"spt_version_constraint": ">=3.0.0",
"downloads": 425925,
"fika_compatibility": "compatible",
"published_at": "2025-03-20T13:50:00.000000Z",
"created_at": "2025-02-12T01:50:00.000000Z",
"updated_at": "2025-03-17T07:50:00.000000Z"
}
],
"links": {
"first": "https://forge.sp-tarkov.com/api/v0/mod/1/versions?page=1",
"last": "https://forge.sp-tarkov.com/api/v0/mod/1/versions?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.sp-tarkov.com/api/v0/mod/1/versions?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.sp-tarkov.com/api/v0/mod/1/versions",
"per_page": 12,
"to": 5,
"total": 5
}
}
Example response (200, Success (Include Dependencies)):
{
"success": true,
"data": [
{
"id": 938,
"hub_id": null,
"version": "0.2.9",
"description": "Magni eius ad temporibus similique accusamus assumenda aliquid. Quisquam placeat in necessitatibus ducimus quasi odit. Autem nulla ea minus itaque.",
"link": "http://kautzer.com/enim-ut-quis-suscipit-dolores.html",
"content_length": 52428800,
"spt_version_constraint": "^1.0.0",
"downloads": 8,
"fika_compatibility": "unknown",
"dependencies": [
{
"id": 5,
"mod_id": 42,
"mod_guid": "com.example.core-library",
"mod_name": "Core Library",
"version_constraint": "^2.0.0",
"is_optional": false
},
{
"id": 8,
"mod_id": 15,
"mod_guid": "com.example.helper-utils",
"mod_name": "Helper Utilities",
"version_constraint": ">=1.5.0",
"is_optional": true
}
],
"published_at": "2024-05-09T10:49:41.000000Z",
"created_at": "2024-12-19T04:49:41.000000Z",
"updated_at": "2025-02-18T11:49:41.000000Z"
},
{
"id": 660,
"hub_id": null,
"version": "8.2.8",
"description": "Mollitia voluptatem quia et ex aut. Qui libero tempore ut. Suscipit a eius recusandae aut pariatur soluta necessitatibus.",
"link": "http://lockman.net/",
"spt_version_constraint": "<4.0.0",
"downloads": 3332503,
"fika_compatibility": "compatible",
"dependencies": [],
"published_at": "2024-07-03T05:49:25.000000Z",
"created_at": "2024-10-06T23:49:25.000000Z",
"updated_at": "2024-10-15T03:49:25.000000Z"
}
],
"links": {
"first": "https://forge.sp-tarkov.com/api/v0/mod/1/versions?include=dependencies&page=1",
"last": "https://forge.sp-tarkov.com/api/v0/mod/1/versions?include=dependencies&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.sp-tarkov.com/api/v0/mod/1/versions?include=dependencies&page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.sp-tarkov.com/api/v0/mod/1/versions",
"per_page": 12,
"to": 2,
"total": 2
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Mod Updates
requires authentication
Checks for available updates for one or more installed mod versions, filtered by SPT version compatibility. This endpoint intelligently handles dependency constraints and prerelease versions to provide safe update recommendations.
How it works:
- Accepts mod identifier:version pairs and a target SPT version
- Finds newer versions compatible with the target SPT version
- Validates that updates won't break dependencies
- Returns categorized results: safe updates, blocked updates, up-to-date mods, and incompatible mods
Prerelease Handling:
- If a mod is on a prerelease version (e.g., 1.0.0-beta.1), the stable release (1.0.0) will be recommended if available, otherwise newer prereleases (e.g., 1.0.0-beta.2)
- If a mod is on a stable version, only stable versions are recommended (never prereleases)
Dependency Validation:
- Checks if updating would break constraints from other installed mods
- Validates that all dependencies of the new version can be satisfied
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/mods/updates" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/mods/updates"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/mods/updates';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/mods/updates'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success):
{
"success": true,
"data": {
"spt_version": "3.11.5",
"updates": [
{
"current_version": {
"id": 42,
"mod_id": 5,
"guid": "com.example.mod",
"name": "Example Mod",
"slug": "example-mod",
"version": "1.0.0"
},
"recommended_version": {
"id": 58,
"version": "1.5.0",
"link": "https://example.com/download",
"content_length": 1048576,
"fika_compatibility": "compatible",
"spt_versions": [
"3.11.0",
"3.11.5"
]
},
"update_reason": "newer_version_available"
}
],
"blocked_updates": [
{
"current_version": {
"id": 99,
"mod_id": 20,
"guid": "com.example.blocked",
"name": "Blocked Mod",
"version": "2.0.0"
},
"latest_version": {
"id": 105,
"version": "3.0.0",
"spt_versions": [
"3.11.5"
]
},
"block_reason": "dependency_constraint_violation",
"blocking_mods": [
{
"mod_id": 15,
"mod_guid": "com.example.dependent",
"mod_name": "Dependent Mod",
"current_version": "1.0.0",
"constraint": "^2.0.0",
"incompatible_with": "3.0.0"
}
]
}
],
"up_to_date": [
{
"id": 125,
"mod_id": 25,
"guid": "com.example.current",
"name": "Current Mod",
"version": "1.8.0",
"spt_versions": [
"3.11.5"
]
}
],
"incompatible_with_spt": [
{
"id": 150,
"mod_id": 30,
"guid": "com.example.old",
"name": "Old Mod",
"version": "1.0.0",
"reason": "no_version_for_spt",
"latest_compatible_version": null
}
]
}
}
Example response (400, Missing Parameter):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "You must provide both 'mods' and 'spt_version' parameters."
}
Example response (400, Invalid SPT Version):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "SPT version not found or not published."
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Mod Dependencies
requires authentication
Resolves the complete dependency tree for one or more mod versions, returning all required dependencies recursively. This endpoint is designed for mod managers and installers that need to determine which mods must be downloaded and installed to satisfy all dependencies for a given set of mods.
How it works:
- Accepts one or more
identifier:versionpairs where identifier can be either a mod_id (numeric) or GUID (string) (e.g.,5:1.2.0,com.example.mod:2.0.5) - For each queried mod version, resolves all direct and transitive dependencies
- Returns a flattened tree structure with each dependency and its nested dependencies
- Applies intelligent deduplication when multiple queried mods depend on the same mod
- Detects and flags version constraint conflicts
Smart Deduplication: When multiple queried mods share the same dependency, the endpoint analyzes semantic version constraints:
- Compatible constraints (e.g., ^1.0.0 and ^1.5.0): Returns only the highest version satisfying all constraints (e.g., 1.8.0), with
conflict: false - Incompatible constraints (e.g., ^1.0.0 and ^2.0.0): Returns all conflicting versions, each marked with
conflict: true
Response Structure: Each mod in the response includes:
- Mod fields:
id,guid,name,slug- Essential identifying information - latest_compatible_version: The highest version satisfying all constraints, containing:
id- Mod version IDversion- Semantic version stringlink- Download URL for the mod filecontent_length- File size in bytesfika_compatibility- Compatibility status with Fika mod
- conflict: Boolean indicating if this dependency has incompatible version constraints
- dependencies: Array of nested dependencies (same structure, recursive)
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/mods/dependencies" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/mods/dependencies"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/mods/dependencies';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/mods/dependencies'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (Compatible Dependencies)):
{
"success": true,
"data": [
{
"id": 5,
"guid": "com.example.dependency",
"name": "Dependency Mod",
"slug": "dependency-mod",
"latest_compatible_version": {
"id": 42,
"version": "2.1.0",
"link": "https://example.com/mods/dependency-mod-2.1.0.zip",
"content_length": 1048576,
"fika_compatibility": "compatible"
},
"conflict": false,
"dependencies": [
{
"id": 8,
"guid": "com.example.subdep",
"name": "Sub Dependency",
"slug": "sub-dependency",
"latest_compatible_version": {
"id": 67,
"version": "1.0.0",
"link": "https://example.com/mods/sub-dependency-1.0.0.zip",
"content_length": 524288,
"fika_compatibility": "unknown"
},
"conflict": false,
"dependencies": []
}
]
}
]
}
Example response (200, Success (Conflicting Dependencies)):
{
"success": true,
"data": [
{
"id": 12,
"guid": "com.example.conflicting",
"name": "Conflicting Dependency",
"slug": "conflicting-dependency",
"latest_compatible_version": {
"id": 100,
"version": "1.5.0",
"link": "https://example.com/mods/conflicting-1.5.0.zip",
"content_length": 2097152,
"fika_compatibility": "compatible"
},
"conflict": true,
"dependencies": []
},
{
"id": 12,
"guid": "com.example.conflicting",
"name": "Conflicting Dependency",
"slug": "conflicting-dependency",
"latest_compatible_version": {
"id": 150,
"version": "2.0.0",
"link": "https://example.com/mods/conflicting-2.0.0.zip",
"content_length": 3145728,
"fika_compatibility": "incompatible"
},
"conflict": true,
"dependencies": []
}
]
}
Example response (200, Success (No Dependencies Found)):
{
"success": true,
"data": []
}
Example response (400, Missing Parameter):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "You must provide the 'mods' parameter."
}
Example response (400, Invalid Format):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "Invalid format for 'mods' parameter. Expected format: 'identifier:version,identifier:version' where identifier is either a mod_id (numeric) or GUID (string)"
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Addons
Endpoints for managing and retrieving addons.
Get Addons
requires authentication
Retrieves a paginated list of addons, allowing filtering, sorting, and relationship inclusion.
Fields available:guid, name, slug, teaser, thumbnail, downloads, detail_url,
contains_ai_content, contains_ads, mod_id, published_at, created_at, updated_at
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/addons" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/addons"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/addons';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/addons'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (All fields, No Includes)):
{
"success": true,
"data": [
{
"id": 1,
"guid": "com.example.music-pack",
"name": "Ultimate Music Pack",
"slug": "ultimate-music-pack",
"teaser": "A collection of atmospheric music tracks",
"thumbnail": "",
"downloads": 1523,
"owner": {
"id": 1,
"name": "AddonAuthor",
"profile_photo_url": "https://example.com/profile.jpg",
"cover_photo_url": "https://example.com/cover.jpg"
},
"additional_authors": [],
"source_code_links": [],
"detail_url": "https://forge.sp-tarkov.com/addon/1/ultimate-music-pack",
"contains_ads": false,
"contains_ai_content": false,
"mod_id": 5,
"is_detached": false,
"published_at": "2025-01-09T17:48:53.000000Z",
"created_at": "2024-12-11T14:48:53.000000Z",
"updated_at": "2025-04-10T13:50:00.000000Z"
}
],
"links": {
"first": "https://forge.test/api/v0/addons?page=1",
"last": "https://forge.test/api/v0/addons?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.test/api/v0/addons?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.test/api/v0/addons",
"per_page": 12,
"to": 1,
"total": 1
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Addon Details
requires authentication
Retrieves details for a single addon, allowing relationship inclusion.
Fields available:guid, name, slug, teaser, description, thumbnail, downloads, source_code_links,
detail_url, contains_ai_content, contains_ads, mod_id, is_detached, published_at, created_at, updated_at
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/addon/0" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/addon/0"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/addon/0';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/addon/0'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (All fields, No Includes)):
{
"success": true,
"data": {
"id": 1,
"guid": "com.example.music-pack",
"name": "Ultimate Music Pack",
"slug": "ultimate-music-pack",
"teaser": "A collection of atmospheric music tracks",
"description": "This addon adds over 50 new music tracks...",
"thumbnail": "",
"downloads": 1523,
"owner": {
"id": 1,
"name": "AddonAuthor",
"profile_photo_url": "https://example.com/profile.jpg",
"cover_photo_url": "https://example.com/cover.jpg"
},
"additional_authors": [],
"source_code_links": [],
"detail_url": "https://forge.sp-tarkov.com/addon/1/ultimate-music-pack",
"contains_ads": false,
"contains_ai_content": false,
"mod_id": 5,
"is_detached": false,
"published_at": "2025-01-09T17:48:53.000000Z",
"created_at": "2024-12-11T14:48:53.000000Z",
"updated_at": "2025-04-10T13:50:00.000000Z"
}
}
Example response (404, Addon Does Not Exist):
{
"success": false,
"code": "NOT_FOUND",
"message": "Resource not found."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Addon Versions
requires authentication
Retrieves a paginated list of addon versions, allowing filtering, sorting, and relationship inclusion.
Fields available:id, version, description, link, content_length, mod_version_constraint,
downloads, published_at, created_at, updated_at
The content_length field contains the file size in bytes as determined by the Content-Length header
from the download link. This field may be null for versions created before file size validation was implemented.
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/addon/0/versions" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/addon/0/versions"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/addon/0/versions';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/addon/0/versions'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (All fields, No Includes)):
{
"success": true,
"data": [
{
"id": 1,
"version": "1.2.0",
"description": "Added 10 new tracks",
"link": "https://example.com/download/v1.2.0.zip",
"content_length": 52428800,
"mod_version_constraint": "^2.0.0",
"downloads": 523,
"published_at": "2025-01-09T17:48:53.000000Z",
"created_at": "2024-12-11T14:48:53.000000Z",
"updated_at": "2025-04-10T13:50:00.000000Z"
},
{
"id": 2,
"version": "1.1.0",
"description": "Fixed audio glitches",
"link": "https://example.com/download/v1.1.0.zip",
"content_length": 51200000,
"mod_version_constraint": "^2.0.0",
"downloads": 1000,
"published_at": "2024-12-15T10:30:00.000000Z",
"created_at": "2024-11-20T08:15:00.000000Z",
"updated_at": "2025-01-05T12:45:00.000000Z"
}
],
"links": {
"first": "https://forge.sp-tarkov.com/api/v0/addon/1/versions?page=1",
"last": "https://forge.sp-tarkov.com/api/v0/addon/1/versions?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.sp-tarkov.com/api/v0/addon/1/versions?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.sp-tarkov.com/api/v0/addon/1/versions",
"per_page": 12,
"to": 2,
"total": 2
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Addon Dependencies
requires authentication
Resolves the complete dependency tree for one or more addon versions, returning all required mod dependencies. This endpoint is designed for mod managers and installers that need to determine which mods must be downloaded and installed to satisfy all dependencies for a given set of addons.
How it works:
- Accepts one or more
identifier:versionpairs where identifier can be either an addon_id (numeric) or slug (string) (e.g.,5:1.2.0,my-addon:2.0.5) - For each queried addon version, resolves all direct mod dependencies and their transitive dependencies
- Returns a flattened tree structure with each dependency and its nested dependencies
- Applies intelligent deduplication when multiple queried addons depend on the same mod
- Detects and flags version constraint conflicts
Smart Deduplication: When multiple queried addons share the same dependency, the endpoint analyzes semantic version constraints:
- Compatible constraints (e.g., ^1.0.0 and ^1.5.0): Returns only the highest version satisfying all constraints, with
conflict: false - Incompatible constraints (e.g., ^1.0.0 and ^2.0.0): Returns all conflicting versions, each marked with
conflict: true
Response Structure: Each mod in the response includes:
- Mod fields:
id,guid,name,slug- Essential identifying information - latest_compatible_version: The highest version satisfying all constraints
- conflict: Boolean indicating if this dependency has incompatible version constraints
- dependencies: Array of nested mod dependencies (same structure, recursive)
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/addons/dependencies" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/addons/dependencies"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/addons/dependencies';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/addons/dependencies'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (Compatible Dependencies)):
{
"success": true,
"data": [
{
"id": 5,
"guid": "com.example.dependency",
"name": "Dependency Mod",
"slug": "dependency-mod",
"latest_compatible_version": {
"id": 42,
"version": "2.1.0",
"link": "https://example.com/mods/dependency-mod-2.1.0.zip",
"content_length": 1048576,
"fika_compatibility": "compatible"
},
"conflict": false,
"dependencies": []
}
]
}
Example response (200, Success (No Dependencies Found)):
{
"success": true,
"data": []
}
Example response (400, Missing Parameter):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "You must provide the 'addons' parameter."
}
Example response (400, Invalid Format):
{
"success": false,
"code": "VALIDATION_FAILED",
"message": "Invalid format for 'addons' parameter. Expected format: 'identifier:version,identifier:version' where identifier is either an addon_id (numeric) or slug (string)"
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Mod Categories
Endpoints for retrieving mod category data.
Get Mod Categories
requires authentication
Retrieves a paginated list of mod categories, allowing filtering and sorting.
Fields available:id, hub_id, title, slug, description
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/mod-categories" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/mod-categories"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/mod-categories';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/mod-categories'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success):
{
"success": true,
"data": [
{
"id": 1,
"hub_id": 12,
"title": "Weapons",
"slug": "weapons",
"description": "Weapon mods and attachments",
},
{
"id": 2,
"hub_id": 13,
"title": "Gear",
"slug": "gear",
"description": "Armor, rigs, and equipment",
}
],
"links": {
"first": "https://forge.sp-tarkov.com/api/v0/mod-categories?page=1",
"last": "https://forge.sp-tarkov.com/api/v0/mod-categories?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.sp-tarkov.com/api/v0/mod-categories?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.sp-tarkov.com/api/v0/mod-categories",
"per_page": 50,
"to": 2,
"total": 2
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get Mod Category
requires authentication
Retrieves a single mod category by ID or slug.
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/mod-categories/illum" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/mod-categories/illum"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/mod-categories/illum';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/mod-categories/illum'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success):
{
"success": true,
"data": {
"id": 1,
"hub_id": 12,
"title": "Weapons",
"slug": "weapons",
"description": "Weapon mods and attachments",
}
}
Example response (404, Not Found):
{
"success": false,
"code": "NOT_FOUND",
"message": "The requested resource was not found."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
SPT Versions
Endpoints for retrieving SPT-related data.
Get SPT Versions
requires authentication
Retrieves a paginated list of SPT versions, allowing filtering and sorting.
Fields available:id, version, version_major, version_minor, version_patch, version_labels, mod_count,
link, color_class, created_at, updated_at
Example request:
curl --request GET \
--get "https://forge.sp-tarkov.com/api/v0/spt/versions" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://forge.sp-tarkov.com/api/v0/spt/versions"
);
const headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$url = 'https://forge.sp-tarkov.com/api/v0/spt/versions';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://forge.sp-tarkov.com/api/v0/spt/versions'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success):
{
"success": true,
"data": [
{
"id": 2,
"version": "3.11.3",
"version_major": 3,
"version_minor": 11,
"version_patch": 3,
"version_labels": "",
"mod_count": 371,
"link": "https://github.com/sp-tarkov/build/releases/tag/3.11.3",
"color_class": "green",
"created_at": "2025-04-08T19:29:40.000000Z",
"updated_at": "2025-04-08T19:29:40.000000Z"
},
{
"id": 3,
"version": "3.11.2",
"version_major": 3,
"version_minor": 11,
"version_patch": 2,
"version_labels": "",
"mod_count": 371,
"link": "https://github.com/sp-tarkov/build/releases/tag/3.11.2",
"color_class": "green",
"created_at": "2025-03-31T12:39:00.000000Z",
"updated_at": "2025-03-31T12:39:00.000000Z"
}
],
"links": {
"first": "https://forge.sp-tarkov.com/api/v0/spt/versions?page=1",
"last": "https://forge.sp-tarkov.com/api/v0/spt/versions?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://forge.sp-tarkov.com/api/v0/spt/versions?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://forge.sp-tarkov.com/api/v0/spt/versions",
"per_page": 12,
"to": 2,
"total": 2
}
}
Example response (401, Unauthenticated):
{
"success": false,
"code": "UNAUTHENTICATED",
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.