Integrations and API Framework Bridge Framework Bridge Framework-specific code is isolated under client/bridge/ and server/bridge/. Auto-detection order is: Qbox / QBX QBCore ESX Nord Core Standalone Framework ownership/economy is bridged while Nord Garages keeps its own authoritative runtime state. Framework table mapping The configuration contains default table mappings for ESX and QB/QBX. If your server uses a heavily customized ownership schema, adjust only the bridge/table mapping instead of rewriting the garage core. Nord Core The included bridge expects a GetPlayer(source) style export. If your local Nord Core API differs, adapt the Nord bridge file while preserving the core API contract. Keys, Fuel & Inventory Keys, Fuel & Inventory Nord Vehicle Keys When nord_vehiclekeys is used, Nord Garages integrates server-authoritatively. Typical API usage includes registering the owned network entity, checking keys/physical key items and granting keys only when needed. With Config.Keys.keepOwnerKeysOnStore = false, storing/impounding removes the physical vehicle key lifecycle where appropriate, and spawning recreates valid owner access without duplicating physical key items. Fuel The fuel bridge restores the saved fuel value during entity initialization, then stops writing so the active fuel resource controls normal consumption. lc_fuel receives extra initialization safety to avoid persisting an uninitialized decorator as a false 0% tank. Inventory bridge API Internally normalized operations include: NordInventory.GetCount(source, item, metadata) NordInventory.HasItem(source, item, amount, metadata) NordInventory.GetItem(source, item, metadata) NordInventory.AddItem(source, item, amount, metadata, slot, reason) NordInventory.RemoveItem(source, item, amount, metadata, slot, reason) NordInventory.RegisterStash(id, label, slots, weight, owner, groups, coords) NordInventory.OpenStash(source, id, owner) Client Exports Client Exports Garage UI exports['nord_garages']:OpenGarage(identifier) exports['nord_garages']:CloseGarage() local garages = exports['nord_garages']:GetGarages() Impounds exports['nord_garages']:OpenImpound(identifier) local impounds = exports['nord_garages']:GetImpounds() exports['nord_garages']:OpenImpoundManager() exports['nord_garages']:OpenJobImpoundManager() Admin permission for management remains server-side. Showroom helpers exports['nord_garages']:IsInShowroom() exports['nord_garages']:IsShowroomVehicle(vehicle) exports['nord_garages']:GetShowroomVehicleData(vehicle) Use these to ensure target/inventory resources ignore preview entities where appropriate. Server Exports — Garages & Vehicles Server Exports — Garages & Vehicles Garage lookup/registration exports['nord_garages']:GetGarage(identifier) exports['nord_garages']:GetGarages(true) exports['nord_garages']:GetImpounds(true) exports['nord_garages']:GetGarageTemplates() exports['nord_garages']:RegisterGarage(data) Fleet exports['nord_garages']:RegisterFleetVehicle(job, garageIdentifier, vehicleData) Vehicle state exports['nord_garages']:SetVehicleState(plate, state, garageIdentifier, details) exports['nord_garages']:ImpoundVehicle(plate, garageIdentifier, reason, releaseAt, fine) exports['nord_garages']:ReleaseVehicle(plate, garageIdentifier) Staff-safe garage mutations exports['nord_garages']:AddVehicleToGarage(plate, garageIdentifier, options) exports['nord_garages']:ForceStoreVehicle(plate, garageIdentifier, options) exports['nord_garages']:RemoveVehicleFromGarage(plate, options) exports['nord_garages']:DetachVehicleFromGarages(plate, options) exports['nord_garages']:StaffDeleteWorldVehicle(plate, garageIdentifier, options) exports['nord_garages']:GetVehicleGarageState(plate) All trusted mutation integrations should check the returned ok/ error fields. Server Exports — Admin, Staff & Sync Server Exports — Admin, Staff & Sync Admin access AddAdmin(value) RemoveAdmin(value) IsAdmin(value) GetRuntimeAdmins() Compatibility aliases: GiveGaragesAccess(value) RemoveGaragesAccess(value) HasGaragesAccess(value) Staff snapshots local rows = exports['nord_garages']:GetStaffVehicleSnapshot(limit) The helper is designed for bulk authoritative reads instead of one export call per vehicle. Framework reconciliation exports['nord_garages']:ReconcileOwnedVehicleByPlate(plate, options) exports['nord_garages']:SyncAllFrameworkVehicles(limit, force) exports['nord_garages']:ReconcileImpounds(options) Use these after trusted staff/ownership operations when another resource has changed the framework ownership table. Ownership deletion DeleteOwnedVehicleRecord is intended for explicit staff ownership deletion. Do not confuse this with StaffDeleteWorldVehicle, which is world-only and does not delete framework ownership. Server Exports — Vehicle OS Server Exports — Vehicle OS Main exports include: RegisterVIPProvider(name, handler) RegisterProvider(kind, name, handler) GetProviders() IsPersistentParkingVIP(source) GetVehicleIdentity(value) ChangeVehiclePlate(value, newPlate, actor) CompareVehicles(values) SearchVehicles(source, query, limit) GetVehicleHistory(value, limit) GetVehicleSnapshots(value, limit) RestoreVehicleSnapshot(value, snapshotId, actor) GrantVehicleAccess(value, identifier, role, expiresAt, actor) RevokeVehicleAccess(value, identifier, actor) SetVehicleCollection(source, value, collection, favorite) CreateGarageReservation(source, garage, vehicleId, minutes) GetGarageReservations(garage) GetGarageSlots(identifier) UpsertGarageSlot(identifier, slot) SetVehicleServiceData(value, patch, actor) SetVehicleInsurance(value, patch, actor) SetVehicleStolen(value, stolen, actor, details) SetVehicleEVData(value, patch, actor) GetMaintenanceStatus(value) TowVehicleToImpound(value, garage, reason, actor, fine) GetRecoveryCenter() RepairVehicleState(value, action, garage, actor) GetGarageAnalytics(days) RestorePersistentParking() RequestVehicleDelivery(source, plate, mode) External resources should use these contracts rather than querying auxiliary Vehicle OS tables directly. Events & Live Sync Events & Live Sync Nord Garages emits events so Staff, Phone and other integrations can refresh without polling the full database continuously. Vehicle changed AddEventHandler('nord_garages:server:vehicleChanged', function(payload) -- refresh local integration cache end) Vehicle OS event bus AddEventHandler('nord_garages:server:event', function(eventName, payload) end) AddEventHandler('nord_garages:server:vehicleChangedV2', function(payload) end) Garage changes Garage create/update/delete operations emit the garage change flow used by live admin/staff integrations. Integration recommendation Prefer event-driven cache invalidation plus occasional reconciliation. Avoid high-frequency SQL polling for every player/vehicle. Nord Phone Integration Nord Phone Integration Server-side phone exports provide UI-safe normalized vehicle data. local vehicles = exports['nord_garages']:GetPhoneVehicles(source) local vehicle = exports['nord_garages']:GetPhoneVehicle(source, plate) local garages = exports['nord_garages']:GetPhoneGarages() The normalized vehicle snapshot can include plate, model/label, state, garage or impound identity, location, fuel and impound metadata. A notification helper is also available: exports['nord_garages']:NotifyPhoneVehicleChanged(ownerIdentifier, plate, action, garageIdentifier) Vehicle history/state changes invalidate the live phone cache so store, spawn, transfer, impound, release and reconciliation operations can refresh without a resource restart. Nord Staff Integration Nord Staff Integration Nord Staff should use the trusted server exports instead of directly manipulating Nord Garages rows. Give/store vehicle After creating framework ownership, call ReconcileOwnedVehicleByPlate or AddVehicleToGarage so the new vehicle appears immediately without restart. DV / remove from world Use: exports['nord_garages']:StaffDeleteWorldVehicle(plate, nil, { source = source, netId = netId, }) This reconciles world tracking/garage state without deleting ownership. Delete ownership Use the explicit ownership deletion export only when the staff action genuinely removes the vehicle from the player's ownership database. Global list Use GetStaffVehicleSnapshot(limit) for bulk state and SyncAllFrameworkVehicles(limit, force) when a full framework sync is required.