Version 1.22.2 · Last updated May 2026
FiveM CAD is a cloud-based Computer Aided Dispatch system built specifically for FiveM roleplay communities. It provides real-time dispatching, character management, and law enforcement tools with seamless in-game integration.
The platform runs entirely in the cloud and connects to your server using a lightweight resource, allowing instant deployment with no backend setup required.
After selecting a plan, your community is created instantly. You can access your dashboard by signing in and completing the onboarding wizard.
All configuration is handled through the web dashboard.
Integrate your server using the provided Lua resource:
atlantic_cad resource using the button aboveatlantic_cad folder inside your server's resources/ directoryserver.cfg:
ensure atlantic_cad
atlantic_cad.lua and set your credentials at the top:
local CAD_URL = "https://your-cad-domain.com"
local CAD_TOKEN = "your_api_token"
Generate your API token from Community Dashboard → Setup → FiveM Token. Restart your server after setup — players will then be able to use CAD commands in-game.
All command names are configurable in config.lua. The names listed below are the defaults shipped with the resource.
| Command | Usage | Description |
|---|---|---|
/duty |
/duty |
Toggle on/off duty status. Must be a configured LEO job. |
/cadchar |
/cadchar |
Open the character selector. Auto-selects if you only have one character. |
| Command | Usage | Description |
|---|---|---|
/cadcall |
/cadcall |
Open the call creation form. Auto-fills postal, street, and zone from your current position. Requires duty. |
/911 |
/911 |
Opens the same call creation form as /cadcall without a duty requirement. Available to all players. |
/respond |
/respond <call_id> |
Respond to a call by its ID or call number. Sets your status to Enroute and places a waypoint. Requires duty. |
/onscene |
/onscene |
Mark yourself on-scene for your active call. Sets status to On Scene. Requires duty and an active responded call. |
/closecall |
/closecall |
Close your active call and mark it complete in the CAD. Requires duty. |
/clearcall |
/clearcall |
Detach yourself from your active call without closing it. Other units remain assigned. Requires duty. |
/scenecommand |
/scenecommand |
Take scene command on your active call. Requires duty. |
/releasescene |
/releasescene |
Release scene command on your active call. Requires duty. |
| Default Key | Action | Description |
|---|---|---|
F6 |
Respond to Call | When an incoming call overlay is visible, respond to it and set a waypoint. Rebindable in GTA V controls. |
F7 |
Dismiss Call | When an incoming call overlay is visible, dismiss it without responding. Rebindable in GTA V controls. |
F9 |
Panic Button | Broadcast an officer-in-distress alert to all on-duty units. Creates a flashing blip at your location for 90 seconds. Requires duty. Rebindable in GTA V controls. |
| Command | Usage | Description |
|---|---|---|
/status |
/status |
List all available status codes. |
/status <code> |
/status 10-8 |
Set your unit status. Requires duty. |
| Code | Meaning |
|---|---|
10-8 | Available |
10-6 | Busy |
10-7 | Out of Service / Hospital |
10-15 | Transporting Prisoner |
10-97 | On Scene |
10-98 | Call Complete |
Status codes are configurable in config.lua.
| Command | Usage | Description |
|---|---|---|
/lookup |
/lookup or /lookup <name or plate> |
Open the MDT lookup form. Supplying a plate (uppercase, 2–8 characters, no spaces) auto-routes to a plate search. Supplying a name auto-routes to a person search. Requires duty. |
/report |
/report |
Open the report creation form. Fields: report type (Incident, Use of Force, Crash Report, Fire Report, Medical Report, Tow Report, Other — filtered by department), title, body, evidence, involved persons, and involved vehicles. Requires duty. |
/citation |
/citation |
Open the citation form. Fields: suspect character ID, violation, fine amount, and points. Requires duty. |
| Command | Usage | Description |
|---|---|---|
/ts |
/ts <plate> |
Log a traffic stop. Automatically looks up the plate, creates a call, and marks you on-scene in one command. Flags the vehicle as stolen or BOLO'd if applicable and displays the owner info. Requires duty. |
| Command | Usage | Description |
|---|---|---|
/regvehicle |
/regvehicle |
Register the vehicle you are currently sitting in to the CAD. Records the plate, make, model, and color. |
/delvehicle |
/delvehicle <plate> |
Deregister a vehicle from the CAD by plate. |
/stolenvehicle |
/stolenvehicle <plate> |
Mark a vehicle as stolen in the CAD. Requires duty. |
/recovervehicle |
/recovervehicle <plate> |
Mark a previously stolen vehicle as recovered. Requires duty. |
| Command | Usage | Description |
|---|---|---|
/bolo |
/bolo <plate> <description> |
Create a Be On Lookout alert. The plate is automatically uppercased. All text after the plate is used as the description. Broadcasts to all on-duty units. Requires duty. |
/bolo ABC123 Red Dodge Charger, armed suspect, last seen near bank
The Dispatch tab is the real-time command center for your community. It stays live as calls come in and units respond — no page refreshes needed.
The dispatch view uses a three-column layout:
Below the incident detail pane, a scrollable panel shows the last 6 closed calls. You can click View to reopen any closed incident's full detail. Admins also see a Delete button per row.
Every call is assigned a sequential call number (e.g. #42) automatically.
Call numbers never reset and are unique per community.
/cadcall or /911 — postal, street, and zone auto-fill from your position| Status | Meaning |
|---|---|
| Available | On duty, not assigned to a call |
| Enroute | Responded to a call, heading to scene |
| On Scene | Arrived at the call location |
| Busy | On duty but unavailable for new calls |
Each player can create and manage multiple characters. Your active character determines your callsign, department assignment, and what records are linked to you in the CAD.
/cadchar
Character type controls what you can do in the CAD — leo, ems, and
fd characters get access to the Dispatch, BOLOs, Warrants, Lookup, and Reports tabs.
civilian and tow characters have a trimmed view.
The DMV system is an optional, feature-flagged module that tracks driving licenses and automatically enforces point-based suspensions. Admins enable it per community in Settings.
When DMV points are enabled, citations with a point value automatically update the character's license. Points expire after a configurable number of days (default: 365).
Officers can generate permanent law enforcement records from both the CAD dashboard and in-game commands.
pending status) until approved or rejected by an admin/citation or from the CAD dashboardThe weapons module is optional and enabled per community in Settings. It tracks registered firearms and civilian license requests.
Available on Premium (tier 3) communities. The Live Map tab renders a real-time canvas map of the GTA V world showing every on-duty LEO, EMS, and FD unit.
POST /fivem/livemap/position
The FiveM Lua resource communicates with FiveM CAD through a REST API.
All /fivem/* routes require a Bearer token generated from the Setup Wizard.
Tokens are community-scoped — you never pass community_id in the request body.
Base URL: your CAD domain, e.g. https://cad.yourserver.com
Include the token on every request:
Authorization: Bearer your_token_here
Tokens are created and revoked from the Setup → API Tokens tab in your dashboard.
A missing or invalid token returns 401.
Opens a persistent Server-Sent Events connection. FiveM CAD pushes real-time events to any connected client. FiveM's HTTP client cannot hold long-lived SSE connections — use the polling fallback below.
| Event | When fired |
|---|---|
connected | Immediately on connect |
new_call | A call is created (web or API) |
call_updated | Call priority, status, or scene command changes |
call_closed | A call is closed |
panic | Officer triggers panic button |
heartbeat | Every 25 s (keep-alive comment) |
Returns calls created in the last 30 seconds. Poll every 15 s as a fallback when SSE is unavailable.
// Response
{
"calls": [
{
"id": "uuid",
"call_number": 42,
"title": "10-50 MVA",
"location": "Route 1",
"postal": "334",
"priority": 2,
"status": "active",
"created_at": "2026-04-29T14:32:00Z"
}
]
}
Look up characters by name or Discord ID. One query param required.
| Param | Example | Notes |
|---|---|---|
name | ?name=John+Smith | Partial match, up to 5 results |
discord_id | ?discord_id=1234567890 | Exact match |
// Response
{
"found": true,
"characters": [
{
"id": "uuid",
"first_name": "John",
"last_name": "Smith",
"date_of_birth": "1990-04-15",
"type": "leo",
"department": "Los Santos Police Department",
"rank": "Officer",
"weapons_license": true,
"flags": { "has_warrants": true, "warrant_count": 1 },
"warrants": [{ "title": "Armed Robbery", "status": "active" }],
"vehicles": [{ "plate": "ABC123", "make": "Vapid", "is_stolen": false }]
}
]
}
Character type values: leo · ems · fd · tow · civilian
Full plate lookup with BOLO and warrant flags. Plate is case-insensitive.
// Response
{
"plate": "ABC123",
"vehicle": {
"plate": "ABC123",
"make": "Vapid",
"model": "Dominator",
"color": "Black",
"year": 2020,
"is_stolen": false,
"owner_name": "John Smith"
},
"bolo": null,
"warrants": [],
"flags": {
"registered": true,
"is_stolen": false,
"has_bolo": false,
"has_warrants": false
}
}
vehicle and bolo are null when not found.
Create a dispatch call. Pushes a new_call SSE event to all connected CAD browsers.
| Field | Required | Type | Notes |
|---|---|---|---|
title | Yes | string | Short call type / title |
description | No | string | |
location | No | string | Street / area name |
postal | No | string | |
priority | No | int | 1=high 2=medium 3=low (default 2) |
created_by | No | UUID | Character ID of the caller |
Returns the full call object with status 201.
Mark a character enroute to a call. Character must be on duty.
{ "character_id": "uuid", "call_id": "uuid" }
Mark a character on-scene. Must have already called /respond for this call.
{ "character_id": "uuid", "call_id": "uuid" }
Update a unit's status on a call.
// Body
{ "character_id": "uuid", "call_id": "uuid", "status": "busy" }
// status values: available | enroute | on_scene | busy
Take or release scene command on a call. Only one unit can hold scene command at a time. Pushes call_updated SSE event.
| Field | Required | Notes |
|---|---|---|
character_id | Yes | |
call_id | Yes | |
take | Yes | true = take, false = release |
Close a call by its UUID. Pushes call_closed SSE event.
// Response
{ "message": "Call closed", "call_number": 42 }
Remove a unit from a call without closing it. Adds a "cleared" narrative.
// Body
{ "character_id": "uuid" }
// Response
{ "message": "Detached from call", "call_number": 42 }
Submit an incident / use-of-force / other report. Status defaults to pending (enters supervisor review queue).
| Field | Required | Notes |
|---|---|---|
author_id | Yes | Writing officer's character UUID |
title | Yes | |
body | Yes | Full narrative text |
type | No | incident · use_of_force · crash_report · fire_report · medical_report · tow_report · other |
call_id | No | Link to existing call UUID |
evidence | No | |
involved_persons | No | Array of { name, notes } |
involved_vehicles | No | Array of { plate, is_stolen } |
report_data | No | Structured fields object — keys vary by type (see roadmap Report Types reference) |
// Response (201)
{ "id": "uuid", "report_number": 7, "status": "pending", "message": "Report submitted" }
Record an arrest.
| Field | Required | Notes |
|---|---|---|
character_id | Yes | Arrested character |
arrested_by | Yes | Arresting officer character UUID |
charges | Yes | Comma-separated charge list |
jail_time_min | No | Integer minutes, default 0 |
fine_amount | No | Float, default 0 |
report_id | No | Link to parent report UUID |
Issue a citation. If DMV is enabled and points > 0, points are added to the character's driving license and auto-suspension is evaluated.
| Field | Required | Notes |
|---|---|---|
character_id | Yes | Cited character |
issued_by | Yes | Officer character UUID |
violation | Yes | |
fine_amount | No | Float, default 0 |
paid | No | Boolean, default false |
points | No | DMV points 0–12 (clamped) |
Called when a player joins the server. Resolves their Discord ID to CAD characters.
// Body
{ "discord_id": "123456789012345678" }
// Response (registered)
{
"registered": true,
"user": { "id": "uuid", "username": "AtlanticDev", "discord_id": "..." },
"characters": [
{ "id": "uuid", "first_name": "John", "last_name": "Smith",
"type": "leo", "callsign": "1-A-12", "dept_short": "LSPD" }
]
}
// Response (not registered)
{ "registered": false }
Create a character for an existing CAD user from in-game, without requiring the web dashboard.
| Field | Required | Notes |
|---|---|---|
user_id | Yes | UUID from player-connect response |
first_name | Yes | |
last_name | Yes | |
type | No | leo · ems · fd · tow · civilian |
department_id | No | Assign to a department UUID |
Returns the full character row with status 201.
Toggle a character on or off duty. Fires the community's Duty Change Webhook if configured.
// Body
{ "character_id": "uuid", "action": "on" }
// action: "on" | "off"
// Response
{ "on_duty": true }
Create a Be On Lookout from in-game.
| Field | Required | Notes |
|---|---|---|
description | Yes | What to look for |
type | No | vehicle (default) · person · other |
plate | No | Auto-uppercased |
created_by | No | Character UUID |
Returns the full BOLO row.
Register a vehicle for a character.
| Field | Required | Notes |
|---|---|---|
character_id | Yes | Owner's character UUID |
plate | Yes | Auto-uppercased, alphanumeric only |
make | No | |
model | No | |
color | No | |
year | No | Integer |
vin | No |
Returns the full vehicle row (201). Returns 409 with vehicle_id and owner_character_id if the plate is already registered.
Deregister a vehicle by plate. Plate is case-insensitive.
// Response
{ "ok": true, "plate": "ABC123" }
Mark a vehicle stolen or recovered.
// Body
{ "stolen": true }
// Response
{ "ok": true, "plate": "ABC123", "is_stolen": true }
Trigger an officer-in-distress alert. Creates a priority-1 call titled
PANIC — [callsign] Name and pushes a panic SSE event to all
connected CAD browsers.
| Field | Required | Notes |
|---|---|---|
character_id | Yes | |
location | No | Street / area name |
postal | No | |
coords | No | { x, y, z } GTA V world coords |
// Response
{ "ok": true, "call_id": "uuid", "call_number": 43 }
Report a unit's live position. Call this server-side every ~2 s for each on-duty unit.
Pass raw GetEntityCoords() values — do not scale or convert them.
Positions older than 30 s are automatically pruned.
| Field | Required | Notes |
|---|---|---|
character_id | Yes | Character UUID |
name | No | Display name shown on map, e.g. [K-1] John Smith |
x | Yes | Raw GetEntityCoords() X |
y | Yes | Raw GetEntityCoords() Y (positive = south) |
z | Yes | Elevation |
heading | Yes | Raw GetEntityHeading() — 0=North, 90=East, 180=South, 270=West |
// Lua example (server-side tick, every 2s per on-duty unit)
RegisterNetEvent('cad:updatePosition')
AddEventHandler('cad:updatePosition', function(x, y, z, heading)
local charId = playerCharacters[source].activeCharId
PerformHttpRequest(CAD_URL .. '/fivem/livemap/position', function() end, 'POST',
json.encode({ character_id = charId, x = x, y = y, z = z, heading = heading }),
{ ['Content-Type'] = 'application/json', ['Authorization'] = 'Bearer ' .. CAD_TOKEN })
end)
Response: { "ok": true }
Fetch all current on-duty unit positions for this community.
// Response
{
"units": [
{
"character_id": "uuid",
"name": "[K-1] John Smith",
"x": -1234.5,
"y": 4567.8,
"z": 28.0,
"heading": 182.3,
"updated_at": 1714396800000
}
]
}
Fetch the community's sound configuration. Call once on resource start to know which alert sounds are enabled, at what volume, and whether a custom audio file has been uploaded.
// Response
[
{ "event": "new_call", "enabled": true, "volume": 0.7, "custom_url": null },
{ "event": "panic", "enabled": true, "volume": 1.0,
"custom_url": "https://cad.yourserver.com/uploads/sounds/.../panic.mp3" }
]
custom_url is null when no custom file has been uploaded — fall back to your resource's bundled audio.
All errors return JSON: { "error": "Description" }
| Status | Meaning |
|---|---|
400 | Missing or invalid field |
401 | Missing or invalid Bearer token |
403 | Character not authorized, not on duty, or tier too low |
404 | Record not found |
409 | Conflict — e.g. plate already registered |
429 | Rate limit exceeded (3000 req/min for FiveM routes) |
500 | Server error |
Billing is managed through the Admin dashboard.
Failed payments include a 7-day grace period before service is restricted.