Get a character
curl --request GET \
--url http://localhost:3000/api/civilians/{id} \
--cookie __Host-argus-session=import requests
url = "http://localhost:3000/api/civilians/{id}"
headers = {"cookie": "__Host-argus-session="}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {cookie: '__Host-argus-session='}};
fetch('http://localhost:3000/api/civilians/{id}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_COOKIE => "__Host-argus-session=",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/civilians/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("cookie", "__Host-argus-session=")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:3000/api/civilians/{id}")
.header("cookie", "__Host-argus-session=")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/civilians/{id}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["cookie"] = '__Host-argus-session='
response = http.request(request)
puts response.read_body{
"data": {
"id": "cmg6a1civ000fl508civ00001",
"reference": "CIV-000123",
"ownerId": "cmg5x1k2a0000l508a1b2c3d4",
"fullName": "Amelia Hart",
"dateOfBirth": "1990-04-12",
"gender": "FEMALE",
"address": "14 Curzon Street, Mayfair",
"phone": "020 7946 0000",
"occupation": "Chauffeur",
"imageUrl": null,
"notes": "Private backstory",
"status": "ACTIVE",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:30:00.000Z",
"identityLocked": true,
"licence": {
"id": "cmg6a2lic000hl508lic00001",
"number": "HART9144223PA85",
"categories": [
"B"
],
"status": "VALID",
"suspendedUntil": null,
"issuedAt": "2026-10-06T19:30:00.000Z",
"expiresAt": "2036-10-06T19:30:00.000Z",
"points": 3,
"endorsements": [
{
"id": "cmg6a3end000il508end00001",
"code": "SP30",
"reason": "Exceeding 30 mph limit",
"points": 3,
"createdAt": "2026-10-06T19:42:10.000Z",
"expiresAt": null,
"active": true
}
]
},
"vehicles": [
{
"id": "cmg6a4veh000jl508veh00001",
"plate": "LK21ABC",
"make": "BMW",
"model": "3 Series",
"colour": "Black",
"type": "CAR",
"registrationStatus": "REGISTERED",
"insuranceStatus": "INSURED",
"motStatus": "VALID",
"taxStatus": "TAXED",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:30:00.000Z",
"keeperSince": "2026-10-06T19:30:00.000Z"
}
],
"records": [
{
"id": "cmg6a5rec000kl508rec00001",
"reference": "REC-000045",
"type": "CITATION",
"status": "OPEN",
"title": "Speeding on Park Lane",
"description": "47 mph in a 30 mph limit",
"location": "Park Lane",
"occurredAt": "2026-10-06T19:30:00.000Z",
"fineAmount": 100,
"points": 3,
"vehicle": {
"id": "cmg6a4veh000jl508veh00001",
"plate": "LK21ABC"
}
}
]
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"limit"
],
"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": "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"
}Civilians
Get a character
Permission: civilians.manage_own. The character’s owner, or anyone with civilians.manage.
Access: Browser session only.
The character as its owner sees it: profile, driving licence, current vehicles and the official records disclosed to them. Warrants, markers, undisclosed records and the identity of whoever recorded something are never included.
GET
/
civilians
/
{id}
Get a character
curl --request GET \
--url http://localhost:3000/api/civilians/{id} \
--cookie __Host-argus-session=import requests
url = "http://localhost:3000/api/civilians/{id}"
headers = {"cookie": "__Host-argus-session="}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {cookie: '__Host-argus-session='}};
fetch('http://localhost:3000/api/civilians/{id}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_COOKIE => "__Host-argus-session=",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/civilians/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("cookie", "__Host-argus-session=")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://localhost:3000/api/civilians/{id}")
.header("cookie", "__Host-argus-session=")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/civilians/{id}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["cookie"] = '__Host-argus-session='
response = http.request(request)
puts response.read_body{
"data": {
"id": "cmg6a1civ000fl508civ00001",
"reference": "CIV-000123",
"ownerId": "cmg5x1k2a0000l508a1b2c3d4",
"fullName": "Amelia Hart",
"dateOfBirth": "1990-04-12",
"gender": "FEMALE",
"address": "14 Curzon Street, Mayfair",
"phone": "020 7946 0000",
"occupation": "Chauffeur",
"imageUrl": null,
"notes": "Private backstory",
"status": "ACTIVE",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:30:00.000Z",
"identityLocked": true,
"licence": {
"id": "cmg6a2lic000hl508lic00001",
"number": "HART9144223PA85",
"categories": [
"B"
],
"status": "VALID",
"suspendedUntil": null,
"issuedAt": "2026-10-06T19:30:00.000Z",
"expiresAt": "2036-10-06T19:30:00.000Z",
"points": 3,
"endorsements": [
{
"id": "cmg6a3end000il508end00001",
"code": "SP30",
"reason": "Exceeding 30 mph limit",
"points": 3,
"createdAt": "2026-10-06T19:42:10.000Z",
"expiresAt": null,
"active": true
}
]
},
"vehicles": [
{
"id": "cmg6a4veh000jl508veh00001",
"plate": "LK21ABC",
"make": "BMW",
"model": "3 Series",
"colour": "Black",
"type": "CAR",
"registrationStatus": "REGISTERED",
"insuranceStatus": "INSURED",
"motStatus": "VALID",
"taxStatus": "TAXED",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:30:00.000Z",
"keeperSince": "2026-10-06T19:30:00.000Z"
}
],
"records": [
{
"id": "cmg6a5rec000kl508rec00001",
"reference": "REC-000045",
"type": "CITATION",
"status": "OPEN",
"title": "Speeding on Park Lane",
"description": "47 mph in a 30 mph limit",
"location": "Park Lane",
"occurredAt": "2026-10-06T19:30:00.000Z",
"fineAmount": 100,
"points": 3,
"vehicle": {
"id": "cmg6a4veh000jl508veh00001",
"plate": "LK21ABC"
}
}
]
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"limit"
],
"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": "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. Argus record identifier.
Required string length:
1 - 64Pattern:
^[a-zA-Z0-9_-]+$Response
Success.
Show child attributes
Show child attributes