curl --request POST \
--url http://localhost:3000/api/civilians \
--header 'Content-Type: application/json' \
--cookie __Host-argus-session= \
--data '
{
"fullName": "Amelia Hart",
"dateOfBirth": "1990-04-12",
"address": "14 Curzon Street, Mayfair"
}
'import requests
url = "http://localhost:3000/api/civilians"
payload = {
"fullName": "Amelia Hart",
"dateOfBirth": "1990-04-12",
"address": "14 Curzon Street, Mayfair"
}
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({
fullName: 'Amelia Hart',
dateOfBirth: '1990-04-12',
address: '14 Curzon Street, Mayfair'
})
};
fetch('http://localhost:3000/api/civilians', 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",
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([
'fullName' => 'Amelia Hart',
'dateOfBirth' => '1990-04-12',
'address' => '14 Curzon Street, Mayfair'
]),
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"
payload := strings.NewReader("{\n \"fullName\": \"Amelia Hart\",\n \"dateOfBirth\": \"1990-04-12\",\n \"address\": \"14 Curzon Street, Mayfair\"\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/civilians")
.header("cookie", "__Host-argus-session=")
.header("Content-Type", "application/json")
.body("{\n \"fullName\": \"Amelia Hart\",\n \"dateOfBirth\": \"1990-04-12\",\n \"address\": \"14 Curzon Street, Mayfair\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/civilians")
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 \"fullName\": \"Amelia Hart\",\n \"dateOfBirth\": \"1990-04-12\",\n \"address\": \"14 Curzon Street, Mayfair\"\n}"
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": null,
"status": "ACTIVE",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:30:00.000Z"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"fullName"
],
"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.create."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "CIVILIAN_LIMIT",
"message": "An account can hold at most 25 characters."
},
"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"
}Create a character
Permission: civilians.create.
Access: Browser session only.
Creates a character owned by the caller. The owner always comes from the session; a body that names one is rejected. Characters are never deleted, only marked inactive or deceased.
curl --request POST \
--url http://localhost:3000/api/civilians \
--header 'Content-Type: application/json' \
--cookie __Host-argus-session= \
--data '
{
"fullName": "Amelia Hart",
"dateOfBirth": "1990-04-12",
"address": "14 Curzon Street, Mayfair"
}
'import requests
url = "http://localhost:3000/api/civilians"
payload = {
"fullName": "Amelia Hart",
"dateOfBirth": "1990-04-12",
"address": "14 Curzon Street, Mayfair"
}
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({
fullName: 'Amelia Hart',
dateOfBirth: '1990-04-12',
address: '14 Curzon Street, Mayfair'
})
};
fetch('http://localhost:3000/api/civilians', 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",
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([
'fullName' => 'Amelia Hart',
'dateOfBirth' => '1990-04-12',
'address' => '14 Curzon Street, Mayfair'
]),
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"
payload := strings.NewReader("{\n \"fullName\": \"Amelia Hart\",\n \"dateOfBirth\": \"1990-04-12\",\n \"address\": \"14 Curzon Street, Mayfair\"\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/civilians")
.header("cookie", "__Host-argus-session=")
.header("Content-Type", "application/json")
.body("{\n \"fullName\": \"Amelia Hart\",\n \"dateOfBirth\": \"1990-04-12\",\n \"address\": \"14 Curzon Street, Mayfair\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/civilians")
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 \"fullName\": \"Amelia Hart\",\n \"dateOfBirth\": \"1990-04-12\",\n \"address\": \"14 Curzon Street, Mayfair\"\n}"
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": null,
"status": "ACTIVE",
"createdAt": "2026-10-06T19:30:00.000Z",
"updatedAt": "2026-10-06T19:30:00.000Z"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Request validation failed.",
"details": [
{
"path": [
"fullName"
],
"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.create."
},
"requestId": "3f1c9d5e-7a42-4f0b-9c1e-8b6d2a4e5f70"
}{
"error": {
"code": "CIVILIAN_LIMIT",
"message": "An account can hold at most 25 characters."
},
"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.
Body
Letters, spaces, apostrophes, hyphens and full stops. Runs of spaces are collapsed.
2 - 80YYYY-MM-DD, from 1900-01-01 to today.
3 - 200MALE, FEMALE, NON_BINARY, UNSPECIFIED ^\+?[0-9][0-9 ()-]{2,19}$2 - 100HTTPS only. Argus stores the link and never fetches it.
2048Private to the owner; never shown in the PNC.
1 - 2000Response
Created.
Show child attributes
Show child attributes