What goes wrong most often with Text UI, what it actually means, and what to do about it. While you investigate, set Config.Debug = true in shared/config.lua and keep the F8 console open — Lua errors from the client show up there.
Installation#
"Failed to verify protected resource" or "You lack the required entitlement"
The server key belongs to a different CFX account than the one that bought Text UI, or the protected files were modified or re-uploaded through FTP in text mode. Download it again from Granted Assets with the purchasing account, upload it in binary mode, and use a server key generated by that same account.
"No such export displayTextUI in resource qs-textui"
The script calling the export started before Text UI, or Text UI is not running. Move ensure qs-textui above every script that uses it, check the folder is named exactly qs-textui, and look further up the server console for the reason it did not start.
"API is not available. Unable to check the version."
Only the update check failed — the server could not reach GitHub. Text UI itself works normally, and the message can be ignored.
"attempt to call a nil value (global 'GetJobName')"
A prompt has a job other than 'all', but no framework was detected. Either your framework starts after Text UI — move it above ensure qs-textui — or the server is standalone, and the prompt needs job = 'all'. A framework under another resource name can be added as shown in Integrations.
Prompts#
A 3D prompt never shows
Go through these in order:
It has no
displayDist. Without it the prompt is skipped — with debug on, the console printsNo displayDist.Its
jobis not your character's job, or itscanInteractreturnsfalse.The id was already used. A second
create3DTextUIwith the same id is ignored, so the first one's coordinates and settings stay.The coordinate is under the floor or inside a wall, so it is never on screen. Raise
zby half a metre.Another script has the mouse cursor open — an inventory or a menu. Prompts hide until it closes, by design.
Pressing the key does nothing
The prompt has a
keybut nokeyNum.keyis only the label;keyNumis the control that is listened to.Another option is selected. With several prompts in reach only the highlighted one responds — use the arrow keys.
On a prompt on a player,
enableKeyClickis missing. It must betruethere.The event name in
triggerDatais wrong, or the event is server-side andisServeris nottrue.On-screen prompts from
displayTextUInever handle a key — your script checks the key itself.
"attempt to concatenate a nil value (field 'key')", and every prompt stops
A 3D prompt was created without a key. Every prompt needs a key label — also a display-only one — so pass key = 'E' or any label, then restart qs-textui. If it comes from an old script through DrawText3D, use the wrapper, which fills in a key.
Prompts disappeared after restarting qs-textui
Prompts created through exports live in Text UI's memory, and a restart clears them. Restart the scripts that create them too, or have them recreate their prompts when Text UI starts — see When qs-textui Restarts.
Prompts vanish while an inventory, phone or menu is open
Correct behaviour. Whenever another script has the mouse cursor, Text UI hides itself so it never covers that window, and comes back when it closes. The same happens in the pause menu and during screen fades.
DrawText3D labels stay on screen after walking away
The script calls drawText3D directly and never deletes the label. Use the full wrapper, which removes the label a few frames after the script stops drawing it, or call DeleteDrawText3D yourself.
Two labels jump between places, or one replaces the other
They share an id. Every prompt needs its own — add the door number, the shop name or the entity to it: 'door_' .. doorId.
The text shows ~g~ or ~r~ instead of colours
GTA colour codes are supported from version 1.2.27. Check the version in fxmanifest.lua and download the latest one from the CFX Portal.
The on-screen prompt is in the wrong place
A position that is not one of the nine names falls back to Config.DefaultAlign — left or right from QBCore, for example. Use the names listed in Screen Position, or the mapping in Integrations. In the Cyberpunk style, the dialogue sits at Config.CyberpunkTextUI.align unless the script chooses.
Config changes do nothing
shared/config.lua is read when qs-textui starts. Restart it after every edit — and then restart the scripts that create prompts through exports, because the restart clears them.
Still stuck? Open a ticket and include your Text UI version (from
fxmanifest.lua), your framework, the F8 console output withConfig.Debug = true, and the code that creates the prompt.



