Files
Module-uo/swagger-fragment.json
wtclaude 5cdcf0fbb6
All checks were successful
PR Checks / server-tests (pull_request) Successful in 19s
PR Checks / frozen-manifest (pull_request) Successful in 35s
PR Checks / client-build (pull_request) Successful in 8m49s
feat(release): ship an OpenAPI fragment, a frozen manifest and a bundle (phase 3, slice 5)
The three artifacts that make this module installable and checkable, closing
phase 3's extraction. Nothing about what the module serves changes: the same 72
URLs, the same behaviour.

**The OpenAPI fragment (MODULE_API.md §2.8, §6.1a) was never built, on either
side.** The 417 `#swagger` annotations came across in slice 1 and went nowhere,
and core's /api/docs.json merged nothing — so every route this module serves was
in no spec at all, which is core's standing rule ("never ship a route that isn't
in the spec") being broken by the extraction rather than by a route.

`server/scripts/swaggerFragment.js` generates it. The prefixes are DERIVED: the
script runs the module's own `register()` against a recording api and asks
`require.cache` which file each router came from, so a mount prefix exists in one
place — `server/index.js` — and not in a table beside it. The 31 schemas moved
here from core's swagger.js, namespaced `Uo…` because core wins every key
collision in the merge; `Error` and `ValidationError` stay referenced by core's
names, since they resolve in the merged document.

**The frozen route manifest (§5.3)** is derived too, and by subtraction: CI
clones core at the ref pinned in ci/core-ref.json, generates its manifest without
this module and then with it, and the difference is what this module serves. That
buys the half of §5.3 that matters most for free — a module that shadowed or
displaced one of core's routes shows up as a REMOVAL, not merely as an addition
elsewhere. The same job checks the fragment against ground truth: every route
must have an operation and every operation must be a route.

**The release workflow** publishes `module-uo-<version>.tar.gz` plus a manifest
carrying its sha256. The version is declared in module.json rather than computed
from commit subjects, and the workflow never writes to a branch — it tags and
publishes — so `main` needs no push exception. The bundle is assembled from an
include list, because an exclude list ships whatever it forgot.

Four annotation defects, inherited from core and never visible until something
generated a spec from these files: two `requestBody` literals a brace short (the
route documented with an empty body), and two descriptions whose inner quoting
swagger-autogen cannot survive — it re-quotes `"` and a backtick to `'` before
evaluating, so either inside a single-quoted description ends the string early
and the annotation is dropped. It reports each one and then prints Success in
green, so the generator now captures its diagnostics and makes them fatal.

Also fixed while writing it: passing one shared `doc` to swagger-autogen six
times. It renders components.schemas from an EXAMPLE object and writes the result
back into what it was handed, so each pass re-wrapped the last and the fragment
came out at 484 MB.

- 409 server tests (+21), 40 client tests unchanged
- swagger-fragment.json: 69 paths covering all 72 routes
- routes.manifest.json: 72 routes; core's own surface unchanged, 0 removals
- verified end to end by assembling the bundle exactly as CI will, unpacking it
  into a real core and regenerating the manifest

Refs: docs/website/MODULE_SYSTEM.md §2.7.1, MODULE_API.md §2.8, §5.3, §6.1a

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-11 22:40:21 -05:00

8161 lines
241 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"paths": {
"/api/v1/admin/shard/account": {
"post": {
"tags": [
"Admin · Account"
],
"summary": "Create a game account and link it to the caller (staff self-service)",
"description": "Same as POST /player/shard/account but for a signed-in staff user — provisions a game account (own username + password) and links it. Gated by game_account_signup + the shards mode; the password is never stored or logged.",
"responses": {
"201": {
"description": "Account created and linked",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Game-account signup unavailable (site or shard)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Account name already taken",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"account",
"password"
],
"properties": {
"account": {
"type": "string"
},
"password": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/v1/admin/shard/accounts": {
"get": {
"tags": [
"Admin · Account"
],
"summary": "List the callers linked game accounts (self)",
"description": "",
"responses": {
"200": {
"description": "Linked accounts",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardLink"
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/atlas": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Spawn atlas status: path, drift, counts, pending review (admin only)",
"description": "Where the ServUO tree is, whether it can be read, whether its source files have drifted from the loaded atlas, and any refresh staged for approval. The public /atlas/meta route reports the game world only; the filesystem detail is here.",
"responses": {
"200": {
"description": "Atlas status",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasStatus"
}
}
}
},
"403": {
"description": "Admin role required",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/atlas/approve": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Approve a staged atlas refresh that removes a facet (admin only)",
"description": "Re-parses the tree and applies it, facet loss included. Only the decision was stored, never the parsed world, so what lands matches the tree at approval time — an operator who has since fixed a half-copied mount gets the corrected import.",
"responses": {
"200": {
"description": "What happened",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasRefreshResult"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/atlas/import": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Re-import the spawn atlas from the ServUO tree (admin only)",
"description": "Applies a map change without a restart. `force` reimports even when the source hashes match what is loaded. A refresh that would REMOVE a facet is still staged for approval rather than applied — that decision is never taken implicitly. An unreadable tree answers 200 with status \"unavailable\" rather than 500: the refresh contract reports outcomes instead of throwing, and the admin needs to be told what is wrong with the path.",
"responses": {
"200": {
"description": "What happened",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasRefreshResult"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"force": {
"type": "boolean",
"description": "Reimport even if the tree is unchanged."
}
}
}
}
}
}
}
},
"/api/v1/admin/shard/atlas/path": {
"put": {
"tags": [
"Admin · Shard"
],
"summary": "Set the ServUO tree the atlas reads from (admin only)",
"description": "Persisted as a setting, which wins over the SERVUO_PATH deploy default so the mount can move without a redeploy. Blank clears it and the atlas is simply skipped on the next boot. Deliberately does not import as a side effect — the response carries the refreshed status so the panel can offer that as the next step.",
"responses": {
"200": {
"description": "Atlas status after the change",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasStatus"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Absolute path to the ServUO server root. Blank disables the atlas."
}
}
}
}
}
}
}
},
"/api/v1/admin/shard/atlas/reject": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Reject a staged atlas refresh (admin only)",
"description": "Keeps the current atlas and remembers the decision against those exact source hashes, so a declined refresh does not re-prompt on every restart. Changing the tree asks again.",
"responses": {
"200": {
"description": "Rejected",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasRefreshResult"
}
}
}
},
"404": {
"description": "Nothing is awaiting review",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/audit": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Recent in-game moderation audit events (admin/moderator)",
"description": "",
"parameters": [
{
"name": "limit",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "admin.audit events, newest first",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardEvent"
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/ban": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Ban an account, timed or indefinite (admin/moderator)",
"description": "",
"responses": {
"200": {
"description": "Banned",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Protected target or write plane disabled",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"account": {
"type": "string"
},
"serial": {
"type": "string"
},
"durationSec": {
"type": "integer"
},
"reason": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/v1/admin/shard/broadcast": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Broadcast a system message to everyone online (admin/moderator)",
"description": "",
"responses": {
"200": {
"description": "Broadcast",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"hue": {
"type": "integer"
}
},
"required": [
"text"
]
}
}
}
}
}
},
"/api/v1/admin/shard/char/{serial}": {
"get": {
"tags": [
"Admin · Account"
],
"summary": "Character sheet (self-linked characters; admins: any character)",
"description": "",
"parameters": [
{
"name": "serial",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Mobile serial, e.g. 0x24C."
}
],
"responses": {
"200": {
"description": "Character profile",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"400": {
"description": "Bad Request"
},
"403": {
"description": "Character not on an account linked to the caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
},
"502": {
"description": "Bad Gateway"
},
"503": {
"description": "Service Unavailable"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/clilocs": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Cliloc table status: sources, drift, entry count (admin only)",
"description": "Where the cliloc sources are, whether they can be read, how many entries are loaded, and whether the files on disk have drifted from them. The table is built from a SET of sources — the converted client table plus every operator-maintained overlay under `custom/`, which is how shard-added and shard-edited items get names. `missingSources` lists any source that was loaded before and is now gone; an import refuses that without `approve`. A shard with nothing configured is a supported state — item names simply render as ids.",
"responses": {
"200": {
"description": "Cliloc status",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoClilocStatus"
}
}
}
},
"403": {
"description": "Admin role required",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/clilocs/import": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Re-import the cliloc table from its source files (admin only)",
"description": "Applies a client patch, or a change to the shard\\'s own overlay files, without a restart. `force` reimports even when the source hashes match what is loaded. `approve` accepts a refresh in which a previously-loaded source has VANISHED — refused by default, because an unmounted volume and a deliberate deletion are indistinguishable from the server, and the wrong guess silently drops every name that file contributed. A missing path — or the common mistake of pointing at the client\\'s own COMPRESSED Cliloc.enu — answers 200 with status \"unavailable\" and the reason, rather than 500: the refresh contract reports outcomes instead of throwing, and the admin needs to be told which file to convert.",
"responses": {
"200": {
"description": "What happened",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoClilocRefreshResult"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"force": {
"type": "boolean",
"description": "Reimport even if the sources are unchanged."
},
"approve": {
"type": "boolean",
"description": "Accept a refresh in which a previously-loaded source has vanished."
}
}
}
}
}
}
}
},
"/api/v1/admin/shard/clilocs/path": {
"put": {
"tags": [
"Admin · Shard"
],
"summary": "Set the cliloc source the site reads from (admin only)",
"description": "Accepts either the converted base file itself or a directory to search. Overlays are read from a `custom/` directory beside it either way — pointing at a file does not forfeit them. Persisted as a setting, which wins over the UO_CLIENT_PATH deploy default so the mount can move without a redeploy. Blank clears it and resolution is skipped on the next boot. Deliberately does not import as a side effect — the response carries the refreshed status so the panel can offer that as the next step.",
"responses": {
"200": {
"description": "Cliloc status after the change",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoClilocStatus"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Path to the converted cliloc file, or a directory containing one. Blank disables resolution."
}
}
}
}
}
}
}
},
"/api/v1/admin/shard/houses": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Full house registry — owner, price, decay (admin/moderator)",
"description": "The complete house registry. The public endpoint shows only IDOC houses with location; this staff view carries owner/price/co-owner/decay detail.",
"responses": {
"200": {
"description": "Houses, ordered by name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardHouse"
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/kick": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Kick every live session of an account (admin/moderator)",
"description": "",
"responses": {
"200": {
"description": "Kicked",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Protected target or write plane disabled",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"account": {
"type": "string"
},
"serial": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/v1/admin/shard/link": {
"post": {
"tags": [
"Admin · Account"
],
"summary": "Link an in-game account with a one-time code (self)",
"description": "",
"responses": {
"200": {
"description": "Linked",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardLinkResult"
}
}
}
},
"400": {
"description": "Unknown or expired code",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
},
"502": {
"description": "Bad Gateway"
},
"503": {
"description": "Service Unavailable"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardLinkRequest"
}
}
}
}
}
},
"/api/v1/admin/shard/pages": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Open help-page (support) queue (admin/moderator)",
"description": "",
"responses": {
"200": {
"description": "Open pages",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/pages/{id}/close": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Resolve a help page without a reply (admin/moderator)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Page id (sender serial)."
}
],
"responses": {
"200": {
"description": "Closed",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/pages/{id}/respond": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Reply to a help page, optionally closing it (admin/moderator)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Page id (sender serial)."
}
],
"responses": {
"200": {
"description": "Responded",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"404": {
"description": "Unknown page",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"close": {
"type": "boolean"
}
},
"required": [
"message"
]
}
}
}
}
}
},
"/api/v1/admin/shard/roster/{account}": {
"get": {
"tags": [
"Admin · Account"
],
"summary": "Character roster for an account (self; admins: any account)",
"description": "",
"parameters": [
{
"name": "account",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "A game account linked to the caller."
}
],
"responses": {
"200": {
"description": "Account roster",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Account not linked to the caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/sales": {
"get": {
"tags": [
"Admin · Account"
],
"summary": "Recent player-vendor sales for the callers linked accounts (self)",
"description": "",
"responses": {
"200": {
"description": "Vendor sales",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardVendorSale"
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/unban": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Clear an account ban (admin/moderator)",
"description": "",
"responses": {
"200": {
"description": "Unbanned",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"account": {
"type": "string"
}
},
"required": [
"account"
]
}
}
}
}
}
},
"/api/v1/admin/shard/vendors/{account}": {
"get": {
"tags": [
"Admin · Account"
],
"summary": "Player vendors for an account (self; admins: any account)",
"description": "",
"parameters": [
{
"name": "account",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "A game account linked to the caller."
}
],
"responses": {
"200": {
"description": "Vendor snapshot",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Account not linked to the caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/shard/visibility": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Get per-feature shard visibility config (admin only)",
"description": "The effective config (compiled defaults merged with stored overrides) plus the vocabulary the admin UI renders from: the audience ladder and the always-locked fields. Defaults reproduce pre-v3 behavior.",
"responses": {
"200": {
"description": "Visibility config",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardVisibilityConfig"
}
}
}
},
"403": {
"description": "Admin role required",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
},
"put": {
"tags": [
"Admin · Shard"
],
"summary": "Update per-feature shard visibility config (admin only)",
"description": "Patch one or more features. Unknown feature names, unknown rungs, and any attempt to configure a locked field (acct / webId — admin-only always) are rejected with 400 rather than silently dropped.",
"responses": {
"200": {
"description": "Updated config",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardVisibilityConfig"
}
}
}
},
"400": {
"description": "Unknown feature, rung, or a locked field",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardVisibilityUpdate"
}
}
}
}
}
},
"/api/v1/admin/uo-link/config": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Get uo-link config + live status + ingestion stats (admin only)",
"description": "",
"responses": {
"200": {
"description": "Masked config, health and ingestion stats",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Admin role required",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
},
"put": {
"tags": [
"Admin · Shard"
],
"summary": "Save uo-link connection config (admin only)",
"description": "token is write-only — omit/blank it to keep the existing one. Saving (re)starts the WS ingest client.",
"responses": {
"200": {
"description": "Updated config + live status",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"400": {
"description": "Validation error, or missing token while enabling",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Admin role required",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"baseUrl": {
"type": "string"
},
"wsUrl": {
"type": "string"
},
"token": {
"type": "string"
},
"protocol": {
"type": "integer"
},
"enabled": {
"type": "boolean"
}
}
}
}
}
}
}
},
"/api/v1/admin/uo-link/signup-mode": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Get the game-account signup mode (admin only)",
"description": "Whether the site offers game-account creation, and in which direction. The shard\\'s own SignupMode (Bridge.cfg) must agree: website/hybrid accept site-created accounts, game refuses them.",
"responses": {
"200": {
"description": "The configured mode and the legal values",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"mode": {
"type": "string"
},
"modes": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
},
"403": {
"description": "Admin role required",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
},
"put": {
"tags": [
"Admin · Shard"
],
"summary": "Set the game-account signup mode (admin only)",
"description": "",
"responses": {
"200": {
"description": "The saved mode",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"mode": {
"type": "string"
}
}
}
}
}
},
"400": {
"description": "Unknown mode",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Admin role required",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"mode"
],
"properties": {
"mode": {
"type": "string",
"enum": [
"disabled",
"website",
"hybrid",
"game"
]
}
}
}
}
}
}
}
},
"/api/v1/admin/uo-link/stream": {
"get": {
"tags": [
"Admin · Shard"
],
"summary": "Full live shard event stream incl. audit/cheat (SSE, admin only)",
"description": "",
"responses": {
"200": {
"description": "An SSE stream (Content-Type: text/event-stream)."
}
}
}
},
"/api/v1/admin/uo-link/towncrier": {
"post": {
"tags": [
"Admin · Shard"
],
"summary": "Publish / replace a town-crier message (admin only)",
"description": "",
"responses": {
"200": {
"description": "Posted",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"400": {
"description": "Rejected (over caps)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
},
"502": {
"description": "Bad Gateway"
},
"503": {
"description": "Shard unavailable",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoTownCrierRequest"
}
}
}
}
}
},
"/api/v1/admin/uo-link/towncrier/{id}": {
"delete": {
"tags": [
"Admin · Shard"
],
"summary": "Remove a town-crier message (admin only)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Town-crier message id."
}
],
"responses": {
"200": {
"description": "Removed",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"404": {
"description": "Unknown id",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
},
"502": {
"description": "Bad Gateway"
},
"503": {
"description": "Service Unavailable"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/users/{id}/shard/accounts": {
"get": {
"tags": [
"Admin · Users"
],
"summary": "A users linked game accounts (admin only)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
},
"description": "User id."
}
],
"responses": {
"200": {
"description": "Linked accounts",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardLink"
}
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/users/{id}/shard/houses": {
"get": {
"tags": [
"Admin · Users"
],
"summary": "Houses owned by a users accounts (admin only)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
},
"description": "User id."
}
],
"responses": {
"200": {
"description": "Houses (IDOC first)",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/users/{id}/shard/link/{account}": {
"delete": {
"tags": [
"Admin · Users"
],
"summary": "Unlink a game account from this user (admin only)",
"description": "Severs a game accounts tie to the website user from the site side (sidecar DELETE /link/{account}) and drops the local mirror. actor is stamped from the session.",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
},
"description": "User id."
},
{
"name": "account",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Game account to unlink."
}
],
"responses": {
"200": {
"description": "Unlinked",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"account": {
"type": "string"
},
"unlinked": {
"type": "boolean"
}
}
}
}
}
},
"403": {
"description": "Protected staff account (refused by shard)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Not linked",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
},
"502": {
"description": "Bad Gateway"
},
"503": {
"description": "Service Unavailable"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/users/{id}/shard/online": {
"get": {
"tags": [
"Admin · Users"
],
"summary": "A users characters currently online (admin only)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
},
"description": "User id."
}
],
"responses": {
"200": {
"description": "Online characters",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/users/{id}/shard/sales": {
"get": {
"tags": [
"Admin · Users"
],
"summary": "Recent vendor sales on a users accounts (admin only)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
},
"description": "User id."
}
],
"responses": {
"200": {
"description": "Vendor sales",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardVendorSale"
}
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/admin/users/{id}/shard/standing": {
"get": {
"tags": [
"Admin · Users"
],
"summary": "A users shard standing — governorships held and guilds led (admin only)",
"description": "",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
},
"description": "User id."
}
],
"responses": {
"200": {
"description": "Standing { governorOf, guildsLed }",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"404": {
"description": "Not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/player/shard/account": {
"post": {
"tags": [
"Player · Shard"
],
"summary": "Create a game account (hybrid signup) and link it to the caller",
"description": "Provisions a new game account with its own username + password and auto-links it to the signed-in website user. Available only when game_account_signup is enabled and the shard accepts website signups. The password is hashed on the shard and never stored or logged by the site.",
"responses": {
"201": {
"description": "Account created and linked",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"account": {
"type": "string"
},
"linked": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "Validation error or rejected name/password",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ValidationError"
}
}
}
},
"403": {
"description": "Game-account signup unavailable (site or shard)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"409": {
"description": "Account name already taken",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Per-IP account cap reached",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
},
"503": {
"description": "Shard unavailable — retry",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"account",
"password"
],
"properties": {
"account": {
"type": "string"
},
"password": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/v1/player/shard/accounts": {
"get": {
"tags": [
"Player · Shard"
],
"summary": "List the callers linked game accounts",
"description": "",
"responses": {
"200": {
"description": "Linked accounts",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardLink"
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/player/shard/char/{serial}": {
"get": {
"tags": [
"Player · Shard"
],
"summary": "Character sheet — only for a character on the callers linked account",
"description": "",
"parameters": [
{
"name": "serial",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Mobile serial, e.g. 0x24C."
}
],
"responses": {
"200": {
"description": "Character profile",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"400": {
"description": "Bad Request"
},
"403": {
"description": "Character not on an account linked to the caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
},
"502": {
"description": "Bad Gateway"
},
"503": {
"description": "Shard unavailable — retry",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/player/shard/houses": {
"get": {
"tags": [
"Player · Shard"
],
"summary": "The callers own houses (home status)",
"description": "Houses owned by the callers linked accounts, with decay/IDOC status. Only the callers own houses — never anyone elses.",
"responses": {
"200": {
"description": "The callers houses",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardHouse"
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/player/shard/link": {
"post": {
"tags": [
"Player · Shard"
],
"summary": "Link an in-game account with a one-time code",
"description": "The player runs [link in game to get a code, then submits it here. The server confirms it with the sidecar and mirrors the link.",
"responses": {
"200": {
"description": "Linked",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardLinkResult"
}
}
}
},
"400": {
"description": "Unknown or expired code",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
},
"502": {
"description": "Bad Gateway"
},
"503": {
"description": "Shard unavailable — retry",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardLinkRequest"
}
}
}
}
}
},
"/api/v1/player/shard/roster/{account}": {
"get": {
"tags": [
"Player · Shard"
],
"summary": "Character roster for a linked account",
"description": "",
"parameters": [
{
"name": "account",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "A game account linked to the caller."
}
],
"responses": {
"200": {
"description": "Account roster",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Account not linked to the caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"503": {
"description": "Shard unavailable — retry",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/player/shard/sales": {
"get": {
"tags": [
"Player · Shard"
],
"summary": "Recent player-vendor sales for the callers linked accounts",
"description": "",
"responses": {
"200": {
"description": "Vendor sales",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardVendorSale"
}
}
}
}
},
"500": {
"description": "Internal Server Error"
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/player/shard/vendors/{account}": {
"get": {
"tags": [
"Player · Shard"
],
"summary": "Player vendors for a linked account",
"description": "",
"parameters": [
{
"name": "account",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "A game account linked to the caller."
}
],
"responses": {
"200": {
"description": "Vendor snapshot",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Account not linked to the caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"503": {
"description": "Shard unavailable — retry",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"security": [
{
"cookieAuth": []
},
{
"bearerAuth": []
}
]
}
},
"/api/v1/public/atlas/champions": {
"get": {
"tags": [
"Public · Atlas"
],
"summary": "Configured champion altars (the roster, not the live board)",
"description": "Where the altars are and what each one summons — \"there is an Unholy Terror altar in Deceit\". `randomType` marks altars whose champion is drawn at activation. Do not conflate this with GET /public/shard/champs, which is the live sidecar-fed board (\"it is on level 3 right now\").",
"parameters": [
{
"name": "facet",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Limit to one facet."
}
],
"responses": {
"200": {
"description": "Altars, by facet then name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoAtlasChampion"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/atlas/creatures": {
"get": {
"tags": [
"Public · Atlas"
],
"summary": "Search the bestiary (paginated)",
"description": "Every creature the shard spawns, most numerous first. `total` is how many can be alive at once across all spawners; `points` is how many spawners mention it; `facets` maps facet name to that creature\\'s share on it. Static content parsed from the shard\\'s ServUO tree — unaffected by the shard being offline.",
"parameters": [
{
"name": "q",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Substring match on the creature name (max 60 chars)."
},
{
"name": "facet",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Limit to creatures spawning on this facet. Facet names come from the shard's own files; an unknown one returns an empty page."
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Page size, 1..100 (default 50)."
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Rows to skip (default 0)."
}
],
"responses": {
"200": {
"description": "A page of creatures plus the unpaginated total",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasCreaturePage"
}
}
}
},
"403": {
"description": "The atlas feature is gated above this caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "The atlas feature is disabled",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/atlas/creatures/{slug}": {
"get": {
"tags": [
"Public · Atlas"
],
"summary": "One creature: where it spawns, and what spawns with it",
"description": "The answer the atlas exists to give. `places` is the aggregate — \"lizardman → Shrines, Isamu-Jima, Yew\" — resolved by point-in-rect against the shard\\'s own region rectangles, falling back to the nearest landmark, else \"Wilderness\". `spawners` lists the individual spawn points (bounded; `spawnersTruncated` says when the list was cut), and `alsoHere` is what shares those spawners.",
"parameters": [
{
"name": "slug",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Creature slug, e.g. lizardman."
},
{
"name": "facet",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Restrict places and spawners to one facet."
},
{
"name": "points",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Max spawners to return, 1..1000 (default 200)."
}
],
"responses": {
"200": {
"description": "The creature",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasCreature"
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "No such creature in this atlas (or the feature is disabled)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/atlas/landmarks": {
"get": {
"tags": [
"Public · Atlas"
],
"summary": "Points of interest (dungeon levels, town markers)",
"description": "From the shard\\'s Data/Locations files. `group` is the innermost enclosing parent (\"Covetous\"), which is the label worth showing over the individual marker (\"Level 1\").",
"parameters": [
{
"name": "facet",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Limit to one facet."
},
{
"name": "q",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Substring match on the landmark name or its group."
}
],
"responses": {
"200": {
"description": "Landmarks, by facet then group",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoAtlasLandmark"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/atlas/meta": {
"get": {
"tags": [
"Public · Atlas"
],
"summary": "What atlas is loaded: facets, counts, when it was imported",
"description": "Drives the facet filter and the \"parsed from the shard\\'s own files on <date>\" line. Reports the game world only — the ServUO path, the per-file hashes and any pending refresh are operator detail and live on the admin status route.",
"responses": {
"200": {
"description": "Atlas metadata",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoAtlasMeta"
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/atlas/regions": {
"get": {
"tags": [
"Public · Atlas"
],
"summary": "Named regions and their rectangles",
"description": "Flattened out of the shard\\'s nested Regions.xml. `priority` and the rectangles are what placed each spawn point, kept so the placement can be re-derived rather than taken on trust.",
"parameters": [
{
"name": "facet",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Limit to one facet."
},
{
"name": "q",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Substring match on the region name."
}
],
"responses": {
"200": {
"description": "Regions, by facet then name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoAtlasRegion"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/champs": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Current champion-spawn board (all categories)",
"description": "The live board of every champion / mini-champ / sea-boss spawn. Update in place via the champ.update / champ.remove frames on /shard/stream.",
"responses": {
"200": {
"description": "Champion spawns, ordered by name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/economy": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Gold-supply time series (oldest → newest)",
"description": "",
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Max samples (default 100, max 1000)."
}
],
"responses": {
"200": {
"description": "Economy samples",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardEconomyPoint"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/features": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Shard features visible to the caller (drives client nav)",
"description": "The caller\\'s audience rung plus the shard features they may reach, so a client can hide nav entries instead of rendering links that 403. Reports only what the caller can see — the list itself does not disclose gated features.",
"responses": {
"200": {
"description": "Visible features",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardFeatures"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/feed": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Recent notable shard events (from the ingested log)",
"description": "The stored-history twin of /shard/stream, and it reaches the same verdict: which kinds are returned is resolved against the caller\\'s audience rung under the live visibility config, and each event\\'s payload is field-projected against its own kind\\'s feature. Kinds the caller may not read are omitted (an explicit ?kind= for one of them returns []), and acct/webId never appear below admin.",
"parameters": [
{
"name": "kind",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Filter to a single event kind, e.g. vendor.sale. Returns [] if the caller may not read that kind."
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Max rows (default 100, max 1000)."
}
],
"responses": {
"200": {
"description": "Events, newest first",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardEvent"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/governors": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Current town-governor board (City Loyalty)",
"description": "One entry per city with its governor and election phase. Empty if the shard does not run the City Loyalty system. Live via city.update on /shard/stream.",
"responses": {
"200": {
"description": "Cities, ordered by name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/governors/{city}/history": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Governor term history for a city",
"description": "",
"parameters": [
{
"name": "city",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "City name, e.g. Britain."
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Max terms (default 100, max 500)."
}
],
"responses": {
"200": {
"description": "Terms, newest first",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/guilds": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Current guild board (rosters, alliances, leaders)",
"description": "The live board of every guild. Update in place via the guild.update / guild.remove / guild.join frames on /shard/stream.",
"responses": {
"200": {
"description": "Guilds, ordered by name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/houses": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "House registry (owner, co-owners, price, decay)",
"description": "Every house seen via the house.update registry feed. `price` is the placement value, not a for-sale flag. Live via house.update / house.remove on /shard/stream.",
"responses": {
"200": {
"description": "Houses, ordered by name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardHouse"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/idoc": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Houses currently in danger (IDOC)",
"description": "Location-level board of the houses about to collapse. Owner identity and price are gated by the `houses` feature\\'s field rules (default `staff`), and the owner\\'s game account is admin-only always — so an anonymous caller sees name, region and coordinates only.",
"responses": {
"200": {
"description": "IDOC houses",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardHouse"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/market": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Search the player-vendor marketplace",
"description": "Every priced listing on every player vendor the shard publishes — the same index the in-game Vendor Search gump reads, and it honours the same per-vendor opt-out, so a player who hid their shop in game is hidden here too. Results are LISTINGS, each carrying enough of its shop to be actionable. Served from the site\\'s own tables (the sidecar is not touched), so it renders while the shard is down; `staleAt` is the oldest vendor row and the page must say how far behind the index can be — the shard sweeps vendors round-robin, so prices are inherently up to one full cycle old. Item names are resolved server-side against the cliloc table (docs/website/CLILOCS.md); on a shard that has not configured one, `displayName` is null and clients render the item id.",
"parameters": [
{
"name": "q",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Substring match on the resolved item name or the item's own literal name (max 60 chars)."
},
{
"name": "minPrice",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Lowest price to include."
},
{
"name": "maxPrice",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Highest price to include."
},
{
"name": "itemId",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Exact ItemID (art id) match — the more-like-this filter."
},
{
"name": "map",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Limit to one facet. Facet names come from the shard's own data; an unknown one returns an empty page."
},
{
"name": "region",
"in": "query",
"required": false,
"schema": {
"type": "string"
},
"description": "Limit to one named region."
},
{
"name": "sort",
"in": "query",
"required": false,
"schema": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"enum": {
"type": "array",
"example": [
"price_asc",
"price_desc",
"recent"
],
"items": {
"type": "string"
}
}
}
},
"description": "Default price_asc. recent orders by when the shop was last seen."
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Page size, 1..100 (default 50)."
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Rows to skip (default 0)."
}
],
"responses": {
"200": {
"description": "A page of listings plus the unpaginated total and the staleness stamp",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardMarketPage"
}
}
}
},
"403": {
"description": "The market feature is gated above this caller",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "The market feature is disabled",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"429": {
"description": "Rate limited",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/market/meta": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Marketplace size, staleness and filter options",
"description": "How many vendors and listings the index holds, how stale it may be (`staleAt` = the oldest vendor row, `freshAt` = the newest), and which facets and regions actually hold vendors — so a client can build its filters without running a search it will discard.",
"responses": {
"200": {
"description": "Marketplace metadata",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardMarketMeta"
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/market/vendors/{serial}": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "One player vendor and everything it is selling",
"description": "A single shop by its vendor serial, with its listings. `truncated` (and `total` exceeding `count`) means the shop holds more than the shard publishes per frame — a commodity reseller with thousands of stacks is a real thing, and the page says so rather than presenting a partial shop as complete. Returns 404 for a serial the index has never seen, which also covers a vendor since dismissed or hidden.",
"parameters": [
{
"name": "serial",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Vendor serial, e.g. 0x40001234"
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Listings to return, 1..500 (default 250)."
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "integer"
},
"description": "Listings to skip (default 0)."
}
],
"responses": {
"200": {
"description": "The vendor",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardMarketVendor"
}
}
}
},
"400": {
"description": "Malformed vendor serial"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "No such vendor in the index"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/online": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Staff online now (linked staff accounts; location is admin/moderator-only)",
"description": "",
"responses": {
"200": {
"description": "Online players",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardOnlinePlayer"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/points": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Points / loyalty leaderboards, one board per point system",
"description": "Every points/loyalty leaderboard the shard publishes (Queen\\'s Loyalty, Void Pool, the nine city loyalties, Clean Up Britannia, …), each with its display name, max points, participant count and top N. Served from our own store, so it renders while the shard is down; live via points.board on /shard/stream. A board\\'s display name may arrive as a literal (`nameString`) or a cliloc id (`nameNumber`) — resolve clilocs client-side.",
"responses": {
"200": {
"description": "Boards, ordered by display name",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UoShardPointsBoard"
}
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/points/{system}": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "One points system\\'s leaderboard",
"description": "A single board by the shard\\'s own PointsType name (e.g. `QueensLoyalty`, `CleanUpBritannia`). Returns 404 when the shard has never published that system — distinct from a published board that nobody has scored in yet, which returns 200 with an empty `top`.",
"parameters": [
{
"name": "system",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "PointsType name, e.g. QueensLoyalty"
}
],
"responses": {
"200": {
"description": "The board",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardPointsBoard"
}
}
}
},
"400": {
"description": "Malformed system name"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "The shard has never published that system"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/presence": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Online population aggregate (count + per-facet + per-region)",
"description": "The latest presence.online snapshot powering the \"Players Online\" widget. Live via presence.online on /shard/stream.",
"responses": {
"200": {
"description": "Population snapshot",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/ruleset": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "The shard\\'s published ruleset (expansion, systems, caps, limits)",
"description": "How this shard is actually configured, published by the shard itself as one world.ruleset frame: expansion, which optional systems are on, skill/stat caps, account and house limits, champion scroll rules and the save/restart schedule. Served from our own store, so it renders while the shard is down; live via world.ruleset on /shard/stream. Returns `null` if the shard has never published one (an older plugin, or Bridge.RulesetEnabled=false) — distinct from a published ruleset, and the page renders it differently.",
"responses": {
"200": {
"description": "The ruleset, or null if never published",
"content": {
"application/json": {
"schema": {
"type": "object",
"nullable": true,
"additionalProperties": true
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/status": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Shard connection state, online count and latest economy",
"description": "",
"responses": {
"200": {
"description": "Shard status",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/UoShardStatus"
}
}
}
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Not Found"
},
"500": {
"description": "Internal Server Error"
}
}
}
},
"/api/v1/public/shard/stream": {
"get": {
"tags": [
"Public · Shard"
],
"summary": "Live shard event stream (Server-Sent Events, filtered by audience)",
"description": "text/event-stream of live events. The caller\\'s audience rung is resolved once at subscribe time and frozen for the connection; each frame is then gated on its feature and field-projected, so sensitive kinds and fields (staff audit, cheat detection, login attempts, IPs, acct/webId) never reach a caller below their configured rung.",
"responses": {
"200": {
"description": "An SSE stream (Content-Type: text/event-stream)."
}
}
}
}
},
"tags": [
{
"name": "Public · Shard",
"description": "Live shard data ingested from the uo-link sidecar (status, feed, economy, IDOC, characters)"
},
{
"name": "Public · Atlas",
"description": "Spawn atlas / bestiary — static shard content parsed from the shard's own ServUO tree, independent of the sidecar"
},
{
"name": "Player · Shard",
"description": "Link an in-game account and read its roster / vendors (uo-link)"
},
{
"name": "Admin · Shard",
"description": "uo-link sidecar connection config, live status and town crier (admin only)"
}
],
"components": {
"schemas": {
"UoShardStatus": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "Public shard status (GET /public/shard/status)."
},
"properties": {
"type": "object",
"properties": {
"enabled": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"status": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "connected"
},
"description": {
"type": "string",
"example": "connected | reconnecting | disconnected | error"
}
}
},
"pluginConnected": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"description": {
"type": "string",
"example": "Is the shard link up right now?"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"lastEventAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"onlineCount": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 12
}
}
},
"economy": {
"$ref": "#/components/schemas/UoShardEconomyPoint"
}
}
}
}
},
"UoShardEvent": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A logged shard event."
},
"properties": {
"type": "object",
"properties": {
"id": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 4821
}
}
},
"kind": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "vendor.sale"
}
}
},
"t": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Event time, epoch ms."
},
"example": {
"type": "number",
"example": 1783720195626
}
}
},
"bootId": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "boot-abc123"
}
}
},
"payload": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"additionalProperties": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "The full event object."
}
}
},
"createdAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
}
}
}
}
}
}
},
"UoShardEconomyPoint": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "One gold-supply sample."
},
"properties": {
"type": "object",
"properties": {
"accounts": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 240
}
}
},
"gold": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 1028983421
}
}
},
"t": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Sample time, epoch ms."
},
"example": {
"type": "number",
"example": 1783720000000
}
}
}
}
}
}
},
"UoShardOnlinePlayer": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A LINKED player online now (only accounts linked to a website user are listed)."
},
"properties": {
"type": "object",
"properties": {
"serial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "0x24C"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Darrow"
}
}
},
"map": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Trammel"
}
}
},
"x": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 1402
}
}
},
"y": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 1604
}
}
},
"z": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 0
}
}
}
}
}
}
},
"UoShardVendorSale": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A player-vendor sale (visible only to the linked owner)."
},
"properties": {
"type": "object",
"properties": {
"t": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Sale time, epoch ms."
},
"example": {
"type": "number",
"example": 1783720195626
}
}
},
"itemType": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Longsword"
}
}
},
"amount": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 1
}
}
},
"price": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 100
}
}
},
"commission": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 5
}
}
},
"ownerAcct": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "whitlocktech"
}
}
}
}
}
}
},
"UoShardHouse": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A house at its current decay stage."
},
"properties": {
"type": "object",
"properties": {
"serial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "0x4004705F"
}
}
},
"stage": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "IDOC"
}
}
},
"map": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Trammel"
}
}
},
"x": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"y": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"z": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"region": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "An Unnamed House"
}
}
},
"ownerSerial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"ownerAcct": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"builtOn": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"lastRefreshed": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"isIdoc": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"updatedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
}
}
}
}
}
}
},
"UoShardPointsBoard": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "One point system's leaderboard (Protocol 3.0 points.board). The shard carries ~25 separate point currencies; each publishes its own board. The display name may arrive as a literal string, a cliloc id, or both — resolve clilocs client-side."
},
"properties": {
"type": "object",
"properties": {
"system": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "QueensLoyalty"
},
"description": {
"type": "string",
"example": "The shard's PointsType name; the board's stable key."
}
}
},
"nameString": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Queen's Loyalty"
}
}
},
"nameNumber": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 1114938
},
"description": {
"type": "string",
"example": "Cliloc id, 0 when the name is a literal."
}
}
},
"maxPoints": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 30000
}
}
},
"players": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 842
},
"description": {
"type": "string",
"example": "Players actually holding points in this system."
}
}
},
"showOnGump": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "The shard's own 'is this player-facing?' flag."
}
}
},
"top": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"description": {
"type": "string",
"example": "The ranked players, best first. Capped by the shard (10 by default). Empty when nobody has scored yet."
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"rank": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 1
}
}
},
"serial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "0x1A2B"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Darrow"
},
"description": {
"type": "string",
"example": "Omitted when the leaderboards `name` field is gated above the caller."
}
}
},
"points": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 29500
}
}
}
}
}
}
}
}
},
"t": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Frame time, epoch ms."
}
}
},
"updatedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
}
}
}
}
}
}
},
"UoShardMarketLocation": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Where a vendor is standing. ONE nested object rather than flat map/x/y/region because it is one admin-configurable field (`market.location`) — the whole object is omitted when that field is gated above the caller."
},
"properties": {
"type": "object",
"properties": {
"map": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Trammel"
}
}
},
"x": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 1421
}
}
},
"y": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 1699
}
}
},
"z": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 0
}
}
},
"region": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Britain"
}
}
},
"house": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Darrow's Villa"
},
"description": {
"type": "string",
"example": "The house SIGN's name, not the house type. Null for a vendor standing outside one."
}
}
}
}
}
}
},
"UoShardMarketListing": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "One priced listing on a player vendor, carrying enough of its shop to be actionable without a second request."
},
"properties": {
"type": "object",
"properties": {
"serial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "0x40012ABC"
}
}
},
"itemId": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 3922
},
"description": {
"type": "string",
"example": "ItemID (the art/graphic id)."
}
}
},
"hue": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 0
}
}
},
"amount": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 1
}
}
},
"price": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 25000
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "The item's own literal name, set by a player. Null for most items."
}
}
},
"cliloc": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 1023721
},
"description": {
"type": "string",
"example": "The item's LabelNumber."
}
}
},
"displayName": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "quarter staff"
},
"description": {
"type": "string",
"example": "Resolved server-side from `name` (preferred, being player-set and more specific) else `cliloc`. Null on a shard with no cliloc table configured — render the item id."
}
}
},
"child": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": false
},
"description": {
"type": "string",
"example": "Priced by an enclosing container rather than itself, exactly as the in-game Vendor Search reports it."
}
}
},
"vendor": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"serial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "0x40001234"
}
}
},
"shopName": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Darrow's Bargains"
}
}
},
"ownerSerial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "0x1A2B"
},
"description": {
"type": "string",
"example": "Omitted when the market `ownerSerial` field is gated above the caller."
}
}
},
"ownerName": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Darrow"
},
"description": {
"type": "string",
"example": "Omitted when the market `ownerName` field is gated above the caller."
}
}
},
"location": {
"$ref": "#/components/schemas/UoShardMarketLocation"
},
"updatedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"description": {
"type": "string",
"example": "When the shard last published this shop."
}
}
}
}
}
}
}
}
}
}
},
"UoShardMarketPage": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A page of marketplace listings plus the unpaginated total and the staleness stamp."
},
"properties": {
"type": "object",
"properties": {
"listings": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"$ref": "#/components/schemas/UoShardMarketListing"
}
}
},
"total": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 1284
},
"description": {
"type": "string",
"example": "Matching listings, ignoring paging."
}
}
},
"limit": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 50
}
}
},
"offset": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 0
}
}
},
"vendors": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 137
},
"description": {
"type": "string",
"example": "Vendors in the whole index."
}
}
},
"staleAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "The OLDEST vendor row. The shard sweeps vendors round-robin, so the index can be a full cycle behind and a client must say so rather than implying live prices."
}
}
}
}
}
}
},
"UoShardMarketVendor": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "One player vendor and its listings."
},
"properties": {
"type": "object",
"properties": {
"serial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "0x40001234"
}
}
},
"shopName": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Darrow's Bargains"
}
}
},
"ownerSerial": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"ownerName": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Darrow"
}
}
},
"location": {
"$ref": "#/components/schemas/UoShardMarketLocation"
},
"count": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 250
},
"description": {
"type": "string",
"example": "Listings the shard published for this shop."
}
}
},
"total": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 3104
},
"description": {
"type": "string",
"example": "Listings the shop actually holds."
}
}
},
"truncated": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "`total` exceeds `count` — the shop holds more than the shard publishes per frame."
}
}
},
"updatedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
}
}
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"$ref": "#/components/schemas/UoShardMarketListing"
}
}
}
}
}
}
},
"UoShardMarketMeta": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "Marketplace size, staleness and the filter options a client needs to build its UI."
},
"properties": {
"type": "object",
"properties": {
"vendors": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 137
}
}
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 18422
}
}
},
"staleAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"freshAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"maps": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"example": {
"type": "array",
"example": [
"Felucca",
"Trammel"
],
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"example": "Facets that actually hold vendors. From the shard's own data — never a hardcoded list."
}
}
},
"regions": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"example": {
"type": "array",
"example": [
"Britain",
"Luna"
],
"items": {
"type": "string"
}
}
}
}
}
}
}
},
"UoShardFeatures": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "The shard features the caller may reach, plus the audience rung they resolved to. Drives client nav so it never renders a link that would 403."
},
"properties": {
"type": "object",
"properties": {
"level": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"enum": {
"type": "array",
"example": [
"anonymous",
"logged_in",
"player",
"staff",
"admin"
],
"items": {
"type": "string"
}
},
"example": {
"type": "string",
"example": "anonymous"
}
}
},
"features": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"example": {
"type": "array",
"example": [
"status",
"activity",
"champs",
"guilds",
"governors",
"houses",
"presence"
],
"items": {
"type": "string"
}
}
}
}
}
}
}
},
"UoShardFeatureVisibility": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "Visibility settings for one shard feature."
},
"properties": {
"type": "object",
"properties": {
"enabled": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"audience": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"enum": {
"type": "array",
"example": [
"anonymous",
"logged_in",
"player",
"staff",
"admin"
],
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"example": "Minimum rung that may reach this feature. Each rung implies the ones below it."
},
"example": {
"type": "string",
"example": "anonymous"
}
}
},
"stream": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"description": {
"type": "string",
"example": "Whether this feature's event kinds fan out over SSE at all."
},
"example": {
"type": "boolean",
"example": true
}
}
},
"fieldRules": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"additionalProperties": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"description": {
"type": "string",
"example": "Per-field rung overrides for the sensitive fields this feature exposes. acct / webId are admin-only always and are rejected here."
},
"example": {
"type": "object",
"properties": {
"location": {
"type": "string",
"example": "staff"
}
}
}
}
}
}
}
}
},
"UoShardVisibilityConfig": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"ladder": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"example": {
"type": "array",
"example": [
"anonymous",
"logged_in",
"player",
"staff",
"admin"
],
"items": {
"type": "string"
}
}
}
},
"lockedFields": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"example": {
"type": "array",
"example": [
"acct",
"webId"
],
"items": {
"type": "string"
}
}
}
},
"defaults": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"additionalProperties": {
"$ref": "#/components/schemas/UoShardFeatureVisibility"
}
}
},
"features": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"additionalProperties": {
"$ref": "#/components/schemas/UoShardFeatureVisibility"
}
}
}
}
}
}
},
"UoShardVisibilityUpdate": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"required": {
"type": "array",
"example": [
"features"
],
"items": {
"type": "string"
}
},
"properties": {
"type": "object",
"properties": {
"features": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"additionalProperties": {
"$ref": "#/components/schemas/UoShardFeatureVisibility"
},
"example": {
"type": "object",
"properties": {
"market": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"example": true
},
"audience": {
"type": "string",
"example": "player"
},
"stream": {
"type": "boolean",
"example": false
},
"fieldRules": {
"type": "object",
"properties": {
"ownerName": {
"type": "string",
"example": "player"
}
}
}
}
}
}
}
}
}
}
}
}
},
"UoAtlasCreature": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A creature in the bestiary. `places`/`points`/`alsoHere` are present only on the single-creature route."
},
"properties": {
"type": "object",
"properties": {
"slug": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "lizardman"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Lizardman"
}
}
},
"total": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "How many can be alive at once, summed across every spawner."
},
"example": {
"type": "number",
"example": 214
}
}
},
"points": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "How many spawners mention this creature."
},
"example": {
"type": "number",
"example": 62
}
}
},
"facets": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"additionalProperties": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"description": {
"type": "string",
"example": "This creature's share per facet."
},
"example": {
"type": "object",
"properties": {
"Felucca": {
"type": "number",
"example": 96
},
"Trammel": {
"type": "number",
"example": 88
},
"Tokuno": {
"type": "number",
"example": 30
}
}
}
}
},
"art": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Operator-supplied art under uploads/atlas/. NULL on a fresh import — the repo ships no creature art."
}
}
},
"places": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"description": {
"type": "string",
"example": "Where it spawns, aggregated by resolved place. The answer the atlas exists to give."
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"facet": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Trammel"
}
}
},
"label": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"description": {
"type": "string",
"example": "Resolved region, else nearest landmark group, else \"Wilderness\"."
},
"example": {
"type": "string",
"example": "Shrines"
}
}
},
"spawners": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 7
}
}
},
"maxAlive": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 21
}
}
}
}
}
}
}
}
},
"spawners": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"description": {
"type": "string",
"example": "The individual spawners. Named separately from `points` (the count) so one key never means two things."
},
"items": {
"$ref": "#/components/schemas/UoAtlasSpawner"
}
}
},
"spawnersTruncated": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"description": {
"type": "string",
"example": "True when the spawner list was cut at the requested bound."
},
"example": {
"type": "boolean",
"example": false
}
}
},
"alsoHere": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"description": {
"type": "string",
"example": "Creatures sharing a spawner with this one."
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"slug": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "lizardman-warrior"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Lizardman Warrior"
}
}
},
"shared": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 12
}
}
}
}
}
}
}
}
}
}
}
}
},
"UoAtlasSpawner": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "One ServUO spawner, with the place its coordinates resolved to."
},
"properties": {
"type": "object",
"properties": {
"id": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"facet": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Felucca"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "The spawner's own name in the ServUO file."
}
}
},
"x": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 5411
}
}
},
"y": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 1234
}
}
},
"width": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"height": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"range": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Spawn radius."
}
}
},
"maxCount": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "How many of THIS creature this spawner keeps alive."
},
"example": {
"type": "number",
"example": 3
}
}
},
"minDelay": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Respawn window, in SECONDS. Normalised at parse time — the source stores minutes or seconds per record, decided by its own DelayInSec flag."
},
"example": {
"type": "number",
"example": 300
}
}
},
"maxDelay": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 600
}
}
},
"todStart": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Meaningless unless todMode is non-zero."
}
}
},
"todEnd": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"todMode": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"region": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Despise"
}
}
},
"landmark": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Covetous"
}
}
},
"label": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"description": {
"type": "string",
"example": "Region, else landmark group, else \"Wilderness\"."
},
"example": {
"type": "string",
"example": "Despise"
}
}
}
}
}
}
},
"UoAtlasCreaturePage": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"total": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Matching creatures before pagination."
},
"example": {
"type": "number",
"example": 800
}
}
},
"limit": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 50
}
}
},
"offset": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 0
}
}
},
"creatures": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"$ref": "#/components/schemas/UoAtlasCreature"
}
}
}
}
}
}
},
"UoAtlasRegion": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A named region, flattened out of the shard's nested Regions.xml."
},
"properties": {
"type": "object",
"properties": {
"facet": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Felucca"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Despise"
}
}
},
"type": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "ServUO region class."
},
"example": {
"type": "string",
"example": "DungeonRegion"
}
}
},
"priority": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 50
}
}
},
"parent": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Britain"
}
}
},
"rects": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"description": {
"type": "string",
"example": "The rectangles that placed each spawn point."
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"additionalProperties": {
"type": "boolean",
"example": true
}
}
}
}
}
}
}
}
},
"UoAtlasLandmark": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"facet": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Trammel"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Level 1"
}
}
},
"group": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Innermost enclosing parent — the label worth showing."
},
"example": {
"type": "string",
"example": "Covetous"
}
}
},
"x": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 5411
}
}
},
"y": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 1234
}
}
},
"z": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 0
}
}
}
}
}
}
},
"UoAtlasChampion": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A CONFIGURED champion altar. Not the live board — see GET /public/shard/champs for that."
},
"properties": {
"type": "object",
"properties": {
"slug": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "felucca-deceit"
}
}
},
"name": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Deceit"
}
}
},
"group": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Spawn group; one altar active per group."
},
"example": {
"type": "string",
"example": "Dungeons"
}
}
},
"type": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "NULL when the champion is drawn at activation."
},
"example": {
"type": "string",
"example": "UnholyTerror"
}
}
},
"randomType": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": false
}
}
},
"facet": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "Felucca"
}
}
},
"x": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"y": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"z": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"radius": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 60
}
}
},
"label": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Deceit"
}
}
}
}
}
}
},
"UoAtlasMeta": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "What atlas is loaded. Game-world facts only: the ServUO path, source hashes and any pending refresh are operator detail and live on the admin status route."
},
"properties": {
"type": "object",
"properties": {
"importedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"generatedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"counts": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"nullable": {
"type": "boolean",
"example": true
},
"additionalProperties": {
"type": "boolean",
"example": true
},
"example": {
"type": "object",
"properties": {
"facets": {
"type": "number",
"example": 6
},
"points": {
"type": "number",
"example": 6455
},
"creatures": {
"type": "number",
"example": 800
},
"regions": {
"type": "number",
"example": 387
},
"landmarks": {
"type": "number",
"example": 558
},
"champions": {
"type": "number",
"example": 25
},
"unresolvedPoints": {
"type": "number",
"example": 1086
}
}
}
}
},
"facets": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"example": {
"type": "array",
"example": [
"Felucca",
"Ilshenar",
"Malas",
"TerMur",
"Tokuno",
"Trammel"
],
"items": {
"type": "string"
}
}
}
}
}
}
}
},
"UoAtlasStatus": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "Admin view of atlas state: where the tree is, whether it is readable, whether it has drifted from what is loaded, and any refresh staged for review."
},
"properties": {
"type": "object",
"properties": {
"configured": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"path": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "/srv/servuo"
}
}
},
"treeReadable": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"drift": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "True when the tree's source hashes differ from the loaded atlas. NULL when the tree could not be read."
},
"example": {
"type": "boolean",
"example": false
}
}
},
"facets": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
}
}
},
"importedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"counts": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"nullable": {
"type": "boolean",
"example": true
},
"additionalProperties": {
"type": "boolean",
"example": true
}
}
},
"pending": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "A refresh that was parsed but NOT applied because it would remove a facet. `status` is pending or rejected."
},
"additionalProperties": {
"type": "boolean",
"example": true
}
}
}
}
}
}
},
"UoAtlasRefreshResult": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "Outcome of a refresh. Reported rather than thrown, so an unreadable tree is an answer and not a 500."
},
"properties": {
"type": "object",
"properties": {
"status": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"enum": {
"type": "array",
"example": [
"skipped",
"unavailable",
"unchanged",
"imported",
"needsReview",
"failed",
"rejected",
"none"
],
"items": {
"type": "string"
}
},
"example": {
"type": "string",
"example": "imported"
}
}
},
"reason": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"path": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"counts": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"nullable": {
"type": "boolean",
"example": true
},
"additionalProperties": {
"type": "boolean",
"example": true
}
}
},
"addedFacets": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
}
}
},
"removedFacets": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
}
}
}
}
}
}
},
"UoClilocStatus": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "Admin view of cliloc state: where the converted file is, whether it is readable, how many entries are loaded, and whether the file has drifted from them. `configured: false` is a supported state — item names then render as ids."
},
"properties": {
"type": "object",
"properties": {
"configured": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"path": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "/srv/uo-client"
}
}
},
"file": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "The file actually resolved, when the path is a directory."
},
"example": {
"type": "string",
"example": "/srv/uo-client/clilocs.tsv"
}
}
},
"fileReadable": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"problem": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Why the file cannot be used, when it cannot. Set (with code COMPRESSED) for a readable-but-unconverted client file."
},
"example": {}
}
},
"code": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Machine-readable cause of `problem`."
},
"enum": {
"type": "array",
"example": [
"NO_PATH",
"NOT_FOUND",
"NO_FILE",
"UNREADABLE",
"COMPRESSED"
],
"items": {
"type": "string"
}
}
}
},
"drift": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "True when any source hash differs from the loaded table. NULL when the sources could not be read or are not usable."
},
"example": {
"type": "boolean",
"example": false
}
}
},
"count": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Entries currently loaded."
},
"example": {
"type": "number",
"example": 67496
}
}
},
"sources": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"description": {
"type": "string",
"example": "Every source found now, root-relative, base first then overlays in merge order."
},
"example": {
"type": "array",
"example": [
"clilocs.plain",
"custom/uomysticmoon.tsv"
],
"items": {
"type": "string"
}
}
}
},
"loadedSources": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "What each source contributed at the last import."
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"label": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "custom/uomysticmoon.tsv"
}
}
},
"kind": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"enum": {
"type": "array",
"example": [
"base",
"custom"
],
"items": {
"type": "string"
}
},
"example": {
"type": "string",
"example": "custom"
}
}
},
"entries": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 37
}
}
},
"added": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Ids this source introduced."
},
"example": {
"type": "number",
"example": 25
}
}
},
"overrode": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"description": {
"type": "string",
"example": "Ids it replaced from an earlier source."
},
"example": {
"type": "number",
"example": 12
}
}
}
}
}
}
}
}
},
"missingSources": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"description": {
"type": "string",
"example": "Sources loaded previously and now absent. An import refuses these without `approve`."
},
"example": {
"type": "array",
"example": [],
"items": {}
}
}
},
"importedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"sourceBytes": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 4973525
}
}
}
}
}
}
},
"UoClilocRefreshResult": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "Outcome of a cliloc refresh. Reported rather than thrown, so a missing or compressed file is an answer and not a 500."
},
"properties": {
"type": "object",
"properties": {
"status": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"enum": {
"type": "array",
"example": [
"skipped",
"unavailable",
"unchanged",
"imported",
"needsReview",
"failed"
],
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"example": "`needsReview` means a previously-loaded source has vanished and nothing was applied; re-run with `approve` to accept it."
},
"example": {
"type": "string",
"example": "imported"
}
}
},
"reason": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"code": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Machine-readable cause. `COMPRESSED` means the client's own Cliloc.enu was supplied instead of a converted one."
},
"enum": {
"type": "array",
"example": [
"NO_PATH",
"NOT_FOUND",
"NO_FILE",
"UNREADABLE",
"COMPRESSED",
"TRUNCATED",
"EMPTY",
"NOT_BUFFER"
],
"items": {
"type": "string"
}
}
}
},
"path": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"file": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
}
}
},
"count": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Entries stored (blank strings are dropped)."
},
"example": {
"type": "number",
"example": 67496
}
}
},
"parsed": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Entries read across every source before blanks were dropped."
},
"example": {
"type": "number",
"example": 123527
}
}
},
"blank": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "number",
"example": 55994
}
}
},
"sources": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"nullable": {
"type": "boolean",
"example": true
},
"description": {
"type": "string",
"example": "Per-source breakdown: what each file contributed and how much of it overrode an earlier source."
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"label": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"kind": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"enum": {
"type": "array",
"example": [
"base",
"custom"
],
"items": {
"type": "string"
}
}
}
},
"entries": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"added": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
},
"overrode": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
}
}
}
}
}
}
}
}
},
"missingSources": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"nullable": {
"type": "boolean",
"example": true
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"description": {
"type": "string",
"example": "On `needsReview`: the sources that vanished. Nothing was applied."
}
}
},
"acceptedMissing": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"nullable": {
"type": "boolean",
"example": true
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
}
}
},
"description": {
"type": "string",
"example": "On `imported` with `approve`: the vanished sources the admin accepted."
}
}
}
}
}
}
},
"UoShardLinkRequest": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"required": {
"type": "array",
"example": [
"code"
],
"items": {
"type": "string"
}
},
"properties": {
"type": "object",
"properties": {
"code": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"description": {
"type": "string",
"example": "The one-time code shown by [link in game."
},
"example": {
"type": "string",
"example": "AB12CD"
}
}
}
}
}
}
},
"UoShardLinkResult": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"properties": {
"type": "object",
"properties": {
"linked": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "boolean"
},
"example": {
"type": "boolean",
"example": true
}
}
},
"account": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "whitlocktech"
}
}
}
}
}
}
},
"UoShardLink": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"description": {
"type": "string",
"example": "A linked in-game account (GET /player/shard/accounts)."
},
"properties": {
"type": "object",
"properties": {
"account": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"example": {
"type": "string",
"example": "whitlocktech"
}
}
},
"userId": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"example": {
"type": "number",
"example": 42
}
}
},
"charName": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"nullable": {
"type": "boolean",
"example": true
},
"example": {
"type": "string",
"example": "Darrow"
}
}
},
"linkedAt": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"format": {
"type": "string",
"example": "date-time"
}
}
}
}
}
}
},
"UoTownCrierRequest": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "object"
},
"required": {
"type": "array",
"example": [
"id",
"lines"
],
"items": {
"type": "string"
}
},
"properties": {
"type": "object",
"properties": {
"id": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"maxLength": {
"type": "number",
"example": 64
},
"description": {
"type": "string",
"example": "Re-posting the same id replaces the prior entry."
},
"example": {
"type": "string",
"example": "news-42"
}
}
},
"lines": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "array"
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "string"
},
"maxLength": {
"type": "number",
"example": 200
}
}
},
"example": {
"type": "array",
"example": [
"Hear ye!",
"Market tax is now 5%."
],
"items": {
"type": "string"
}
}
}
},
"durationSec": {
"type": "object",
"properties": {
"type": {
"type": "string",
"example": "integer"
},
"minimum": {
"type": "number",
"example": 1
},
"maximum": {
"type": "number",
"example": 86400
},
"example": {
"type": "number",
"example": 3600
}
}
}
}
}
}
}
}
}
}