How Integrations Work#
Newspaper Job talks to other resources through small open bridge files in client/framework/, client/vehiclekeys/ and server/framework/. Most layers pick themselves by looking for a started resource, so start them before qs-newspaperjob.
Layer | Supported | How it is chosen | Without it |
|---|---|---|---|
Framework | es_extended · qb-core · qbx_core | Automatic | Required — the editor never spawns. |
Inventory | ox_inventory · qs-inventory | Automatic | The framework's own inventory (qb-inventory, ESX's). |
Target | ox_target · qb-target |
| Press E next to the editor. |
Vehicle keys | Eleven resources (below) | Automatic | No keys are given. |
Fuel | LegacyFuel or any |
| The tank is left as spawned. |
3D text | qs-textui | Automatic | Built-in floating text. |
Job accounts | qs-job-management | Automatic | Pay goes straight to the courier. |
Notifications | Built-in, or any resource |
| — |
Money is always paid in cash: the money account on ESX and cash on QBCore and Qbox. Qbox is supported through its qb-core compatibility layer, so it uses the same bridge as QBCore.
Inventories#
Every read and write of the newspaper goes to the inventory that is really running — ox_inventory and qs-inventory are called directly, because ESX's own item functions do not reach qs-inventory. Before handing out a bag the script also asks the inventory whether the item exists at all, so a missing item is reported as This item does not exist: weapon_acidpackage (and once in the server console) instead of Your inventory is full.
The item definitions for qs-inventory, ox_inventory and qb-inventory are in Installation → Registering the Newspaper Item.
Targets#
Target is not detected automatically. To use third-eye on the editor instead of pressing E:
Config.Target = true
Config.TargetScript = 'ox' -- 'ox' for ox_target, 'qb' for qb-targetThe editor gets a single Start working option within 3 m. Handing the bike in is always a key press at the drop-off.
Vehicle Keys#
The work bike gets keys when it spawns and loses them when it is handed back. The first of these that is running is used:
qs-vehiclekeys · qb-vehiclekeys · qbx_vehiclekeys · F_RealCarKeysSystem
fivecode_carkeys · glfp10_carkeys · mono_carkeys · ti_vehicleKeys
vehicles_keys · wasabi_carlock · xd_locksystemFor a keys resource that is not listed, copy the closest file in client/vehiclekeys/, change its first line to your resource name, fill in AddVehiclekeys(vehicle, plate) and RemoveVehiclekeys(vehicle, plate), and add the resource to the vehicleKeys table at the top of config/config.lua:
-- config/config.lua
local vehicleKeys = {
['qs-vehiclekeys'] = 'qs-vehiclekeys',
-- ...
['my_keys'] = 'my_keys',
}
-- client/vehiclekeys/my_keys.lua
if Config.Vehiclekeys ~= 'my_keys' then
return
end
function AddVehiclekeys(vehicle, plate)
exports['my_keys']:GiveKeys(plate)
end
function RemoveVehiclekeys(vehicle, plate)
exports['my_keys']:RemoveKeys(plate)
endFuel#
Only the Faggio uses fuel out of the box. To fill its tank on spawn, point the export at your fuel resource:
Config.Fuel = true
Config.FuelExport = exports['LegacyFuel'] -- or exports['cdn-fuel'], exports['ps-fuel'] …The resource must expose SetFuel(vehicle, amount).
Notifications and Prompts#
By default the job draws its own notifications, with a sound and an icon per type (success, error, warning, info). To send them through your own system, turn the built-in ones off and fill SendTextMessage in config/config.lua:
Config.DefaultNotifications = false
function SendTextMessage(msg, type) -- type: 'info' | 'error' | 'success' | 'warning'
exports['okokNotify']:Alert('Newspaper', msg, 5000, type)
endWith qs-textui running, the "[E] Start working" and "[E] Hand the bike in" prompts use it automatically. With Config.DrawText3D = false they become a hint in the corner of the screen.
Job Accounts#
When qs-job-management is running, every route payout goes through it under the courier's newspaper job, so the boss's treasury cut and the job statistics move with each delivery. Several papers in Config.NewspaperJob each book to their own job. Ranking prizes are always paid directly to the winner.
Discord Logs#
Five events can be posted to Discord as colour-coded embeds, each with the player's name, server id and identifier in the footer. Off by default:
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/…', -- the shared channel
Name = 'qs-newspaperjob',
Avatar = '', -- an image URL, or '' for none
Timestamp = true,
Events = {
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = 'https://discord.com/api/webhooks/…', -- its own channel
ExperienceGiven = false,
},
}Event | Posted when |
|---|---|
| A route is taken — stops, bike, pay and experience. |
| The bike is handed in — share of stops served, pay, experience and any newspapers charged. |
| A route is abandoned from the panel — stops served of the total. |
| A route payout is handed over. |
| Experience is granted — gained, level before and after, progress to the next level and total. |
Each event takes true (the shared Url), false, or a URL of its own — so money can go to a staff channel while routes go somewhere public.
Adding a Framework#
A renamed or custom core is supported by editing the open bridges rather than the detection. server/framework/esx.lua and qb.lua each define the same small set of functions — GetPlayeridentifier, GetPlayerJobName, AddInventoryItem, RemoveInventoryItem, AddMoney, GetPlayerFromIdentifier — and the client files handle the job updates, the bike spawn and the blip. Adjust the one matching your core's API, and keep the core's resource name in the frameworks table of config/config.lua.
Languages#
Eleven translations ship in config/translations.lua: English (en), Spanish (es), Italian (it), French (fr), Portuguese (pt), German (de), Russian (ru), Turkish (tr), Dutch (nl), Simplified Chinese (cn) and Traditional Chinese (zh-tw).
Config.Language = 'es'
-- inside each language table:
["CURRENCY_TYPE"] = "$", -- the symbol FormatCurrency usesAny key missing from the active language falls back to English rather than showing its raw name. To add a language, copy the ['en'] table under a new code, translate the text between the quotes and set Config.Language to it.



