Before You Begin#
Before installing Licenses Creator, make sure your server meets the minimum requirements. Three things are mandatory — the two libraries and an inventory, because every license is an item. Everything else is optional and detected on its own.
Requirement | Status | Notes |
|---|---|---|
oxmysql | Required | Database access. The tables create themselves. |
ox_lib | Required | Callbacks, notifications and shared helpers. |
Inventory | Required | ox_inventory, qs-inventory, qb-inventory, origen_inventory or tgiann-inventory — auto-detected. A license is an item the player carries. |
FiveM server | Required | Artifact 5181 or newer, with OneSync enabled. |
Framework | Optional | ESX, QBCore or Qbox — auto-detected. Standalone works without one. |
screenshot-basic | Recommended | Takes the license photo straight from the game view. Without it the photo falls back to the interface and can come out black. |
Target | Optional | ox_target, qb-target or ph-target. Without one, every ped shows an |
qs-interface / qs-textui | Optional | Used for notifications and the 3D prompt when running. Otherwise ox_lib notifications and a built-in prompt are used. |
Everything framework- or third-party-specific sits behind a small bridge file, and the resource picks the right one by looking at what is already running:
Layer | Detection order |
|---|---|
Framework | es_extended → qb-core → qbx_core → standalone |
Inventory | ox_inventory → qs-inventory → qb-inventory → origen_inventory → tgiann-inventory |
Target | ph-target → ox_target → qb-target (only with |
Photo capture | screenshot-basic → the interface's own capture |
Notifications / prompt | qs-interface → ox_lib · qs-textui → built-in drawn text |
Every optional integration degrades silently: a missing target means the [E] prompt, a missing framework means standalone. The inventory is the one exception — if none is found, the console says so on every boot. Integrations has the details and how to pin one by hand.
Downloading Licenses Creator#
After purchasing Licenses Creator, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Licenses Creator.
After extracting the download, you should have the following folder:
qs-licensescreator/
├── shared/
│ ├── config.lua -- language, admin access, items, blips: what you may edit
│ └── advanced.lua -- card animation, photo framing, ped streaming, table names
├── client/custom/ -- bridges: framework, target, starter-license hooks
├── server/custom/ -- bridges: framework, inventory, card fields, points
├── server/webhook.lua -- how Discord logs look
├── database/sql.sql -- the tables plus the example city
├── locales/ -- 41 languages
└── web/build/ -- the interface, ready to runKeep the folder named
qs-licensescreator. The ox_inventory item hook (qs-licensescreator.useLicenseItem) and every export your other scripts call use that name, so a renamed copy stops answering them.
Installing the Resource#
Move the qs-licensescreator folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-licensescreator/Once copied, open your server.cfg and make sure every dependency — and everything it should detect — starts before it:
ensure oxmysql
ensure ox_lib
ensure screenshot-basic
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Inventory
ensure ox_inventory
# ensure qs-inventory
# Target (optional)
ensure ox_target
ensure qs-licensescreatorThe loading order matters. Detection only sees resources that are already started. A framework that has not even begun starting is missed, the resource falls back to standalone and hands out the wrong identifiers — so always keep your framework and inventory above ensure qs-licensescreator.
The Database#
The tables create themselves on first start, all prefixed qs_licenses_, and missing columns are added on every boot. Importing database/sql.sql is only needed for the example city: two categories, seven license designs, seven license offices, an authorization center, a police review terminal and a forger — all described in Usage. It is strongly recommended on a fresh install.
Tables | Hold |
|---|---|
| Each license: its name, initials, validity, card design and starter flag, and the groups they sit in. |
| License offices with their prices, and the terminal, center and forger peds. |
| Every document handed out: number, holder, expiry, status, photo and points. |
| Requests for approval, who reviewed them and whether the document was collected. |
| Who may open the creator, and every setting edited in the Settings tab. |
| Kept from the first version. Nothing new is written to it. |
The example rows use fixed ids — templates 3–9, license offices 1–7, global peds 1–3, categories 1–2 — so importing
sql.sqlagain puts those rows back the way they shipped and overwrites any edit you made to them. Everything you created yourself gets a higher id and is never touched.
Registering the Inventory Items#
A license is an inventory item, so your inventory has to know it before anyone can carry one. By default every license is its own item, named after its template id in lowercase, plus one single authorization document for the whole server. With the example city, that is:
id_card driver_license police_badge weapon_license
pilot_license fishing_license business_license
authorization_documentNothing has to be written by hand. Open /licensecreator, go to Licenses and press the cube button next to any license — or open it and press Inventory item setup. It shows the file to edit, the image folder, the image file name it expects and a ready-to-paste snippet in your inventory's own format, with your inventory marked detected.
Until an item exists, the console names it on every boot:
[ERROR] ox has no definition for: id_card, driver_license, authorization_document
[ERROR] Open /licensecreator, edit any license and press "Inventory item setup" for the snippet.Claiming Admin Access#
The creator is where offices are placed, licenses designed and the server configured, so it is closed to everyone until you say otherwise. Any one of these routes is enough:
The way in on a brand-new database. Put your own identifier in shared/config.lua — find it in the txAdmin player list or with status in the server console:
Config.Admin = {
mainAdminIdentifierType = 'license', -- license, steam, discord or fivem
mainAdminIdentifier = 'license:1a2b3c4d5e6f...',
}The value works with or without its prefix; without it, mainAdminIdentifierType supplies it.
Grant the ace in server.cfg:
add_ace group.admin command.licensecreator allowFramework staff in one of Config.Creator.adminGroups — admin, superadmin, god — get in automatically.
Inside the creator, Users adds people by identifier — the citizenid on QBCore and Qbox, the identifier on ESX — with one of two levels:
Level | Sees |
|---|---|
Admin | Every tab, including Users and Settings. |
Staff | Peds, Licenses, Designer, Categories and Issued. |
The main admin identifier, the ace and the admin groups always grant the Admin level.
Configuring the Resource#
Very little is configured in files. Prices, validity, photo upload, theme colours and Discord logs live in the database and are edited from the creator. What the files hold:
File | Contents |
|---|---|
| Language, admin access, the two commands, framework and inventory overrides, item names, the paying account, the fake-card switch, target, the gender labels printed on cards and the blips. |
| How the card is shown (animation, prop, radius, duration), how the photo is framed, ped streaming distances, item image overrides and paths, and the table names. |
| Your own values for any of the twenty card fields — the driving categories on a driver license, the class on a firearms permit. |
| The penalty-point thresholds per license and what happens when one is reached. |
| Titles, colours and fields of the Discord log embeds. |
| The character-creation events that hand out starter licenses. |
| Every text in game and in the interface, one file per language. |
The values worth reviewing first:
Config.Creator = {
command = 'licensecreator', -- opens the creator
placementCommand = 'placement', -- opens it straight on the Peds tab
permission = 'command.licensecreator',
adminGroups = { 'admin', 'superadmin', 'god' },
}
Config.SeparateItemPerLicense = true -- one item per license, or a single 'license' item
Config.PurchaseAccount = 'cash' -- 'cash' or 'bank'
Config.AllowPlayerFakeCards = true -- master switch for the forger
Config.UseTarget = false -- third eye instead of the [E] prompt
Config.Nationality = 'San Andreas' -- printed when the framework stores none
Config.BlipShortRange = true -- false keeps every blip on the mapThe language is chosen in the creator, not in the file: Settings → Validity → Panel language. It is stored in the database (English until you change it) and wins over
Config.Languageon every boot. The language, colours, logo and every price apply the moment you press Save; only the two config files need a resource restart.
Verifying the Installation#
After completing the installation, restart your server and read the console. With the example city imported, a healthy boot looks like this:
[INFO] Loaded 0 panel user(s).
[INFO] Loaded 2 categor(y/ies).
[INFO] Loaded 7 license template(s).
[INFO] Loaded 0 issued license(s).
[INFO] Loaded 0 authorization request(s).
[INFO] qs-licensescreator ready.
[INFO] Loaded 10 ped(s).Any [ERROR] line names what is missing — an item, or the inventory itself. Common Errors explains each one. Then join your server and work through the first loop:
Open the creator
/licensecreatoropens on the Peds tab with the ten example locations. If it says you have no permission, revisit Claiming Admin Access.Configure photo upload
Every license carries a photo, so nothing can be issued until photos have somewhere to go. Settings → Photo upload: the quickest is a Discord webhook from a private channel. Save.
Get an ID card
Go to the Citizen Affairs desk at City Hall, press the prompt, take your photo and pay. The card lands in your inventory as
id_card.Show it
Use the item from your inventory. Your character holds the card out and it appears on screen with your name, date of birth and photo — for you and anyone standing next to you.
Nothing needs a restart from here on. Every office, design, price and setting is edited from the creator and reaches players the moment it is saved.



