In Game Photos


Features:
Dynamic Dealer Modes – Configure markets as Static guards, Roaming wanderers, or PolyZone walkers to keep locations unpredictable and engaging.
Reputation & Leveling System – Players earn XP with every transaction, leveling up to unlock restricted items and exclusive high-tier contraband.
Global Stock Economy – Create real scarcity with finite stock that refills dynamically, randomly, or based on player sales (supports Global or Personal stock).
Multi-Currency Support – Fully configurable to accept Cash or Dirty Money (supports Accounts, Items, or Metadata).
Modern React-Based UI – A sleek, responsive interface.
Multi-Framework Compatibility – Fully optimized for QBCore, Qbox, and ESX.
Optimized & Secure Logging – Built for performance with extensive webhook support (Discord, Fivemerr, Fivemanage) to securely track transactions and prevent abuse.
Elevate your illegal economy with the ultimate Black Market solution!
Preview 
Preview Video
Purchase Links 
Escrowed
Open Source
Supports:
• Framework: qb-core, qbx_core and es_extended
• Target: qb-target and ox_target
• Inventory: qb-inventory, ox_inventory, codem-inventory, origen_inventory and tgiann-inventory
• Database: oxmysql
• Logging: discord, fivemanage and fivemerr
Installation
- Download from Keymaster/Portal
- Ensure the folder is named AP5-BlackMarket.
- Put the folder in your resources folder.
- Restart your server.
Preview config.lua
Config = {}
Config = {}
Config.Debug = false
-- Framework Options: 'qb', 'qbx', 'esx'
Config.Framework = 'qb'
-- Inventory System (Options: 'qb', 'ox', 'codm', 'tgiann', 'origen')
Config.Inventory = 'ox'
-- Interaction System (Options: 'ox_target', 'qb-target', 'drawtext')
Config.Target = 'ox_target'
-- NPC Interaction Behavior
Config.StopPedOnInteract = true -- If true, moving NPCs will stop and face the player when opening the menu.
----- STOCK SYSTEM -----
Config.EnableStockSystem = true -- true: Enable stock system | false: Infinite stock
Config.Stock = {
-- Options: 'random_restart' (Random stock generated every server restart)
-- 'dynamic_daily' (Persistent stock, refills daily based on chance, requires SQL)
-- 'static' (Fixed stock, no random generation)
System = 'dynamic_daily',
Global = true, -- true: Shared stock for all players | false: Unique stock per player
RefillType = 'random', -- Options: 'random' or 'maxstock'
SellRestocksBuy = false, -- Add this line (true = selling refills buy stock, false = it doesn't)
}
----- REPUTATION / LEVELING SYSTEM -----
Config.EnableReputationSystem = true -- true: Enable reputation system | false: Disable it
Config.Reputation = {
-- System Type: 'internal' (SQL Database) or 'metadata' (QBCore/QBox Player Metadata)
System = 'internal',
-- Metadata Key (Only used if System = 'metadata')
-- Example: 'craftingrep' or 'blackmarket_xp'
MetadataName = 'blackmarket_xp',
-- Toggle Reputation Requirements
EnableBuy = true, -- If true, players need specific levels to BUY items
EnableSell = false, -- If true, players need specific levels to SELL items (requires adding minLevel to sellItems)
}
Config.Money = {
Cash = {
Enabled = true, -- Enable or Disable Cash transactions
},
Dirty = {
Enabled = true, -- Enable or Disable Dirty Money transactions
Type = 'item', -- 'item', 'metadata', or 'account' (ESX)
Item = 'black_money', -- Item name or Account name
MetadataKey = 'worth' -- Only for metadata type
}
}
Config.Markets = {
['blackmarket1'] = {
useMasterOptions = true,
masterOptions = {
model = "g_m_m_armboss_01",
scenario = "WORLD_HUMAN_GUARD_STAND_CLUBHOUSE",
icon = "fas fa-mask",
label = "Access Black Market",
distance = 2.0,
requiredItem = nil, -- Item required to access menu (or nil)
requiredGroup = nil, -- Job/Gang required e.g., 'police', 'ballas' or table {'police', 'ambulance'} (or nil)
},
Static = {
enabled = true, -- Enable this mode
-- Ped/Interaction Options for this mode (Ignored if useMasterOptions = true)
options = {
model = "g_m_m_armboss_01",
scenario = "WORLD_HUMAN_GUARD_STAND_CLUBHOUSE",
icon = "fas fa-mask",
label = "Access Black Market",
distance = 2.0,
requiredItem = "vpn",
requiredGroup = nil,
},
spawnSelection = "all", -- 'random' (picks 1) or 'all' (spawns at all locations)
locations = {
{ coords = vector4(-900.79, 142.61, 64.02, 141.07), enableBilp = true, sprite = 52, color = 2, scale = 0.8, label = "Static Market 1" },
{ coords = vector4(754.76, -1865.65, 29.29, 356.63), enableBilp = true, sprite = 52, color = 2, scale = 0.8, label = "Static Market 2" },
}
},
Roaming = {
enabled = true,
-- Ped/Interaction Options for this mode (Ignored if useMasterOptions = true)
options = {
model = "g_m_m_armboss_01",
icon = "fas fa-mask",
label = "Talk to Dealer",
distance = 2.0,
requiredItem = nil,
requiredGroup = nil,
},
spawnSelection = "random", -- 'random' or 'all'
locations = {
{ coords = vector4(-165.71, -57.73, 53.08, 26.71), enableBilp = true, sprite = 52, color = 2, scale = 0.8, label = "Roaming Market Start" },
}
},
PolyZone = {
enabled = true,
-- Ped/Interaction Options for this mode (Ignored if useMasterOptions = true)
options = {
model = "g_m_m_armboss_01",
icon = "fas fa-question",
label = "Approach Stranger",
distance = 2.0,
requiredItem = nil,
requiredGroup = nil,
},
spawnSelection = "random", -- 'random' or 'all'
speed = 1.1, -- Walk speed
waitTime = 0, -- Time to wait in seconds
stuckTime = 10, -- Seconds before resetting task if stuck
locations = {
{
debug = false,
points = {
vector3(116.84, -997.03, 29.41),
vector3(224.18, -1031.22, 29.38),
vector3(277.57, -866.53, 29.35),
vector3(182.16, -837.53, 31.09)
},
minZ = 28.0,
maxZ = 31.0,
enableBilp = true, sprite = 52, color = 2, scale = 0.8, label = "PolyZone Market 1"
},
}
},
buyItems = {
{ name = 'weapon_pistol', label = 'Heavy Pistol', description = 'Standard issue sidearm.', priceCash = 5000, priceDirty = 7000, minLevel = 1, maxStock = 20, refillChance = 80, xp = 20 },
{ name = 'lockpick', label = 'Lockpick Set', priceCash = 500, priceDirty = nil, description = 'Professional tension wrenches.', minLevel = 1, maxStock = 100, refillChance = 100, xp = 5 },
{ name = 'weapon_assaultrifle', label = 'Assault Rifle', priceCash = nil, priceDirty = 55000, description = 'Military grade rifle.', minLevel = 5, maxStock = 3, refillChance = 30, xp = 150 },
{ name = 'weapon_dbshotgun', label = 'Double Barrel', priceCash = 15000, priceDirty = 20000, description = 'Old school stopping power.', minLevel = 2, maxStock = 10, refillChance = 60, xp = 50 },
{ name = 'security_card_01', label = 'Security Card A', priceCash = nil, priceDirty = 25000, description = 'Cloned access card for secure areas.', minLevel = 4, maxStock = 5, refillChance = 20, xp = 100 },
{ name = 'ammo-9', label = '9mm Ammo Box', priceCash = 200, priceDirty = 250, description = 'Standard 9mm rounds.', minLevel = 1, maxStock = 500, refillChance = 100, xp = 2 },
{ name = 'armour', label = 'Heavy Armor', priceCash = 5000, priceDirty = 6000, description = 'Level III ballistic protection.', minLevel = 2, maxStock = 30, refillChance = 90, xp = 25 },
{ name = 'weapon_switchblade', label = 'Switchblade', priceCash = 300, priceDirty = 450, description = 'Compact blade, quick deployment.', minLevel = 1, maxStock = 50, refillChance = 90, xp = 5 },
{ name = 'advancedlockpick', label = 'Advanced Lockpick', priceCash = 1000, priceDirty = 1200, description = 'Reinforced picks for tougher locks.', minLevel = 2, maxStock = 40, refillChance = 80, xp = 10 },
{ name = 'drill', label = 'Power Drill', priceCash = nil, priceDirty = 8500, description = nil, minLevel = 2, maxStock = 15, refillChance = 70, xp = 30 },
{ name = 'thermite', label = 'Thermite Charge', priceCash = nil, priceDirty = 12000, description = 'Industrial incendiary for heavy doors.', minLevel = 3, maxStock = 10, refillChance = 50, xp = 40 },
{ name = 'weapon_snspistol', label = 'SNS Pistol', priceCash = 3500, priceDirty = 4500, description = 'Saturday Night Special. Easily concealable.', minLevel = 1, maxStock = 25, refillChance = 80, xp = 15 },
},
sellItems = {
{ name = 'weapon_pistol', label = 'Heavy Pistol', description = 'Standard issue sidearm.', sellPrice = 2500, xp = 10 },
{ name = 'lockpick', label = 'Lockpick Set', description = 'Professional tension wrenches.', sellPrice = 100, xp = 2 },
{ name = 'weapon_assaultrifle', label = 'Assault Rifle', description = 'Military grade rifle.', sellPrice = 20000, xp = 75 },
{ name = 'weapon_dbshotgun', label = 'Double Barrel', description = 'Old school stopping power.', sellPrice = 6000, xp = 25 },
{ name = 'ammo-9', label = '9mm Ammo Box', description = 'Standard 9mm rounds.', sellPrice = 50, xp = 1 },
{ name = 'armour', label = 'Heavy Armor', description = 'Level III ballistic protection.', sellPrice = 1500, xp = 12 },
{ name = 'thermite', label = 'Thermite Charge', description = 'Industrial incendiary.', sellPrice = 4000, xp = 20 },
{ name = 'weapon_switchblade', label = 'Switchblade', description = 'Compact blade.', sellPrice = 100, xp = 2 },
{ name = 'advancedlockpick', label = 'Advanced Lockpick', description = 'Reinforced picks.', sellPrice = 400, xp = 5 },
{ name = 'drill', label = 'Power Drill', description = nil, sellPrice = 2500, xp = 15 },
{ name = 'weapon_snspistol', label = 'SNS Pistol', description = 'Saturday Night Special.', sellPrice = 1500, xp = 7 },
{ name = 'security_card_01', label = 'Security Card A', description = 'Cloned access card.', sellPrice = 5000, xp = 50 },
}
},
}
Config.InternalLevelSystem = {
maxLevel = 10,
levels = {
["1"] = { xpRequired = 0 },
["2"] = { xpRequired = 100 },
["3"] = { xpRequired = 250 },
["4"] = { xpRequired = 475 },
["5"] = { xpRequired = 813 },
["6"] = { xpRequired = 1319 },
["7"] = { xpRequired = 2078 },
["8"] = { xpRequired = 3217 },
["9"] = { xpRequired = 4925 },
["10"] = { xpRequired = 7487 },
}
}
Other Releases
Support & Community
Need help, updates, or want to suggest features?
Join the AP5 Studios Community on Discord
Click here to join: AP5 Studios
Additional Info
| Code Access | No |
| Subscription-based | No |
| Lines of Code | ~2000 |
| Requirements | None |
| Support | Yes |















