Isles of Yore comes with a built in web-server that allows REST communication with the game world.

To start the server, a rest port must be provided, otherwise the server will not start. In your launch arguments, for example add: -restport=8085. You may substitute 8085 for a custom port.

Requests need to have a header "username", and a header "password", with the respective username and password for the web server. See server configuration for how to fill this in.

Note: when "UserID" is mentioned here, this refers to the user's steamid.


Endpoints:

POST @ /Announce

Announces a message in-game.

Request example:

{
	"message" : "Hello there!"
}

POST @ /Commands

Sends a raw command, like can be done with the in-game console.

Request example:

{
	"Command" : "announce",
	"Arguments" : ["test"]
}

GET @ /Session

Gets session details.

Response example:

{
  "SessionStartUnixUTCTimestamp": "1639405145708"
}

GET @ /Ping

Returns status 200 with message "Pong!" if server is up.


Players

GET @ /Players

Gets a list of players.

Response example:

{
  "Players": [
    {
      "UserName": "SomeUsername",
      "UserID": "SomeID",
      "Species": "Coelophysis",
      "Needs": {
        "Eat": 100,
        "Drink": 100,
        "Oxygen": 100,
        "Rest": 100
      },
      "Growth": 22.5,
      "GrowthStage": "Adult",
      "Health": 100,
      "IsAlive": true,
      "Location": {
        "X": -7746.56640625,
        "Y": -2029.3963623046875,
        "Z": 66.06634521484375
      },
      "LoginUnixUTCTimestamp": "1639411750941"
    }
  ]
}

Optionally, add a query string to get a specific player:

GET@ /Players/?userid=someid

Response example:

{
	"Player": {
		"NetId": "SomeID",
		"LastKnownUsername": "SomeUsername",
		"AllKnownUsernames": [ "SomeUsername" ],
		"LogonTimestamps": [
			"1640006726518",
			"1640006726540"
		],
		"UseCustomNameColour": false,
		"CustomNameColour": {
			"R": 0,
			"G": 0,
			"B": 0,
			"A": 0
		}
	},
	"Pawn": {
		"Species": "Coelophysis",
		"PersistedSkin": {
			"BasePresetId": "",
			"BaseColour": {
				"R": 0,
				"G": 0,
				"B": 0,
				"A": 0
			},
			"Alphas": []
		},
		"OwnerNetId": "SomeID",
		"Location": {
			"X": -6634.7255859375,
			"Y": -1459.6689453125,
			"Z": 66.06634521484375
		},
		"Growth": 901.5,
		"Health": 1700.3333740234375,
		"Stamina": 349.85000610351563,
		"Thirst": 280,
		"Hunger": 300,
		"Oxygen": 30
	},
	"HasPersistedPawn": true
}

GET @ /Player/Records

Gets a list of historical players.

Response example:

{
    "Players": 
    [
        {
            "Player": {
                "NetId": "SomeID",
                "LastKnownUsername": "SomeUsername",
                "AllKnownUsernames": [ "SomeUsername" ],
                "LogonTimestamps": [
                    "1640006726518",
                    "1640006726540"
                ],
                "UseCustomNameColour": false,
                "CustomNameColour": {
                    "R": 0,
                    "G": 0,
                    "B": 0,
                    "A": 0
                }
            },
            "Pawn": {
                "Species": "Coelophysis",
                "PersistedSkin": {
                    "BasePresetId": "",
                    "BaseColour": {
                        "R": 0,
                        "G": 0,
                        "B": 0,
                        "A": 0
                    },
                    "Alphas": []
                },
                "OwnerNetId": "SomeID",
                "Location": {
                    "X": -6634.7255859375,
                    "Y": -1459.6689453125,
                    "Z": 66.06634521484375
                },
                "Growth": 919.5,
                "Health": 1704.3333740234375,
                "Stamina": 348.04998779296875,
                "Thirst": 267,
                "Hunger": 289.60015869140625,
                "Oxygen": 30
            },
            "HasPersistedPawn": true
        },
    [...]
    ]
}


Simulation

GET @ /World

Gets world simulation details.

Response example:

{
	"Time": 7.1193399429321289,
	"Weather": "Clear Skies",
	"Season": "Spring",
	"Day": 5,
	"Month": 12,
	"Year": 2042,
	"Lat": -47,
	"Long": -176.74156188964844
}

GET @ /World/Config

Gets current world simulation configuration details.

Response example:

{
	"Spawn": {
		"SpawnWeights": {
			"Arganodus": {
				"Weight": 1,
				"Min": 0
			},
			"Chinlea": {
				"Weight": 1,
				"Min": 0
			},
			"Dipterus": {
				"Weight": 0.5,
				"Min": 0
			},
			"Diplocaulus": {
				"Weight": 0.69999998807907104,
				"Min": 0
			},
			"Ichthyostega": {
				"Weight": 2,
				"Min": 0
			},
			"Triceratops": {
				"Weight": 1,
				"Min": 0
			},
			"Stegosaurus": {
				"Weight": 0.5,
				"Min": 0
			},
			"Tyrannosaurus": {
				"Weight": 1.2999999523162842,
				"Min": 0
			},
			"Deinonychus": {
				"Weight": 2.5,
				"Min": 0
			},
			"Coelophysis": {
				"Weight": 4,
				"Min": 0
			},
			"Suchomimus": {
				"Weight": 0.69999998807907104,
				"Min": 0
			},
			"Spinosaurus": {
				"Weight": 1,
				"Min": 0
			},
			"Kongonaphon": {
				"Weight": 2.5,
				"Min": 0
			}
		},
		"TotalMaxSpawnedAI": 103,
		"RegulationFrequency": 5
	},
	"World": {
		"Geography": {
			"Lat": -47,
			"Long": -176.74156188964844
		},
		"Weather": {
			"AuroraAtNightChance": 0.15000000596046448,
			"SpringWeatherProbabilities": {
				"Clear Skies": 1,
				"Partly Cloudy": 1.5,
				"Cloudy": 0.60000002384185791,
				"Overcast": 0.5,
				"Foggy": 0.34999999403953552,
				"Light Rain": 0.5,
				"Rain": 0.5,
				"Thunderstorm": 0.40000000596046448,
				"Light Snow": 0.17499999701976776,
				"Snow": 0.10000000149011612,
				"Blizzard": 0
			},
			"SummerWeatherProbabilities": {
				"Clear Skies": 1,
				"Partly Cloudy": 1.5,
				"Cloudy": 0.60000002384185791,
				"Overcast": 0.5,
				"Foggy": 0.20000000298023224,
				"Light Rain": 0.5,
				"Rain": 0.5,
				"Thunderstorm": 0.40000000596046448,
				"Light Snow": 0,
				"Snow": 0,
				"Blizzard": 0
			},
			"AutumnWeatherProbabilities": {
				"Clear Skies": 1,
				"Partly Cloudy": 1.5,
				"Cloudy": 0.60000002384185791,
				"Overcast": 1,
				"Foggy": 0.5,
				"Light Rain": 0.5,
				"Rain": 0.5,
				"Thunderstorm": 0.40000000596046448,
				"Light Snow": 0.25,
				"Snow": 0,
				"Blizzard": 0
			},
			"WinterWeatherProbabilities": {
				"Clear Skies": 1,
				"Partly Cloudy": 1.5,
				"Cloudy": 0.60000002384185791,
				"Overcast": 0.5,
				"Foggy": 0.34999999403953552,
				"Light Rain": 0.15000000596046448,
				"Rain": 0.10000000149011612,
				"Thunderstorm": 0.20000000298023224,
				"Light Snow": 0.5,
				"Snow": 0.5,
				"Blizzard": 0.40000000596046448
			},
			"TimeRangeHoldNewWeather": {
				"X": 60,
				"Y": 300
			}
		},
		"Clock": {
			"StartingHour": 7.1826539039611816,
			"StartingDay": 5,
			"StartingMonth": 12,
			"StartingYear": 2042,
			"TimeZone": 12,
			"AllowDST": true,
			"DSTStartDay": 26,
			"DSTStartMonth": 9,
			"DSTEndDay": 3,
			"DSTEndMonth": 4,
			"DSTChangeHour": 2,
			"GameSpeedDay": 0.80000001192092896,
			"GameSpeedNight": 1.1000000238418579
		}
	},
	"PersistWorld": true
}

@TODO: POST @ /World/Config

Sets active world simulation details.

Response example:

{
  
}

GET @ /AI

Gets current AI details.

Response example:

{
	"AI": [
		{
			"IsActive": true,
			"Species": "Tyrannosaurus",
			"Needs": {
				"Eat": 0,
				"Drink": 100,
				"Oxygen": 100,
				"Rest": 60.000003814697266
			},
			"Growth": 5,
			"GrowthStage": "Juvenile",
			"Health": 100,
			"IsAlive": true,
			"Location": {
				"X": -7048,
				"Y": -2226,
				"Z": 74.661392211914063
			}
		}
	]
}

Teams

GET @ /Teams

Gets current teams and their members

Response example:

{
	"Teams": [
		{
			"IsActiveTeam": true,
			"UniqueId": "1B7EE0E04A897FC2C109D6B1B583651F",
			"TeamLeadUniqueNetId": "SomeID_A",
			"TeamMembers": [
				{
					"UniqueNetIdStr": "SomeID_A"
				},
				{
					"UniqueNetIdStr": "SomeID_B"
				}
			],
			"AllowedMemberSpecies": [
				"Coelophysis"
			],
			"MaxMembers": 20
		}
	]
}

Bans

GET @ /Bans

Gets current bans.

Response example:

{
  "Bans": [
    {
      "BanID": "857E364E4B6C355BBB27749E31438977",
      "UserID": "SomeUserID",
      "LastKnownUsername": "SomeUsername",
      "BannedByUserID": "SomeBannerID",
      "BannedByUserName": "SomeBannerUsername",
      "Reason": "Some reason",
      "TimestampUnixUTC": "1639410049138",
      "DurationInSeconds": 0 //currently not used
    }
  ]
}

PUT @ /Bans

Adds a ban.

Request example:

{
	"UserID" : "SomeID",
	"BannedByUserID" : "SomeOtherID",
	"BanReason" : "SomeReason"
}

DELETE @ /Bans

Removes a ban.

Request example:

{
	"UserID" : "SomeID"
}

Admins

GET @ /Admins

Gets current admins.

Response example:

{
	"Admins": [ "SomeID" ]
}

PUT @ /Admins/?userid=someid

Adds an admin, send the userid encoded through a url query component (?userid=someid).

DELETE @ /Admins?userid=someid

Removes an admin, send the userid encoded through a url query component (?userid=someid).


Misc

POST@ /NameColour

Adds a custom name colour, used in the game chat.

Request example:

{
	"UserID" : "SomeID",
	"UseCustomColour" : true,
	"Colour" : {
		"R": 204,
		"G": 0,
		"B": 204,
		"A": 1
	}
}