Installation
F5 Shadow Market is a dark-web style player-to-player auction house and marketplace: anonymous sellers, live auctions, buy-now listings, bargaining, seller-set discounts, escrow, physical package delivery, reviews, an encrypted in-app chat, and a full NUI admin panel — all on a self-detecting multi-framework bridge.
Requirements
| Requirement | Details |
|---|---|
| Framework | QBCore, QBox Core, or ESX (auto-detected) |
| FiveM Server | Recent artifacts recommended |
| Lua | 5.4 (enabled automatically via lua54 'yes') |
| Database | MySQL 8.0+ or MariaDB 10.6+ |
| Database Resource | oxmysql (recommended), mysql-async, or ghmattimysql — auto-detected by the built-in SQL bridge (see note below) |
| Target (optional) | ox_target, qb-target, a custom target, or none (auto-detected) |
| Inventory | ox_inventory, qb-inventory, qs-inventory, ps-inventory, codem-inventory, tgiann-inventory, ESX native, or custom — all supported |
F5 Shadow Market automatically detects your framework, inventory and target system at startup — no manual configuration needed. Framework detection priority is QBox → QBCore → ESX (qbx_core → qb-core → es_extended). See Framework Compatibility for the full detection logic and how to force a specific adapter.
The script ships a built-in SQL bridge (server/sql_bridge.lua) that auto-detects and supports oxmysql, mysql-async and ghmattimysql out of the box (checked in that priority order, within a 30 s window). It builds a unified MySQL.* layer, so any of the three works with no code changes.
The manifest declares no hard database dependency, so the resource starts on whichever supported driver is running — just make sure your DB resource starts before f5_shadowmarket (see the server.cfg examples below). oxmysql is the recommended default.
Step by Step
1. Download
Purchase F5 Shadow Market from the F5 Studio store. Claim the asset on Cfx.re Keymaster and download the latest version.
2. Folder Structure
Place the resource in your server's resources directory. The folder must be named f5_shadowmarket:
resources/
[f5]/
f5_shadowmarket/
bridge/
client/
html/
item/
locales/
server/
config.lua
config_webhooks.lua
shared.lua
fxmanifest.lua
3. Server Config
Add the resource to your server.cfg — make sure it starts after your framework, oxmysql, and (if used) your inventory and target resources:
- QBCore
- QBox Core
- ESX
ensure oxmysql
ensure qb-core
ensure qb-target
ensure qb-inventory
ensure f5_shadowmarket
ensure oxmysql
ensure ox_lib
ensure ox_inventory
ensure ox_target
ensure qbx_core
ensure f5_shadowmarket
ensure oxmysql
ensure es_extended
ensure ox_target # or qb-target
ensure ox_inventory # optional — ESX native inventory works too
ensure f5_shadowmarket
F5 Shadow Market must start after your framework, oxmysql, target system and inventory. Incorrect boot order is the most common installation issue — the bridge runs its framework/inventory detection once at startup, and if those resources aren't up yet the resource goes inert.
4. Database
No manual SQL import is required. On first start the script auto-creates all required tables, indexes and ENUM values:
| Table | Purpose |
|---|---|
f5_shadowmarket_listings | Buy-now and auction listings |
f5_shadowmarket_offers | Auction bids |
f5_shadowmarket_orders | Completed sales (escrow + delivery tracking) |
f5_shadowmarket_reviews | Buyer ratings of sellers |
f5_shadowmarket_identities | Citizen → anonymous handle mapping |
f5_shadowmarket_notifications | In-app notification inbox |
f5_shadowmarket_favorites | Bookmarked listings per player |
f5_shadowmarket_conversations | Buyer ↔ seller chat threads |
f5_shadowmarket_messages | Chat messages and bargain offers |
f5_shadowmarket_bans | Market access restrictions |
f5_shadowmarket_admin_log | Admin action audit trail |
This is controlled by F5Cfg.Database.autoCreateTables (default true). When you update the script, new columns, indexes and ENUM values are applied as migrations on startup — no manual SQL needed. See Configuration → Database.
5. Register the Item
The script ships with one usable item — market_tablet — that opens the market. Open the file matching your framework and follow the inline instructions:
| Framework | File |
|---|---|
| QBCore | f5_shadowmarket/item/QBCORE.TXT |
| QBox Core | f5_shadowmarket/item/QBXCORE.TXT |
| ESX | f5_shadowmarket/item/ESX.SQL |
Then copy the item icon f5_shadowmarket/item/market_tablet.png into your inventory's image folder:
| Inventory | Icons folder |
|---|---|
ox_inventory | ox_inventory/web/images/ |
qb-inventory | qb-inventory/html/images/ |
qs-inventory | qs-inventory/html/images/ |
ps-inventory | ps-inventory/html/images/ |
codem-inventory | codem-inventory/html/itemimages/ |
tgiann-inventory | inventory_images resource (.webp — see note in Items) |
| ESX native | (no icon folder required) |
See Items for the full per-framework procedure and copy-paste templates.
6. Configure Locale
Open config.lua and set your language code:
F5Cfg.Locale = 'en' -- en, pl, de, es, fr, pt, nl, cs, tr, ar, zh, th
The script ships with 12 languages. See Localization.
7. Configure the Payout Currency
The whole market uses a single money type for balances, spending and payouts. By default that's the bank account:
F5Cfg.Money = {
payoutType = 'bank', -- must match one of the ids in F5Cfg.Money.types
-- ...
}
The types table maps each currency id to the native account name per framework (e.g. cash, bank, crypto, black_money). See Framework Compatibility → Money & Currencies.
8. Configure Admin Access
The /marketadmin panel is gated by an ACE permission or a framework group:
F5Cfg.Admin = {
command = 'marketadmin',
acePermission = 'f5market.admin', -- '' disables the ACE path
frameworkGroups = { 'admin', 'god' }, -- {} disables group-based access
-- ...
}
Grant the ACE in your server.cfg if you use the ACE path:
add_ace group.admin f5market.admin allow
See Admin Panel → Access Control.
9. Configure Discord Webhooks (optional)
Open config_webhooks.lua (a server-only file) and paste a Discord webhook URL into Webhooks.defaultUrl to enable audit logging. See Discord Webhooks.
10. Verify
Restart your server. With F5Cfg.Debug.enabled = true (and the relevant categories on) the bridge prints what it detected:
[SERVER][IO] [sql_bridge] driver detected: oxmysql
[SERVER][BRIDGE] detected framework=qb inventory=qb
If detection fails you'll instead see (resource goes inert):
[SERVER][ERROR] [ERR] [BRIDGE] no supported framework detected (esx/qb/qbx) — resource inert
[SERVER][ERROR] [ERR] [BRIDGE] no supported inventory detected for framework esx
In-game, use the market_tablet item (or run /market, depending on your command mode) to open the market, and /marketadmin as an admin to verify the panel opens.
Next Steps
- Configuration — every option in
config.lua - Items — register
market_tabletin QB/QBX/ESX inventories - Commands —
/market,/marketadmin, command modes - Framework Compatibility — frameworks, inventories, targets, money, custom adapters
- Features — auctions, buy-now, bargaining, discounts, delivery, reviews, chat
- Admin Panel — moderation tools and access control
- Discord Webhooks — audit logging
- Localization — supported languages, adding your own
- Troubleshooting — fixes for common issues