Skip to main content

Requirements

  • A FiveM server running ox_lib and oxmysql.
  • A working cc_lib resource (provides Core, Groups, Inventory, Target, and TaskUI wrappers).
  • Optional: cc_minigames if you want the default training sandbox entries to work.

Steps

1

Place the resource

Copy the cc_heistcontracts folder into a resources directory the server already loads. The repo ships under resources/[cc]/cc_heistcontracts/.
2

Install the database schema

config.autoInstallDatabase in shared/config.lua is true by default — the resource auto-runs sql/install.sql on first start and creates the heist_profiles table if it doesn’t exist. Leave it on for a hands-off install.If you’d rather apply the schema yourself, set config.autoInstallDatabase = false and run the file manually:
mysql your_db < sql/install.sql
Or paste it into your MySQL client.
3

Ensure after the dependencies

Order matters in server.cfg:
ensure oxmysql
ensure ox_lib
ensure cc_lib
ensure cc_minigames
ensure cc_heistcontracts
Heist resources that integrate with cc_heistcontracts should declare it as a dependency in their fxmanifest.lua so FXServer starts them in the right order:
dependencies {
    'ox_lib',
    'cc_heistcontracts',
    'cc_lib',
}
Without this, a heist resource that boots before cc_heistcontracts will hit SCRIPT ERROR: No such export RegisterContract in resource cc_heistcontracts.
4

Register the heist_tablet item

The dashboard is opened by using an inventory item, not a key or chat command. With ox_inventory, the shipped definition is:
heist_tablet = { label = 'Contracts Tablet', weight = 2800, stack = false, },
5

Verify in-game

Join the server, give yourself a heist_tablet (Contracts Tablet) item, and use it from your inventory. The dashboard should open and prompt you to pick an alias. The marketplace starts empty on a fresh boot — listings drip in one at a time on the configured interval (3 minutes by default), so the first contract appears after the first interval has elapsed.
Want listings immediately for testing? Lower config.rotation.dripIntervalMs in shared/config.lua to something like 5 * 1000 (5 seconds) and restart the resource.