ox_target for FiveM: what it is, common mistakes and the AI skill
Updated
Don’t want to manage skills yourself? Get the full app.
ox_target is the third-eye targeting resource for FiveM. You add interaction options to entities, models, players and zones through exports.ox_target. This guide covers the API, the mistakes that open exploits and the AI skill that avoids them.
ox_target is the third-eye targeting resource for FiveM. It replaces qb-target and bt-target and supports ox_core, ESX and qbx_core. You add options to entities, models, players and zones, and the player selects them with the target key. Every function is called through exports.ox_target:<fn>(...), because there is no global ox_target table.
Quick reference
Every function is exports.ox_target:<name>(...) and runs on the client. Each takes an array of option tables.
| Export | Use it for |
|---|---|
addLocalEntity(entity, options) |
An entity you spawned locally |
addEntity(netId, options) |
A networked entity |
addModel(models, options) |
Every instance of a model |
addGlobalPed / addGlobalVehicle / addGlobalObject / addGlobalPlayer |
A whole category |
addGlobalOption(options) |
Everything, no filter |
addBoxZone / addSphereZone / addPolyZone |
A place instead of an entity; returns a zone id |
removeZone(zoneId) |
Remove a zone |
Common option fields: label, name, icon, distance, groups, items, canInteract, onSelect, serverEvent. Set name on any option you plan to remove.
What the ox_target skill gives you
The skill maps each target to the right function:
addLocalEntityfor an entity you spawned locally andaddEntityfor a networked entity.addModelfor every instance of a model.addGlobalPed,addGlobalVehicle,addGlobalObjectandaddGlobalPlayerfor whole categories, andaddGlobalOptionfor everything.addBoxZone,addSphereZoneandaddPolyZonefor a location instead of an entity.
Rule files cover setup, every field of the option table, entities, zones and the migration from qb-target. The upstream reference is overextended.dev/ox_target.
Common mistakes with ox_target
- Trusting onSelect. It runs on the client. Route anything that grants money, items or state through
serverEventand validate again in the server handler. - Using qb-target syntax. The option format is different. Build the options array from the documented fields.
- Forgetting the option name. Options are removed by name, not by index. Pass
nameon every option you plan to remove. - Leaving distance to the default. Set
distanceexplicitly for anything beyond about 2.5 m. - Checking conditions inside onSelect. Gate visibility with
groups,itemsorcanInteractso players do not see options they cannot use. - Calling zone functions on the server. Zone and entity functions are client side only.
- Starting ox_target before ox_lib. Make sure
ox_libstarts first inserver.cfg.
Why AI assistants get ox_target wrong
Many examples online use qb-target, so assistants often emit exports['qb-target'] calls or invent a global table. Both fail on ox_target. Assistants also tend to put the reward logic inside onSelect, which leaves the server open to spoofed events.
The ox_target skill lists the real functions and the decision table for choosing one. The assistant reads the rule that matches your request and writes exports.ox_target code with serverEvent for anything that changes state.
To see how a skill compares with other FiveM AI setups, read our comparison.
Install the ox_target skill in 30 seconds
- Click "Download SKILL.md" at the top of this page.
- Unzip it into the skills or rules folder of your AI tool. The install section below shows the exact path for Claude Code, Cursor and VS Code.
- Ask the assistant for something concrete, like "add a third-eye option to a ped that opens a shop", and check that it uses
exports.ox_target:addLocalEntityand handles the purchase in aserverEvent.
How to install this skill
Download the zip, unzip it, and place the folder where your tool loads skills or rules. The exact path depends on the tool:
Claude Code
Unzip into .claude/skills/ox-target/ inside the project (the folder must contain SKILL.md). For every project, use ~/.claude/skills/ox-target/ instead.
Cursor
Cursor loads project rules from .cursor/rules/. Add a rule file there that points to the unzipped skill, or paste the contents of SKILL.md and the rule files into a rule. The format is .mdc with frontmatter and changes between versions, so check the docs for your version.
VS Code / Copilot
Copilot reads instruction files from .github/instructions/*.instructions.md. Copy SKILL.md there with an applyTo glob for your Lua files, and keep the rule files next to it.
The SKILL.md file
This is the file your AI assistant reads. It links to the rule files bundled in the download.
ox_target
Third-eye targeting for FiveM. Replaces qb-target and bt-target. Supports ox_core, esx and qbx_core.
Activation Contract
Load this skill when the user asks to make something interactable: "press E on this ped", "third eye", "target option", "add an interaction to this vehicle/door/prop", or when migrating from qb-target.
Hard Rules
- Call every function through
exports.ox_target:<fn>(...). There is no globalox_targettable. onSelectruns on the CLIENT. Never trust its arguments server-side: re-validate in theserverEventhandler.- Always pass
nameon an option you intend to remove later. Removal is by name, not by index. distancedefaults to the resource default; set it explicitly for anything above ~2.5m.- Zone and entity functions are CLIENT-side only.
- Prefer
addLocalEntityfor entities you spawned yourself; useaddEntityonly for networked entities and expect the id to change on respawn.
Decision Gates
| Target | Function |
|---|---|
| One entity you spawned locally | addLocalEntity(entities, options) |
| A networked entity (net id) | addEntity(entities, options) |
| Every instance of a model | addModel(models, options) |
| Every ped / vehicle / object / player | addGlobalPed / addGlobalVehicle / addGlobalObject / addGlobalPlayer |
| Everything, no filter | addGlobalOption(options) |
| A location, not an entity | addBoxZone / addSphereZone / addPolyZone |
Execution Steps
- Confirm
ox_targetis started AFTERox_libinserver.cfg. - Pick the function from the Decision Gates table.
- Build the options array. Read rules/options.md for every allowed field.
- Gate visibility with
groups,itemsorcanInteractrather than checking insideonSelect. - Route the action:
onSelectfor client logic,serverEventfor anything that grants money, items or state. - Store the returned zone id if the zone must be removed later.
Output Contract
Return runnable Lua using exports.ox_target. Include the fxmanifest.lua dependency lines when the resource is new. Never emit qb-target syntax.
References
- rules/setup.md — install, fxmanifest, convars, framework support.
- rules/options.md — every field of the option table.
- rules/entities.md — entity, model and global targets.
- rules/zones.md — box, sphere and poly zones.
- rules/migration.md — qb-target to ox_target.
Upstream docs: https://overextended.dev/ox_target
Frequently asked questions
- Yes. ox_target replaces qb-target and bt-target, and the skill includes a migration rule for qb-target. The option format differs, so do not paste qb-target syntax.
- Yes. ox_target is open source and published on GitHub by the Overextended and CommunityOx teams, so you can use it on any server at no cost.
- No. onSelect runs on the client, so its arguments cannot be trusted. Use serverEvent for anything that grants money, items or state, and validate again in the server handler.
Does ox_target replace qb-target?
Is ox_target free?
Is it safe to give items from onSelect?
Related guides
Longer reads from the FiveAI blog on the same topic.