MENU navbar-image

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"
    }
}
 

Request      

GET api/v0/ping

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
        ]
    }
}
 

Request      

POST api/v0/auth/login

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The user's email address. Must be a valid email address. The email of an existing record in the users table. Example: [email protected]

password   string     

The user's password. Must not be greater than 128 characters. Example: secretPassword

token_name   string  optional    

A descriptive name for the API token. Must not be greater than 255 characters. Example: my-data-script-token

abilities   string[]  optional    
Must be one of:
  • create
  • read
  • update
  • delete

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."
}
 

Request      

POST api/v0/auth/logout

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
}
 

Request      

POST api/v0/auth/logout/all

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
        ]
    }
}
 

Request      

POST api/v0/auth/register

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

The desired username. Must not be greater than 36 characters. Example: NewUser123

email   string     

The user's email address. Must be a valid email address. Must not be greater than 255 characters. Example: [email protected]

password   string     

The desired password (must meet complexity requirements). Must not be greater than 128 characters. Must be at least 8 characters. Example: StrongP@ssw0rd!

timezone   string     

The user's timezone (IANA identifier). Example: America/New_York

Must be one of:
  • Africa/Abidjan
  • Africa/Accra
  • Africa/Addis_Ababa
  • Africa/Algiers
  • Africa/Asmara
  • Africa/Bamako
  • Africa/Bangui
  • Africa/Banjul
  • Africa/Bissau
  • Africa/Blantyre
  • Africa/Brazzaville
  • Africa/Bujumbura
  • Africa/Cairo
  • Africa/Casablanca
  • Africa/Ceuta
  • Africa/Conakry
  • Africa/Dakar
  • Africa/Dar_es_Salaam
  • Africa/Djibouti
  • Africa/Douala
  • Africa/El_Aaiun
  • Africa/Freetown
  • Africa/Gaborone
  • Africa/Harare
  • Africa/Johannesburg
  • Africa/Juba
  • Africa/Kampala
  • Africa/Khartoum
  • Africa/Kigali
  • Africa/Kinshasa
  • Africa/Lagos
  • Africa/Libreville
  • Africa/Lome
  • Africa/Luanda
  • Africa/Lubumbashi
  • Africa/Lusaka
  • Africa/Malabo
  • Africa/Maputo
  • Africa/Maseru
  • Africa/Mbabane
  • Africa/Mogadishu
  • Africa/Monrovia
  • Africa/Nairobi
  • Africa/Ndjamena
  • Africa/Niamey
  • Africa/Nouakchott
  • Africa/Ouagadougou
  • Africa/Porto-Novo
  • Africa/Sao_Tome
  • Africa/Tripoli
  • Africa/Tunis
  • Africa/Windhoek
  • America/Adak
  • America/Anchorage
  • America/Anguilla
  • America/Antigua
  • America/Araguaina
  • America/Argentina/Buenos_Aires
  • America/Argentina/Catamarca
  • America/Argentina/Cordoba
  • America/Argentina/Jujuy
  • America/Argentina/La_Rioja
  • America/Argentina/Mendoza
  • America/Argentina/Rio_Gallegos
  • America/Argentina/Salta
  • America/Argentina/San_Juan
  • America/Argentina/San_Luis
  • America/Argentina/Tucuman
  • America/Argentina/Ushuaia
  • America/Aruba
  • America/Asuncion
  • America/Atikokan
  • America/Bahia
  • America/Bahia_Banderas
  • America/Barbados
  • America/Belem
  • America/Belize
  • America/Blanc-Sablon
  • America/Boa_Vista
  • America/Bogota
  • America/Boise
  • America/Cambridge_Bay
  • America/Campo_Grande
  • America/Cancun
  • America/Caracas
  • America/Cayenne
  • America/Cayman
  • America/Chicago
  • America/Chihuahua
  • America/Ciudad_Juarez
  • America/Costa_Rica
  • America/Coyhaique
  • America/Creston
  • America/Cuiaba
  • America/Curacao
  • America/Danmarkshavn
  • America/Dawson
  • America/Dawson_Creek
  • America/Denver
  • America/Detroit
  • America/Dominica
  • America/Edmonton
  • America/Eirunepe
  • America/El_Salvador
  • America/Fort_Nelson
  • America/Fortaleza
  • America/Glace_Bay
  • America/Goose_Bay
  • America/Grand_Turk
  • America/Grenada
  • America/Guadeloupe
  • America/Guatemala
  • America/Guayaquil
  • America/Guyana
  • America/Halifax
  • America/Havana
  • America/Hermosillo
  • America/Indiana/Indianapolis
  • America/Indiana/Knox
  • America/Indiana/Marengo
  • America/Indiana/Petersburg
  • America/Indiana/Tell_City
  • America/Indiana/Vevay
  • America/Indiana/Vincennes
  • America/Indiana/Winamac
  • America/Inuvik
  • America/Iqaluit
  • America/Jamaica
  • America/Juneau
  • America/Kentucky/Louisville
  • America/Kentucky/Monticello
  • America/Kralendijk
  • America/La_Paz
  • America/Lima
  • America/Los_Angeles
  • America/Lower_Princes
  • America/Maceio
  • America/Managua
  • America/Manaus
  • America/Marigot
  • America/Martinique
  • America/Matamoros
  • America/Mazatlan
  • America/Menominee
  • America/Merida
  • America/Metlakatla
  • America/Mexico_City
  • America/Miquelon
  • America/Moncton
  • America/Monterrey
  • America/Montevideo
  • America/Montserrat
  • America/Nassau
  • America/New_York
  • America/Nome
  • America/Noronha
  • America/North_Dakota/Beulah
  • America/North_Dakota/Center
  • America/North_Dakota/New_Salem
  • America/Nuuk
  • America/Ojinaga
  • America/Panama
  • America/Paramaribo
  • America/Phoenix
  • America/Port-au-Prince
  • America/Port_of_Spain
  • America/Porto_Velho
  • America/Puerto_Rico
  • America/Punta_Arenas
  • America/Rankin_Inlet
  • America/Recife
  • America/Regina
  • America/Resolute
  • America/Rio_Branco
  • America/Santarem
  • America/Santiago
  • America/Santo_Domingo
  • America/Sao_Paulo
  • America/Scoresbysund
  • America/Sitka
  • America/St_Barthelemy
  • America/St_Johns
  • America/St_Kitts
  • America/St_Lucia
  • America/St_Thomas
  • America/St_Vincent
  • America/Swift_Current
  • America/Tegucigalpa
  • America/Thule
  • America/Tijuana
  • America/Toronto
  • America/Tortola
  • America/Vancouver
  • America/Whitehorse
  • America/Winnipeg
  • America/Yakutat
  • Antarctica/Casey
  • Antarctica/Davis
  • Antarctica/DumontDUrville
  • Antarctica/Macquarie
  • Antarctica/Mawson
  • Antarctica/McMurdo
  • Antarctica/Palmer
  • Antarctica/Rothera
  • Antarctica/Syowa
  • Antarctica/Troll
  • Antarctica/Vostok
  • Arctic/Longyearbyen
  • Asia/Aden
  • Asia/Almaty
  • Asia/Amman
  • Asia/Anadyr
  • Asia/Aqtau
  • Asia/Aqtobe
  • Asia/Ashgabat
  • Asia/Atyrau
  • Asia/Baghdad
  • Asia/Bahrain
  • Asia/Baku
  • Asia/Bangkok
  • Asia/Barnaul
  • Asia/Beirut
  • Asia/Bishkek
  • Asia/Brunei
  • Asia/Chita
  • Asia/Colombo
  • Asia/Damascus
  • Asia/Dhaka
  • Asia/Dili
  • Asia/Dubai
  • Asia/Dushanbe
  • Asia/Famagusta
  • Asia/Gaza
  • Asia/Hebron
  • Asia/Ho_Chi_Minh
  • Asia/Hong_Kong
  • Asia/Hovd
  • Asia/Irkutsk
  • Asia/Jakarta
  • Asia/Jayapura
  • Asia/Jerusalem
  • Asia/Kabul
  • Asia/Kamchatka
  • Asia/Karachi
  • Asia/Kathmandu
  • Asia/Khandyga
  • Asia/Kolkata
  • Asia/Krasnoyarsk
  • Asia/Kuala_Lumpur
  • Asia/Kuching
  • Asia/Kuwait
  • Asia/Macau
  • Asia/Magadan
  • Asia/Makassar
  • Asia/Manila
  • Asia/Muscat
  • Asia/Nicosia
  • Asia/Novokuznetsk
  • Asia/Novosibirsk
  • Asia/Omsk
  • Asia/Oral
  • Asia/Phnom_Penh
  • Asia/Pontianak
  • Asia/Pyongyang
  • Asia/Qatar
  • Asia/Qostanay
  • Asia/Qyzylorda
  • Asia/Riyadh
  • Asia/Sakhalin
  • Asia/Samarkand
  • Asia/Seoul
  • Asia/Shanghai
  • Asia/Singapore
  • Asia/Srednekolymsk
  • Asia/Taipei
  • Asia/Tashkent
  • Asia/Tbilisi
  • Asia/Tehran
  • Asia/Thimphu
  • Asia/Tokyo
  • Asia/Tomsk
  • Asia/Ulaanbaatar
  • Asia/Urumqi
  • Asia/Ust-Nera
  • Asia/Vientiane
  • Asia/Vladivostok
  • Asia/Yakutsk
  • Asia/Yangon
  • Asia/Yekaterinburg
  • Asia/Yerevan
  • Atlantic/Azores
  • Atlantic/Bermuda
  • Atlantic/Canary
  • Atlantic/Cape_Verde
  • Atlantic/Faroe
  • Atlantic/Madeira
  • Atlantic/Reykjavik
  • Atlantic/South_Georgia
  • Atlantic/St_Helena
  • Atlantic/Stanley
  • Australia/Adelaide
  • Australia/Brisbane
  • Australia/Broken_Hill
  • Australia/Darwin
  • Australia/Eucla
  • Australia/Hobart
  • Australia/Lindeman
  • Australia/Lord_Howe
  • Australia/Melbourne
  • Australia/Perth
  • Australia/Sydney
  • Europe/Amsterdam
  • Europe/Andorra
  • Europe/Astrakhan
  • Europe/Athens
  • Europe/Belgrade
  • Europe/Berlin
  • Europe/Bratislava
  • Europe/Brussels
  • Europe/Bucharest
  • Europe/Budapest
  • Europe/Busingen
  • Europe/Chisinau
  • Europe/Copenhagen
  • Europe/Dublin
  • Europe/Gibraltar
  • Europe/Guernsey
  • Europe/Helsinki
  • Europe/Isle_of_Man
  • Europe/Istanbul
  • Europe/Jersey
  • Europe/Kaliningrad
  • Europe/Kirov
  • Europe/Kyiv
  • Europe/Lisbon
  • Europe/Ljubljana
  • Europe/London
  • Europe/Luxembourg
  • Europe/Madrid
  • Europe/Malta
  • Europe/Mariehamn
  • Europe/Minsk
  • Europe/Monaco
  • Europe/Moscow
  • Europe/Oslo
  • Europe/Paris
  • Europe/Podgorica
  • Europe/Prague
  • Europe/Riga
  • Europe/Rome
  • Europe/Samara
  • Europe/San_Marino
  • Europe/Sarajevo
  • Europe/Saratov
  • Europe/Simferopol
  • Europe/Skopje
  • Europe/Sofia
  • Europe/Stockholm
  • Europe/Tallinn
  • Europe/Tirane
  • Europe/Ulyanovsk
  • Europe/Vaduz
  • Europe/Vatican
  • Europe/Vienna
  • Europe/Vilnius
  • Europe/Volgograd
  • Europe/Warsaw
  • Europe/Zagreb
  • Europe/Zurich
  • Indian/Antananarivo
  • Indian/Chagos
  • Indian/Christmas
  • Indian/Cocos
  • Indian/Comoro
  • Indian/Kerguelen
  • Indian/Mahe
  • Indian/Maldives
  • Indian/Mauritius
  • Indian/Mayotte
  • Indian/Reunion
  • Pacific/Apia
  • Pacific/Auckland
  • Pacific/Bougainville
  • Pacific/Chatham
  • Pacific/Chuuk
  • Pacific/Easter
  • Pacific/Efate
  • Pacific/Fakaofo
  • Pacific/Fiji
  • Pacific/Funafuti
  • Pacific/Galapagos
  • Pacific/Gambier
  • Pacific/Guadalcanal
  • Pacific/Guam
  • Pacific/Honolulu
  • Pacific/Kanton
  • Pacific/Kiritimati
  • Pacific/Kosrae
  • Pacific/Kwajalein
  • Pacific/Majuro
  • Pacific/Marquesas
  • Pacific/Midway
  • Pacific/Nauru
  • Pacific/Niue
  • Pacific/Norfolk
  • Pacific/Noumea
  • Pacific/Pago_Pago
  • Pacific/Palau
  • Pacific/Pitcairn
  • Pacific/Pohnpei
  • Pacific/Port_Moresby
  • Pacific/Rarotonga
  • Pacific/Saipan
  • Pacific/Tahiti
  • Pacific/Tarawa
  • Pacific/Tongatapu
  • Pacific/Wake
  • Pacific/Wallis
  • UTC

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."
        ]
    }
}
 

Request      

POST api/v0/auth/email/resend

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The email address of the account needing verification. Must be a valid email address. Must not be greater than 255 characters. Example: [email protected]

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."
}
 

Request      

GET api/v0/auth/user

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

include   string  optional    

optional Comma-separated list of relationships to include. Available relationships: role. Example: role

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."
}
 

Request      

GET api/v0/auth/abilities

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
}
 

Request      

GET api/v0/mods

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: name,slug,featured,created_at

filter[id]   string  optional    

Filter by comma-separated Mod IDs. Example: 1,5,10

filter[hub_id]   string  optional    

Filter by comma-separated Hub IDs. Example: 123,456

filter[guid]   string  optional    

Filter by comma-separated GUIDs. Example: com.example.mymod1,com.example.mymod2

filter[name]   string  optional    

Filter by name (fuzzy filter). Example: Raid Time

filter[slug]   string  optional    

Filter by slug (fuzzy filter). Example: some-mod

filter[teaser]   string  optional    

Filter by teaser text (fuzzy filter). Example: important

filter[featured]   string  optional    

Filter by featured status (1, true, 0, false). Example: true

filter[contains_ads]   boolean  optional    

Filter by contains_ads status (1, true, 0, false). Example: false

filter[contains_ai_content]   boolean  optional    

Filter by contains_ai_content status (1, true, 0, false). Example: false

filter[category_id]   string  optional    

Filter by comma-separated category IDs. Example: 1,2,3

filter[category_slug]   string  optional    

Filter by comma-separated category slugs. Example: weapons,gear

filter[created_between]   string  optional    

Filter by creation date range (YYYY-MM-DD,YYYY-MM-DD). Example: 2025-01-01,2025-03-31

filter[updated_between]   string  optional    

Filter by update date range (YYYY-MM-DD,YYYY-MM-DD). Example: 2025-01-01,2025-03-31

filter[published_between]   string  optional    

Filter by publication date range (YYYY-MM-DD,YYYY-MM-DD). Example: 2025-01-01,2025-03-31

filter[spt_version]   string  optional    

Filter mods that are compatible with an SPT version SemVer constraint. This will only filter the mods, not the mod versions. Example: ^3.8.0

filter[fika_compatibility]   boolean  optional    

Filter by Fika compatibility status. When true, only shows mods with Fika compatible versions (1, true, 0, false). Example: true

filter[include_legacy]   boolean  optional    

Include legacy mods (mods with versions that have no SPT version constraint). By default, legacy mods are excluded from results (1, true, 0, false). Example: true

query   string  optional    

Search query to filter mods using Meilisearch. This will search across name, slug, and description fields. Example: raid time

include   string  optional    

Comma-separated list of relationships. Available: versions, license, category, source_code_links. Example: versions,category

sort   string  optional    

Sort results by attribute(s). Default ASC. Prefix with - for DESC. Comma-separate multiple fields. Allowed: name, featured, created_at, updated_at, published_at. Example: featured,-name

page   integer  optional    

The page number for pagination. Example: 2

per_page   integer  optional    

The number of results per page (max 50). Example: 25

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."
}
 

Request      

GET api/v0/mod/{modId}

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

modId   string     

Example: 0

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: name,slug,featured,created_at

include   string  optional    

Comma-separated list of relationships. Available: versions, license, category, source_code_links. Example: versions,license

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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://forge.sp-tarkov.com/api/v0/mod/1/versions?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "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": "&laquo; 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 &raquo;",
                "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."
}
 

Request      

GET api/v0/mod/{modId}/versions

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

modId   string     

Example: 0

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: id,version,link,created_at

filter[id]   string  optional    

Filter by mod version ID. Comma-separated. Example: 234,432

filter[hub_id]   string  optional    

Filter by mod hub ID. Comma-separated. Example: 234,432

filter[version]   string  optional    

Filter mod versions by using a SemVer constraint. Example: ^1.0.0

filter[description]   string  optional    

Fuzzy-filter by mod version description. Example: This is a description

filter[link]   string  optional    

Filter by mod version link. Example: example.com

filter[published_between]   string  optional    

Filter by mod version published between. Example: 2025-01-01,2025-03-31

filter[created_between]   string  optional    

Filter by mod version created between. Example: 2025-01-01,2025-03-31

filter[updated_between]   string  optional    

Filter by mod version updated between. Example: 2025-01-01,2025-03-31

filter[spt_version]   string  optional    

Filter mod versions that are compatible with a SemVer constraint. Example: ^3.8.0

filter[fika_compatibility]   string  optional    

Filter by Fika compatibility status. Comma-separated. Available values: compatible, incompatible, unknown. Example: compatible

include   string  optional    

Comma-separated list of relationships. Available: dependencies, virus_total_links. Example: dependencies,virus_total_links

sort   string  optional    

Sort results by attribute(s). Default ASC. Prefix with - for DESC. Comma-separate multiple fields. Example: -version,-created_at

page   integer  optional    

The page number for pagination. Example: 2

per_page   integer  optional    

The number of results per page (max 50). Example: 25

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:

Prerelease Handling:

Dependency Validation:

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."
}
 

Request      

GET api/v0/mods/updates

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

mods   string     

Comma-separated list of identifier:version pairs for installed mods. Identifier can be mod_id (numeric) or GUID (string). Example: 5:1.2.0,com.example.mod:2.0.5

spt_version   string     

Target SPT version to check compatibility against. Example: 3.11.5

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:

Smart Deduplication: When multiple queried mods share the same dependency, the endpoint analyzes semantic version constraints:

Response Structure: Each mod in the response includes:

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."
}
 

Request      

GET api/v0/mods/dependencies

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

mods   string     

Comma-separated list of identifier:version pairs to resolve dependencies for. Identifier can be either a mod_id (numeric) or GUID (string). Version strings must match exactly. Example: 5:1.2.0,com.example.mod:2.0.5,15:3.1.0

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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://forge.test/api/v0/addons?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "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."
}
 

Request      

GET api/v0/addons

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: name,slug,created_at

filter[id]   string  optional    

Filter by comma-separated Addon IDs. Example: 1,5,10

filter[guid]   string  optional    

Filter by comma-separated GUIDs. Example: com.example.addon1,com.example.addon2

filter[name]   string  optional    

Filter by name (fuzzy filter). Example: Music Pack

filter[slug]   string  optional    

Filter by slug (fuzzy filter). Example: some-addon

filter[teaser]   string  optional    

Filter by teaser text (fuzzy filter). Example: important

filter[mod_id]   string  optional    

Filter by comma-separated mod IDs (parent mod). Example: 1,2,3

filter[contains_ads]   boolean  optional    

Filter by contains_ads status (1, true, 0, false). Example: false

filter[contains_ai_content]   boolean  optional    

Filter by contains_ai_content status (1, true, 0, false). Example: false

filter[is_detached]   boolean  optional    

Filter by detached status (1, true, 0, false). Example: false

filter[created_between]   string  optional    

Filter by creation date range (YYYY-MM-DD,YYYY-MM-DD). Example: 2025-01-01,2025-03-31

filter[updated_between]   string  optional    

Filter by update date range (YYYY-MM-DD,YYYY-MM-DD). Example: 2025-01-01,2025-03-31

filter[published_between]   string  optional    

Filter by publication date range (YYYY-MM-DD,YYYY-MM-DD). Example: 2025-01-01,2025-03-31

query   string  optional    

Search query to filter addons using Meilisearch. This will search across name, slug, and description fields. Example: music pack

include   string  optional    

Comma-separated list of relationships. Available: versions, license, mod, source_code_links. Example: versions,mod

sort   string  optional    

Sort results by attribute(s). Default ASC. Prefix with - for DESC. Comma-separate multiple fields. Allowed: name, created_at, updated_at, published_at. Example: -name

page   integer  optional    

The page number for pagination. Example: 2

per_page   integer  optional    

The number of results per page (max 50). Example: 25

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."
}
 

Request      

GET api/v0/addon/{addonId}

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

addonId   string     

Example: 0

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: name,slug,created_at

include   string  optional    

Comma-separated list of relationships. Available: versions, license, mod, source_code_links. Example: versions,license

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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://forge.sp-tarkov.com/api/v0/addon/1/versions?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "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."
}
 

Request      

GET api/v0/addon/{addonId}/versions

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

addonId   string     

Example: 0

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: id,version,link,created_at

filter[id]   string  optional    

Filter by addon version ID. Comma-separated. Example: 234,432

filter[version]   string  optional    

Filter addon versions by using a SemVer constraint. Example: ^1.0.0

filter[description]   string  optional    

Fuzzy-filter by addon version description. Example: This is a description

filter[link]   string  optional    

Filter by addon version link. Example: example.com

filter[published_between]   string  optional    

Filter by addon version published between. Example: 2025-01-01,2025-03-31

filter[created_between]   string  optional    

Filter by addon version created between. Example: 2025-01-01,2025-03-31

filter[updated_between]   string  optional    

Filter by addon version updated between. Example: 2025-01-01,2025-03-31

include   string  optional    

Comma-separated list of relationships. Available: virus_total_links. Example: virus_total_links

sort   string  optional    

Sort results by attribute(s). Default ASC. Prefix with - for DESC. Comma-separate multiple fields. Example: -version,-created_at

page   integer  optional    

The page number for pagination. Example: 2

per_page   integer  optional    

The number of results per page (max 50). Example: 25

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:

Smart Deduplication: When multiple queried addons share the same dependency, the endpoint analyzes semantic version constraints:

Response Structure: Each mod in the response includes:

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."
}
 

Request      

GET api/v0/addons/dependencies

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

addons   string     

Comma-separated list of identifier:version pairs to resolve dependencies for. Identifier can be either an addon_id (numeric) or slug (string). Version strings must match exactly. Example: 5:1.2.0,my-addon:2.0.5,15:3.1.0

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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://forge.sp-tarkov.com/api/v0/mod-categories?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "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."
}
 

Request      

GET api/v0/mod-categories

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: id,title,slug

filter[id]   string  optional    

Filter by category ID. Comma-separated. Example: 1,2,3

filter[slug]   string  optional    

Filter by category slug. Comma-separated. Example: weapons,gear

filter[title]   string  optional    

Filter by category title (wildcard search). Example: weapon

sort   string  optional    

Sort results by attribute(s). Default ASC. Prefix with - for DESC. Comma-separate multiple fields. Example: title,-slug

page   integer  optional    

The page number for pagination. Example: 2

per_page   integer  optional    

The number of results per page (max 100). Example: 50

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."
}
 

Request      

GET api/v0/mod-categories/{identifier}

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

identifier   string     

Example: illum

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: id,title,slug

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": "&laquo; Previous",
                "active": false
            },
            {
                "url": "https://forge.sp-tarkov.com/api/v0/spt/versions?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next &raquo;",
                "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."
}
 

Request      

GET api/v0/spt/versions

Headers

Authorization        

Example: Bearer YOUR_API_KEY

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

fields   string  optional    

Comma-separated list of fields to include in the response. Defaults to all fields. Example: id,version,created_at

filter[id]   string  optional    

Filter by SPT version ID. Comma-separated. Example: 234,432

filter[created_between]   string  optional    

Filter between by two created_at dates. Example: 2025-01-01,2025-03-31

filter[updated_between]   string  optional    

Filter between by two updated_at dates. Example: 2025-01-01,2025-03-31

filter[spt_version]   string  optional    

Filter versions that are compatible with a SemVer constraint. Example: ^3.9.0

sort   string  optional    

Sort results by attribute(s). Default ASC. Prefix with - for DESC. Comma-separate multiple fields. Example: -version,created_at

page   integer  optional    

The page number for pagination. Example: 2

per_page   integer  optional    

The number of results per page (max 50). Example: 25