Index: TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Animal.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Animal.openapi.yaml	(revision 460)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Animal.openapi.yaml	(revision 463)
@@ -34,5 +34,5 @@
         - WorldState
       summary: Animals list
-      description: Fetch a list of the currently spawned animals in the world
+      description: Fetch a list of the currently spawned (non-hostile) animals in the world
       operationId: animal.get
       responses:
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Bloodmoon.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Bloodmoon.openapi.yaml	(revision 463)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Bloodmoon.openapi.yaml	(revision 463)
@@ -0,0 +1,58 @@
+openapi: 3.1.0
+info:
+  title: Bloodmoon
+  version: '1'
+
+components:
+  schemas:
+    BloodmoonObject:
+      type: object
+      properties:
+        gameTime:
+          $ref: './openapi.yaml#/components/schemas/TypeGameTimeObject'
+          description: Current in-game time
+        bloodmoonActive:
+          type: boolean
+          description: A bloodmoon is currently happening
+        nextBloodmoon:
+          $ref: './openapi.yaml#/components/schemas/TypeGameTimeObject'
+          description: In-game time of start of next bloodmoon or the currently running one
+        nextBloodmoonEnd:
+          $ref: './openapi.yaml#/components/schemas/TypeGameTimeObject'
+          description: In-game time of the end of the next bloodmoon - or end of the current one if running
+      required:
+        - gameTime
+        - bloodmoonActive
+        - nextBloodmoon
+        - nextBloodmoonEnd
+
+
+paths:
+  /api/bloodmoon:
+    get:
+      tags:
+        - WorldState
+      summary: Bloodmoon
+      description: Get info on the bloodmoon
+      operationId: Bloodmoon.get
+      responses:
+        200:
+          description: Bloodmoon info
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  data:
+                    $ref: '#/components/schemas/BloodmoonObject'
+                  meta:
+                    $ref: './openapi.yaml#/components/schemas/ResultEnvelopeMeta'
+                required:
+                  - data
+                  - meta
+        403:
+          $ref: './openapi.yaml#/components/responses/Unauthorized'
+      security:
+        - apiTokenName: [ ]
+          apiTokenSecret: [ ]
+        - sessionCookie: [ ]
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Hostile.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Hostile.openapi.yaml	(revision 463)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Hostile.openapi.yaml	(revision 463)
@@ -0,0 +1,58 @@
+openapi: 3.1.0
+info:
+  title: Hostile
+  version: '1'
+
+components:
+  schemas:
+    HostileElement:
+      type: object
+      properties:
+        id:
+          $ref: './openapi.yaml#/components/schemas/TypeEntityId'
+        name:
+          type: string
+          examples:
+            - animalStag
+        position:
+          $ref: './openapi.yaml#/components/schemas/TypeVector3i'
+      required:
+        - id
+        - name
+        - position
+
+    HostileList:
+      type: array
+      items:
+        $ref: '#/components/schemas/HostileElement'
+
+
+paths:
+  /api/hostile:
+    get:
+      tags:
+        - WorldState
+      summary: Hostiles list
+      description: Fetch a list of the currently spawned hostiles - including hostile animals - in the world
+      operationId: Hostile.get
+      responses:
+        200:
+          description: List of hostiles
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  data:
+                    $ref: '#/components/schemas/HostileList'
+                  meta:
+                    $ref: './openapi.yaml#/components/schemas/ResultEnvelopeMeta'
+                required:
+                  - data
+                  - meta
+        403:
+          $ref: './openapi.yaml#/components/responses/Unauthorized'
+      security:
+        - apiTokenName: []
+          apiTokenSecret: []
+        - sessionCookie: []
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Player.cs
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Player.cs	(revision 460)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Player.cs	(revision 463)
@@ -1,4 +1,3 @@
 using System;
-using System.Collections.Generic;
 using System.Net;
 using JetBrains.Annotations;
@@ -215,45 +214,4 @@
 		}
 
-		protected override void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
-			if (!JsonCommons.TryGetJsonField (_jsonInput, "command", out string commandString)) {
-				SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_COMMAND");
-				return;
-			}
-
-			WebCommandResult.ResultType responseType = WebCommandResult.ResultType.Full;
-
-			if (JsonCommons.TryGetJsonField (_jsonInput, "format", out string formatString)) {
-				if (formatString.EqualsCaseInsensitive ("raw")) {
-					responseType = WebCommandResult.ResultType.Raw;
-				} else if (formatString.EqualsCaseInsensitive ("simple")) {
-					responseType = WebCommandResult.ResultType.ResultOnly;
-				}
-			}
-
-			int commandSepIndex = commandString.IndexOf (' ');
-			string commandPart = commandSepIndex > 0 ? commandString.Substring (0, commandSepIndex) : commandString;
-			string argumentsPart = commandSepIndex > 0
-				? commandString.Substring (commandPart.Length + 1)
-				: "";
-
-			IConsoleCommand command = SdtdConsole.Instance.GetCommand (commandPart, true);
-
-			if (command == null) {
-				SendEmptyResponse (_context, HttpStatusCode.NotFound, _jsonInputData, "UNKNOWN_COMMAND");
-				return;
-			}
-
-			int commandPermissionLevel = GameManager.Instance.adminTools.Commands.GetCommandPermissionLevel (command.GetCommands ());
-
-			if (_context.PermissionLevel > commandPermissionLevel) {
-				SendEmptyResponse (_context, HttpStatusCode.Forbidden, _jsonInputData, "NO_PERMISSION");
-				return;
-			}
-
-			_context.Response.SendChunked = true;
-			WebCommandResult wcr = new WebCommandResult (commandPart, argumentsPart, responseType, _context);
-			SdtdConsole.Instance.ExecuteAsync (commandString, wcr);
-		}
-
 		public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
 	}
Index: TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Player.openapi.yaml
===================================================================
--- TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Player.openapi.yaml	(revision 463)
+++ TFP-WebServer/WebServer/src/WebAPI/APIs/WorldState/Player.openapi.yaml	(revision 463)
@@ -0,0 +1,176 @@
+openapi: 3.1.0
+info:
+  title: Player
+  version: '1'
+
+components:
+  schemas:
+    PlayerElement:
+      type: object
+      properties:
+        entityId:
+          $ref: './openapi.yaml#/components/schemas/TypeEntityId'
+        name:
+          type: string
+        platformId:
+          $ref: './openapi.yaml#/components/schemas/TypeUserIdObject'
+        crossplatformId:
+          $ref: './openapi.yaml#/components/schemas/TypeUserIdObject'
+        totalPlayTimeSeconds:
+          type: 'null'
+        lastOnline:
+          type: 'null'
+        online:
+          type: boolean
+          const: true
+        ip:
+          type:
+            - string
+            - 'null'
+        ping:
+          type:
+            - integer
+            - 'null'
+        position:
+          oneOf:
+            - $ref: './openapi.yaml#/components/schemas/TypeVector3i'
+            - type: 'null'
+        level:
+          type: 'null'
+        health:
+          type: integer
+        stamina:
+          type: number
+          format: float
+        score:
+          type: integer
+        deaths:
+          type: integer
+        kills:
+          type: object
+          properties:
+            zombies:
+              type: integer
+            players:
+              type: integer
+          required:
+            - zombies
+            - players
+        banned:
+          type: object
+          properties:
+            banActive:
+              type: boolean
+            reason:
+              type:
+                - string
+                - 'null'
+            until:
+              oneOf:
+                - type: string
+                  format: date-time
+                - type: 'null'
+          required:
+            - banActive
+            - reason
+            - until
+      required:
+        - entityId
+        - name
+        - platformId
+        - crossplatformId
+        - totalPlayTimeSeconds
+        - lastOnline
+        - online
+        - ip
+        - ping
+        - position
+        - level
+        - health
+        - stamina
+        - score
+        - deaths
+        - kills
+        - banned
+
+    PlayerResultObject:
+      type: object
+      properties: 
+        players:
+          type: array
+          items:
+            $ref: '#/components/schemas/PlayerElement'
+      required:
+        - players
+
+
+  parameters:
+    EntityIdParameter:
+      name: id
+      in: path
+      required: true
+      schema:
+        $ref: './openapi.yaml#/components/schemas/TypeEntityId'
+
+
+paths:
+  /api/player:
+    get:
+      tags:
+        - WorldState
+      summary: Players list
+      description: Fetch a list of the currently online players. This is restricted to the player of the logged in user when the logged in user does not have the permission to view all players.
+      operationId: Player.get
+      responses:
+        200:
+          description: List of players
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  data:
+                    $ref: '#/components/schemas/PlayerResultObject'
+                  meta:
+                    $ref: './openapi.yaml#/components/schemas/ResultEnvelopeMeta'
+                required:
+                  - data
+                  - meta
+      security:
+        - {}
+        - apiTokenName: [ ]
+          apiTokenSecret: [ ]
+        - sessionCookie: [ ]
+
+  /api/player/{id}:
+    get:
+      tags:
+        - WorldState
+      summary: Player get
+      description: Fetch the player specified by the given EntityID
+      operationId: Player.get.id
+      parameters:
+        - $ref: '#/components/parameters/EntityIdParameter'
+      responses:
+        200:
+          description: Player
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  data:
+                    $ref: '#/components/schemas/PlayerResultObject'
+                  meta:
+                    $ref: './openapi.yaml#/components/schemas/ResultEnvelopeMeta'
+                required:
+                  - data
+                  - meta
+        404:
+          description: EntityID not found
+          $ref: './openapi.yaml#/components/responses/HttpEmptyEnvelopedResponse'
+      security:
+        - {}
+        - apiTokenName: [ ]
+          apiTokenSecret: [ ]
+        - sessionCookie: [ ]
