A DUI-based ATM system for FiveM that renders a realistic banking interface directly onto in-game ATM textures. Framework agnostic with support for QBCore, ESX, and Qbox.
Pro Tip: Elevate your server's experience with more premium resources at OsmFX Mods. Join our Discord for exclusive updates, and consider dropping a server boost for prioritized support!
- Ensure the required dependency (
ox_lib) is running on your server. - Drop the
osm-atmduifolder into your server'sresourcesdirectory. - Open
config.luaand adjust the framework and preferences to match your server. - (Recommended) Add the
atm_receiptitem snippet provided below to your framework's shared items to enable interactive physical receipts. - Add
ensure osm-atmduito yourserver.cfg. - Start your server (or run
ensure osm-atmdui). You are ready to go!
- DUI Rendering - Custom UI rendered directly on ATM screen textures
- Scripted Camera - Smooth camera transitions with mouse-based interaction
- Realistic UI - Bank-grade interface
- Animations - Card insertion, and cash dispensing animations
- Sound Effects - Keypad clicks, card sounds, transaction confirmations
- PIN Authentication - 4-digit PIN with lockout protection
- Withdraw - Quick amounts ($20, $50, $100, $200, $500) + custom
- Deposit - Deposit cash to bank account
- Transfer - Transfer funds to other players by account number
- Balance Check - View current account balance
- Interactive Receipt - Players receive an
atm_receiptphysical item giving them a beautiful UI view of their transaction details.
- Framework Agnostic - Works with QBCore, ESX, and Qbox, and bridge-support for other frameworks.
- ox_lib Integration - Uses ox_lib for DUI, callbacks, and native elements.
- ox_target Support - Target-based interaction (configurable)
- Secure - Server-side validation for all transactions
- Configurable - Extensive configuration options
- ox_target (if using target interaction)
- Download and extract to your resources folder
- Ensure
ox_libis started before this resource - Add
ensure osm-atmduito your server.cfg - Configure
config.luaas needed
Config.Framework = 'auto' -- 'auto', 'qbcore', 'esx', 'qbox'-- Add offsets unique to different map props to ensure the screen matches map scale/skew
Config.ATMModels = {
['prop_atm_01'] = { offset = vec3(0.0, 0.05, 0.65), scale = 0.06, width = 1024, height = 1024 },
['prop_atm_02'] = { offset = vec3(0.0, 0.05, 0.65), scale = 0.06, width = 1024, height = 1024 },
['prop_atm_03'] = { offset = vec3(0.0, 0.15, 0.67), scale = 0.055, width = 1024, height = 1024 },
['prop_fleeca_atm'] = { offset = vec3(0.0, 0.1, 0.7), scale = 0.04, width = 1024, height = 1024 }
}Config.PIN = {
length = 4,
maxAttempts = 3,
lockoutTime = 300, -- seconds
requireCard = true, -- require bank_card item
}Config.Transactions = {
quickAmounts = {20, 50, 100, 200, 500},
maxWithdraw = 10000,
maxDeposit = 50000,
maxTransfer = 25000,
fee = 0,
feePercent = 0,
}For PIN verification, players need a bank_card item with metadata containing the PIN. This is already shipped with most frameworks like QBCore and QBOX.
Add the atm_receipt item to your framework's item list to enable the in-game physical receipt UI feature:
-- In qb-core/shared/items.lua
atm_receipt = {
name = 'atm_receipt',
label = 'ATM Receipt',
weight = 0.1,
type = 'item',
image = 'atm_receipt.png',
unique = true,
useable = true,
shouldClose = true,
combinable = nil,
description = 'A receipt from the ATM'
},info = {
cardPin = 1234, -- 4-digit PIN
cardNumber = "4532123456789012", -- optional
citizenid = "ABC12345" -- optional
}The script includes adapters for:
- Uses
qb-coreexports for player data and money management - Supports
QBCore.Functions.Notifyfor notifications - Uses
QBCore.Functions.HasItemfor inventory checks
- Uses
es_extendedexports - Supports both default ESX inventory and ox_inventory
- Uses
ESX.ShowNotificationfor notifications
- Uses
qbx_coreexports - Uses
ox_inventoryfor item management - Uses
lib.notifyfor notifications
The UI has been rewritten natively using React, TypeScript, TailwindCSS, and Framer Motion for high-performance and incredibly smooth animations. It renders a modern, responsive layout that functions seamlessly both as a 3D texture overlay (DUI) and a full-screen native browser UI (NUI).
To edit the UI:
- Navigate to the
web/directory. - Ensure you have Node.js installed and run
npm install. - Modify the source code inside
web/src/. - Run
npm run buildto compile the changes to thehtml/folder format readable by FiveM. - Restart the resource in-game with
ensure osm-atmdui.
-- Button clicked in ATM UI
AddEventHandler('atm-dui:client:buttonClicked', function(buttonId)
-- Handle button click
end)
-- ATM session ended
AddEventHandler('atm-dui:client:sessionEnded', function()
-- Session cleanup
end)-- Verify PIN
lib.callback.register('atm-dui:server:verifyPIN', function(source, pin) ... end)
-- Withdraw
lib.callback.register('atm-dui:server:withdraw', function(source, amount) ... end)
-- Deposit
lib.callback.register('atm-dui:server:deposit', function(source, amount) ... end)
-- Transfer
lib.callback.register('atm-dui:server:transfer', function(source, target, amount) ... end)-- Start ATM session programmatically
exports['osm-atmdui']:StartSession(atmEntity)
-- End current session
exports['osm-atmdui']:EndSession()- DUI implementation inspired by colbss_keypad and cr-3dnui and benite-atm
- Design references from 0BugScripts
- Idea suggested on our discord by french_fab
Built with caffeine, code, and a help from our AI overlords (Claude Opus 4.5, Opus 4.6 and Gemini 3.1 Pro). The bugs, however, are 100% human-made.