curl --request PATCH \
--url http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId} \
--header 'Content-Type: application/json' \
--cookie __Host-argus-session= \
--data '
{
"colour": "Midnight blue"
}
'import requests
url = "http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}"
payload = { "colour": "Midnight blue" }
headers = {
"cookie": "__Host-argus-session=",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {cookie: '__Host-argus-session=', 'Content-Type': 'application/json'},
body: JSON.stringify({colour: 'Midnight blue'})
};
fetch('http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}', 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/civilians/{id}/vehicles/{vehicleId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'colour' => 'Midnight blue'
]),
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/civilians/{id}/vehicles/{vehicleId}"
payload := strings.NewReader("{\n \"colour\": \"Midnight blue\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}")
.header("cookie", "__Host-argus-session=")
.header("Content-Type", "application/json")
.body("{\n \"colour\": \"Midnight blue\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Patch.new(url)
request["cookie"] = '__Host-argus-session='
request["Content-Type"] = 'application/json'
request.body = "{\n \"colour\": \"Midnight blue\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "cmg6a4veh000jl508veh00001",
"plate": "LK21ABC",
"make": "BMW",
"model": "3 Series",
"colour": "Midnight blue",
"type": "CAR",
"registrationStatus": "REGISTERED",
"insuranceStatus": "INSURED",
"motStatus": "VALID",
"taxStatus": "TAXED",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:42:10.000Z",
"keeperSince": "2026-10-06T19:30:00.000Z"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"colour"
],
"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: civilians.manage_own."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "NOT_FOUND",
"message": "Character not found."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "PLATE_TAKEN",
"message": "A vehicle with this registration already exists."
},
"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"
}Update a vehicle's description
Permission: civilians.manage_own. The character’s owner, or anyone with civilians.manage. Changing plate always needs civilians.manage.
Access: Browser session only.
Changes make, model, colour or type. Each change is written to the vehicle’s history. Correcting the registration is an administrative act.
curl --request PATCH \
--url http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId} \
--header 'Content-Type: application/json' \
--cookie __Host-argus-session= \
--data '
{
"colour": "Midnight blue"
}
'import requests
url = "http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}"
payload = { "colour": "Midnight blue" }
headers = {
"cookie": "__Host-argus-session=",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {cookie: '__Host-argus-session=', 'Content-Type': 'application/json'},
body: JSON.stringify({colour: 'Midnight blue'})
};
fetch('http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}', 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/civilians/{id}/vehicles/{vehicleId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'colour' => 'Midnight blue'
]),
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/civilians/{id}/vehicles/{vehicleId}"
payload := strings.NewReader("{\n \"colour\": \"Midnight blue\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}")
.header("cookie", "__Host-argus-session=")
.header("Content-Type", "application/json")
.body("{\n \"colour\": \"Midnight blue\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/civilians/{id}/vehicles/{vehicleId}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Patch.new(url)
request["cookie"] = '__Host-argus-session='
request["Content-Type"] = 'application/json'
request.body = "{\n \"colour\": \"Midnight blue\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "cmg6a4veh000jl508veh00001",
"plate": "LK21ABC",
"make": "BMW",
"model": "3 Series",
"colour": "Midnight blue",
"type": "CAR",
"registrationStatus": "REGISTERED",
"insuranceStatus": "INSURED",
"motStatus": "VALID",
"taxStatus": "TAXED",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:42:10.000Z",
"keeperSince": "2026-10-06T19:30:00.000Z"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"colour"
],
"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: civilians.manage_own."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "NOT_FOUND",
"message": "Character not found."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "PLATE_TAKEN",
"message": "A vehicle with this registration already exists."
},
"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
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
Civilian ID of the current keeper. Argus record identifier.
1 - 64^[a-zA-Z0-9_-]+$Vehicle ID. Argus record identifier.
1 - 64^[a-zA-Z0-9_-]+$Body
Spaces and hyphens are removed and letters capitalised; the result must be 2 to 8 letters and digits and unique.
201 - 401 - 603 - 30CAR, MOTORCYCLE, VAN, LORRY, BUS, OTHER Response
Success.
Show child attributes
Show child attributes