Dispatch & LEO API
Calls management, dispatch units, BOLOs, lookups, suspects, and announcements for law enforcement operations.
Authentication: Most endpoints require
authCheck — a valid JWT Bearer token or active session cookie.
Some dispatch endpoints (location tracking) use
x-api-key for server-to-server communication.
See
Authentication for details.
1. Calls Management
The calls system manages dispatched calls for service. Calls track type, location, priority, status, assigned units, attached civilians and vehicles, and dispatcher notes.
Auto-Expiry: Calls with status pending, active, or dispatched are automatically deleted after 25 minutes of inactivity. Ensure your integration handles this cleanup gracefully.
Call Status Lifecycle
| Status | Description |
pending | Call created, awaiting assignment |
assigned | Unit(s) assigned to the call |
enroute | Unit(s) en route to the scene |
on-scene | Unit(s) arrived at the scene |
closed | Call resolved and closed |
cancelled | Call was cancelled |
Retrieve all pending calls for a community. Returns calls that have not yet been assigned or resolved.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | The community to fetch calls for |
Response
[
{
"_id": "665a1b2c3d4e5f6a7b8c9d0e",
"callType": "Traffic Stop",
"location": "Main St & 5th Ave",
"caller": "Anonymous",
"description": "Erratic driving reported",
"status": "pending",
"priority": "normal",
"postal": "345",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"createdAt": "2025-06-01T14:30:00.000Z"
}
]
Get a single call with full details including populated references for assigned units, attached civilians, and vehicles.
Path Parameters
| Parameter | Type | Description |
id | string | The call ID |
Response
{
"_id": "665a1b2c3d4e5f6a7b8c9d0e",
"callType": "Traffic Stop",
"location": "Main St & 5th Ave",
"caller": "John Doe",
"description": "Erratic driving reported",
"status": "on-scene",
"priority": "high",
"postal": "345",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"assignedUnits": [
{ "_id": "unit1", "unitName": "1-Adam-12", "status": "on-scene" }
],
"attachedCivilians": [
{ "_id": "civ1", "firstName": "Jane", "lastName": "Smith", "licenseNumber": "DL-12345" }
],
"attachedVehicles": [
{ "_id": "veh1", "plate": "ABC1234", "make": "Honda", "model": "Civic", "year": "2020" }
],
"notes": [
{ "text": "Driver cooperative", "createdBy": "Officer Adams", "createdAt": "2025-06-01T14:35:00.000Z" }
],
"createdAt": "2025-06-01T14:30:00.000Z",
"updatedAt": "2025-06-01T14:45:00.000Z"
}
Create a new call for service. A new call starts with pending status by default.
Request Body
| Field | Type | Required | Description |
callType | string | Yes | Type of call (e.g. "Traffic Stop", "Robbery") |
location | string | Yes | Location or address of the call |
communityId | string | Yes | Community this call belongs to |
caller | string | No | Name of the caller |
description | string | No | Details about the call |
priority | string | No | One of: low, normal, high. Defaults to normal |
postal | string | No | Postal code for map reference |
Example Request
{
"callType": "Suspicious Activity",
"location": "1200 Oak Avenue",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"caller": "Anonymous",
"description": "Person looking into car windows in parking lot",
"priority": "normal",
"postal": "221"
}
Response 201
{
"success": true,
"call": {
"_id": "665a1b2c3d4e5f6a7b8c9d0e",
"callType": "Suspicious Activity",
"location": "1200 Oak Avenue",
"status": "pending",
"priority": "normal",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"createdAt": "2025-06-01T14:30:00.000Z"
}
}
Update an existing call. All fields are optional — only provided fields will be updated.
Request Body
| Field | Type | Required | Description |
callType | string | No | Updated call type |
location | string | No | Updated location |
caller | string | No | Updated caller name |
description | string | No | Updated description |
status | string | No | Updated status |
priority | string | No | Updated priority (low, normal, high) |
postal | string | No | Updated postal code |
Example Request
{
"description": "Updated: suspect now wearing a red jacket",
"priority": "high"
}
Permanently delete a call. Admin only. Use the status update endpoint to close or cancel calls during normal operations.
Admin Required: This endpoint requires administrator privileges. Non-admin users will receive a 403 Forbidden response.
Update only the status of a call. This is the preferred method for progressing calls through the status lifecycle.
Request Body
| Field | Type | Required | Description |
status | string | Yes | One of: pending, assigned, enroute, on-scene, closed, cancelled |
Example Request
{
"status": "enroute"
}
Attach a civilian record to a call. You can identify the civilian by ID, license number, or full name.
Request Body (one of the following)
| Field | Type | Required | Description |
civilianId | string | Option 1 | Direct civilian record ID |
licenseNumber | string | Option 2 | Civilian's license number |
firstName | string | Option 3 | Civilian's first name (used with lastName) |
lastName | string | Option 3 | Civilian's last name (used with firstName) |
Example — By License Number
{
"licenseNumber": "DL-12345"
}
Example — By Name
{
"firstName": "Jane",
"lastName": "Smith"
}
Attach a vehicle record to a call. Identify the vehicle by ID or plate number.
Request Body (one of the following)
| Field | Type | Required | Description |
vehicleId | string | Option 1 | Direct vehicle record ID |
plate | string | Option 2 | Vehicle plate number |
Example
{
"plate": "ABC1234"
}
Add a dispatcher or officer note to a call. Notes are appended chronologically and include the author and timestamp.
Request Body
| Field | Type | Required | Description |
text | string | Yes | The note content |
Example Request
{
"text": "Suspect fled on foot heading northbound"
}
Add or remove a unit from a call's assigned units list.
Request Body
| Field | Type | Required | Description |
action | string | Yes | One of: add, remove |
unitId | string | Yes | The unit's ID |
unitName | string | Yes | The unit's display name (e.g. "1-Adam-12") |
Example — Add Unit
{
"action": "add",
"unitId": "665b2c3d4e5f6a7b8c9d0e1f",
"unitName": "1-Adam-12"
}
Example — Remove Unit
{
"action": "remove",
"unitId": "665b2c3d4e5f6a7b8c9d0e1f",
"unitName": "1-Adam-12"
}
2. Dispatch
The dispatch system manages active units, real-time location tracking (for FiveM livemap integration), 911 call management, and unit assignments from the dispatcher's perspective.
Get all active units for a community. Returns unit status, assigned calls, and current information.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | The community to fetch units for |
Response
[
{
"_id": "665b2c3d4e5f6a7b8c9d0e1f",
"unitName": "1-Adam-12",
"status": "available",
"job": "police",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"assignedCalls": ["665a1b2c3d4e5f6a7b8c9d0e"]
}
]
Update a unit's real-time location for the FiveM livemap. This endpoint is designed for high-frequency calls from the FiveM server.
Request Body
| Field | Type | Required | Description |
unitId | string | Yes | The unit's unique identifier |
unitName | string | Yes | The unit's display name |
x | number | Yes | X coordinate on the game map |
y | number | Yes | Y coordinate on the game map |
z | number | Yes | Z coordinate (altitude) |
heading | number | Yes | Direction the unit is facing (0–360) |
job | string | Yes | Unit's job type (e.g. "police", "ems", "fire") |
status | string | Yes | Current unit status |
postal | string | Yes | Nearest postal code |
communityId | string | Yes | Community ID |
Example Request
// Header: x-api-key: fvm_xxxxx
{
"unitId": "officer_42",
"unitName": "1-Adam-12",
"x": -1042.5,
"y": -2745.3,
"z": 21.3,
"heading": 180.0,
"job": "police",
"status": "patrolling",
"postal": "345",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d"
}
Get all tracked unit locations for the livemap display. Returns the most recent position data for every active unit.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | The community to fetch locations for |
Response
[
{
"unitId": "officer_42",
"unitName": "1-Adam-12",
"x": -1042.5,
"y": -2745.3,
"z": 21.3,
"heading": 180.0,
"job": "police",
"status": "patrolling",
"postal": "345",
"updatedAt": "2025-06-01T14:30:05.000Z"
}
]
Remove a unit from location tracking. Typically called when a unit goes off-duty or disconnects from the FiveM server.
Path Parameters
| Parameter | Type | Description |
unitId | string | The unit's unique identifier to remove from tracking |
Get all active 911 calls for the dispatch board. Returns open emergency calls awaiting response or currently being serviced.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | The community to fetch 911 calls for |
Response
[
{
"_id": "665c3d4e5f6a7b8c9d0e1f2a",
"callType": "911 Emergency",
"location": "Legion Square",
"caller": "Civilian #4421",
"description": "Shots fired near the fountain",
"status": "pending",
"priority": "high",
"postal": "110",
"assignedUnits": [],
"createdAt": "2025-06-01T14:45:00.000Z"
}
]
Get 911 call markers for map display. Returns location data formatted for rendering on the dispatch livemap.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | The community to fetch markers for |
Assign one or more units to a 911 call. Accepts either unit IDs or unit names for flexible assignment.
Path Parameters
| Parameter | Type | Description |
callId | string | The 911 call ID |
Request Body
| Field | Type | Required | Description |
unitIds | string[] | Option 1 | Array of unit IDs to assign |
unitNames | string[] | Option 2 | Array of unit names to assign |
Example — By Unit IDs
{
"unitIds": [
"665b2c3d4e5f6a7b8c9d0e1f",
"665b2c3d4e5f6a7b8c9d0e2a"
]
}
Example — By Unit Names
{
"unitNames": ["1-Adam-12", "2-Boy-15"]
}
Close a 911 call with a disposition and optional closing notes.
Path Parameters
| Parameter | Type | Description |
callId | string | The 911 call ID |
Request Body
| Field | Type | Required | Description |
disposition | string | No | Final disposition of the call (e.g. "Arrest Made", "Unfounded", "Report Taken") |
notes | string | No | Closing notes or summary |
Example Request
{
"disposition": "Arrest Made",
"notes": "Suspect apprehended at scene. One weapon recovered."
}
3. BOLOs (Be On the Lookout)
BOLOs alert officers about wanted persons, suspicious vehicles, or ongoing situations. BOLOs support priority levels, expiration dates, subject and vehicle details, and read-tracking.
Permissions: BOLO creation is governed by the community's boloPermission setting, which can be set to admin, supervisor, or all. Check your community settings to determine who can create BOLOs.
Get all active BOLOs for the dispatch dashboard. Returns non-expired, non-deactivated BOLOs.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | The community to fetch BOLOs for |
Response
[
{
"_id": "665d4e5f6a7b8c9d0e1f2a3b",
"reason": "Armed Robbery Suspect",
"description": "Suspect robbed a convenience store at gunpoint",
"priority": "critical",
"subjectFirstName": "John",
"subjectLastName": "Doe",
"subjectDescription": "Male, 6ft, black hoodie",
"vehiclePlate": "XYZ9876",
"vehicleMake": "Ford",
"vehicleModel": "F-150",
"vehicleColor": "Black",
"isActive": true,
"viewedBy": ["user1", "user2"],
"expiresAt": "2025-06-02T14:00:00.000Z",
"createdAt": "2025-06-01T14:00:00.000Z"
}
]
Search BOLOs by text query. Searches across reason, description, subject name, and vehicle information.
Query Parameters
| Parameter | Type | Required | Description |
query | string | Yes | Search text |
communityId | string | Yes | Community scope |
Create a new BOLO. Requires the boloPermission level configured for the community (admin, supervisor, or all).
Request Body
| Field | Type | Required | Description |
reason | string | Yes | Reason for the BOLO |
description | string | Yes | Detailed description |
communityId | string | Yes | Community this BOLO belongs to |
priority | string | No | One of: low, medium, high, critical |
expiresAt | string | No | ISO 8601 expiration date/time |
Subject Fields (all optional)
| Field | Type | Description |
subjectFirstName | string | Subject's first name |
subjectLastName | string | Subject's last name |
subjectDOB | string | Subject's date of birth |
subjectLicense | string | Subject's license number |
subjectDescription | string | Physical description of the subject |
Vehicle Fields (all optional)
| Field | Type | Description |
vehiclePlate | string | Vehicle license plate |
vehicleMake | string | Vehicle manufacturer |
vehicleModel | string | Vehicle model |
vehicleYear | string | Vehicle year |
vehicleColor | string | Vehicle color |
vehicleDescription | string | Additional vehicle description |
Example Request
{
"reason": "Armed Robbery Suspect",
"description": "Suspect robbed First National Bank, fled on foot heading east",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"priority": "critical",
"subjectFirstName": "John",
"subjectLastName": "Doe",
"subjectDescription": "Male, 6ft, wearing black hoodie and jeans",
"vehiclePlate": "XYZ9876",
"vehicleMake": "Ford",
"vehicleModel": "F-150",
"vehicleYear": "2022",
"vehicleColor": "Black",
"vehicleDescription": "Lifted, tinted windows, aftermarket bumper",
"expiresAt": "2025-06-02T14:00:00.000Z"
}
Update an existing BOLO. Accepts all the same fields as the create endpoint. Only provided fields will be modified.
Path Parameters
| Parameter | Type | Description |
id | string | The BOLO ID |
Example Request
{
"priority": "high",
"description": "Updated: suspect last seen heading west on Interstate 4",
"vehicleDescription": "Damage to front-left quarter panel"
}
Deactivate a BOLO. The BOLO record is retained but marked as inactive and will no longer appear in active BOLO listings.
Path Parameters
| Parameter | Type | Description |
id | string | The BOLO ID to deactivate |
Mark a BOLO as viewed by the current user. Used to track which officers have acknowledged and read a BOLO.
Path Parameters
| Parameter | Type | Description |
id | string | The BOLO ID |
4. Lookups
The lookup system provides officers with the ability to search civilian records, vehicles, and reports. It supports smart search with automatic type detection as well as explicit type-based queries.
Rate Limited: The smart search endpoint is limited to 60 requests per minute per user. Plan your integration accordingly.
Perform a smart search across civilians, vehicles, and records. The system automatically detects the query type, or you can specify it explicitly.
Request Body
| Field | Type | Required | Description |
query | string | Yes | The search query (name, plate, SSN, phone, etc.) |
communityId | string | Yes | Community scope |
type | string | No | Force a specific search type: name, partial_name, phone, plate, ssn |
Search Type Behavior
| Type | Description | Example Query |
name | Exact first + last name match | "John Smith" |
partial_name | Partial name matching | "Smi" |
phone | Phone number lookup | "555-0123" |
plate | Vehicle plate number lookup | "ABC1234" |
ssn | Social security number lookup | "123-45-6789" |
Example Request
{
"query": "John Smith",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"type": "name"
}
Response
{
"civilians": [
{
"_id": "665e5f6a7b8c9d0e1f2a3b4c",
"firstName": "John",
"lastName": "Smith",
"dateOfBirth": "1990-05-15",
"licenseNumber": "DL-12345",
"phone": "555-0123",
"address": "742 Evergreen Terrace"
}
],
"vehicles": [
{
"_id": "665f6a7b8c9d0e1f2a3b4c5d",
"plate": "ABC1234",
"make": "Honda",
"model": "Civic",
"year": "2020",
"owner": "John Smith"
}
]
}
Get recent lookup history. Useful for showing officers their most recent searches for quick re-access.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | Community scope |
type | string | No | Filter by lookup type |
limit | number | No | Number of results to return. Default: 10 |
Get detailed civilian information by record ID. Returns full profile including licenses, warrants, flags, and associated vehicles.
Path Parameters
| Parameter | Type | Description |
id | string | The civilian record ID |
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | Community scope |
Get detailed vehicle information by record ID. Returns registration, owner details, stolen status, and insurance info.
Path Parameters
| Parameter | Type | Description |
id | string | The vehicle record ID |
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | Community scope |
Get all reports (incidents, citations, arrests) associated with a specific license number. Useful for pulling a subject's full history during a stop.
Path Parameters
| Parameter | Type | Description |
licenseNumber | string | The civilian's license number |
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | Community scope |
Response
{
"reports": [
{
"_id": "665g7b8c9d0e1f2a3b4c5d6e",
"type": "citation",
"title": "Speeding - 85 in a 55 zone",
"officerName": "Officer Adams",
"createdAt": "2025-05-28T10:15:00.000Z"
},
{
"_id": "665h8c9d0e1f2a3b4c5d6e7f",
"type": "arrest",
"title": "DUI - First Offense",
"officerName": "Officer Baker",
"createdAt": "2025-05-15T22:30:00.000Z"
}
]
}
5. Suspects
Manage suspect records associated with active investigations. Suspects can be linked to calls, BOLOs, and reports.
Create a new suspect record.
Example Request
{
"firstName": "John",
"lastName": "Doe",
"description": "Male, 6ft, black hoodie",
"status": "at-large",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d"
}
Get all suspect records for the community.
Response
[
{
"_id": "665i9d0e1f2a3b4c5d6e7f8a",
"firstName": "John",
"lastName": "Doe",
"description": "Male, 6ft, black hoodie",
"status": "at-large",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"createdAt": "2025-06-01T15:00:00.000Z"
}
]
Get a single suspect record by ID with full details.
Path Parameters
| Parameter | Type | Description |
id | string | The suspect record ID |
Update an existing suspect record. Only provided fields will be modified.
Path Parameters
| Parameter | Type | Description |
id | string | The suspect record ID |
Example Request
{
"status": "in-custody",
"description": "Updated: suspect now in custody at Central Booking"
}
6. Announcements
Announcements are broadcast messages displayed on the dispatch dashboard. They support priority levels and optional expiration. Only supervisors and administrators can create or delete announcements.
Get all active (non-expired) announcements for the dispatch dashboard.
Query Parameters
| Parameter | Type | Required | Description |
communityId | string | Yes | The community to fetch announcements for |
Response
[
{
"_id": "665j0e1f2a3b4c5d6e7f8a9b",
"title": "Shift Change Reminder",
"message": "All day-shift units report to briefing room at 1800 hours for shift change.",
"priority": "info",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"expiresAt": "2025-06-01T18:00:00.000Z",
"createdBy": "Sgt. Johnson",
"createdAt": "2025-06-01T12:00:00.000Z"
},
{
"_id": "665k1f2a3b4c5d6e7f8a9b0c",
"title": "High-Speed Pursuit Policy Update",
"message": "Effective immediately: all pursuits require supervisor authorization before initiation.",
"priority": "urgent",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"expiresAt": null,
"createdBy": "Chief Williams",
"createdAt": "2025-06-01T08:00:00.000Z"
}
]
Create a new announcement. Only users with supervisor or admin roles can create announcements.
Request Body
| Field | Type | Required | Description |
title | string | Yes | Announcement title |
message | string | Yes | Announcement body text |
priority | string | Yes | One of: info, warning, urgent |
communityId | string | Yes | Community this announcement belongs to |
expiresAt | string | No | ISO 8601 expiration date/time. If omitted, announcement persists until deleted |
Priority Levels
| Priority | Use Case |
info | General information, reminders, shift changes |
warning | Important notices requiring attention (weather alerts, policy changes) |
urgent | Critical alerts requiring immediate action (active threats, officer safety) |
Example Request
{
"title": "Severe Weather Warning",
"message": "Tornado warning in effect for the northern district until 2100 hours. All units exercise caution.",
"priority": "warning",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"expiresAt": "2025-06-01T21:00:00.000Z"
}
Response 201
{
"success": true,
"announcement": {
"_id": "665l2a3b4c5d6e7f8a9b0c1d",
"title": "Severe Weather Warning",
"message": "Tornado warning in effect for the northern district until 2100 hours. All units exercise caution.",
"priority": "warning",
"communityId": "663f1a2b3c4d5e6f7a8b9c0d",
"expiresAt": "2025-06-01T21:00:00.000Z",
"createdAt": "2025-06-01T15:30:00.000Z"
}
}
Delete an announcement. Only users with supervisor or admin roles can delete announcements. The announcement is permanently removed.
Path Parameters
| Parameter | Type | Description |
id | string | The announcement ID to delete |
Quick Reference
Complete endpoint summary for all Dispatch & LEO routes.
Calls (/api/calls)
| Method | Endpoint | Description | Auth |
GET | /api/calls/pending | Get pending calls | authCheck |
GET | /api/calls/:id | Get call details | authCheck |
POST | /api/calls | Create call | authCheck |
PUT | /api/calls/:id | Update call | authCheck |
DELETE | /api/calls/:id | Delete call (admin) | authCheck |
PATCH | /api/calls/:id/status | Update status | authCheck |
PATCH | /api/calls/:id/attach-civilian | Attach civilian | authCheck |
PATCH | /api/calls/:id/attach-vehicle | Attach vehicle | authCheck |
POST | /api/calls/:id/notes | Add note | authCheck |
PUT | /api/calls/:id/assign-unit | Add/remove unit | authCheck |
Dispatch (/api/dispatch)
| Method | Endpoint | Description | Auth |
GET | /api/dispatch/units | Active units | authCheck |
POST | /api/dispatch/location-update | Update unit location | API Key |
GET | /api/dispatch/locations | All unit locations | — |
DELETE | /api/dispatch/location/:unitId | Remove from tracking | API Key |
GET | /api/dispatch/911 | Active 911 calls | authCheck |
GET | /api/dispatch/911/markers | 911 map markers | — |
POST | /api/dispatch/911/:callId/assign | Assign units to 911 | authCheck |
POST | /api/dispatch/911/:callId/close | Close 911 call | authCheck |
BOLOs (/api/bolos)
| Method | Endpoint | Description | Auth |
GET | /api/bolos/active | Active BOLOs | authCheck |
GET | /api/bolos/search | Search BOLOs | authCheck |
POST | /api/bolos | Create BOLO | authCheck |
PUT | /api/bolos/:id | Update BOLO | authCheck |
DELETE | /api/bolos/:id | Deactivate BOLO | authCheck |
POST | /api/bolos/:id/viewed | Mark BOLO viewed | authCheck |
Lookups (/api/lookup)
| Method | Endpoint | Description | Auth |
POST | /api/lookup | Smart search (60/min) | authCheck |
GET | /api/lookup/recent | Recent lookups | — |
GET | /api/lookup/civilian/:id | Detailed civilian | — |
GET | /api/lookup/vehicle/:id | Detailed vehicle | — |
GET | /api/lookup/reports/:licenseNumber | Reports by license | — |
Suspects (/api/suspects)
| Method | Endpoint | Description | Auth |
POST | /api/suspects | Create suspect | authCheck |
GET | /api/suspects | Get all suspects | authCheck |
GET | /api/suspects/:id | Get suspect by ID | authCheck |
PUT | /api/suspects/:id | Update suspect | authCheck |
Announcements (/api/announcements)
| Method | Endpoint | Description | Auth |
GET | /api/announcements/active | Active announcements | authCheck |
POST | /api/announcements | Create announcement | supervisor/admin |
DELETE | /api/announcements/:id | Delete announcement | supervisor/admin |