Release a unit
curl --request POST \
--url http://localhost:3000/api/cad/incidents/{id}/remove \
--header 'Content-Type: application/json' \
--cookie __Host-argus-session= \
--data '
{
"unitId": "cmg5z2unt000al508unt00001",
"version": 3
}
'import requests
url = "http://localhost:3000/api/cad/incidents/{id}/remove"
payload = {
"unitId": "cmg5z2unt000al508unt00001",
"version": 3
}
headers = {
"cookie": "__Host-argus-session=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {cookie: '__Host-argus-session=', 'Content-Type': 'application/json'},
body: JSON.stringify({unitId: 'cmg5z2unt000al508unt00001', version: 3})
};
fetch('http://localhost:3000/api/cad/incidents/{id}/remove', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3000",
CURLOPT_URL => "http://localhost:3000/api/cad/incidents/{id}/remove",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'unitId' => 'cmg5z2unt000al508unt00001',
'version' => 3
]),
CURLOPT_COOKIE => "__Host-argus-session=",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/cad/incidents/{id}/remove"
payload := strings.NewReader("{\n \"unitId\": \"cmg5z2unt000al508unt00001\",\n \"version\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "__Host-argus-session=")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:3000/api/cad/incidents/{id}/remove")
.header("cookie", "__Host-argus-session=")
.header("Content-Type", "application/json")
.body("{\n \"unitId\": \"cmg5z2unt000al508unt00001\",\n \"version\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/cad/incidents/{id}/remove")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["cookie"] = '__Host-argus-session='
request["Content-Type"] = 'application/json'
request.body = "{\n \"unitId\": \"cmg5z2unt000al508unt00001\",\n \"version\": 3\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "cmg5z2unt000al508unt00001",
"callsign": "MO12",
"agencyCode": "MET",
"type": "RESPONSE",
"status": "AVAILABLE",
"incidentId": null,
"version": 4,
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:42:10.000Z",
"crew": [
{
"id": "cmg5z3crw000bl508crw00001",
"unitId": "cmg5z2unt000al508unt00001",
"identifier": "Olivia Officer",
"userId": "cmg5x1k2a0000l508a1b2c3d4",
"joinedAt": "2026-10-06T19:30:00.000Z",
"leftAt": null,
"user": {
"id": "cmg5x1k2a0000l508a1b2c3d4",
"displayName": "Olivia Officer",
"discord": {
"id": "254781093445672960",
"username": "olivia.officer",
"avatar": null
},
"roblox": {
"id": "4821093375",
"username": "OliviaOfficer"
},
"staff": {
"id": "cmg5x1k2a0001l5089f8e7d6c",
"active": true
}
}
},
{
"id": "cmg5z3crw000cl508crw00002",
"unitId": "cmg5z2unt000al508unt00001",
"identifier": "Ben Baker",
"userId": "cmg5x1k2a0002l508b7c8d9e0",
"joinedAt": "2026-10-06T19:42:10.000Z",
"leftAt": null,
"user": {
"id": "cmg5x1k2a0002l508b7c8d9e0",
"displayName": "Ben Baker",
"discord": null,
"roblox": null,
"staff": {
"id": "cmg5x1k2a000ol508staff0002",
"active": true
}
}
}
],
"incident": null
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"unitId"
],
"message": "Invalid input"
}
]
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "Sign in to continue."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "FORBIDDEN",
"message": "Permission required: cad.dispatch."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "NOT_FOUND",
"message": "CAD record not found."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "CAD_CONFLICT",
"message": "Unit changed. Refresh before saving."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "The request could not be completed."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}Incidents
Release a unit
Permission: cad.dispatch. Requires cad.view as well, like every Control endpoint.
Access: Browser session, or a service credential holding the permission as a scope.
Releases a unit from this incident. It returns to AVAILABLE. Records UNIT_REMOVED. This is the only way to clear an assignment short of closing the incident or the whole crew booking off.
POST
/
cad
/
incidents
/
{id}
/
remove
Release a unit
curl --request POST \
--url http://localhost:3000/api/cad/incidents/{id}/remove \
--header 'Content-Type: application/json' \
--cookie __Host-argus-session= \
--data '
{
"unitId": "cmg5z2unt000al508unt00001",
"version": 3
}
'import requests
url = "http://localhost:3000/api/cad/incidents/{id}/remove"
payload = {
"unitId": "cmg5z2unt000al508unt00001",
"version": 3
}
headers = {
"cookie": "__Host-argus-session=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {cookie: '__Host-argus-session=', 'Content-Type': 'application/json'},
body: JSON.stringify({unitId: 'cmg5z2unt000al508unt00001', version: 3})
};
fetch('http://localhost:3000/api/cad/incidents/{id}/remove', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3000",
CURLOPT_URL => "http://localhost:3000/api/cad/incidents/{id}/remove",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'unitId' => 'cmg5z2unt000al508unt00001',
'version' => 3
]),
CURLOPT_COOKIE => "__Host-argus-session=",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/cad/incidents/{id}/remove"
payload := strings.NewReader("{\n \"unitId\": \"cmg5z2unt000al508unt00001\",\n \"version\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "__Host-argus-session=")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:3000/api/cad/incidents/{id}/remove")
.header("cookie", "__Host-argus-session=")
.header("Content-Type", "application/json")
.body("{\n \"unitId\": \"cmg5z2unt000al508unt00001\",\n \"version\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/cad/incidents/{id}/remove")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["cookie"] = '__Host-argus-session='
request["Content-Type"] = 'application/json'
request.body = "{\n \"unitId\": \"cmg5z2unt000al508unt00001\",\n \"version\": 3\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "cmg5z2unt000al508unt00001",
"callsign": "MO12",
"agencyCode": "MET",
"type": "RESPONSE",
"status": "AVAILABLE",
"incidentId": null,
"version": 4,
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:42:10.000Z",
"crew": [
{
"id": "cmg5z3crw000bl508crw00001",
"unitId": "cmg5z2unt000al508unt00001",
"identifier": "Olivia Officer",
"userId": "cmg5x1k2a0000l508a1b2c3d4",
"joinedAt": "2026-10-06T19:30:00.000Z",
"leftAt": null,
"user": {
"id": "cmg5x1k2a0000l508a1b2c3d4",
"displayName": "Olivia Officer",
"discord": {
"id": "254781093445672960",
"username": "olivia.officer",
"avatar": null
},
"roblox": {
"id": "4821093375",
"username": "OliviaOfficer"
},
"staff": {
"id": "cmg5x1k2a0001l5089f8e7d6c",
"active": true
}
}
},
{
"id": "cmg5z3crw000cl508crw00002",
"unitId": "cmg5z2unt000al508unt00001",
"identifier": "Ben Baker",
"userId": "cmg5x1k2a0002l508b7c8d9e0",
"joinedAt": "2026-10-06T19:42:10.000Z",
"leftAt": null,
"user": {
"id": "cmg5x1k2a0002l508b7c8d9e0",
"displayName": "Ben Baker",
"discord": null,
"roblox": null,
"staff": {
"id": "cmg5x1k2a000ol508staff0002",
"active": true
}
}
}
],
"incident": null
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"unitId"
],
"message": "Invalid input"
}
]
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "Sign in to continue."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "FORBIDDEN",
"message": "Permission required: cad.dispatch."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "NOT_FOUND",
"message": "CAD record not found."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "CAD_CONFLICT",
"message": "Unit changed. Refresh before saving."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "The request could not be completed."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}Authorizations
sessionCookieserviceCredential
The opaque session cookie set by Discord sign-in. Named argus-session outside production. HttpOnly, so scripts cannot read it; same-origin requests send it automatically. Requests other than GET must also carry an Origin header equal to the application's own origin.
Path Parameters
Incident ID. Argus record identifier.
Required string length:
1 - 64Pattern:
^[a-zA-Z0-9_-]+$Body
application/json
Response
Success.
Show child attributes
Show child attributes