NX CreativeNX CreativeDocs
Scriptsnx_realbanking

Configuration

Every entry in shared/config.lua. Defaults, types, and purpose.

All settings live in shared/config.lua. The file is in escrow_ignore so it remains editable after install. Locale strings live in two places, both editable: shared/locales/<lang>.lua covers notifications and target labels, nui/js/locales/<lang>.js covers the ATM screen and the bank app. Webhook URLs and the PIN secret live in server-config.lua, which is never sent to players; its logging settings are documented at the end of this page.

Internal calibration (the 3D ATM panels and their IK geometry, animation dictionaries, camera offsets, cache TTLs, sound effect mapping) is set inside the encrypted resource and is not part of this file.

General

Config.Localestringdefault: 'en'

Active locale, applied to both the ATM and the bank app. Shipped values: 'en', 'fi', 'de', 'fr', 'pt-br', 'es', 'tr', 'nl', 'it', 'pl'.

Config.UseTargetbooleandefault: true

Use a targeting system (ox_target / qb-target) for ATM and bank-ped interactions. If false, falls back to proximity prompts.

Config.TargetSystemstringdefault: 'ox_target'

Target resource name. One of 'ox_target', 'qb-target', 'qtarget'.

Session

Config.Session.timeoutSecondsnumberdefault: 120

Inactivity timeout before the ATM session is killed.

Config.Session.pinAttemptsnumberdefault: 3

Allowed wrong-PIN attempts before lockout.

Config.Session.lockoutDurationnumberdefault: 300

Lockout duration in seconds after exceeding pinAttempts.

3D ATM panels

Accounts

Config.Accounts.autoCreateDefaultbooleandefault: true

When a player without a default account uses an ATM, create one automatically.

Config.Accounts.autoCreateAccountTypestringdefault: 'personal'

Type assigned to the auto-created default account.

Config.Accounts.autoCreateAccountNamestringdefault: 'Personal Account'

Display name assigned to the auto-created default account.

Config.Accounts.autoCreateLinkBankBalancebooleandefault: true

If true, mirror the framework's bank balance onto the linked personal account on login.

Config.Accounts.nameMinLengthnumberdefault: 3

Minimum allowed length for an account name.

Config.Accounts.nameMaxLengthnumberdefault: 32

Maximum allowed length for an account name.

Config.Accounts.allowOwnerClosebooleandefault: true

Owners can close their own accounts.

Config.Accounts.allowOwnerFreezebooleandefault: false

Owners can freeze their own accounts.

Config.Accounts.adminGroupsstring[]default: { 'admin', 'superadmin', 'mod' }

Framework group names treated as bank admins.

Config.Accounts.adminPermissionsstring[]default: { 'admin', 'god' }

Additional QBCore permissions recognized as bank admins.

Config.Accounts.adminAcePermissionstringdefault: 'command.nx_realbanking_admin'

ACE permission checked for admin actions.

Shared accounts

Config.Accounts.Shared.enabledbooleandefault: true

Master toggle for multi-owner (shared) accounts.

Config.Accounts.Shared.allowPersonalbooleandefault: false

Allow personal accounts to be shared with other players.

Config.Accounts.Shared.allowBusinessbooleandefault: true

Allow business accounts to be shared.

Config.Accounts.Shared.allowSavingsbooleandefault: true

Allow savings accounts to be shared.

Config.Accounts.Shared.allowLinkedPersonalbooleandefault: false

Allow the framework-linked personal account to be shared.

Config.Accounts.Shared.cacheSecondsnumberdefault: 120

Cache TTL for shared account membership lookups.

Config.Accounts.Shared.adminBypassbooleandefault: true

Admins bypass shared-account role checks.

Config.Accounts.Shared.defaultRolestringdefault: 'viewer'

Role assigned when inviting a new member without an explicit role.

Config.Accounts.Shared.rolestable

Role to permission map. Shipped with owner, manager, teller, viewer. Each role sets boolean flags: view, withdraw, deposit, transfer, manage_members, edit_limits, freeze, close.

Inventory / cash item

Config.Inventory.useOxInventoryForCashbooleandefault: false

When true, deposit and withdraw flows write the cash item directly through ox_inventory instead of calling the framework's AddMoney / RemoveMoney. Use this if your server renamed the cash item and the framework's auto-sync no longer fires.

Config.Inventory.moneyItemstringdefault: 'money'

ox_inventory item name that represents cash. Common values: 'money', 'cash'. Only used when useOxInventoryForCash is true.

PIN code

Config.Pincode.changeCostnumberdefault: 100

Fee charged when the user changes their PIN. First creation is free.

Config.Pincode.resetCostnumberdefault: 200

Fee charged for a PIN reset (no old PIN required).

Config.Pincode.allowSequentialbooleandefault: false

Whether players may set a run of consecutive digits such as 1234 or 4321. Off means those PINs are refused.

Config.Pincode.allowRepeatedbooleandefault: false

Whether players may set the same digit four times, such as 1111. Off means those PINs are refused. PINs are always 4 digits; attempts and lockout are set under Config.Session.

Fees

Each fee block shares a shape: { enabled, type = 'percentage' | 'flat', value, minFee?, maxFee? }.

Config.Fees.withdrawaltabledefault: { enabled=false, type='percentage', value=1.5, minFee=1.00, maxFee=50.00 }

Charged on ATM withdrawals, on top of the amount requested: the player receives what they asked for and the account loses amount + fee. Ships disabled so updating does not change your economy.

Config.Fees.transfertabledefault: { enabled=true, type='flat', value=2.50, sameBankFree=true }

Charged on transfers. sameBankFree waives the fee for transfers between accounts of the same player.

Config.Fees.deposittabledefault: { enabled=false, type='flat', value=0 }

Taken out of the deposit: the player hands over the amount and the account is credited amount - fee. Ships disabled.

Transaction limits

Config.Limitstable

Per-account-tier limits: default, premium, business, savings. Each entry: { dailyWithdrawal, dailyDeposit, dailyTransfer, transactionMax, transactionMin }. Shipped defaults use a deliberately permissive ceiling. Tighten these for your economy.

Sounds

Config.Sounds.volumenumberdefault: 0.5

Scales the whole ATM sound mix (0.0 to 1.0). 0.5 is the shipped level, 0.0 mutes the ATM.

Security

Config.Security.logLevelstringdefault: 'basic'

One of 'none', 'basic', 'verbose', 'paranoid'. Controls how much detail is written to the security audit log. The bank app's Security Center reads from these logs, so 'basic' is the minimum if you want session and PIN events to appear there. Set to 'none' to silence all security logs.

Config.Security.anticheattabledefault: { distanceChecks=true, teleportDetection=false, speedHackDetection=false, injectionDetection=false }

Anti-exploit toggles. Distance checks are cheap and recommended. The movement checks are heuristics and ship off, because an admin teleport menu or a vehicle launcher will trip them. injectionDetection refuses malformed payloads from a client.

Config.Security.thresholdstabledefault: { rapidTransactions=10, largeTransfer=50000, dailyLimitPercent=90 }

Heuristic thresholds for flagging suspicious activity. These flag, they do not hard-block.

ATMs

Config.ATMPropstable

Array of ATM prop definitions. Each entry: { model = `hash`, type = 'standalone' | 'wall' | 'maze_bank' }. Shipped models: prop_atm_01, prop_atm_02, prop_fleeca_atm, v_5_b_atm1, v_5_b_atm2.

Blips

Config.Blipstabledefault: { enabled=false, sprite=207, color=2, scale=0.8, label='ATM', shortRange=true }

Global toggle for ATM blips. Per-location visibility is still controlled by Config.ATMLocations[i].blip.

Config.ATMLocationstable

ATM marker / blip definitions at fixed coordinates. Each entry: { coords = vector3, name = string, blip = boolean }.

Bank locations

Config.BankLocationstable

Array of in-world bank-access points. Each entry: { coords = vector3, heading, type = 'fleeca' | 'pacific' | 'blaine' | 'maze', label, blip, ped }. Peds spawn with the given model and scenario. Targeting a banker triggers nx_realbanking:server:openBank.

Bank interactions

Config.BankInteractions.targetOptionstabledefault: { label='Access Bank', icon='fa-solid fa-building-columns', distance=2.5 }

Options surfaced when a player targets a bank ped or counter.

Config.BankInteractions.markertable

Marker placed at bank locations. Fields: enabled, type, color {r,g,b,a}, size, bobUpAndDown, faceCamera, rotate. Disabled by default in favor of target-based interaction.

Config.BankInteractions.drawDistancenumberdefault: 15.0

Maximum distance at which markers and 3D text are drawn.

Config.BankInteractions.text3dtabledefault: { enabled=false, scale=0.35, color={r=255,g=255,b=255,a=255} }

Optional 3D text prompt above bank peds.

Config.BankInteractions.keybindtabledefault: { enabled=true, key=38, label='E' }

Proximity keypress, used only when Config.UseTarget is false. If you turn targeting off, leave this on or players cannot reach the bank peds.

Societies (job invoicing)

Config.Societiestable

Map of job name to { label, account, canBill, canInspect, finePresets, requireReason }. Shipped jobs: police, sheriff, ambulance, mechanic, taxi, realestate, cardealer. Each finePresets is an array of { label, amount } quick-fill options surfaced in the invoice UI.

Freelance billing

Config.FreelanceBilling.enabledbooleandefault: true

Master toggle for freelance (player-to-player) invoicing.

Config.FreelanceBilling.maxAmountnumberdefault: 10000

Maximum amount for a single freelance invoice.

Config.FreelanceBilling.minAmountnumberdefault: 10

Minimum amount for a single freelance invoice.

Config.FreelanceBilling.requireDescriptionbooleandefault: true

Reject freelance invoices without a description.

Config.FreelanceBilling.cooldownSecondsnumberdefault: 60

Anti-spam cooldown between invoices issued by the same player.

Config.FreelanceBilling.allowOfflinePlayersbooleandefault: false

Whether freelance invoices can be addressed to offline players.

Invoices

Config.Invoices.enablePersonalbooleandefault: true

Enable player-to-player personal invoices.

Config.Invoices.enableSocietybooleandefault: true

Enable job-issued society invoices.

Config.Invoices.allowSelfInvoicebooleandefault: true

Allow a player to send an invoice to themselves.

Config.Invoices.personalRequireAcceptancebooleandefault: true

Personal invoices require the receiver to accept before they can be paid.

Config.Invoices.acceptanceTimeoutCheckIntervalnumberdefault: 5

Minutes between sweeps that expire un-accepted personal invoices.

Config.Invoices.onlyOnlineTargetsbooleandefault: true

Restrict invoice creation to currently online recipients.

Config.Invoices.targetMenuEnabledbooleandefault: false

Adds a billing option to the target menu for every player in the world. Off by default. The bank app's Send Invoice tab works either way.

Invoice limits

Config.InvoiceLimits.maxPendingtabledefault: { received=20, sent=10 }

Hard cap on simultaneously pending invoices per player, split by direction.

Config.InvoiceLimits.maxAmountnumberdefault: 100000

Maximum amount a single invoice may carry.

Config.InvoiceLimits.minAmountnumberdefault: 1

Minimum amount a single invoice may carry.

Config.InvoiceLimits.dailyLimittabledefault: { enabled=true, maxCreated=50, maxAmount=500000 }

Per-player daily cap on invoice count and total amount issued.

Config.InvoiceLimits.expirationtabledefault: { enabled=true, days=30 }

When enabled, invoices become overdue after `days`.

VAT

Config.VAT.enabledbooleandefault: false

Apply VAT on top of invoice amounts.

Config.VAT.ratenumberdefault: 10.0

VAT percentage.

Config.VAT.govAccountstringdefault: 'society_government'

Society account that receives collected VAT.

Config.VAT.applyToSocietybooleandefault: true

Apply VAT to society-issued invoices.

Config.VAT.applyToFreelancebooleandefault: true

Apply VAT to freelance-issued invoices.

Config.VAT.showBreakdownbooleandefault: true

Display VAT as a separate line in the invoice UI.

Commission

Config.Commission.societyInvoicestabledefault: { enabled=true, percent=5.0, minAmount=10, maxAmount=500 }

Commission on society invoices, clamped between minAmount and maxAmount.

Config.Commission.freelanceInvoicestabledefault: { enabled=false, percent=0.0, minAmount=0, maxAmount=0 }

Commission on freelance invoices. Disabled by default.

Autopay

Config.Autopay.enabledbooleandefault: false

Auto-debit invoices that pass their due date.

Config.Autopay.daysnumberdefault: 7

Days after the due date at which autopay attempts settlement.

Config.Autopay.checkIntervalnumberdefault: 60

Minutes between autopay sweeps.

Config.Autopay.notifyBeforetabledefault: { enabled=true, daysBefore=1 }

Notify the player before autopay runs against them.

Config.Autopay.onFailuretabledefault: { applyInterest=true, interestRate=5.0, sendToDebtCollection=false, notifyPlayer=true }

Behavior when autopay cannot collect funds.

Credit cards

Config.Credit.enabledbooleandefault: true

Master toggle. If false, all credit-card exports return CREDIT_DISABLED.

Config.Credit.itemstabledefault: { givePhysicalCard=true, creditCardItem='credit_card' }

ox_inventory item name that represents a credit card, and whether to give the physical item on approval.

Config.Credit.billingtable

Billing cycle knobs: inGameDayMinutes, cycleDays, dueDays, checkIntervalSeconds, interestIntervalDays, minimumPaymentPercent, minimumPaymentFlat. In-game days compress real-world billing windows into a gameplay-friendly pace.

Config.Credit.scoretable

Credit score model: min/max bounds, base score, stable-job bonus, bank-balance thresholds, account-age bonus, payment bonuses and penalties, usage bonus, and a usage-bonus cap (cardUsageBonusCap). These numbers drive tier eligibility.

Config.Credit.penaltiestabledefault: { lateFeeFlat=250, lateFeePercent=2.5, collectionsThreshold=50000, autoSeizeEnabled=true }

Late fees and collections behavior. autoSeizeEnabled will seize funds from linked accounts when debt exceeds collectionsThreshold.

Config.Credit.limitstabledefault: { maxActiveCards=2, maxSingleCharge=25000 }

Hard limits on cards per player and the maximum value of a single charge.

Config.Credit.atmCashAdvancetable

ATM cash-advance flow: enabled, autoFallbackOnInsufficient, requirePhysicalCard, merchant label, transactionType identifier.

Config.Credit.tierstable

Tier definitions keyed by tier id. Shipped: standard, gold, black. Each: label, creditLimit, interestRate, graceInterestRate, graceDays, minimumScore, requiresStableJob, whitelistedJobs. The black tier whitelists specific jobs.

Config.Credit.tierPrioritystring[]default: { 'black', 'gold', 'standard' }

Order used when auto-assigning a tier from score. Highest eligible tier wins.

Discord logging

These live in server-config.lua, not shared/config.lua. A webhook URL lets anyone holding it post as your server, so keep it in that file and regenerate it in Discord if it ever leaks.

Config.Logging.enabledbooleandefault: true

Master switch for all Discord logging.

Config.Logging.defaultWebhookstringdefault: ''

Used by any enabled category that has no webhook of its own. Leave this and every category webhook empty and nothing is sent.

Config.Logging.botNamestringdefault: 'NX Banking'

Name shown on the messages. The category is appended, so a security message posts as 'NX Banking - Security'.

Config.Logging.botAvatarstringdefault: ''

Optional avatar image URL for the messages.

Config.Logging.mentionRoleIdstringdefault: ''

Role id pinged on critical events only. Empty means never ping. Everything else posts with notifications suppressed so a busy channel does not spam your staff.

Config.Logging.flushSecondsnumberdefault: 3

How long an event may wait to be grouped with others. Lower feels more live, higher is quieter. Critical events ignore this and send immediately.

Config.Logging.maxQueuedEventsnumberdefault: 500

Backlog limit per channel. If Discord cannot keep up, the oldest events are dropped and the next message reports how many were lost.

Config.Logging.categoriestable

One entry per category: transactions, security, invoices, credit, accounts, admin. Each takes enabled, webhook, label, mode and minSeverity. transactions also takes minAmount to ignore small movements.

Config.Logging.privacytabledefault: { includeIp=false, includeIdentifiers=false }

Citizen ids are always shortened in the message. These two opt in to also recording the player's IP address and full identifier list. An IP counts as personal data in most jurisdictions.

Categories

Each category can point at its own channel. An empty webhook falls back to defaultWebhook.

CategoryCoversVolumeDefault
securityExploit attempts, PIN lockouts, permission violations, money that failed to reconcileLowOn
accountsAccounts created, closed, frozen, renamed, handed over, plus shared account membershipLowOn
adminInvoice deletions, player financial inspections, export-driven actionsLowOn
invoicesCreated, paid, cancelled, auto-paid, expiredMediumOff
creditApplications, charges, statements, late fees, collectionsMedium to highOff
transactionsDeposits, withdrawals, transfersHighOff

transactions and credit ship off because they are busy enough to deserve a channel of their own. Turn them on once you have somewhere to put them.

Modes

mode controls how much room each event gets.

ModeBehaviour
embedOne message block per event. Readable, best for low volume.
digestMany events collapsed into a single table. Best for transactions.
offCategory disabled.

Severity

minSeverity drops anything below the level you set: info, warning or critical. Auto-payments, credit interest and member removals are warnings. Exploit attempts and debt seizures are critical.

NX Docs