Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Welcome to the i3D.net documentation!
This documentation is primarily aimed at people who want to understand the following services provided by i3D.net:
The Game Hosting service can be used by game publishers to dynamically deploy their game servers all over the world, using our bare metal servers, flex metal servers, and cloud VMs.
There are two ways in which developers can learn about the inner workings of the platform:
The Dashboard: For end-users and developers alike.
The API: Learn how to communicate with the API in order to automate deployment related processes.
We have expanded our infrastructure services to also include an Anti-DDoS solution, GLAD (Global Low-Latency anti-DDoS protection). This intuitive solution takes advantage of i3D.net’s extensive global network to prevent, detect, and thwart a strike to your services.
Our product offerings encompass Compute solutions such as Bare Metal and FlexMetal. Bare Metal provides a high-performance, single-tenant computing environment that eliminates virtualization layers, enabling customized hardware configurations to precisely meet specific requirements. FlexMetal combines the strength of physical servers with the flexibility of cloud services. This hybrid model provides the best of both worlds, enabling hourly or monthly billing to fit your needs and optimize costs.
The FlexMetal API is in BETA active development.
We have expanded our cloud provider portfolio to include Tencent Cloud. It is a viable option for game hosting, optimizing your game server performance and player experience. For more information, see our .
At i3D.net, we understand the challenges and uncertainties that come with game hosting. That's why we've developed a cutting-edge and adaptable method to assist you in effectively managing your infrastructure resources throughout the game's entire lifespan. Our complete product offers game build distribution, scaling, and automation. For more information, see .
It's very easy to use our Game hosting dashboard. The following sections describes how to quickly get your game deployed. If you prefer setting up your game hosting through API, please see our .
After you receive your credentials, you will be able to upload your build archive.
After you have uploaded your build archive, you can now create your build by defining your application. This guide will assist you in setting up your Application details, settings, and properties. For more information, see Define your application and create your application build.
In this step, you learn how you can create your game, utility, dependency, or capacity templates.
Create a game template: This will help you define which game application builds will be deployed for that fleet.
Create a utility template: This template will help you to specify which utility / utilities you want to deploy onto each host (Bare Metal or Virtal Machine).
Create a dependency template: This template is used by a fleet and defines which dependency installer and uninstaller application builds will be deployed for that fleet.
Create a capacity template: This template you can define how many game instances you want deployed on any specified BM instance types and / or VM instance types.
In this step, you learn how to configure your infrastructure to deploy your game. You will be able to configure your fleets of servers, defining your deployment profiles to specify how you want your game to be distributed. For more information, see Game deployment environment, profile, and fleets introduction.
Once you have registered your build origin server from the previous step, you can now define your application. You can define your application in the following four types:
A Game server
A Utility / sidecar
A Dependency installer
Nearly all endpoints in the API v3 require authentication as an i3D.net customer.
Authentication occurs in the form of an API key that can be .
By clicking on the Generate API key button on the aforementioned control panel page, you create a new API key.
By default it has no IP whitelisting and no expiration date.
i3D.net provides the "Arcus" management protocol for communication with game servers. This protocol is used by the host agent and by the i3D.net Game Hosting platform to list information about servers such as their name, player count and whether or not they are password protected. Arcus can also be used to send instructions to a game server. E.g. to perform a graceful stop.
Continue reading: Usage
A2S is the standard Steam query protocol. It's simple and only used for querying your game server for information about the game.
Please refer to its manual for more information: Steam query protocol website
The A2S query protocol uses protocol ID 1 in our platform.
For more information on how to setup the A2S query protocol within our platform, please refer to the Supported Management Protocols chapter.
To change your CPU platform, you can only do this with Google Cloud Provider (GCP). In order to upgrade to the CPU platform AMD Milan or later, you must first create a new Virtual Machine (VM) with a new template in ODP. The steps below explain the process.
Go to one.i3D.net and enter your login credentials.
Create a new VM with a new instance template.
After the creation of the new template, i3D.net automatically sends a request in GCP. With that template request, GCP creates a template with the same name. GCP will use this template to create a VM.
Each name is unique on GCP, so if you want to apply this new template on a name that already exists, you must:
Copy the name of the existing template.
Delete the template.
Paste the name on the newly created template.
Select the Series N2D in the drop down list.
Select the Machine type N2d-standard-2 (2 vCPU, 8 GB memory).
Select the CPU platform AMD Milan or later in the drop down list.
Click Create.
Make sure that the advanced settings related to the network match with the GCP and the ODP platform.
You can do this directly in the Game hosting dashboard. Here are the steps to follow below.
Go to Game Hosting > Applications.
In the Application Management page, click Create application.
In the Create Application window, enter the following fields:
Application Name.
(Optional fields) Enter Description, Developer Name, Publisher Name, and Website URL.
Click Next. You will now enter your application settings.
For this example, we will demonstrate how to create a game application.
Select your Application Type. You can select from the following types: Game, Utilities, Dependency Installer, or Dependency Uninstaller.
Select your Management Protocol. You can select from the following protocols: None, A2S, and Arcus. This only applies when your Application Type is Game.
Select your Operating System Group that will run on the machine and be used for the stop method. You can select either Windows or Linux.
Select your Default Stop Method. The stop method that will be used on restart or destroy of an application instance. The default is Hard kill. Depending on your Management Protocol and Operating System Group, you will have a defined selection to choose from.
Select the Stop Method Time-out. This ensures that there are no active players on the instances that are scaled down by the scaler. The default is 0 Seconds (no timeout).
Click Next. To create your application properties, follow the next steps below.
Here you can customize how you want your application to send and receive information. For example, you can define that your application uses a certain network port, or requires a password or multiple ports, and a preset password, or have the system generate a unique password for each ApplicationInstance.
To add a new Application property, click + Add.
Select Type from the drop down list.
Enter the Key.
Enter the Value.
Click the floppy disc icon to save your newly created application property.
Click Create.
Click Save.
Follow the step below to create your application build.
For more explanation about private/public network port properties and private/public network port range properties, see our ApplicationProperty overview documentation
Go to Game Hosting > Applications.
Click the Builds tab.
Click Create build.
On the Create an Application Build window, enter the Application Build Name.
(Optional) Select the Instance does ready callback check box if you want the platform to be informed when it's done initializing and ready to accept players.
Select the Application, CDN Account, and File from the drop down list.
Click Next.
Select your Operating System from the drop down list.
Enter your Application Build Executable.
By default, the Run as root user is check box is selected.
Enter your Version and Startup Parameters.
Select your Host Capacity Template from the drop down list.
Click Next.
Click + Add to set up your labels.
Enter your Key and Value
Click the floppy disc icon to save.
Click Next.
You will see your Application build properties displayed here. To edit, click the pencil icon.
Click Save.
If you want to lock down usage of the API key to one or more IP addresses, or a range of IP addresses then you can fill in a start IP and end IP address for the API key.
API keys can be set to expire at a certain date. To set this up, enter or select a date by clicking on the API Key expidation date field. The API key will expire when the indicated date has been reached.
Authenticating your requests is done by adding a PRIVATE-TOKEN HTTP header containing your API key as the value:
PRIVATE-TOKEN
YOUR_API_KEY
Table 1: API v3 authentication header
Looking for a quick start on game deployment within the Game Hosting platform using our Game Server Orchestrator? Here's how it works:
Before you can begin, you need to register a build origin; a secure web server that hosts your build archives. A build origin can be a web server that you host yourself, or you can use a build origin provided by us.
Once that's registered, upload your build to the origin.
Our platform needs to have some information about the application you're going to deploy. As such, you have to telling us what kind of application it is (a game application to begin with) and you must give it some , like a network (game) port that clients can connect to.
Next you must point to your build archive from within an . Here you enter things like the name of the executable, along with any startup parameters that we need to pass to the game server when starting it.
From within a you point to an Application Build you want to deploy. You need this step because you must point to this later on in the process.
A is the top most element in your deployment hierarchy. It encapsulates all Fleets that must be grouped together for a single purpose. E.g. you can have a development, testing and production environment.
Now it's time to tell the platform where you want your game servers deployed by creating a . Here you must define your geographical deployment regions (based on where you rent bare metal servers from us) and optionally add cloud bursting locations to each region.
A ties all previously created elements together, defining for the platform all details it requires in order to deploy your game servers.
Finally, you must . Sit back and see your game servers come online within a few minutes(1)(2)
¹ the largest factor in deployment time is the size of your build archive that needs to be downloaded ² in order to deploy game servers you first need to have at least one bare metal or flex metal server active in your account
This section of the documentation explains processes within the i3D.net ONE Game Hosting service.
A process is a certain aspect of the Platform that you may have to go through and complete before you can use the Platform, such as setting up your applications and application builds. Or setting up your deployment environment so that our system knows how to deploy your game servers.
Here are all the documented processes where each has a short explanation and a link to the full process documentation.
Application Management is the process of defining and maintaining the applications you want to deploy with the ONE Game Hosting service.
The purpose of the i3D.net ONE Game Hosting platform is to deploy your applications. Providing your build to the platform therefore is a crucial process.
Application Build Management is the process of creating and maintaining software builds for your Application. An ApplicationBuild defines the software that will be deployed by our system. It can be a game server or a utility (side car).
Deployment configuration is the process of setting up how you want your applications to be deployed and where and when.
Dependency Installation is the process of installing software requirements (dependencies) for your applications.
This chapter describes the process of deploying an ApplicationInstance.
Opposite the manual deployment process is the automatic deployment process whereby our platform takes care of deploying game servers and utilities (side cars) for you. This is done according to the Deployment Configuration you have setup for a Fleet.
This chapter explains the logic behind our automatic scaling process.
A patching process is the process of updating game servers / utilities to a new version of the software. There are multiple ways in which this can be done.
Updating your game servers with a rolling update means that you update game servers as soon as they exit naturally or when they are empty and unallocated. This of course only works for game types that have matches that end. Some games do not have the concept of finite matches but instead run forever. That type of game might not be suited for this kind of update method.
No maintenance window is required. What is required is that your back end can handle multiple game server versions alongside each other. Additionally your clients should be able to connect to either version. As you can tell, you should only perform rolling updates if the new version is compatible with the old one.
After a while most game servers will be updated. Any remainders can be Forcibly Updated.
No maintenance window is required
No extra server resources are required. The total amount of game servers will remain equal during a rolling update
Completely transparent to your clients
No way to test your newly deployed game server versions. As such, testing must be done beforehand!
You can perform all of the above manually if you wish, bypassing our automated systems. For more details on how to do this, please see the chapter. Note that you will not receive any live-reporting emails then.
A deployment template defines which applications to deploy for a Fleet.
This section of the documentation elaborates on deployment template elements for game server builds, utilities and dependencency installers.
The GameDeploymentTemplate indicates which [game server] ApplicationBuilds you want to have deployed within a Fleet.
The UtilityDeploymentTemplate indicates which utility / utilities you want to deploy onto each host (bare metal or VM). A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on bare metal servers or virtual machines, or both.
The DependencyDeploymentTemplate enables you to provide scripts that install dependencies onto a Host that are required by your Application(s) to run properly. Besides an installer script, you must also define an un-installer script to remove the dependencies and to allow clean up of a Host after removing all applications running on it.
The figure below depicts the relationships between the different Application related elements:
To use the protocol and fetch information or send requests to a game server, you need to open a TCP connection. The first thing you need to send is the Initialization packet (link to Initialization structure) the server will accept the Initialization or deny it. When it's denied, the server closes the connection. When the server accepts the Initialization it will reply with an "Acknowledged" packet.
You are now ready to communicate with the game server. When you send an instruction to the game server it will respond with a Not implemented packet or an Acknowledged packet to indicate what is going on.
When you request information such as Server information you will not receive an Acknowledged packet but just a packet with the response.
Does your game require a feature that we don't currently support? Please so we can see if we can help with the feature you require.
Each packet contains a version byte in its headers. This byte will be used in case the packet structure will change in the future. By default this value is 1.
Continue reading:
The following examples are full walkthroughs for using the Game Hosting platform via the API.
Deployment configuration is the process of setting up how you want your applications (its builds) to be deployed and where and when.
A deployment configuration is made up of several elements which are described in the following chapters. A deployment configuration always begins with a Deployment Environment.
For the best hosting results and for full control over your game servers and clients, you can integrate some functions of our platform within your game. Although this is not technically necessary, it is recommended.
A smooth release of a multiplayer game with an efficient game hosting solution can help with its success. i3D.net understands the importance of that. To help burgeoning game studios in that endeavor, i3D.net offers a new product: The Game Server Orchestrator. The Game Server Orchestrator is a fully customizable game hosting solution that offers scalability solutions (scaling up / down game servers based on demand), health checks, monitoring, and more.
The DeploymentEnvironment is the topmost element in the deployment configuration hierarchy. It is normally used to reflect a title (game) that you host on our platform, split up into e.g. development, testing and production environments.
Figure 1: DeploymentEnvironment's place in the Deployment Configuration
Our recommendation is to create an environment per title. Additionally, separating your live environment from any development environments is advised so changes and experiments done for development purposes in a development environment won't affect your live environment.
Within a DeploymentEnvironment you can create multiple s, in case you want to separate e.g. different platforms like PC, PS4, Xbox, Switch, etc.
A/B deployment is an update process whereby you deploy new versions of your game servers alongside your already existing game servers. First in small amounts, allowing you to test your new build first with a few clients, maybe a team of internal or external testers. You control the clients that will connect to the new versions via your matchmaker - you do not update all clients at the same time. Only when you are happy with the new game server version will you send all client-update instructions and will you let all other clients join with the new game servers.
This has the side effect that your game servers running the old version will automatically be abandoned once all your clients have updated. When that moment has been reached, you can delete the remaining game servers still running the old version.
We have a core part of the i3D platform which are ping beacons. The ping beacons examine User Datagram Protocol (UDP) traffic to measure latency with a multiplayer games' UDP transport. We operate these beacons in multiple regions so that your game operates optimally. Using a ping beacon will measure the time of sending a UDP message and when you receive a response. In short, the quicker the response received, the lower the latency you have for your games.
User Datagram Protocol is used for multiplayer games since it allows for data transmission at a much faster rate than other protocols such as TCP.
The PatchJobApplicationBuild element describes an old ApplicationBuild ID and a new one to replace the old with.
This element is one of the properties that define the selection of ApplicationInstances to patch. Additionally it defines which new ApplicationBuild to deploy over the olde one.
The other PatchJob properties that create the selection of ApplicationInstances are:
DeploymentEnvironment ID (PatchJob.deploymentEnvironmentId property)
Application ID (PatchJob.applicationId
After sending a request packet, the server must always respond with a packet. If the server does not recognize the request, it can send a Not implemented packet in response so the system will detect that the server cannot handle the request and report back that there is an error and cannot perform the request.
When the server acknowledges the request, it must send the Acknowledged packet back. If the request has a specific response like a Server information response, don’t send the acknowledged packet back but only the response for that specific response.
A cloud instance type defines the amount of hardware resources (e.g. CPU cores & memory) a VM will have available. Some examples of available instance types on different cloud providers:
(AKA machine types)
Within our system you can use any instance type you want or need. You can even use specialized instance types if that suits your requirements. That said, under normal circumstances you would use regular compute instance types.
You must have the following elements to patch a utility:
A VM or a BM with utilities included.
A new application build for your utility.
Once you have met the prerequisites above, you can create a patch job.
Create a utility patch job.
Wait for the patch job to commence.
Your target fleet will be put into manual operational status. You cannot change this while the patch is running. The system will not touch your fleet at this point. This means the system will not add or remove new application instances, VMs, or BMs.
Wait for the patch job to complete.
Once complete, review the patching changes. You can review through the sent emails or manually checking your monitoring tools to ensure that your patch has successfully completed the changes based on your requirements.
After a successful review, place the fleet back in your desired operational status (Auto deployment or Auto scaling).
The patch job will download the new application build on the machine. It will slowly stop the existing application instances, replace the file, and start them again. The Game/Utility deployment template's builds will be updated to the new build as soon as the patch job completes. When you reactivate the fleet, new application instances will now use the new application build.
No maintenance window is required
Allows for testing your new game servers before moving the whole community to the new version
During the A/B deployment process you will have a bit more game servers than normal, occupying a bit more resources, unless you have unused bare metal hosts available
You can perform all of the above manually if you wish, bypassing our automated systems. For more details on how to do this, please see the AB Deployment - Manually chapter. Note that you will not receive any live-reporting emails then.
Please note that you must integrate this flow using i3D SDK manually in your game clients since this is the component that sends the UDP packet towards the i3D.net ping servers. The game backend in most cases pulls the ping server list from i3D.net and passes it to the game client on start up.
You call the API endpoint to receive a complete list of i3D.net ping beacons.
Create a UDP socket.
Send a single UDP datagram on port 3075. The message must begin with 0xffff. Note: You can push other payloads in as long as it starts with 0xffff. You can add your own content.
Next, the ping server will reply with 0x0000.
From there, you can measure the time between sending the UDP message and when you receive a response.
The payload data in a response packet is always a "json" data blob or empty. The length of the payload is mentioned in the packet's header.
Continue reading: Available Opcodes
If your game allows for players in a particular region to play against each other, or players at a similar level of experience to play against each other, you normally create a matchmaker that will decide where a player will end up and who he or she will play against.
Especially the geographical decisions in this process are relevant to our platform. You will want to request a game server from the platform in a certain region.
We have a core part of the i3D platform which are ping beacons. The ping beacons examine User Datagram Protocol (UDP) traffic to measure latency with a multiplayer games' UDP transport. We operate these beacons in multiple regions so that your game operates optimally. Using a ping beacon will measure the time of sending a UDP message and when you receive a response. In short, the quicker the response received, the lower the latency you have for your games.
A management protocol is a means for a game server to be queried or controlled by an external source. In this case the external source is i3D.net's ONE Game Hosting service. A management protocol can be used to query a game server for live game related information (status queries returning the number of players, the current map, rules, etc), or for sending commands for e.g. a graceful (soft) stop.
Many game servers have an initialization process to go through when starting up. This has the effect that the game server will not actually be usable during this initialization period. Our platform should know about this, otherwise it will assume the game server is ready to accept clients immediately after starting. For this to be possible, your game server can let our back end know when it is ready to accept players. We refer to this as a "game server run-status update" and can be performed by having the game server make an API call either towards our public API, or locally towards our Host Agent.
It is possible to receive events from within our platform, allowing you to get more insight into which actions it performing. You could log these for your own purposes.
At the time of writing this is an experimental feature that we are testing with a few clients. There is no publicly available endpoint that allows to you automatically sign up to our event stream. But you can request access to it via the usual support channels.
All instance types can be fetched from GET /cloud/instanceType.
In theory you can choose any instance type you deem fit for running your game servers. However, we recommend using the largest instance types possible so that you effectively create a VM that uses all hardware resources of a host, with the result that you are the only one with a VM on that host. That way you will lower the risk of suffering the "noisy neighbour" effect whereby other VMs on a host consume a lot of resources, potentially causing unwanted network lag or processor spikes for your VM. Since game servers must perform well for an optimal gaming experience for your clients, predictable performance is desired and as such, "renting" an entire host reduces risk.
Much to contrary belief, cloud providers do not have an endless supply of VMs and hosts. A certain instance type can and will run out in random regions. For this reason it is highly recommended to configure a secondary instance type for each cloud data center location you select to use. This way you have an alternative in case your primary instance type is sold out.
To determine which instance type best suits your needs, some profiling needs to be performed. If oyu are unsure how to proceed with this, feel free to contact us for help with profiling your game servers and determining the resources they need.

Before you can create a Deployment Configuration, you must first create an Application with at least one ApplicationBuild.
Please refer to the Application Management and Application Build Management chapters for more information on creating these elements.
The DeploymentEnvironment element sits at the top of a deployment configuration. This is a simple element with just a name. We recommend creating a Deployment Environment for each game / title you host on our platform. Though during e.g. development of your software you could also create environments meant for testing. This way you can create environments for different purposes.
The Fleet element is on the second layer within the deployment configuration hierarchy. It is a direct descendant of the DeploymentEnvironment element and is essentially just a sub-divisor of said element. Its children are the Deployement Templates and Deployment Profile. Only one fleet can be deployed on a host at a time.
Deployment Templates represent which applications (builds) will be deployed within a fleet. There are two types of templates: Game Deployment Templates and Utility Deployment Templates.
The Utility Deployment Template indicates which utility / utilities you want to deploy onto each host. A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on bare metal servers or virtual machines, or both.
When a new host is selected for deployment of game servers, the utility will be the first thing to be deployed onto the host. Reversely, when a host has been freed from any game server applications, the utilities will be removed again, cleaning up the host.
The Game Deployment Template indicates which game server builds you want to have deployed within a fleet.
The DeploymentProfile element - also known as a Scaling Profile - defines where and how your Application will be deployed. It contains all the Deployment Regions which in turn contain all the individual data center (DC) locations within said regions. Cloud VMs and their creation specifications are also indicated here.
The DeploymentRegion element defines a geographical region that contains one or more i3D.net DC locations. You must have bare metal servers rented in these locations in order to add them.
The DeploymentContainer and DeploymentContainerLocation elements define cloud (DC) locations to burst towards when your bare metal pool runs dry.
The automatic deployment mechanism needs to know how many game instances it can deploy on a given host. Without giving the system any hints, it will default to deploying one instance per physical core. To deviate from this default you must create a HostCapacity template.
With the HostCapacityTemplate element you can define how many game instances you want deployed on any specified BM instance types and / or VM instance types. The actual definitions of the instance types and capacities themselves are defined in the InstanceTypeCapacity elements, which are assigned to this HostCapacityTemplate upon creation.










Read-only
The IP address
version
int
Read-only
IP version (4 or 6)
type
int
Read-only
IP type: 1 Normal 2 KVM 3 VRRP1 4 VRRP2 5 gateway
private
int
Read-only
0 Public IP 1 Private IP (RFC-1918)
Table 1: HostIp element structure
The HostIp element is part of the Host element and is not used stand-alone.
ipAddress
string
id
string
Read-only
Unique identifier of this element
string
Yes
The email address to send PatchJob reports to
progressReport `
int
Yes
Table 1: PatchJobEmail element structure
This element is not created individually, but is included in, and created with the PatchJob element.
id
string
Read-only
Unique identifier of this element
name
string
Yes
Name of the deployment environment
createdAt
int
Read-only
Table 1: DeploymentEnvironment element structure
Create a new DeploymentEnvironment within your i3D.net account.

id
string
Read-only
Unique identifier of this element
total
int
Read-only
Total number of affected ApplicationInstances
preLoaded
int
Read-only
Total number of pre-loaded ApplicationBuilds
success
int
Read-only
Total number of successfully patched ApplicationInstances
failed
Table 1: PatchJobOverallProgress element structure
This element is not created individually, but is included in, and created with the PatchJob element.
One or more Fleet IDs (PatchJob.fleet property)
id
string
Read-only
Unique identifier of this element
oldApplicationBuildId
string
Yes
The ApplicationBuild ID to replace
newApplicationBuildId
string
Yes
Table 1: PatchJobApplicationBuild element structure
This element is not created individually, but is included in, and created with the PatchJob element.
id
string
Read-only
Unique identifier of this element
markedForDeletion
boolean
Read-only
Name of the deployment region
containerLocations
[]
No
Table 1: DeploymentContainer element structure
DeploymentContainer elements are not created separately, but are always created and updated inside the DeploymentRegion element inside the containers property.

Application Management is the process of defining and maintaining the applications you want to deploy with the ONE Game Hosting service.
An Application is defined by the following two elements:
Application definition elements:
For information on maintaining builds for your Application, please see the chapter.
To be able to deploy an imaginary game called "Bluewolf", you first have to create an Application element, defining your application within the platform. It would be specified as follows:
JSON request data :
The value 2 for managementProtocol stands for the management protocol.
Next, ApplicationProperty elements are added to the Application. This is necessary for Application configuration and to ensure the platform knows how to deploy related instances:
JSON request data :
The value 1 for propertyType stands for "public network port". In this case we give it the name game_port and the default value of 0. Passing 0 instructs the platform to find a random free port each time an application instance is started.
JSON request data :
The value 6 for propertyType stands for "private network port". Giving your Application a managementport property tells the platform that your game servers can be queried for information, or that commands can be issued. The latter depends on the value of the Application.management_protocol property you provided while creating the Application. Just like with the previous game_port property, the value 0 tells the platform to pick a random port on each application instance start.
JSON request data :
This is a raw property. The platform does not use these internally for any kind of functionality and these properties are here only for your own reference, or to use as a static configuration parameter in your game server startup configurations.
We now have a complete Application element with definitions for:
application type, Application.type = 1 (game)
a managementProtocol, Application.managementProtocol = 2 (Arcus)
a management private network port, ApplicationProperty "managementport" with default value 0 (random port)
This element details the CPU information of a Host.
socket
Table 1: HostCpu element structure
You can tell whether hyperthreading is enabled by looking at the cores and threads properties.
The cores property represents physical cores. The threads property represents logical cores.
Hyperthreading is enabled when threads is double the amount of cores.
Hyperthreading is disabled when threads is equal to the amount of cores.
The Cpu element is part of the element and is not used stand-alone.
The following terms are used throughout the documentation pages and should be understood in order to fully comprehend the components and inner workings of the i3D.net Game Hosting service.
Term
Description
Allocation
The process of allocating (reserving) a game server for players to connect to. This is normally done by a Matchmaker.
Application
The application you want the Platform to host. This can be a game server application, or any kind of utility you want to run alongside your game server.
Application Build
An element containing execution information and meta data about an Application Install.
Application Instance
A single deployed application build, e.g. a deployed game server, or a deployed utility.
AWS
The DeploymentContainerLocation element defines a cloud (dc) location to burst towards when your bare metal pool runs dry.
Figure 1: Highlighting where the DeploymentContainerLocation elements belong in the overview.
Table 1: DeploymentContainerLocation element structure
DeploymentContainerLocation elements are not created separately, but are always inside the containers property, as children of the elements.
This element describes an IP address of an ApplicationInstance. Every ApplicationInstance element has one or more IP addresses. Virtual hosts have both private (internal) and public IP addresses, whereas bare metal hosts normally only have a public IP address, unless you have a custom networking setup.
Table 1: ApplicationInstanceIP element structure
An ApplicationInstance will have at least one public IP address. An instance deployed onto a VM will additionally have at least one private IP address (). The reason for this is that a VM has no public IP address defined on the host level, but instead gets its public IP address via NAT. This means that the VM host itself only has knowledge of private IP addresses and not any public ones. The illustration below explains this further:
[](images/BM-&-VM-ip-address-assignment.png) Figure 1: BM & VM IP address assignment
Our platform has knowledge about all IP addresses involved with a bare metal server or VM. As such it can populate an element with all public and private IP addresses related to the host it's deployed on.
If you must bind a specific IP address to your application's socket(s), care must be taken during configuration of your 's properties.
When configuring an application, you can use in your application's startup parameters or configuration file(s). If you have a socket that must be bound to a specific IP address, note that you should use the platform variable VARIPV4BINDING or VARIPV6BINDING. These variables contain the correct IP addresses to use for socket binding, depending on whether your application is being deployed onto a bare metal (BM) server or a cloud VM. If it concerns a BM, a public IP address will be used. Otherwise, on a VM, its private IP address will be used, allowing your application to bind to the correct socket.
If you specifically need the public IP addresses of an ApplicationInstance during Application configuration, you can use the platform variable VARIPV4PUBLIC. See the chapter on for all available platform variables.
Version: v0.9.1 (Beta)
All v1.0 features are complete and ready for integration and use. Customer iteration will determine any final changes before labelling as v1.0.
The SDK provides games with the ability to communicate with the i3D.net ONE Platform, for easy scaling of game servers! In order to integrate Arcus into the Game Server itself, you will need to read the following guides:
Build – How to build and test the repository.
Integration Guide – How to integrate the Arcus API into a Game Server.
The i3D.net Game Hosting SDK works on Windows and Linux. If you need further assistance after reading the documentation, please .
C/C++ v11 library.
Easy-to-use C API interface for maximum language compatibility.
Source-only build allowing for "copy and drop-in" of files.
Supported platforms:
The below are not provided or part of current goals. Please for change requests.
Testing on Linux distros other than Ubuntu 18.04.
The SDK is made up of code to be integrated into the Game plus additional components that aid in the testing, development and integration.
is the library that provides communication between the Game Server and the scaling environment in the One Platform. It is to be integrated into the Game Server. It contains a C/C++ implementation of the ONE platform's Arcus protocol and messages, and provides a TCP server to communicate with the ONE Platform.
is a library that provides a way to obtain server addresses of the ONE backend and utilities to ping the servers, for use in a game's player client code's matchmaking features.
contains samples that use the SDK components to aid in integration, development, and testing.
Unity engine support is implemented as a plugin which is available .
Unreal engine support is implemented as a plugin which is available and also located in our documentation .
The PatchJobFleet element describes a Fleet whose ApplicationInstances will be patched (in combination with other selectors).
This element is one of the PatchJob properties that define the selection of ApplicationInstances to patch.
The other PatchJob properties that create the selection of ApplicationInstances are:
DeploymentEnvironment ID (PatchJob.deploymentEnvironmentId property)
Application ID (PatchJob.applicationId property)
One or more old ApplicationBuild IDs (PatchJob.applicationBuild property)
Table 1: PatchJobFleet element structure
This element is not created individually, but is included in, and created with the element.
The ONE Game Hosting platform has a patching mechanism that makes it easy for you to update builds for already running application instances. You can perform updates in different ways, using different patching methods. Each method has a different purpose and performs different actions. To learn more about each patching method, choose one of the following:
When creating a new Patch Job, you can choose one of these methods and make a selection of which application instances to update. You can run the Patch Job right away, or schedule it to run at a later time. Reporting emails will be sent to any email addresses you submit inside the Patch Job. Reporting will start as soon as the Patch Job begins giving you an overview of which instances will be affected. During the patching process itself we keep sending report emails to show you the patching progress. When all is done, a final report will be sent. More details about the different patching method and all the Patch Job settings can be found in this and the following chapters.
This chapter describes the process of deploying an .
Before an ApplicationInstance can be deployed, you must first create a . This ensures you have a with s and s. Hosts (bare metal servers in your account or VMs) onto which ApplicationInstances are deployed will automatically become part of a region based on their geographical location.
Here is a schematic overview of the resulting structure:
Figure 1: Deployment (environment) structure with ApplicationInstances
With the HostCapacityTemplate element you can define how many game instances you want deployed on any specified BM instance types and / or VM instance types. The actual definitions of the instance types and capacities themselves are defined in the elements, which are assigned to this HostCapacityTemplate upon creation.
The SDK contains multiple separate components providing specific functionality. This integration guide will provide information of how to integrate the Arcus and Ping components.
Arcus Component: For communication between Game Server and the ONE Game Hosting Platform.
Ping Component: For obtaining available servers and pings from the game's Player code.
Once you have defined your application and created your application build from the previous step, you can now create your templates. Follow the instructions below.
A Game template is used by a fleet and defines which game application builds will be deployed for that Fleet. You can create as many Game templates as you like on the platform. However, a Fleet can only point to one Game template at a time. A Game template can be shared across multiple fleets though.
If an uses configuration files (e.g. setup.cfg), then these can be submitted and assigned to an in the form of ApplicationBuildConfiguration elements. Each of these elements represent a configuration file. An ApplicationBuild can have zero or more ApplicationBuildConfiguration elements.
{
"name": "Bluewolf"
}[
{
"id": "173892217340309897",
"name": "Bluewolf",
"createdAt": 1568312996
}
]The goal of the integration is for the game server to host an Arcus Server over TCP, allowing the ONE Platform to connect to the server to send and receive Arcus messages.
The one/arcus folder must be copied to the project and configured for building.
Alternatively, to integrate binaries and headers:
Build the repository.
Copy the static lib found in build/one/arcus/one_arcus.lib/a.
Either way, the following headers must be included in the game server:
one/arcus/c_api.h
one/arcus/c_error.h
one/arcus/c_platform.h
For C++ game engines, the additional C++ code in one/fake/arcus/game is can be used in your integration to wrap the C API and provide easy-to-use C++ interfaces for the game engine.
The ONE Server Wrapper, defined in one/fake/arcus/game/one_server_wrapper.cpp, is the core of this sample. It is a C++ header/cpp wrapper around the ONE Arcus Server API that does the following actions:
Isolates the ONE API from the rest of the game code.
Contains in-source code comments explaining the motivation and purpose of the API calls from the user's perspective.
Can be directly copied and used as a head-start for developers integrating the library into their own engines.
See the Fake Game readme for details.
While developing the integration, the Game Server may be tested by building and running the Fake Agent. The Fake Agent can connect to a running instance of the game server, to test the basics of the integration without needing to deploy to the remote ONE Platform.
Once the integration is complete, the Game Server must be deployed to the ONE Platform for final testing. This consists of the following steps:
Setup an application on the ONE Platform.
Deploy the Game Server with the Arcus integration to the ONE Platform.
Use the platform dashboard and tools to confirm the Agent is successfully connected with the server and that all messages are functioning as expected.
The One Arcus API has relatively low network activity. It's rare for messages to be sent and received. The most common messages will be small keep-alive packets sent and received several times a minute.
The goal of the integration is to obtain network ping latency values from the player to the game server locations.
The one/ping folder must be copied to the project and configured for building.
Alternatively, to integrate binaries and headers:
Build the repository.
Copy the binaries found in build/one/ping.
Either way, the following headers must be included in the game server:
one/ping/c_api.h
one/ping/c_error.h
one/ping/c_platform.h
For C++ game engines, the additional C++ code in one/fake/ping can be used in your integration to wrap the C API and provide easy-to-use C++ interfaces for the game engine.
The sites and pingers wrappers, located at one/fake/ping/i3d_sites_getter_wrapper.cpp and one/fake/ping/i3d_pingers_wrapper.cpp, are the core of the sample integration. They are C++ header/cpp wrappers around the i3d Ping C API that:
isolates the ONE API from the rest of the game code
contains in-source code comments explaining the motivation and purpose of the API calls from the user's perspective
can be directly copied and used as a head-start for developers integrating the library into their own engines
See the Fake Game readme for details.
No special testing configuration is needed. Integrate the ping component into your game and inspect the results for correctness.
The library performs HTTP calls (through your engine's own solution), decodes JSON, and makes outgoing TCP ping calls. The frequency of this activity can be controlled directly by your integration.
When you create a game deployment template, it will indicate which game server application builds you would like to have deployed within a fleet.
Go to Game Hosting > Templates.
Select the Game tab.
Click Create template.
On the Create Game Template window, enter the Game Template Name.
Select your Application Build.
Click Create.
The UtilityDeploymentTemplate indicates which utility / utilities you want to deploy onto each host (Bare metal or Virtual machine). A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on Bare metal servers or Virtual machines, or both.
Go to Hosting > Templates.
Select the Utility tab.
Click Create template.
Enter your Template name.
Select your Application Build from the drop down list.
Select what machines you want to Deploy on from the drop down list.
Click Create.
The Dependency template enables you to point to scripts (ApplicationBuilds) that install dependencies onto a host that are required by your Applications to run properly. Besides an installer script, you must also define an uninstaller script to remove the dependencies and to allow clean up of a host after removing all applications running on it.
Go to Game Hosting > Templates.
Select the Dependency tab.
Click Create template.
Enter your Template name.
Select your Dependency Installer Build from the drop down list.
Select your Dependency Uninstaller Build from the drop down list.
Click Create.
When you create your own host capacity template, you define how many game instances you want deployed on any specified Bare metal and/or Virtual machine instance types.
Go to Game Hosting > Templates.
Select the Host Capacity tab.
Click Create template.
Enter a Template name.
Click Add host capacity.
Select a Provider from the drop down list.
Select your Instance Type from the drop down list. Please note that depending on your Cloud provider choice, your instance type selections will differ.
Click Save.
Indicates whether to send progress reports to the email address (0: no, 1: yes)
resultReport
int
Yes
Indicates whether to send the final report to the email address (0: no, 1: yes)
createdAt
int
Read-only
A unix timestamp of when this element was created
A unix timestamp of when this element was created
int
Read-only
Total number of failed (to deploy) ApplicationInstances
The ApplicationBuild ID that will replace the old one
int
Read-only
Number of populated CPU sockets
cores
int
Read-only
Total number of cores (sum of all CPU cores)
threads
int
Read-only
Total number of threads (sum of all CPU threads)
info
string
Read-only
CPU information
type
string
Read-only
CPU type
ipAddress
string
Read-only
An IP address
ipVersion
int
Read-only
4: IPv4 6: IPv6
private
int
Read-only
0: public IP address 1: private IP address
Windows 10 Pro, Visual Studio 2017 and VSCode
Ubuntu 18.04, VSCode
Docs contains additional readme files and DOxygen configuration.
Length
uint
Length of the payload data
Payload
JSON string
Optional payload of the packet
byte
8 bit character
ushort
16 bit unsigned integer
uint
32 bit unsigned integer
ulong
64 bit unsigned integer
Version
byte
Version number of the request
Flags
byte
Request packets use 0x01
Opcode
byte
Identifier of the request
Reserved
byte
A reserved byte not in use right now but can be used for future purposes
id
string
Read-only
Unique identifier of this element
fleetId
string
Yes
The Fleet ID to include in the PatchJob
List of DeploymentContainerLocation elements that indicate data center locations that belong to a region
Amazon Web Services - we always refer to the EC2 section.
Bare Metal Server
A physical server in a data center. More information.
Deployment Environment
The topmost element that encompasses all of your deployment related configurations for a hosted game. More information
Deployment Profile
The profile that defines how and where your applications are deployed. More information
Game Instance
An Application Instance of type "game". See Application Instance.
Game Server
An Application Instance of type "game". See Application Instance.
GCP
Google Cloud Platform - we always refer to the Compute section.
Host
A machine that hosts your application instances. This can be a bare metal machine, or a virtual machine - the word Host is agnostic in this sense and simply refers to an OS in which programs can be installed and run. More information
Matchmaker
A back end service run by game publishers that allocates game servers in the regions where game clients want to play a game or match and informs said game clients about the game server details, so they know where to connect to.
Patching
This is the process of updating game servers / utilities to a new version of the software.
Preloading
To shorten deployment times during an update process, the software archive / build you want to deploy will be uploaded and extracted onto all applicable hosts, before starting the actual deployment process. More information
Utility Instance
See Application Instance.
Virtual Machine
A virtualized server. Often hosted at e.g. AWS or GCP, on a large bare metal server that hosts one or more virtual machines. More information.
There is a different procedure for patching utilities. For more information, see the Utility Patching Process documentation.
A Patch Job is always applied to a certain selection of application instances (game servers only). To make a selection, you must configure a number of options when creating a Patch Job:
DeploymentEnvironment
The DeploymentEnvironment within which you want to perform a build update
Application
The Application that you want to patch
ApplicationBuild
The currently running ApplicationBuild you want to replace with a new build
Fleet(s)
One or more Fleet elements within which we look for the given ApplicationBuild to update
Table 1: Patch Job instance selection parameters
After creating a selection of Instances, you can configure the Patch Job itself and provide some details:
Name
The Patch Job Name
Method
The patching method, e.g. Forced deployment, Rolling deployment, A/B deployment
Start time
The desired start time of the Patch job
Graceful stop(-timeout)
Whether or not to send a graceful stop command as opposed to an immediate stop. Comes with a maximum-drain-timeout value
Comments
Any comments you would like to add to the Patch Job - maybe for other viewers to see
Reporting email addresses
You will receive start, progress and final reports on the email addresses you provide
Table 2: Patch Job details and configuration parameters
You can accompany the Patch Job with a list of email addresses to which we will send start, progress and final reports. You can indicate for each email address whether to receive start & final reports and / or progress reports.
5 minutes before the start time of a Patch Job, distribution of the new build towards all the relevant hosts begins, allowing for a quicker patching process later on.
Once the start time has been reached, the Patch Job will begin to run. First it collects information on all the application instances in your Patch Job selection and generates an initial report about it, which is sent to all relevant email addresses stored within the Patch Job.
Then the patching process itself begins. Which actions are performed depend on the selected patching method and are described in their respective chapters:
Once the Patch Job is complete, a final report is generated and sent to all relevant email addresses.
You can cancel a Patch Job for as long as it's not finished yet. If you cancel a running Patch Job, we stop issuing new commands and update the Job's status. Then we revert all the already performed actions by creating an inverted Patch Job which will start running immediately.
The patching process introduces a few elements, used by all patch options:
PatchJob - the element representing a scheduled patching process
PatchJobProgressReport - the element containing information about an ongoing PatchJob
PatchJobFinalReport - the element containing a summary of a completed PatchJob
Read-only
The type of disk
diskMedium
string
Read-only
The medium of this disk
model
string
Read-only
The model name of this disk
product
string
Read-only
The product string of this disk
diskSerial
string
Read-only
The serial number of this disk
firmwareVersion
string
Read-only
Firmware version
rotationRate
int
Read-only
Rotational rate (does not apply to SSD)
sectorSizeLogical
int
Read-only
Logical sector size
sectorSizePhysical
int
Read-only
Physical sector size
size
int
Read-only
Disk size in bytes
Table 1: HostDisk element structure
The HostDisk element is part of the Host element and is not used stand-alone.
diskType
string
Read-only
The brand name
model
string
Read-only
The model name
size
int
Read-only
Size in bytes
speed
int
Read-only
The speed this memory module runs at
ecc
int
Read-only
Set to 1 if ecc is supported and enabled
memoryBank
int
Read-only
The bank this module sits is
memoryType
string
Read-only
The type of memory module
memorySlot
string
Read-only
The slot this module sits in
memorySerial
string
Read-only
The serial number of this module
Table 1: HostMemory element structure
The HostMemory element is part of the Host element and is not used stand-alone.
brand
string
a game server public network port, ApplicationProperty "game_port" with default value 0 (random port)
a default revision value, ApplicationProperty "revision" with value 1.2.13
id
string
Read-only
Unique identifier of this element
name
string
Yes
The name of the HostCapacityTemplate
createdAt
int
Read-only
A unix timestamp of when this element was created
Table 1: HostCapacityTemplate element structure
Create a new HostCapacityTemplate within your i3D.net account.
A HostCapacityTemplate can be assigned to a Fleet. Here is a simple example to show you how:
A HostCapacityTemplate can also be assigned to an ApplicationBuild. This will override a HostCapacityTemplate set in the Fleet. This is useful if you want to test optimizations of a new build, to see if you can deploy more game instances than before.
This element contains a list of InstanceTypeCapacity elements.
{
"type": 1,
"managementProtocol": 2,
"name": "Bluewolf",
"websiteUrl": "www.bluewolf.game.com",
"description": "Life is not the same after meeting your worst enemy",
"developerName": "Crywolf",
"publisherName": "ThePubs"
}{
"propertyType": 1,
"propertyKey": "game_port",
"propertyValue": "0"
}{
"propertyType": 6,
"propertyKey": "managementport",
"propertyValue": "0"
}{
"propertyType": 0,
"propertyKey": "revision",
"propertyValue": "1.2.13"
}{
"name": "MyHostCapacityTemplate"
}[
{
"id": "4943474277300823573",
"name": "MyHostCapacityTemplate",
"createdAt": 1579007256
}
]{
"hostCapacityTemplateId": "4943474277300823573"
}[
{
"id": "7420099900751948711",
"name": "Bluewolf PC",
"deploymentEnvironmentId": "173892217340309897",
"deploymentProfileId": "8068976724396537810",
"gameDeploymentTemplateId": "2190484266497878757",
"utilityDeploymentTemplateId": "1316371245160957961",
"dependencyDeploymentTemplateId": "6537333393893172977",
"hostCapacityTemplateId": "4943474277300823573",
"operationalStatus": 0
}
]{
"hostCapacityTemplateId": "4943474277300823573"
}[
{
"id": "794401102378076360",
"name": "Bluewolf PC build",
"applicationId": "7983757100270474749",
"type": 1,
"executable": "GameServer",
"startupParameters": "-applicationInstanceId VARAPPLICATIONINSTANCEID -maxplayers 8",
"instanceDoesReadyCallback": 0,
"installId": 8675,
"osId": 151,
"hostCapacityTemplateId": "4943474277300823573",
"createdAt": 1568899371,
"label": []
}
]primaryInstanceTypeName
string
Yes
The primary instance type to use
secondaryInstanceTypeName
string
No
The secondary instance type to use
cpuPlatform
string
No
The CPU platform to use for the given cloudProviderId. Get all possible values from . Note that this selector is currently only required for the GCP cloud platform)
markedForDeletion
boolean
Read-only
If set to true, the platform will gracefully remove all game servers and VMs in this cloud location. Afterwards this cloud location will really be deleted
id
string
Read-only
Unique identifier of this element
cloudProviderId
int
Yes
The cloud provider ID of this location
dcLocationId
int
Yes

The dcLocation ID (see )
GET https://api.i3d.net/v3/deploymentEnvironmentAuthentication occurs via an API key. Creation and usage is explained in the API Authenticaton chapter.
All endpoints presented by the API including their input and output headers, parameters, request and response objects are documented at the following URL:
Our API v3 is based upon REST principles. It is however mostly used as a CRUD API. This means that you are almost always working with objects that you can Create, Read, Update and Delete. Even when you initiate a process like starting a game server with:
POST /applicationInstance/{applicationInstanceId}/start
With this POST request you are still creating an object (a Task) that represents the process of starting an application instance and allows you to track that process. As such nearly all endpoints (unless stated otherwise) will return one or more objects, except certain DELETE requests, which will return 204 No Content with no response body.
All valid GET, POST and PUT requests return a 200 OK response code and an array of objects in JSON format in the response body. Even if the response contains only one object you will still get an array with that one object inside.
DELETE requests always return a 204 No Content without a response body.
In case your API request triggered an error, an error object will be returned:
The Error object contains an errorCode allowing you to programmatically handle it. There also is an errorMessage for humans to read.
Additionally an array of errors is returned in the object for additional information on what went wrong. E.g. if you have errors in a submitted object, this array will contain the error specifics.
Further reading: handling API errors
Erroneous requests will have any of the following HTTP response codes, depending on the type of error:
401 Unauthorized
When failed.
403 Forbidden
When you are not allowed to perform a certain action E.g. when your IP is banned by the system, or when you are attempting to perform an action outside of the allotted time window.
404 Not Found
When a requested entity could not be found.
422 Unprocessable Entity
When a submitted entity contains errors. The specific errors will be mentioned in the returned Error object.
500 Internal Server Error
When there was an internal problem with the server or API.
Table 1: HTTP response codes for errors
A RESTful architecture can allow for caching of individual elements returned by the API. However we recommend you do not cache any elements, because they may be altered by other people or services at any point in time. As such we do not indicate caching hints in our API responses.
ApplicationInstances will normally be deployed dynamically and automatically by the platform. You can however deploy them manually as well, e.g. if you just want to test a build.
Manually deploying new ApplicationInstances is a two-step process:
The first step into deploying a new ApplicationInstance is to create an entity for it. From that moment on it exists in our system (but is not yet deployed):
JSON request data ApplicationInstance:
Parameter fleetId can be obtained from GET /fleet
Parameter hostId can be obtained from GET /host
With the entity created, you can now deploy an ApplicationBuild for it:
JSON request data:
Parameter applicationInstanceId is the ID of the previously created ApplicationInstance.
Parameter applicationBuildId can be obtained from GET /applicationBuild
This call will trigger the deployment process for the ApplicationInstance.
ApplicationInstances are normally deployed automatically by the platform. This would at least be the case for the live environment of your game. For this to happen, all you have to do is enable automatic deployment and / or automatic scaling in the Fleet(s) created for your live environment. Please see the Fleet's Operational Status documentation.
For the complete documentation on automatic deployment and scaling, please see the Automatic Deployment chapter.
Below is a schematic overview of the (automatic) deployment process for an ApplicationInstance:
Figure 2: ApplicationInstance deployment process
The default installPath and instancesPath on Linux are:
installPath: /home/gameinstalls
instancesPath: /home/gameinstances
The default installPath and instancesPath on Windows are:
installPath: C:\localuser\gameinstalls
instancesPath: C:\localuser\gameinstances

Deployment Templates
Host Capacity Templates
id
string
Read-only
Unique identifier of this element
configPath
string
Yes
A path relative to the root of an application
configName
string
Yes
The name of the configuration file
configContents
string
Yes
The contents of the configuration file
createdAt
Table 1: ApplicationBuildConfiguration element structure
The configPath property defines in which folder to store the configuration file. The folder is always relative to the root (working directory) of the deployed ApplicationInstance's folder on the Host.
if the folder does not exist, it will be created
if configPath is /, \ or ., it will be translated to point to the ApplicationInstance's working directory
See also: Application element relations
You can have any number of ApplicationBuildConfiguration elements assigned to an ApplicationBuild. There is no limit.
This document introduces you to the three concepts of the deployment configuration hierarchy. Next, you will learn how to create your own environment, profile, and fleets in the dashboard.
Deployment environment: The deployment environment is the top most element in the deployment configuration hierarchy. It is normally used to reflect a game title that you host on our platform, split up into development, testing, and production environments.
Fleet: The Fleet is the second layer within the deployment configuration hierarchy, which represents a collection of hosts (Bare metal or Virtual machines). You can have as many Fleets under a deployment environment as you like. There are no limits.
Deployment profile: The deployment profile is the main element that determines how your application instances will be deployed.
It's recommended to create an environment per title. Additionally, it's advised to separate your live environment from any development environments. When you separate the environments, changes and experiments done for development purposes in a development environment won't affect your live environment. Within a game deployment environment, you can create multiple Fleets in case you want to separate for different platforms such as PC, PS4, Xbox, Switch, and more.
Go to Game Hosting > Deployments.
Click Create enivronment.
Enter your Environment Name.
Click Create.
A deployment profile is always the only child of a fleet. You can only have one deployment profile per fleet.
Go to Game Hosting > Deployments.
Select the Profiles tab.
Click Create Profile.
Enter the Name of your profile.
After you have created your deployment profile name, click the cog icon to the right of the profile name to set your Profile settings.
On the Profile page, the default Global Strategy setting is Round Robin. For more information about the Round robin strategy, see .
To define the amount of instances you want to deploy in a specific region, enter your Miniumum amount of instances and Maximum amount of instances in the Global Capacity section.
Next you will need to create your region. Follow the steps below.
This defines a geographical region that contains one or more i3D.net data center (dc) locations.
On the Profile settings page, click Create region.
On the Create Region pop up window, select at least one i3D.net location and click Next.
Enter the Region Name and click Create.
Follow the steps below to Add Bare Metal locations and cloud groups
Click the cog wheel icon next to the deployment region you just created. This will bring you to the region settings page.
To add location to a Bare Metal Group, Click Add location.
On the Add Bare Metal Location window, select your location.
Click Save.
A cloud group is a wrapper that holds multiple cloud locations to burst towards when your bare metal pool runs dry.
Click Add cloud location.
On the Add Cloud Location window, select your Cloud provider from the drop down list.
Select your Location from the drop down list.
Select your Primary instance from the drop down list.
Fleets are normally used to differentiate between different builds or platforms such as PC, Xbox, Playstation, Switch, and more. But you can use fleets to deploy instances for temporary or testing purposes while keeping these separate from other fleets. Be aware that you cannot deploy multiple fleets on one host at a time.
Go to Game Hosting > Deployments.
Select the Fleets tab.
Select your Deployment Environment that you want to add the fleet to from the drop down list.
Click Create fleet.
After you have set your Minimum Capacity on your Deployment profile to anything higher than 0, then you can see the instance being deployed and online on the Instance Management page.
This chapter explains the logic behind our automatic scaling process.
For more information on how to enable the automatic scaling mode for a Fleet, please see the Automatic Deployment chapter.
For more information on how the deployment process works, please refer to the Deployment Process chapter.
Before explaining how the scaling mechanism (the Scaler) works, let's take a minute to understand why a dynamic deployment system is important.
If your game is higly successful, you can experience a sudden influx of players. Your basic game server capacity deployed onto your own bare metal servers may not be sufficient in that case. You could order more bare metal servers to increase capacity, but by the time we have delivered them to you, it may be too late to cater for the ingress of new players. This is where cloud scaling comes into play. To fill this gap in game server resources, we have created a dynamic game server deployment system that can scale onto any cloud platform. This has the result that you will never have a shortage of game servers. Even if a cloud provider is down entirely, there will still be other cloud providers that we can deploy game servers onto. We can pretty much guarantee game server availability this way.
Even though you could host your entire game in the cloud, we strongly advise using our bare metal servers as much as possible, or at least for your base requirements. Our bare metal servers simply perform better than cloud VMs. But not only that, renting a bare metal server for a month (or longer) is much cheaper than renting a similary sized VM for a month.
The Scaler combines the major elements described in this documentation in order to deploy game servers when and where they they are needed. The Scaler needs to know which application (builds) it needs to deploy ( & ) and where to deploy them (). Together with live game server status information ( / ) the Scaler knows the amount of occupied and free game servers and can then determine whether there are too few or too many free game servers and deploy or remove game servers as needed.
This in a nutshell is how the scaler operates.
The scaling mechanism always operates on a combination of DeploymentRegion + DC location + ApplicationBuild. You can view each of these combinations as stand alone environments on which the scaling mechanism operates.
Figure 1: Combinations of region + location + build the Scaler operates on
This means that the Scaler will iterate over all the regions in your DeploymentProfile, then within each region it iterates over all DC locations and then per location it iterates over all the s defined in the of your . Then for each ApplicationBuild it will do its checks to see whether the amount of ApplicationInstances is too low, too high or just right.
To summarize, the scaling mechanism always operates on individual combinations of region + DC location + ApplicationBuild. Deployment of game servers first occurs on bare metal servers and when they are full, the Scaler continues to deploy onto any configured cloud locations.
When the scaling mechanism needs to deploy a new , it will first look for a usable bare metal host (BM). If you have run out of BM hosts, the Scaler will continue with cloud VMs, provided you have configured cloud locations in your .
A selected BM or VM host will be fully filled with instances before the mechanism will find the next free host. The number of instances that can be deployed onto a host is defined individually for each BM or VM instance type and is explained in the chapter "".
containerLocation versus multiple containerLocationsWhen you define multiple items within a containerLocation they will be treated in a round-robin fashion. When you have multiple containerLocations they will be processed sequentially.
Here is a simple example:
If you have a primary on Google Cloud and Azure, then the Scaler ensures that both are running an equal amount of Game Servers, which will always make sure that first a cloud is filled up completely.
If you have 8 core machines on Google Cloud and 4 core machines on Azure, and you request 16 Game Servers, then you will have the following combination:
1 Google Cloud and 2 Azure VMs: (8 + 4 + 4 = 16 Game Servers).
Example when using multiple containers
When you use multiple containers, the process works differently.
Container A is set up the same: You have 2 Azure and 1 Google Cloud VMs
When Google Cloud doesn't have anymore capacity, then the following process occurs:
The machine will switch over to Azure.
Also, the secondary machine needs to be out of quota.
When you have a primary and secondary with Google and Azure, then the switch over will occur if you cannot spin up any more VMs within the primary. If you request for 16 games instances and Azure is out, then you get 2 Google instances.
If Google and Azure doesn't have anymore capacity, then the following process occurs:
It will switch over to the secondary container.
Within the secondary container (for example, if it contains Amazon and Tencent inside) then a round robin is performed again for those 2 containers until the primary has capacity again.
When a new, empty host (BM or VM) has been selected for game server deployment, the scaling mechanism will first deploy all the utilities (sidecars) defined in your . After that, the new game server(s) are deployed.
If at any moment in time too many application instances are deployed, the scaling mechanism will start removing unused instances until the number of free / unallocated instances equals the again.
If you have application instances deployed onto VMs, we will remove those first. Only empty instances are removed, of course. If no VMs are in use, or if there are no VMs with free / unallocated instances, the Scaler will continue downscaling instances on bare metal hosts.
The host with the least amount of application instances (or secondary, with the most free instances) will be selected as the host to start removing instances from. This attempts to help with freeing up VMs so we can destroy them, reducing cloud hosting cost as much as possible.
Keep in mind though that we do not control (gaming) clients already playing on a game server deployed onto a VM. That means that if your game server hosts matches that do not necessarily end, or take a long time, a VM cannot be destroyed until all those players have left the game server. If your game falls into that category you may want to invest in a mechanism that can transfer players to another game server, in an attempt to reduce cloud hosting costs.
After the last game server instance has been removed from a host, any side cars (utilities) will also be removed. If the host concerns a VM, the VM will be destroyed. A bare metal host will become usable again for deployments (for the same or another environment / fleet / any other purpose).
The DcLocation element represents a data center in a certain location. This can be an i3D.net data center or one of a cloud provider. The latter parties often refer to this as a region, but really these are simply data centers with a varying degree of redundancy in the form of availability zones.
The DcLocation element is used throughout your DeploymentProfile, or more specifically DeploymentRegions and DeploymentContainerLocations, where you can specify in which data center you want to deploy your applications.
Table 1: DcLocation element structure
Below you will find some example DcLocation elements along with explanations.
The first entry with ID 6 represents an i3D.net data center (providerId = 1). It is located in Europe (continentId = 5), in Rotterdam, the Netherlands. It has no availability zones and no region name. These are only populated for cloud locations. This is an i3D.net data center.
The second entry with ID 29 represents an AWS data center (providerId = 27). It is located in Europe (continentId = 5), in Frankfurt, Germany. It has 3 availability zones and its region name is the official AWS region "eu-central-1".
The third entry with ID 64 represents a GCP data center (providerId = 31). It is located in North America (continentId = 7), in Montreal, Canada. It has 3 availability zones and its region name is the official GCP region "northamerica-northeast1".
You cannot configure / specify availability zones in your . The platform will create VMs in a round-robin fashion to spread your VMs over all available availability zones automatically.
Labels are pre-defined or custom key / value pairs that can be tied to elements for easy recognition and selection.
The following elements in the platform can have labels:
Table 1: Label element structure
A Label element has the following constraints:
allowed characters in the label key are a-z 0-9 _ -
the label key may be no longer than 50 characters
the label value may be no longer than 150 characters
Labels in the ApplicationBuild and ApplicationInstance elements are stored as an array of Label elements:
PUT /applicationInstance/{applicationInstanceId}
Figure 1: Example labels for an ApplicationInstance element
When you want to add a new label, you can PUT an element with only that new label. You would submit:
PUT /applicationInstance/{applicationInstanceId}
Figure 2: Example of adding a new label to an ApplicationInstance element
The result will be that the element has 3 labels: label1, label2 and label3.
When you want to update a label, you only have to submit that one label for the element:
PUT /applicationInstance/{applicationInstanceId}
Figure 3: Example of updating an existing label of an ApplicationInstance element
Deleting a label is done by submitting a label with a null value:
PUT /applicationInstance/{applicationInstanceId}
Figure 4: Example of deleting a label from an ApplicationInstance element
After these example mutations, the element ends up with the following labels:
GET /applicationInstance/{applicationInstanceId}
Figure 5: The resulting labels for an ApplicationInstance element after applying the examples
For ApplicationInstance elements, the platform creates a number of default labels (platform defined labels):
application_id
fleet_id
host_id
dc_location_id
These labels are always present for all ApplicationInstance elements. It does mean that user-defined labels cannot have the same name as platform defined labels. These names are reserved.
Labels can be used to trim selections of elements.
In the API v3, using labels is done by adding a label expression as an URL query parameter.
An example of a label expression:
When used in an API v3 request the expression must be url encoded:
If you filter on region_name (or any other label with a string value) you must wrap the search value in double quotes:
The url encoded request:
The purpose of the i3D.net ONE Game Hosting platform is to deploy your applications. Providing your builds to the platform therefore is a crucial process. On this page we will explain how you can upload your builds.
An origin node is simply a server to which you can upload your build archives and from where our platform can download builds. A build archive file will be downloaded, cached and distributed by the i3D.net CDN as soon as the first deployment of your application takes place.
The i3D.net CDN (Content Delivery Network) will download your build from an origin node, using HTTP(S). That means that an origin node must run a web server. Files are often secured by firewalls allowing only certain IP addresses, or by means of HTTP headers to add an additional layer of security. We prefer JWT tokens, but any kind of header aimed at security will work, e.g. an Authorization header.
Origin nodes must be registered in our system so our CDN knows where to grab your archives. And because files are distributed by our CDN, you will also be given a XXXXX.cdn.i3d.net sub-domain. While requesting or registering your origin node you can indicate the desired sub-domain prefix.
You can request an origin node provided by i3D.net. At the time of writing, you must request this through a ticket and you must be a game hosting client.
When requesting an i3D.net provided origin node, you must provide us with the following details:
a custom name for your origin node
desired CDN domain (XXXXX.cdn.i3d.net where you can choose XXXXX)
only a-z characters allowed, max length: 16 characters
if it's no longer available we will ask for a new suggestion
Once setup, we send you the login details, after which you can upload your first build to the origin node using the SCP or Rsync-over-SSH protocol.
You can find your registered origin node in our API by performing a request on . You will need these details when creating an ApplicationBuild.
For the best deployment predictability of your application, please ensure that your build archive's root contents is the root of your application's folder. By that we mean, ensure you do not have only a folder in the root of the archive that contains all the files. The root of your archive must be the root of your application's folder structure.
This faulty example has the game server's root folder inside the archive.
Figure 1: Wrong archive folder structure
This correct example has the game server's files immediately in the archive root. You are permitted to create a folder and place your packed game server there.
Figure 2: Correct archive folder structure
Using the credentials provided by us, log in on the origin node and upload your file. Be sure to only use zip or rar files.
You must use the origin URL to upload your files, not the CDN domain name. Also, you must upload your files with sFTP (on port 22).
Once your file is uploaded, it will be available in the following list with a very small delay (seconds).
API Documentation:
With your file uploaded to our platform, you can point to it in your ApplicationBuild element. This process is described in the next chapter:
Do not delete the build archive file from your origin until you are no longer deploying it and until you have disabled the ApplicationBuild that uses it!
Distribution of your build archives towards your gaming hosts is done via the i3D.net CDN (Content Delivery Network). The CDN is comprised of servers in many regions. Each region will individually download the build archive from your build origin and cache it. The default cache time-to-live is 7 days for any file served by the CDN. This TTL is not reset, so after 7 days the file will always be purged. If the file is downloaded again through the CDN, the file will be pulled from your origin again.
It is therefore very important you do not remove build archives from your build origin until you really do not need it anymore.
Before you update a new file, you must disable the fleet to ensure that there is no running application instance deployed on it.
The old file with the same name in the CDN is deleted.
A new file entry is automatically created for you with a new ID.
You must create a new application build with the newly created file ID.
Link your newly created file ID to your fleet so that you can use it.
Many game servers have an initialization process to go through when starting up. This has the effect that the game server will not actually be usable during this initialization period. Our platform should know about this, otherwise it will assume the game server is ready to accept clients immediately after starting. For this to be possible, your game server can let our back end know when it is ready to accept players. We refer to this as a "game server run-status update" and can be performed by having the game server make an API call either towards our public API, or locally on the host towards our Host Agent.
You do not have to worry about this if your game server start (nearly) instantly. We will by default set a game server's run-status to "RUNNING" after starting it.
Please refer to the ApplicationInstance status chapter for more information about all possible status values.
The following example illustrates how to change the run-status of a game server via the public API.
<NOT NEEDED>
TBD
A management protocol is a means for a game server to be queried or controlled by an external source. In this case the external source is i3D.net's ONE Game Hosting service.
Management protocols are used for different purposes. They can allow for an external program to query a game server for live game related information (status queries returning the number of players, the current map, rules, etc), or sending commands for e.g. a graceful (soft) stop. Some management protocols go further than that and allow full administrative functionality for a game server (kick players, send messages to clients, reconfigure map & rules, etc.), but that goes beyond the scope of this article.
There are different management protocols. Examples of these are A2S, RCON, U3E. Most protocols have the same kind of functionality, but their implementations can differ. So in order for our system to communicate with your game servers, you have to indicate which management protocol they support. You can indicate this in the Application element(s) you create for your game server application(s).
In order for your game to use a management protocol within our platform, you have to tell it on which network port your management protocol is listening, enabling our Host Agent to connect with it. You do that by adding an to your Application, with:
a propertyType of 6 (private network port)
a propertyKey called "managementPort"
a propertyValue between 30000 and 49151
If your management protocol / implementation also requires a password (e.g. an admin password) then you must also add the following ApplicationProperty:
a propertyType of 2, 3 or 4 (password8, password16, password24)
a propertyKey called "managementPassword"
a propertyValue empty if you want our system to generate unique passwords for each ApplicationInstance, or fill in a password for this value to pre-define one
When you create an in our system, you must provide a value for the managementProtocol property. The following table lists the supported protocols and their IDs:
Table 1: Supported management protocols and IDs
1: A2S
game server information (server query)
2: Arcus
game server information (server query)
soft-stop method 1 (Arcus msg)
metadata (pushing metadata to the game server, to update its configuration)
isAllocated (ask game server for allocation status)
If you have a protocol that we currently do not support, or maybe you have one that we support but you've customized it, then please to discuss how we can support your version of the management protocol and how we have to implement it.
Application Build Management is the process of creating and maintaining builds for your . An ApplicationBuild defines the software that will be deployed by our system. It can be a game server or a utility (side car). Whenever you have a software update, you must upload the new build to our system and create an ApplicationBuild for it before it can be deployed.
Before you can create an element, you must first create:
An Application is an component that describes a program that the system can deploy. As such, every program you want to deploy must be defined by an Application component. You can specify the application type, whether it has a (only applies to application type Game), give it a name, a website, description, etc.
An Application can be one of four types:
a game server (type: Game)
Prebuilt binaries are currently not supplied. The integration code is very lightweight. Integrations have two options:
Copy the code in one/arcus directly into the game engine and build directly as part of the regular build.
Or build the repository with the following instructions, and then copy required headers and binaries. Binaries will be output into the build folder; for example, the build/one/arcus/release/one_arcus.lib.
It's recommended to build the repository as it will also create a fake agent executable to aid testing of your game server without deploying to the remote ONE Platform.
The ONE Game Hosting service has a feature called Platform Variables, which can be used for configuration of your applications. Platform variables come in two types:
variables pre-defined by the platform
user defined variables
These variables can be used inside the startupParameters property of an and inside configuration files ( elements), submitted for an ApplicationBuild. Examples are provided near the end of this page.
As you may know, multiplayer online gaming has been rapidly growing over the past few years. Many studios are researching game hosting solutions (early during development) that can help their games to be as efficient as possible when it's released. A smooth release of a multiplayer game with an efficient game hosting solution can help with its success. i3D.net understands the importance of that. To help burgeoning game studios in that endeavor, i3D.net offers a new product: The Game Server Orchestrator.
In a nutshell, the Game Server Orchestrator is a fully customizable game hosting solution that offers scalability solutions (scaling up / down game servers based on demand), health checks, monitoring, and more.
Specifically, the Game Server Orchestrator operates by connecting to the database that contains the application instance entries and our designated message broker. It first retrieves the current state of the application instances from the database, checking if they are in the correct state. Based on this information, the Orchestrator sends messages through the message broker to communicate with the VM Manager, instructing it to create or destroy virtual machines as necessary. This coordination allows the Orchestrator to manage the provisioning and scaling of game server instances dynamically, ensuring optimal performance, and resource utilization in the game environment.
Metadata elements are custom, client provided key / value pairs that can be forwarded to application instances (e.g. a game server). The main purpose of this is for a Matchmaker to provide game server configuration values to be sent to a game server upon allocation of said game server.
In our system, Metadata elements are part of elements.
See the chapter about the for more information.
“A globally scalable game server hosting platform that aims to never run out of game server capacity”
The i3D.net ONE Game Hosting service has been created to provide game publishers with a globally scalable and high performance game server hosting platform that aims to never run out of game server capacity.
Game servers will be deployed dynamically in the locations where you need them. Similarly they will be removed if not needed anymore due to overcapacity, while not dropping below the minimum number of deployed game servers defined by you.
Updating your game servers with a rolling update means that you update game servers as soon as they exit naturally or when they are empty and unallocated.
We have a fleet with 1 ApplicationBuild in its deployment template. 100 game servers have been deployed.
This chapter assumes you already have created a new for your updated software.
It is possible to receive events from within our platform, allowing you to get more insight into which actions it performing. You could log these for your own purposes.
At the time of writing this is an experimental feature that we are testing with a few clients. There is no publicly available endpoint that allows to you automatically sign up to our event stream. But you can request access to it via the usual support channels.
The ONE Arcus Protocol V2 is a TCP/IP-based communication protocol used by the ONE Game Hosting Platform, allowing it to communicate with your game servers and vice versa.
The Arcus protocol when implemented into a Game Server provides two benefits:
Allows a game developer to connect to his game servers to fetch status information and control it
The DependencyDeploymentTemplate enables you to point to scripts (ApplicationBuilds) that install dependencies onto a Host that are required by your Application(s) to run properly. Besides an installer script, you must also define an un-installer script to remove the dependencies and to allow clean up of a Host after removing all applications running on it.
A DependencyDeploymentTemplate is used by a and defines which ApplicationBuilds (of type DependencyInstaller / DependencyUninstaller) will be deployed for that Fleet. A single DependencyDeploymentTemplate defines both the DependencyInstaller and DependencyUninstaller ApplicationBuild elements. Both are required as we need enforce cleanup of a Host in order to keep it clean and usable by you for other purposes without having to do frequent re-installs of the operating system.
The DependencyInstaller ApplicationBuild will be installed and executed before the platform deploys any other Application onto a Host.
Version: v0.9 (Beta)
All v1.0 features are complete and ready for integration and use. Customer iteration will determine any final changes before labelling as v1.0.
The current version of i3D.net ONE Game Hosting SDK code used in this plugin is referenced .
The plugin provides Unreal Engine game servers with the ability to communicate over TCP with the i3D.net ONE Platform, for easy and efficient scaling of game servers.
{
"errorCode": 10001,
"errorMessage": "Entity not found",
"errors": [
{
"property": "propertyName",
"message": "Error message"
}
]
}{
"labelPublic": [
{
"key": "string",
"value": "string"
}
],
"metadata": [
{
"key": "string",
"value": "string"
}
]
}{
"applicationBuildId": {applicationBuildId}
}Default Value: 6855
This is the port on which the Application software listens for incoming server query requests. This can be configured by adding the Application Property managementPort.
Default Value: <empty>
It's possible to protect the protocol with a password, for this we need another Application Property: managementPassword
Continue reading: Packet Structure
int
Read-only
A unix timestamp of when this element was created
0
None
If you do not have a management procotol, use this value
1
A2S
This is the standard Steam query protocol. It's simple and only used for querying your game server for information about the game.
2
Arcus
Arcus is a management protocol developed by i3D.net. It allows for querying game server information, requesting allocation status, exchanging metadata, sending custom commands, etc.
Click the floppy disc icon.
Follow the steps to Create your deployment profile settings.
Enter Fixed amount or percentage in the Global Buffer section. If you select a percentage, enter the Minimum and Maximum percentage.
(Optional) Select your Secondary instance from the drop down list.
Click Add location.
(Optional) To add more cloud locations, click the Add Cloud location button.
Click Save.
On the Create Fleet window, your selected Deployment Environment is already auto-populated, but if you need to select a different one, you can do that by clicking the arrow and select one from the drop down list.
Enter the Fleet Name.
Select your Deployment Profile from the drop down list.
Select your Game Template from the drop down list.
If you are using your fleets for other templates, select Utility Template, Dependency Template, or Host Capacity Template if it applies.
Click Next.
Click Create.



displayName
string
Read-only
Name of the city the DC is located in
providerId
int
Read-only
1: i3D.net 27: AWS 31: GCP
availabilityZones
[string]
Read-only
Provider availability zones for a data center (where available)
regionName
string
Read-only
Provider region name
id
string
Read-only
Unique identifier of this element
continentId
int
Read-only
1: Africa 2: Antarctica 3: Asia 4: Australia 5: Europe 6: Middle East 7: North America 8: South America
country
string
Read-only
Name of the country the DC is located in
region_name
application_build_id
key
string
Yes
The name of the label
value
string
Yes
The value of the label
key
string
Yes
The name of the metadata entry
value
string
Yes
The value of the metadata entry
Table 1: Metadata element structure
A Metadata element has the following constraints:
allowed characters in the key are a-z 0-9 _ -
the key may be no longer than 50 characters
the value may be no longer than 150 characters
Metadata in the ApplicationInstance elements are stored as an array of Metadata elements:
PUT /applicationInstance/{applicationInstanceId}
Figure 1: Example metadata for an ApplicationInstance element
When you want to add a new metadata element, you can PUT an element with only that new metadata element. You would submit:
PUT /applicationInstance/{applicationInstanceId}
Figure 2: Example of adding new metadata to an ApplicationInstance element
The result will be that the element has 3 metadata elements: metadata1, metadata2 and metadata3.
When you want to update metadata, you only have to submit that one metadata element:
PUT /applicationInstance/{applicationInstanceId}
Figure 3: Example of updating an existing metadata element in an ApplicationInstance element
Deleting metadata is done by submitting metadata with a null value:
PUT /applicationInstance/{applicationInstanceId}
Figure 4: Example of deleting metadata from an ApplicationInstance element
After these example mutations, the element ends up with the following metadata:
GET /applicationInstance/{applicationInstanceId}
Figure 5: The resulting metadata for an ApplicationInstance element after applying the examples
During an allocation call (API reference), you can pass a metadata array. This metadata will then be added to all the ApplicationInstances that are allocated during that request.
PUT /applicationInstance/game/{applicationId}/empty/allocate
Figure 6: Example of passing metadata to ApplicationInstances being allocated
Metadata sent during an allocation request will be merged with the metadata of the ApplicationInstances that are allocated. Merging occurs in the same manner as manually updating metadata.
open the GameDeploymentTemplate for the Fleet whose game servers you want to update.
replace the existing ApplicationBuild ID in the DeploymentTemplate with the new ApplicationBuild ID.
Every game instance that is in a free state, or goes into a free state will be re-deployed with the new build. Note that our platform does not update all free instances at once, but does this in batches so that there will always be free instances that can still be allocated during the rolling update period.
Eventually (almost) all game instances will have been updated. To finalize the update process you will want to forcefully update any remaining game instances running the old build. This heavily depends on whether your game uses short or long lived matches / sessions / game play. Games that use matches of a specific maximum length usually rotate fairly quickly, but games that have long running sessions that do not have a particular ending might need a forceful update at some point.
We need to get the Fleet object so that we can see which GameDeploymentTemplate is assigned to it.
Using the Fleet.gameDeploymentTemplateId property from the previous call, we can now get the GameDeploymentTemplate itself.
We see that the currently active ApplicationBuild ID is "1459775459116568767". Let's replace it with our new ApplicationBuild ID "817092209556457642".
Now you can sit back and see inactive / available game servers being updated in batches.
After you have requested access to the event stream, it can be accessed through a RabbitMQ connection, using the AMQP protocol. There are libraries available for many programming languages. Statistical panels and mechanisms like Logstash also have easy means to connect to a RMQ event or message stream.
All events are provided via the stream as JSON objects with at least the following properties:
level
service
group
code
message
@timestamp
parameters
There are several event groups and event types. The ones described below are not exhaustive - existing ones can change and more will be added:
Group: AIM
AIMCreate
A [platform generated] command to create a new Application Instance
AIMDeployed
An Application Instance has been deployed (installed, but not yet running)
AIMStarted
An Application Instance has [been] started
AIMStopped
An Application Instance has [been] stopped
AIMDestroy
An Application Instance has been destroyed
Group: VMM
VmCreated
A VM has been created
VmDestroyed
A VM has been destroyed
VmStarted
A VM has been started
VmStopped
A VM has been stopped
Group: Arcus
ArcusError
Errors encountered by Arcus (our instance management protocol)
Events pushed through this system have a TTL of 2 hours. If you do not consume messages within 2 hours after being published, they will be purged.
[
... snipped ...
{
"id": 6,
"continentId": 5,
"country": "Netherlands",
"displayName": "Rotterdam",
"providerId": 1,
"availabilityZones": [],
"regionName": ""
},
... snipped ...
{
"id": 29,
"continentId": 5,
"country": "Germany",
"displayName": "Frankfurt",
"providerId": 27,
"availabilityZones": [
"a",
"b",
"c"
],
"regionName": "eu-central-1"
},
... snipped ...
{
"id": 64,
"continentId": 7,
"country": "Canada",
"displayName": "Montreal",
"providerId": 31,
"availabilityZones": [
"-a",
"-b",
"-c"
],
"regionName": "northamerica-northeast1"
},
... snipped ...
]{
"labelPublic": [
{
"key": "label1",
"value": "A value"
},
{
"key": "label2",
"value": "Another value"
}
]
}{
"labelPublic": [
{
"key": "label3",
"value": "A new value"
}
]
}{
"labelPublic": [
{
"key": "label2",
"value": "An updated value"
}
]
}{
"labelPublic": [
{
"key": "label2",
"value": null
}
]
}{
"labelPublic": [
{
"key": "label1",
"value": "A value"
},
{
"key": "label3",
"value": "A new value"
}
]
}region_id=123 and fleet_id=456 or host_id=46256GET /applicationInstance?labels=region_id%3D123%20and%20fleet_id%3D456%20or%20host_id%3D46256region_name="Rotterdam"GET /applicationInstance?labels=region_name%3D%22Rotterdam%22[
{
"id": "string",
"fleetId": "string",
"hostId": 0,
"isVirtual": 0,
"applicationId": "string",
"applicationType": 0,
"applicationBuildId": "string",
"installId": 0,
"dcLocationId": 0,
"regionId": "string",
"status": 0,
"createdAt": 0,
"startedAt": 0,
"stoppedAt": 0,
"pid": 0,
"pidChangedAt": 0,
"properties": [
{
"id": "string",
"propertyType": 0,
"propertyKey": "string",
"propertyValue": "string"
}
],
"ipAddress": [
{
"ipAddress": "string",
"ipVersion": 0,
"private": 0
}
],
"labelReadOnly": [
{
"key": "string",
"value": "string"
}
],
"labelPublic": [
{
"key": "string",
"value": "string"
}
],
"metadata": [
{
"key": "string",
"value": "string"
}
],
"updatedAt": 0,
"numPlayersMax": 0,
"numPlayers": 0,
"liveHostName": "string",
"liveMap": "string",
"liveGameVersion": "string",
"liveRules": "string",
"manuallyDeployed": 0
}
]{
"metadata": [
{
"key": "metadata1",
"value": "A value"
},
{
"key": "metadata2",
"value": "Another value"
}
]
}{
"metadata": [
{
"key": "metadata3",
"value": "A new value"
}
]
}{
"metadata": [
{
"key": "metadata2",
"value": "An updated value"
}
]
}{
"metadata": [
{
"key": "metadata2",
"value": null
}
]
}{
"metadata": [
{
"key": "metadata1",
"value": "A value"
},
{
"key": "metadata3",
"value": "A new value"
}
]
}{
"metadata": [
{
"key": "metadata1",
"value": "E.g. a map name"
},
{
"key": "metadata2",
"value": "E.g. game duration"
}
]
}[
{
"id": "988194285688223011",
"name": "Exmaple Fleet",
"deploymentEnvironmentId": "1528510395058174656",
"deploymentProfileId": "2641748478114564847",
"gameDeploymentTemplateId": "6629032387499739571",
"utilityDeploymentTemplateId": "0",
"operationalStatus": 2
}
][
{
"id": "6629032387499739571",
"fleetIds": [
"988194285688223011",
"8080951566089961859"
],
"name": "Example Game Deployment Template",
"inUse": 1,
"createdAt": 1563526808,
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "1459775459116568767"
}
]
}
]{
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "817092209556457642"
}
]
}[
{
"id": "6629032387499739571",
"fleetIds": [
"988194285688223011",
"8080951566089961859"
],
"name": "Example Game Deployment Template",
"inUse": 1,
"createdAt": 1563526808,
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "817092209556457642"
}
]
}
]{
"userId" : 174085,
"level" : "info",
"service" : "ha-application-instance-manager",
"group" : "AIM",
"code" : "AIMDestroy",
"message" : "Application instance delete.",
"@timestamp" : "2020-02-05T19:16:23.128Z",
"parameters" : {
"applicationName" : "test",
"applicationId" : 282888204204416978,
"deploymentEnvironmentName" : "depenv-testI3D-31-39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
"fleetName" : "fleet--39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
"installId" : 13281,
"regionName" : "i3d-us-east-1-39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
"dcLocationId" : 1,
"dcLocationName" : "Ashburn - VA",
"applicationBuildName" : "appbuild-testI3D-31-39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
"applicationBuildId" : 8029997744897942721,
"regionId" : 9126781268035892791,
"applicationInstanceId" : 8762708736248342380,
"deploymentEnvironmentId" : 4276611139388342629,
"fleetId" : 8817355271013717608,
"hostId" : 93005,
"status" : 0
},
"label" : [ ],
"stracktrace" : ""
}Please refer to the Application Management chapter for more information on creating these elements.
Additionally you must have uploaded a build archive to your origin node.
An ApplicationBuild is represented by the following element:
The process flow of creating an ApplicationBuild is visualized in the ApplicationBuild process flow below.
The following diagram is a simple overview depicting the process of creating an ApplicationBuild. Note that you must first define an Application before you can start this process. The chapter after that provides an example for more detail.
The ApplicationBuild creation process can be summarized as follows:
Figure 1: ApplicationBuild creation process
When you have requested an i3D.net hosted origin node, or when you have setup and registered your self-hosted origin node, you can upload your build archive there.
This is the first step; uploading your build(s) to your origin. Note that in the future you will be able to upload your builds via our control panel as well.
When the upload is finished our system will index the files in your account and make them all available via /v3/buildProvisioning/storage/file. Take note of the file IDs, you will need these when creating the ApplicationBuild element below.
JSON response data BuildProvisioningFile:
JSON request data ApplicationBuild:
Here we take the values for buildProvisioningFileId and buildProvisioningRegistrationId from the previous GET /v3/buildProvisioning/storage/file request.
JSON request data ApplicationBuild:
In this case you must provide a bit more details than with an i3D.net hosted origin, because in this self-hosted case, we have no knowledge of which files are hosted on your origin. So you must provide the buildProvisioningRegistrationId, followed by fields you must manually enter for your build file:
domain: the domain of your origin
path: the path within which your build archive resides
filename: the file name of your build archive
headers: key/value array of HTTP headers for your security, to lock down access to the files on your origin. You can enter any kind of header keys (header name) and values (header value).
Upon submission we will validate these details, and see if we get a 200 OK response for a HEAD request, meaning the file could be reached by our platform. If this call succeeds, you will get the newly created ApplicationBuild in the response body of the request. You could optionally verify its existence using the ApplicationBuild's ID:
JSON response data ApplicationBuild:
We now have a complete ApplicationBuild element pointing to an ApplicationBuildFile (representing the build archive you uploaded earlier) and the following definitions:
a name (must be unique)
the Application element this element belongs to
the file path (including file name) to the executable that we need to start the instance
startupParameters to accompany the executable
operating system needed for the build to run on. This must match exactly the operating system on your servers (BM & VM), otherwise the platform will refuse to run your build
a utility / sidecar (type: Utility)
a dependency installer (type: DependencyInstaller)
a dependency un-installer (type: DependencyUninstaller)
id
string
Read-only
Unique identifier of this element
type
int
Yes
The type of application: 1: Game server 2: Utility 3 DependencyInstaller 4 DependencyUninstaller
managementProtocol
int
Yes
Table 1: Application element structure
Every program we deploy with the platform will be defined by an Application element. The Application element is at the top of the application related hierarchy. It gives everything related to an Application an identity:
Additional application specific properties are provided through the ApplicationProperty element. An Application can have zero or more ApplicationProperty elements.
See also:
You can define any number of Applications for your account. There is no limit.
In order to build the source, you must ensure you have the following dependencies installed on your system.
You need a C++ compiler.
Linux: GCC (7.5.0 tested)
CMake 3.17.4. This is used to configure and build the project. See the top of CMakeLists.txt for other CMake versions tested, if you are already using a different version.
After the initial repository clone, initialize the git submodules with the following command:
On Linux, ensure you installed Open SSL (used by curl, for testing, as of 2022-06-01):
For buiding Linux libraries on Windows:
Build scripts for both platforms can be found in the tools folder. The build scripts naming follows the following convention:
build_<debug_or_release>_<platform>_<shared_or_static_library>_<architecture> Windows will also have a trailing mt or mtdll for the code generation CRT configuration (Multi Threaded vs Multi Threaded DLL).
For example, build_release_windows_32_dll_mt.bat will configure and build on windows a release, 32 bit, multi-threaded (MT option in MSVC) dll library.
Running a build script will build the source, run tests, and output results to the build folder.
A clean is needed in most cases when building with different settings.
Run either script in the root:
clean_windows.bat
clean_linux.sh
Cleaning is not required when changing between debug and release builds with other settings being equal.
build_release_dlls.bat will build dll/so libraries for Windows and Linux, outputing them to a shared_lib_build folder in the root. Docker is required.
To load the repository in Visual Studio, first build and then open the generated solution file located at build/OneGameHostingSDK.sln.
For working on the SDK in Visual Studio Code, IDE tips are located here.
The doxygen documentation is built automatically if CMake is able to find the doxygen installed on your system.
As noted above, short tests are run at the end of the cmake build, by default.
Run the following bash scripts from within the tools folder to run longer tests:
run_tests_debug_long.sh
run_tests_debug_soak.sh
Use the build/tests/debug/tests.exe -? option for all commands.
The platform supplies a number of predefined variables:
VARSERVERID
The ID of the (physical or virtual) server an application is deployed on
VARHOSTID
The ID of the host an application is deployed on
VARHOSTNAME
The hostname of the host an application is deployed on
VARPLAYERS
Maximum number of players allowed on a game server
VARCONTINENT
The name of the continent in which the host is located
VARCOUNTRYCODE
The ISO 3166-1 alpha-2 code of the country in which the host is located
Table 1: Platform defined VARiables
Alongside the platform defined VARiables, there are also custom ones that are derived from ApplicationProperty elements. For each ApplicationProperty, a VARiable is generated. Some examples of this:
For a property named game_port, a VARiable named VAR_GAME_PORT is generated. For a property named managementport, a VARiable named VAR_MANAGEMENTPORT is generated. For a property named management_password, a VARiable named VAR_MANAGEMENT_PASSWORD is generated.
As you may already see, there is a visual difference between platform-defined VARiables and custom ones. The custom ones have the prefix VAR_ (with an underscore), whereas the platform-defined ones lack the underscore.
All VARiables are in upper case.
Please note that startParameters VAR must have quotations surrounding it when using JSON:
An example of VAR usage inside ApplicationBuild.startupParameters:
-ip VARIPV4BINDING -port VAR_GAME_PORT -arcusport VAR_MANAGEMENTPORT -name "Bluewolf VAR_GAME_PORT" -applicationInstanceId VARAPPLICATIONINSTANCEID -maxplayers 8
An example of VAR usage inside ApplicationBuildConfiguration.configContent:
You can concatenate VARiables if you want - they do not have to be separated by a space:
-regionIdent VARREGIONNAME-VARAPPLICATIONINSTANCEID
It will even work without a glue character:
-regionIdent VARREGIONNAMEVARAPPLICATIONINSTANCEID
!!! Warning "Underscore is not a glue character"
In the event of a highly successful game with a sudden surge in players, relying solely on basic game server capacity deployed on your own bare metal servers may prove insufficient. Ordering additional bare metal servers to increase capacity may take too long, resulting in new players being unable to join the game. To address this challenge, we have developed a dynamic game server deployment system that can seamlessly scale onto major cloud platforms like GCP, AWS, and Azure. This innovative solution bridges the gap between demand and compute resources, ensuring that your game server resources can dynamically adapt to player influxes in real-time, enabling a smooth and uninterrupted gaming experience for all players while safeguarding your reputation.
You will first need to integrate your game's backend. Then you will need to set up your hosting parameters, scaling mechanisms and deployment types by selecting your needs:
Bare Metal instance types for your base layer (player base).
Your deployment regions.
Your cloud providers (for multi-cloud bursting when you need additional capacity).
Your minimal and maximal amount of game instances per server, and the buffer of free game servers.
Ready to start setting this up? Go to our Quick Start Guide documentation.
Once deployed, a simple game flow is as follows:
Once your players start entering the game servers, the game client sends requests to your matchmaker.
The matchmaker sends game and server details to the game client, which connects to the game server to start the round (and disconnects when the round is done).
Here is a visual of how the Game Server Orchestrator works:
The Orchestrator combines the major elements in order to deploy game servers when and where you need them. It must know which application (builds) it needs to deploy using:
It must also know where and how to deploy the builds with:
Together with the live game server status information such as Allocation / Live Status, the Orchestrator knows the occupied and free game servers. With that data, it can determine whether there are too few or too many free game servers. As a result of that information, the Scaler can send instructions to deploy or remove game servers as needed.
The scaling mechanism always operates on individual combinations of region + DC location (Data Center location) + ApplicationBuild. Deployment of game servers first occurs on Bare Metal servers and when they are full, the Orchestrator continues to deploy onto any configured cloud locations.
What is the Round robin strategy? This is which your BM or VM host will send a request to cloud provider A, then B, then C, and then back to A. Moreover, you can choose to use a cascading approach, which is you exhaust cloud provider A, then exhaust cloud provider B, and so on.
When the scaling mechanism needs to deploy a new ApplicationInstance, it will first look for a usable Bare Metal hosts (BM). If you have run out of BM hosts, the Orchestrator will continue with Cloud VMs, provided you have configured cloud locations in your DeploymentProfile.
A selected BM or VM host will be filled with instances before the mechanism will find the next free host. You can individually define the number of instances to be deployed onto a host for each BM or VM instance type.
When a new, empty host (BM or VM) has been selected for game server deployment, the scaling mechanism will first deploy all the utilities (sidecars) and dependencies that you defined in your UtilityDeploymentTemplate and DepencencyDeploymentTemplate. After that, the new game servers are deployed.
When player demand decreases and if there are too many application instances deployed, the scaling mechanism will start removing unused instances until the number of free / unallocated instances equals the bufferValue again.
If you have application instances deployed onto VMs, they are removed first. Only empty instances are removed. If no VMs are in use, or if there are no VMs with free / unallocated instances, the Scaler will continue downscaling instances on Bare Metal hosts.
To help reduce cloud hosting costs, the host with the least amount of application instances (or secondary, with the most free instances) will be selected for removing instances.
After the last game server instance has been removed from a host, any side cars (utilities) and dependencies will also be removed. If the host is a VM, the VM will be destroyed. A Bare Metal host will become usable again for future deployments.
We utilize our own bare metal servers for your basic capacity needs with the added functionality of scaling onto multiple hyper clouds when additional capacity is needed (AWS, GCP, Azure). Our bare metal servers are connected to our own network which has evolved throughout the years to excel in situations where low latency is crucial.
The Platform is fully configurable to suit your needs. It allows for defining which of your builds must be deployed onto which locations. Scaling behaviour can be changed and you can indicate which hyper cloud providers you want to make use of without the need to create accounts for any of them. Nor do you have to worry about billing from each individual party - we provide you with a single unified invoice for all deployment related activities. Or use your own cloud account(s) if you prefer.
Alongside your game servers we can deploy utilities as well. These may be needed for extra monitoring of said game servers, provide ping-sites, collect and forward crash dumps and related information - anything you may need.
There is a simple integration path for your matchmaker logic. With a single API call it can request available game servers at any time, in any region or location to send players towards. If you require a deeper integration then we can assist you, though we aim to make the Platform as easy to setup as possible so that everyone can set it up to their wishes.
Game server status can be queried by the Platform and made available to you through our API, provided you have integrated a query protocol such as A2S into your game servers. We have developed our own protocol called Arcus, which provides not just a way of querying the status of a game server, but allows sending commands as well. For easy integration, have a look at our C++ SDK on GitHub.
Our ONE Game Hosting service can be used by any game. However, if you desire dynamic game server scaling functionality from the Platform you must meet one of the following requirements:
Your game uses a matchmaker that can allocate game servers in our system
Your game servers support a management protocol that allows the Platform to request game information, such as the number of players currently on a game server.
This way the Platform knows when a game server is in use; either when it's been allocated by your matchmaker, or when players are connected to a game server. Knowing when a game server is in use is required for the dynamic scaling functionality to work.
i3D.net high performance low latency global network
Homogeneous bare metal server types
Scale onto any hyper cloud provider for additional capacity
Never run out of capacity even if a cloud provider is down
REST API
manage the entire Platform
query for information on your and game servers
Easy integration with your back end
Easy game server communication integration via our
Cheaper than pure cloud solutions
Knowledgeable support team that can aid with:
game server profiling to determine what kind of bare metal / virtual machine instance types you need
troubleshooting
game server patching
Knowledgeable network team that can aid with:
connectivity issues
effective anti-DDoS solutions without increasing latency
We can setup and manage your environment if desired (full hands-off experience)
Automatic deployment and scaling with a simple control panel to manage Platform performance
Fine grained configuration and control of your deployment environment
24/7 resource monitoring and configurable alerting on both hard- and software levels
Game server logs made available through a centralized point
Crash event logging
Event / notification callback mechanisms
HTTPS
Slack
SMS
Task system to perform any actions, scheduled in the future or for immediate execution
Enables additional functionality within the ONE game hosting platform
adds support for a Matchmaker allocation system
allows the ONE Game Hosting Platform to retrieve player numbers needed for automatic scaling, if no Allocation mechanism is supported by the game
enables the ONE Game Hosting Platform to request graceful shutdowns
enables a game server to request meta data for the host it runs on and request meta data about itself
custom functionality
In order for an Arcus connection to be possible, the game server needs to listen on the management port defined in the Management protocol.
Our Host Agent will always connect to localhost. This means that for security reasons, a game server should have Arcus listen for local connections only (127.0.0.1).
An Arcus (game) server will listen for a new TCP connection on the management port indicated in the startup parameters of the application instance (game server). More information can be found in the Management protocol port chapter. The client (Host Agent) will connect and wait for an Arcus HELLO packet packet which will tell it the version of the protocol.
The client (Host Agent) will verify whether it supports this version. If not, it will close the connection and report this problem to the ONE Game Hosting platform for logging purposes.
[](../../images/ArcusHandshake.png)Figure 1: Arcus handshake process
Client should always wait on the Arcus HELLO packet. In case the server receive any byte before he send the HELLO packet the server will close the connection because an client should always wait.
Now that the client knows which version it needs to use it can use the arcus protocol, every arcus message contains a PacketID that will be echoed in all the packets an arcus server will send to the clients requests. This will help the client to map responses to requests and makes it possible for the protocol to handle multiple requests.
Ident
4 bytes
Protocol identifier, This value will start with arc and ends with a null byte ["arc"null]
Version
byte
Version number of the protocol
Reserved
byte
A reserved byte which is not in use right now. it may be used for future purposes.
The HELLO packet structure differs from the rest of the packet structures. This structure is specifically designed to fit the requirements of the HELLO packet.
Both requests and responses are sent as TCP packets. Their payload follows the following basic structure:
Flags
byte
Define extra properties to a packet, Example: gzip compressed payload.
Opcode
byte
Identifier of the request
Reserved
byte
A reserved byte which is not in use right now. It may be used for future purposes.
Reserved2
byte
Currently flags are not in used, Flags are meant to define special properties to packets such as Compressing, different byte order etc. Right now we don't have any flag defined so the byte flag will be always null.
The packet id field is a unsigned 32-bit integer chosen by the client for each request. It may be set to any integer. When the server responds to the request, the response packet will have the same packet id as the original request It need not be unique, but if a unique packet id is assigned, it can be used to match incoming responses to their corresponding requests.
The Opcode identifies the packet type. The Section Requests and Responses describes each different packet type.
A reserved byte not in use right now but can be used for future purposes.
A reserved byte not in use right now but can be used for future purposes.
The packet Length field is an unsigned 32-bit integer, representing the length of the request in bytes. Note that the length field itself is not included when determining the length of the packet. Hence the value of this field is always 12 less than the packet's actual length.
Every payload is a JSON string, the Length of the string can be found in the Length property. Keep in mind that every packet type has his own payload structure. To find the payload structures of a specific type check Requests and Responses
You can create as many DependencyDeploymentTemplates as you like within the platform. However, a Fleet can only point to one DependencyDeploymentTemplate at a time. A DependencyDeploymentTemplates can be shared (re-used) across multiple fleets though.
id
string
Read-only
Unique identifier of this element
fleetIds
[int]
Read-only
List of IDs this template is used in
name
string
Yes
Table 1: DependencyDeploymentTemplate element structure
Create a new DependencyDeploymentTemplate within your i3D.net account.
Integration guide - How to integrate the plugin into a game server.
Plugin package - How to package the plugin.
The i3D.net Game Hosting SDK works on Windows and Linux. If you used the guide and you are having problems with the installation, please file an issue.
Supported platforms:
Minimum compatible Unreal version: 4.25
Native SDK libraries require C++ Redistributable 2015 to be installed on Windows. Download the installer and follow its instructions:
Download the ONE Game Hosting Plugin from the Unreal Marketplace.
Copy the plugin folder into C:\Program Files\Epic Games\UE_4.26\Engine\Plugins.
In Unreal Engine Editor, go to Edit > Plugins menu.
Select the plugin from step 1 and click Enable.
Relaunch the Unreal Editor and open your game.
Click Add New > Blueprint Class and search for class One Arcus Server.
Drag in the new One Arcus Server into a persistent level, so that the One Arcus Server persist during the whole game life cycle.
Follow the next task: How to test below.
There are two ways to test a Game Server that is running an One Arcus Server:
The SDK contains a Fake Agent that can connect and simulate a real deployment. Build and run instructions can be found here.
The Game Server can be uploaded to a live One Development Platform Deployment.
Testing can be performed either in Unreal Engine Editor or on a build running in headless mode.
This is an optional step for developers that need to locally build and package the plugin.
Add C:\Program Files\Epic Games\UE_4.26\Engine\Build\BatchFiles in the PATH environment variable
Build the Arcus plugin:
a. The one-gamehosting-sdk-unreal repository is cloned in the folder %USERPROFILE%/source/repos/one-gamehosting-sdk-unreal
b. Run the following command to build the sdk plugin: (Where ... is the working directory where you want to copy the plugin.)
c. Copy the ONEGameHostingPlugin into Unreal Engine plugin directory: C:\Program Files\Epic Games\UE_4.26\Engine\Plugins\One, since it cannot be set directly through their toolchain.
Follow the Linux Quick Start for instructions on how to build the Unreal Engine locally.
For the following steps: the UnrealEngine is cloned in the folder ~/src/UnrealEngine/ and the one-gamehosting-sdk-unreal is cloned in the folder ~/src/one-gamehosting-sdk-unreal. Make sure that the folder is created ~/src/One.
Build the Arcus plugin and run the following command:
Copy the folder ~/src/One/ONEGameHostingPlugin in ~/src/UnrealEngine/Engine/Plugin/One/ONEGameHostingPlugin
Optional - The target audience is software developers that want to build the plugin locally without using pre-built plugin from the Unreal Engine marketplace.
User and developer documentation for the i3D.net Game hosting service.
Application
Dependency Installation is the process of installing software requirements (dependencies) for your applications before those applications are deployed. E.g. an application could require some library to be installed on the host in order to run properly.
If your applications have no additional software requirements, you do not have to use this process.
Dependency installation occurs on a host before any game or utility applications are deployed. This is done by using a DependencyInstaller.
Dependencies must also be un-installed when all applications have been removed from a host. This is done by using a DependencyUninstaller.
If you use a DependencyInstaller, you must also create and use a DependencyUninstaller to clean up a host after all regular instances have been removed. Both must be defined in a DependencyDeploymentTemplate. Finally, the DependencyDeploymentTemplate must be assigned to the Fleet you are using.
A Dependency Installer is an "" of type DependencyInstaller that consists of a script and any dependencies you want to install that may not be part of a regular package manager like APT (Debian / Ubuntu).
Please refer to the paragraph for more information.
A Dependency Un-installer is an "" of type DependencyUninstaller that consists of a script and any programs you need to un-install dependencies that may not be part of a regular package manager like APT (Debian / Ubuntu).
Please refer to the paragraph for more information.
Creation of an of type DependencyInstaller or DependencyUninstaller is identical to the . The only difference is that you must set the type of the Application to either DependencyInstaller or DependencyUninstaller. This means that you first create the Application elements, then upload your DependencyInstaller build archive, then an ApplicationBuild element.
The contents of the Application archive in this case are either a Bash script (Linux) or a PowerShell script (Windows). Additional files can be included, e.g. custom libraries or installers of a service you want to run during the lifetime of game instances on a host. Anything you need, you can put it in the DependencyInstaller Application archive.
Dependencies on Linux are installed via a shell script that will be executed by the Bash command line interpreter. This script can contain any commands you need to install your dependencies.
The Bash script must have the .sh extension. It does not require a .
The script will be executed with root privileges.
The working directory will be the location of the script itself, so you can refer to files that are part of the DependencyInstaller Application using relative paths.
Dependencies on Windows are installed via a PowerShell script. This script can contain any commands you need to install your dependencies.
The PowerShell script must have the .ps1 extension.
The script will be executed with Administrator privileges.
The working directory will be the location of the script itself, however in Windows it's better not to use relative paths in all cases. E.g. msiexec does not like relative paths. The following example shows how to run an MSI file with an absolute path:
The Dependency Installer will automatically run in most cases, but there are differences in that behavior within the different Fleet operational statuses.
All deployments must be performed manually. This includes, where applicable:
Deployment of instances Upscaling is performed by manually deploying all application instances. This includes, where applicable:
manually deploy dependency installer for each host you deploy game instances on
manually deploy utilities for each host you deploy game instances on
manually deploy game instances
Removal of instances - scale down Downscaling is performed by manually removing all application instances. This includes, where applicable:
manually remove game instances
manually remove utilities
manually deploy dependency un-installer after having removed all game instances and utilities
manually remove the dependency installer and un-installer instances
Deployment of instances Upscaling is performed automatically by increasing . This includes, where applicable:
automatically deploy dependency installer for each host we deploy game instances on
automatically deploy utilities for each host we deploy game instances on
automatically deploy game instances
Removal of instances - scale down Downscaling is performed by decreasing and manually removing all deployed application instances. When all game and utility instances have been removed from a host, the dependency un-installer will run automatically. This includes, where applicable:
manually remove game instances
manually remove utilities
the dependency un-installer will deploy automatically after you have removed all game instances and utilities
finally the dependency installer and un-installer instances will automatically be removed
All deployments and removal of application instances are performed by our automatic scaler service. This includes, where applicable:
Deployment of instances - scale up Upscaling is automatically performed by our scaler according to , the and game instance occupation. This includes, where applicable:
automatically deploy dependency installer for each host we deploy game instances on
automatically deploy utilities for each host we deploy game instances on
automatically deploy game instances
Removal of instances - scale down Downscaling is automatically performed by our scaler according to , the and game instance occupation. This includes, where applicable:
automatically remove game instances
automatically remove utilities
automatically deploy dependency un-installer after having removed all game instances and utilities
automatically remove the dependency installer and un-installer instances
This process is described in the element chapter.
This process is described in the element chapter.
The Dependency Installation process is a powerful one and gives you a lot of control and flexibility. Besides installation of dependencies for applications, it can also be used to install services / daemons that will run for as long as there are Game applications installed on a host.
Whatever you choose to install, it is very important that everything is removed / uninstalled once a host becomes empty. This applies mostly to bare metal servers, because these will be re-used at a later time, possibly for different applications, unlike VMs that are destroyed when they are no longer needed. But even on VMs, the Dependency Un-installer will still be run. This allows you to e.g. unregister a monitoring node from a monitoring system.
The ApplicationInstanceProperty is an element that adds meaning to the ApplicationInstance element. These properties are inherited from the ApplicationBuild element and their values will be populated according to the actual settings of the ApplicationInstance. One cannot add or edit ApplicationInstanceProperties manually.
Given that you have the following ApplicationProperty elements with default values for your Application:
Table 1: ApplicationProperty examples
For an ApplicationInstance these values would be substituted with the actual values used for the instance. These are just an illustration of possible values.
Table 2: ApplicationInstanceProperty examples
Table 3: ApplicationInstanceProperty element structure
The characters allowed for a propertyKey are : a-z, 0-9, -, _ A property key must start with a lowercase character.
The maximum length of a propertyKey is 50 characters.
Any UTF-8 character is allowed in a propertyValue.
The maximum length of a propertyValue is 150 characters.
ApplicationInstanceProperty elements consist of a propertyType, a propertyKey and a propertyValue. The propertyType indicates the functionality of the property. The propertyKey gives the property a name and the value a value. Not all property types require a value. E.g. if you have a property of propertyType password16, you can leave propertyValue empty. This means we will generate a password, in this case with a length of 16 characters. If however you do enter a propertyValue, then we take that as the password and the system will not generate a new random password. You can find all available property types and usages in the next chapter.
A propertyType is indicated by a numerical ID. The following types are available:
Table 4: Property types
An ApplicationInstance's properties are inherited from the element it was deployed for.
ApplicationInstanceProperty elements cannot be added / edited manually. They are always inherited from the element it was deployed for.
The GameDeploymentTemplate indicates which [game server] ApplicationBuilds you want to have deployed within a Fleet.
Figure 1: Highlighting where the GameDeploymentTemplate elements belong in the overview
A GameDeploymentTemplate is used by a Fleet and defines which ApplicationBuilds (of type Game) will be deployed for that Fleet. A single GameDeploymentTemplate can define more than one ApplicationBuild by adding multiple GameDeploymentTemplateBuild elements. Each of these defines a single (ApplicationBuild (of type Game).
Each ApplicationBuild defined in a template will be treated like individually scalable builds. If you set a Fleet's operational status to , each build will be deployed individually according to the value. Similarly, when you set the Fleet's operational status to , each build will be automatically scaled individually. In short, each ApplicationBuild in the GameDeploymentTemplate is treated individually. No relationship between the defined ApplicationBuilds exists.
You can create as many GameDeploymentTemplates as you like within the platform. However, a Fleet can only point to one GameDeploymentTemplate at a time. A GameDeploymentTemplate can be shared (re-used) across multiple fleets though.
Table 1: GameDeploymentTemplate element structure
Table 2: GameDeploymentTemplateBuild element structure
Create a new GameDeploymentTemplate within your i3D.net account.
The InstanceTypeCapacity element is a child of the HostCapacityTemplate and defines how many game instances you want deployed on a certain BM instance type and / or VM instance type. during creation, you provide the ID of the HostCapacityTemplate that you want this element to become part of.
Table 1: InstanceTypeCapacity element structure
You can get a list of BM instance types using the /host/instanceType endpoint.
You can get a list of VM instance types using the /cloud/instanceType endpoint.
Note that within this InstanceTypeCapacity element you must provide the name of the instance type and not the ID. This is because the HostCapacityTemplate is region agnostic and therefore we have to use the names and not the IDs of the instance types.
The capacity you indicate is related to the amount of physical cores in a machine. It is therefore important to differentiate between BMs and VMs, because the core count of VMs is usually indicated as vCpus, which are based on logical cores (threads) and not physical cores.
The maximum number of game server instances you can deploy per physical core is 60.
The following table illustrates a few different examples:
Assignment of an InstanceTypeCapacity element to a HostCapacityTemplate is done during creation of this element by providing the ID of the HostCapacityTemplate in the hostCapacityTemplateId property.
Create a new InstanceTypeCapacity for an already existing HostCapacityTemplate.
This element is a child of the element.
A/B deployment is an update process whereby you deploy new versions of your game servers alongside your already existing game servers.
We have a Fleet with 1 ApplicationBuild in its GameDeploymentTemplate.
This chapter assumes you already have created a new ApplicationBuild for your updated software.
create a new GameDeploymentTemplate with the new ApplicationBuild ID.
create the new Fleet (based on the old one).
start sending the first updated clients to the game servers running the new build in the new Fleet (e.g. a group of testers).
if there is something wrong, downgrade those clients and send everyone back to the old build in the old Fleet. You can remove the new Fleet if you want to destroy all the game servers running the new build.
We need to get the Fleet object so that we can create a new one, based on this old one.
If you do not know your Fleet ID yet, you can look it up by using .
Before we create the new Fleet, first create a new GameDeploymentTemplate with your new ApplicationBuild ID, which can be used in the new Fleet.
If you do not know your new ApplicationBuild ID yet, you can look it up by using .
Now we can create the new Fleet based on the old Fleet, with the new GameDeploymentTemplate.
Set the new Fleet's property to 2 (Automatic scaling enabled) to have the platform start deploying new game servers for it.
New game servers will be deployed now, for this new Fleet and you can start sending your first clients to them.
If you spot errors with the new game servers, you could revert the creation of the new Fleet and GameDeploymentTemplate. Or you can leave them to use for later with a new build containing any fixes.
When everything is going well with the new game servers and once all clients have migrated to the new version, remove the old fleet.
Version: v0.9 (Beta)
All v1.0 features are complete and ready for integration and use. Customer iteration will determine any final changes before labelling as v1.0.
The Plugin provides multiple components to interact with the i3D ONE Platform.
Arcus is the library that provides communication between the Game Server and the scaling environment in the One Platform. It is to be integrated into the Game Server. It contains a C/C++ implementation of the ONE platform's Arcus protocol and messages, and provides a TCP server to communicate with the ONE Platform.
Ping is a library that provides a way to obtain server addresses of the ONE backend and utilities to ping the servers, for use in a game's player client code's matchmaking features.
The plugin provides Unity game servers with the ability to communicate over TCP with the i3D.net ONE Platform, for easy and efficient scaling of game servers.
- How to integrate the plugin into a game server.
- How to create a new package.
The i3D.net Game Hosting SDK works on Windows and Linux. If you need further assistance after reading this guide, please .
Supported platforms:
Minimum compatible Unity version: 2017.4.40f1.
Native SDK libraries require C++ Redistributable 2017 to be installed on Windows. Download the installer and follow its instructions:
Simply download from the online repository.
In Unity Editor, go to Assets > Import Package > Custom Package... menu.
Select the package from step 1 and click Open.
In the opened window, click Import.
There are two ways to test a Game Server that is running an Arcus Server:
The SDK contains a Fake Agent that can connect and simulate a real deployment. Build and run instructions can be found .
The Game Server can be uploaded to a live One Development Platform Deployment.
Testing can be performed either in Unity Editor or on a build running in headless mode.
The plugin provides Unity game servers with the ability ping and gather ping statistics for i3D ONE Platform servers.
- How to integrate the plugin into a game server.
- An example of how to use the plugin.
- How to create a new package.
The i3D.net Game Hosting SDK works on Windows and Linux. If you need further assistance after reading this guide, please .
Supported platforms: - Windows 10 Pro - Ubuntu 18.04
Minimum compatible Unity version: 2017.4.40f1.
Native SDK libraries require C++ Redistributable 2017 to be installed on Windows. Download the installer and follow its instructions:
Simply download from the online repository.
In Unity Editor, go to Assets > Import Package > Custom Package... menu.
Select the package from step 1 and click Open.
In the opened window, click Import.
The example ping can be used standalone to test. The example ping will fetch the i3D sites information and start pinging the different sites.
Testing can be performed in Unity Editor.
Optional - for developers that need to recompile the C++ source used by the plugin.
The libraries are built using the .
build_sdk_dlls.bat can be used to build all necessary native assemblies on Windows. Docker must be installed (see ). build_client_sdk_dlls.bat can be used to build all necessary native assemblies on Windows. Docker must be installed (see ).
For example:
Optional - for developers that need to rebuild and repackage the plugin.
Consider potential Unity Version conflicts - ensure the package is built with the lowest Unity Editor Version that your users will be using.
Steps:
Close the project in the Editor (if opened). This is needed to unload the SDK libraries.
Update the native SDK libraries if needed. The easiest way is to use build_dlls.bat script. Alternatively, they can be rebuilt manually by following the instructions in the .
Open the project. Upgrade the project to match required Unity version, if needed.
Go to "Assets -> Export Package..." menu item.
The DeploymentProfile is the main element that determines how your will be deployed.
Figure 1: Highlighting where the DeploymentConfiguration element belongs in the overview
A DeploymentProfile is always the only child of a . As such, you can only have one DeploymentProfile per Fleet.
A DeploymentProfile allows you to set global deployment configuration options which define how ApplicationInstances are deployed within its children. DeploymentRegions allow you to override most configuration options.
The UtilityDeploymentTemplate indicates which utility / utilities you want to deploy onto each host (bare metal or VM). A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on bare metal servers or virtual machines, or both.
When a new host is selected for deployment of game servers, the utility will be the first thing to be deployed onto the host. Reversely, when a host has been freed from any game server applications, the utilities will be removed again, cleaning up the host.
Figure 1: Highlighting where the UtilityDeploymentTemplate elements belong in the overview
A UtilityDeploymentTemplate is used by a and defines which ApplicationBuilds (of type Utility) will be deployed for that Fleet. A single UtilityDeploymentTemplate can define more than one ApplicationBuild by adding multiple
To make use of the cloud scaling part of the ONE Game Hosting service, you generally need not worry about creating your own accounts at the hyper cloud providers we support (AWS, GCP, Azure, Tencent). We will use our own accounts with them. By using our credentials, you don't have to worry about cloud accounts, cloud credentials, cloud billing, cloud images, regional access, quotas, etc. You will also take advantage of our bulk pricing agreements with the cloud providers.
That said, if for some reason you want to use your own credentials, you can. For a single cloud provider or multiple, the choice is yours.
The ApplicationBuildProperty is an element that adds meaning to the element. E.g. you can define that an application uses a certain network port, or requires a password, together with a preset password, or have the system generate a unique password for each ApplicationInstance. These properties are necessary for the system to work properly.
Platform events are an experimental feature, enabled for select clients and sent through RabbitMQ. Our platform generates all of the events described below at different points within the different services of the platform allowing clients to track what is happening with application instances, VMs and other components. We are adding more events and making changes over time, to eventually create a public events system for everyone, published in several ways, e.g. RabbitMQ, Web Sockets, Webhooks, etc.
If you are interested in taking part in this test, please contact us via the usual means of communication.
Probably the first thing you will want to do when starting with our platform is setup your Application (Game).
In this example we will create an Application and demonstrate how you can upload and register the builds for that Application.
The following elements will be created in this chapter:
The ONE Game Hosting service enables you to use the hyper cloud providers to scale onto whenever you need additional capacity.
For this to work, you do not need to do anything special. You do not have to worry about cloud accounts, cloud credentials, cloud billing, cloud images, regional access, quotas, etc. We take care of that for you, by default. That said, you can still use your own cloud credentials if you prefer, or must for specific reasons.
We support the following cloud providers on the ONE Game Hosting service:
[
{
"id": "3878562502763646783",
"buildProvisionRegistrationId": "7495746709577092943",
"filename": "test.test",
"fileSize": "976353",
"md5CheckSum": "d41d8cd98f00b204e9800998ecf8427e",
"createdAt": 1595485988,
"changedAt": 0,
"deletedAt": 0
}
]{
"name": "Bluewolf",
"applicationId": "245926280441350104",
"executable": "bw",
"startupParameters": "-p VAR_GAME_PORT",
"osId": 151,
"label": [
{
"key": "version",
"value": "1.1"
}
],
"applicationBuildFile": {
"buildProvisioningRegistrationId": "7495746709577092943",
"buildProvisioningFileId": "3878562502763646783",
"version": "1.1"
}
}{
"name": "Bluewolf",
"applicationId": "245926280441350104",
"executable": "bw",
"startupParameters": "-p VAR_GAME_PORT",
"osId": 151,
"label": [
{
"key": "version",
"value": "1.1"
}
],
"applicationBuildFile": {
"buildProvisioningRegistrationId": "7495746709577092943",
"filename": "gamebuild.1.1.zip",
"path": "/",
"domain": "builds.gamedev.org",
"version": "1.1"
}
}[
{
"id": "2873523614050361171",
"name": "Bluewolf",
"applicationId": "2801917034933755411",
"executable": "bw",
"startupParameters": "-p VAR_GAME_PORT",
"installId": 9837,
"osId": 151,
"label": [
{
"key": "version",
"value": "1.1"
}
]
}
]git submodule update --init --recursivesudo apt-get update
sudo apt-get install libssl-dev{
"startParameters": "dclocation: \\\"<YOUR PARAMETER>\\\" regionId:2434242"
}// Server name
hostname=Bluewolf VARAPPLICATIONINSTANCEID
// Arcus management passsword
arcus_password=VAR_MANAGEMENT_PASSWORD
// Server password
srv_password=VAR_SRVPASSWORD
// etc Remember `_` is a character that can exist in a VAR name, so **this will not work**: `-regionIdent VARREGIONNAME_VARAPPLICATIONINSTANCEID`{
"name": "MyDependencyDeploymentTemplate",
"dependencyInstallerBuildId": "8745373309035959830",
"dependencyUninstallerBuildId": "7757624915909160276"
}[
{
"id": "8166517913064065155",
"name": "MyDependencyDeploymentTemplate",
"dependencyInstallerBuildId": "8745373309035959830",
"dependencyUninstallerBuildId": "7757624915909160276",
"fleetIds": [
0
],
"inUse": 0,
"createdAt": 1573650353
}
]{
"dependencyDeploymentTemplateId": "6537333393893172977"
}[
{
"id": "string",
"name": "string",
"deploymentEnvironmentId": "string",
"deploymentProfileId": "string",
"gameDeploymentTemplateId": "string",
"utilityDeploymentTemplateId": "string",
"dependencyDeploymentTemplateId": "8166517913064065155",
"operationalStatus": 0
}
]RunUAT.bat BuildPlugin -plugin="%USERPROFILE%/source/repos/one-gamehosting-sdk-unreal/4.26/ONEGameHostingPlugin/ONEGameHostingPlugin.uplugin" -package="%USERPROFILE%/.../Plugins/ONEGameHostingPlugin"- Windows 10 Pro
- Ubuntu 18.04Azure
Google Cloud Platform
Tencent Cloud
To make use of the cloud scaling part of the ONE Game Hosting service, you need not worry about creating your own accounts at the hyper cloud providers we support (AWS, GCP, Tencent, etc). We will use our own credentials for their functionality.
A cloud instance type defines the amount of hardware resources (e.g. CPU cores & memory) a VM will have available.
The management protocol supported by the application (only applies when Application Type is Game server): 0: None 1: A2S 2: Arcus
name
string
Yes
The name of the application
description
string
No
A description of the application
websiteUrl
string
No
A website URL for the application
developerName
string
No
The developer of the application
publisherName
string
No
The publisher of the application
stopDefaultOsGroup
int
no
The default operating system group being used for the stop method, WINDOWS = 1, LINUX = 2. If you have a Windows and Linux ApplicationBuild you can overwrite on the AplicationBuild level. The default operating system is Linux
stopMethod
int
no
The stop method that will be used on restart or destroy of an application instance. The default is hard kill
stopTimeout
int
no
The timeout that will be used on restart or destroy of an application instance. The default is 0 (no timeout)
createdAt
int
Read-only
A unix timestamp of when this element was created
inUse
int
Read-only
If the application currently in use or not
VARCOUNTRY
The full name of the country in which the host is located
VARDCLOCATIONID
The ID of the data center location in which the host is located
VARDCLOCATION
The name of the data center location in which the host is located
VARDEPLOYMENTENVIRONMENTID
The ID of the DeploymentEnvironment of this ApplicationInstance
VARDEPLOYMENTENVIRONMENTNAME
The name of the DeploymentEnvironment of this ApplicationInstance
VARREGIONID
The identifier of the DeploymentRegion in which the host is located
VARREGIONNAME
The name of the DeploymentRegion in which the host is located
VARPROVIDER
The name of the owner of the (physical or virtual) server (e.g. i3D.net, GCP, AWS, etc.)
VARFLEETID
The identifier of the Fleet in which the host is located
VARFLEETNAME
The name of the Fleet in which the host is located
VARAPPLICATIONID
The identifier of the Application element belonging to the ApplicationInstance that is being deployed
VARAPPLICATIONBUILDID
The identifier of the ApplicationBuild element that is being deployed
VARAPPLICATIONINSTANCEID
The ID of the ApplicationInstance that's being deployed
VARIPV4PRIVATE
RFC-1918 IPv4 address of the host an application is deployed on
VARIPV4PUBLIC
Public IPv4 address of the host an application is deployed on
VARIPV4BINDING
IPv4 address that should be used by an application to bind on (e.g. a cloud VM will locally only see the host's private IP and not the public IP)
VARIPV6
IPv6 address of the host an application is deployed on
VARIPV6BINDING
IPv6 address that should be used by an application to bind on (e.g. a cloud VM will locally only see the host's private IP and not the public IP)
PacketID
uint
Unique packetId for the request
Length
uint
Length of the payload data
Payload
JSON string
Optional payload of the packet
Name of the template
inUse
boolean
Read-only
Indicates whether this template is actively being used in a Fleet
createdAt
int
Read-only
A unix timestamp of when this element was created
dependencyInstallerBuildId
string
Yes
Identifier of the DependencyInstaller ApplicationBuild you want to deploy
dependencyUninstallerBuildId
string
Yes
Identifier of the DependencyUninstaller ApplicationBuild you want to deploy




string
Yes
No
The name of the property
propertyValue
mixed
Only for network port
No
The value of the property
password8
string
no
An 8 character password. If no value provided, we generate a unique password for every ApplicationInstance.
3
password16
string
no
A 16 character password. If no value provided, we generate a unique password for every ApplicationInstance.
4
password24
string
no
A 24 character password. If no value provided, we generate a unique password for every ApplicationInstance.
5
public network port range
A number between 2 and 200
yes
A number indicating the size of the desired port range.
6
private network port
A number between: 30000 - 49151
yes
Indicates a default private network port for your application. When the system deploys a new ApplicationInstance, it will find a unique network port to use, per host. The default value is taken as the initial value and will be incremented by 50 until a free port is found.
7
private network port range
A number between 2 and 200
yes
A number indicating the size of the desired port range.
public network port (1)
gamePort
11000
private network port (6)
adminPort
31000
password16 (3)
adminPass
<empty>
public network port (1)
gamePort
11005
private network port (6)
adminPort
30530
password16 (3)
adminPass
d092FuOIAdFGv329
propertyId
string
N/A
Yes
Unique identifier of the element
propertyType
int
Yes
No
Type ID of the property
0
raw value
mixed
no
A custom raw value. This property's key and value will be passed to ApplicationBuilds, ApplicationInstances and labels as-is.
1
public network port
A number between: 10240 - 29999
yes
Indicates a default public network port for your application. When the system deploys a new ApplicationInstance, it will find a unique network port to use, per host. The default value is taken as the initial value and will be incremented by 50 until a free port is found.
propertyKey
2


VM
16 vCpus
16 _ 0.5 _ 60 = 480
VM
64 vCpus
64 _ 0.5 _ 60 = 1920
id
string
Read-only
Unique identifier of this element
hostCapacityTemplateId
string
Read-only
The ID of the HostCapacityTemplate it is a child of
providerId
int
Yes
The ID of the /cloud/provider to which the instanceType property applies
instanceType
string
Yes
The name of the instance type to which the capacity applies. See GET /cloud/instanceType (for virtual servers) and GET /host/instanceType (for bare metal servers)
isVirtual
int
Read-only
1 if the instance type is a virtual server, 0 if it is a bare metal server
capacity
int
Yes
The capacity (number of instances) of the instance type. Minimum value: 1, maximum value: 60
createdAt
int
Read-only
A unix timestamp of when this element was created
BM
4 cores
4 * 60 = 240
BM
16 cores
16 * 60 = 960
BM
64 cores
64 * 60 = 3840
VM
4 vCpus
4 _ 0.5 _ 60 = 120
if all went well, update all your clients and send those to the game servers running the new build.
eventually all clients are migrated. The old Fleet can be removed.
Docker (Optional for developers building C++ Shared Libraries).
Add OneServer component to a scene that is loaded before online gameplay starts.
The component is marked as DontDestroyOnLoad, so the object it's attached to will persist on scene transitions, maintaining the Arcus Server from that point forward.
For game servers that host multiple gaming sessions on a single process, each session should have its own OneServer.
Refer to the [example game] (https://github.com/i3D-net/ONE-GameHosting-SDK-Unity/tree/master/ONE%20SDK%20Plugin/Assets/Plugins/i3D/Example) on how to set up and use the component.
Follow the next task: How to test below.
Docker (Optional for developers building C++ Shared Libraries).
Follow the next task How to test below
Make sure to select the "i3D" subfolder from the "Plugins" folder. All the other folders, if there are any, should be deselected.
Click "Export..." and select the output path.
For each cloud provider you prefer to use your own credentials, you submit said credentials to our platform. The following chapters should be taken into account when doing so:
We advise locking down your credentials by adding our system IP addresses to your credentials whitelist. The IP addresses and ranges to add are:
188.122.92.192/26
188.122.94.105
188.122.94.89
188.122.94.47
Some cloud platforms (e.g. GCP) use projects to separate a cloud account into sections that can easily be managed. When using your own cloud credentials, we advise you create a new project for i3D.net's ONE Game Hosting service before you create anything else. You give the project any name you prefer.
We will always clearly tag VM's with unique identifiers and use those to identify VMs created by our platform in case separation by projects is not an option.
When creating a service account in AWS, you can use the default permissions. You can verify these are correct by checking its permissions against the following list:
ec2:CreateTags
ec2:DeleteTags
ec2:DescribeInstanceStatus
ec2:DescribeInstances
ec2:DescribeRegions
ec2:DescribeTags
ec2:MonitorInstances
ec2:ReportInstanceStatus
ec2:RunInstances
ec2:StartInstances
ec2:StopInstances
ec2:TerminateInstances
iam:GetPolicyVersion
iam:GetUser
iam:ListPoliciesGrantingServiceAccess
iam:ListPolicyVersions
AWS does not support projects, so no configuration is needed in that context. We identify your Game Hosting VMs by the tag we assign to them upon creation.
When creating a Service Principal in Azure, you must grant it one or more Roles so that it has at least the following permissions, scoped to the Resource Group where you would like the resources to be created. You can create a Custom Role in Azure with exactly these permissions to avoid granting unnecessary permissions and to avoid dealing with multiple Azure Roles.
Microsoft.Resources/subscriptions/read
Microsoft.Resources/subscriptions/resourceGroups/read
Microsoft.Network/networkSecurityGroups/read
Microsoft.Network/networkSecurityGroups/write
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/write
Microsoft.Network/networkSecurityGroups/join/action
Microsoft.Network/networkInterfaces/write
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.Network/networkInterfaces/read
Microsoft.Compute/virtualMachines/write
Microsoft.Network/networkInterfaces/join/action
Microsoft.Compute/virtualMachines/read
Microsoft.Network/networkInterfaces/delete
Microsoft.Compute/virtualMachines/delete
Microsoft.Network/publicIPAddresses/write
Microsoft.Network/publicIPAddresses/read
Microsoft.Network/publicIPAddresses/delete
Microsoft.Network/publicIPAddresses/join/action
When creating a service account in GCP, you can use the default permissions. You can verify these are correct by verifying the service account has access to the Compute section of GCP. Make sure access is granted to the correct project.
In order for our platform to handle billing properly, you must ensure that you have granted billing rights to the service account credentials you provide to our platform. The reason for this is that we need to charge a service fee on top of any incurred cloud costs. This permission should have been granted by default. If this is not the case, our platform will notify you when you submit your credentials to our platform.
When using your own credentials, you must also have the necessary VM images on your account (cross-account image usage is not supported). We will handle this automatically and will upload the necessary images to your cloud account(s).
If you use your own cloud credentials, you also need to ensure that VMs created on your cloud account will have access to the internet. Or rather, your game clients must be able to connect to your game servers. We advise creating a security group or firewall policy and configure it with range the port ranges our platform provides: the public range 10240 - 29999 and the private range 30000 - 49151 for both TCP and UDP. Additionally remote administrator access is advisable for trouble shooting purposes, so add port 22 (Linux) or 3389 (Windows) as well.
You can supply the name of the security group (AWS) or network (GCP) along with your cloud credentials. Please refer to the examples below for more information on how to submit a security group name or network name. A security group or network name is not required.
To access your VMs when using your own cloud credentials, you must generate a key-pair. While doing so you must give it a name. You can pass this name while submitting your cloud credentials. Out platform will then run VMs in your cloud account with the given key-pair, allowing you to access your VMs. Please refer to the examples below for more information on how to submit the key-pair name. A key-pair value is not required.
All values below are invalid or otherwise faked, they are here only for example values. You should replace the body variables with your own data.
JSON request data:
JSON request data:
JSON request data:
If you (for example) have an API key that has expired and you need to replace it, follow the steps below.
Submit your new credentials with your respective Cloud provider.
Delete your old credentials by using a DELETE HTTP request with your previous credential.
See also: Application Element Relations
The Application element represents your application or to be more specific, your game or a utility.
In the following example we'll create a game Application:
The ApplicationProperty is an element that adds meaning to the Application element. E.g. you can define that an application uses a certain network port, or requires a password or multiple ports, and a preset password, or have the system generate a unique password for each ApplicationInstance. These properties are necessary for the system to function properly.
In this example we will create 3 properties:
gameport
managementport
managementpassword
This property is of type "public network port" (1). Its value must be either 0 for auto-configuration (recommended) or between 10240 - 29999. The latter will serve as the default port to use upon deployment. If the port is already in use by another game server on the same host, we will keep incrementing the value until we find a free port.
This property is of type "private network port" and works just like the game port in the previous property example, except it will be picked from the private port range (30000 - 49151). However, the name managementport is special in that by defining this property you tell the platform that we can use this port to contact your game server's management protocol. In the Application example above, we have indicated that our Application supports the Arcus (2) management protocol.
This property tells the platform to connect to Arcus with the given password. In this example though, the property value is left blank. This means the platform will create a unique (8 character) password for each game server. If you supply a property value instead, the platform will use that password for all your game servers.
There is one thing left to do: create an ApplicationBuild that essentially tells the platform how to run your game server.
Great! You've setup your application (game) and you have created an ApplicationBuild that you can now use in your Deployment Template. To learn how, continue with the next chapter: Creating a completely configured deployment environment from scratch.
~/src/UnrealEngine/Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin=../one-gamehosting-sdk-unreal/4.26/ONEGameHostingPlugin/ONEGameHostingPlugin.uplugin -package=../One/ONEGameHostingPlugin -TargetPlatform=Linuxapt-get -y install openssl
apt-get -y install libatomic1
cp ./MyCustomLib.so /usr/local/lib/apt-get -y remove openssl
apt-get -y remove libatomic1
rm /usr/local/lib/MyCustomLib.so$cwd = (Get-Item -Path ".\").FullName
msiexec.exe /i $cwd\MyDependencyInstaller.msi /QN$cwd = (Get-Item -Path ".\").FullName
msiexec.exe /x $cwd\MyDependencyInstaller.msi /QN{
"providerId": 31,
"instanceType": "c2-standard-8",
"capacity": 8
}[
{
"id": "4847342966680359842",
"hostCapacityTemplateId": "4943474277300823573",
"providerId": 31,
"instanceType": "c2-standard-8",
"isVirtual": 1,
"capacity": 8,
"createdAt": 1579009662
}
][
{
"id": "988194285688223011",
"name": "Example Fleet",
"deploymentEnvironmentId": "1528510395058174656",
"deploymentProfileId": "2641748478114564847",
"gameDeploymentTemplateId": "6629032387499739571",
"utilityDeploymentTemplateId": "",
"operationalStatus": 2
}
]{
"name": "Example Game Deployment Template (new)",
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "817092209556457642"
}
]
}[
{
"id": "3700287048120517011",
"fleetIds": [],
"name": "Example Game Deployment Template (new)",
"inUse": 0,
"createdAt": 1567591403,
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "817092209556457642"
}
]
}
]{
"name": "Example Fleet (new)",
"deploymentEnvironmentId": "1528510395058174656",
"deploymentProfileId": "2641748478114564847",
"gameDeploymentTemplateId": "3700287048120517011",
"utilityDeploymentTemplateId": ""
}[
{
"id": "2501509179291972037",
"name": "Example Fleet (new)",
"deploymentEnvironmentId": "1528510395058174656",
"deploymentProfileId": "2641748478114564847",
"gameDeploymentTemplateId": "3700287048120517011",
"utilityDeploymentTemplateId": "",
"operationalStatus": 0
}
]{
"operationalStatus": 2
}[
{
"id": "2501509179291972037",
"name": "Example Fleet (new)",
"deploymentEnvironmentId": "1528510395058174656",
"deploymentProfileId": "2641748478114564847",
"gameDeploymentTemplateId": "3700287048120517011",
"utilityDeploymentTemplateId": "",
"operationalStatus": 2
}
][
{
"id": "988194285688223011",
"name": "Example Fleet",
"deploymentEnvironmentId": "1528510395058174656",
"deploymentProfileId": "2641748478114564847",
"gameDeploymentTemplateId": "6629032387499739571",
"utilityDeploymentTemplateId": "",
"operationalStatus": 2,
"markedForDeletion": 1 <<< not implemented yet
}
]- Windows 10 Pro
- Ubuntu 18.04build_sdk_dlls.bat C:\path_to_sdk
build_client_sdk_dlls.bat C:\path_to_sdk{
"providerId": 27,
"name": "my-aws-credentials",
"params": {
"accessKeyId": "9NCE78VT76BC4GR38BNW",
"secretAccessKey": "NQ8s64wpfvnN4LEiXmGJN5aUwSPAGcubljsL5LbG",
"defaultRegion": "eu-central-1",
"securityGroup": "test-security-group",
"keyPair": "myVmKeyPairName",
},
"status": 1
}{
"providerId": 28,
"name": "azure-credentials",
"params": {
"tenantId": "e1468f6f-1574-4145-a8eb-f856ab455eed",
"subscriptionId": "8220edd7-a771-40da-a60b-ccebd11de763",
"clientId": "5ba888cd-bbaa-4da1-8526-fc6d2fbabd98",
"clientSecretKey": "kmORJNvMWT6W71mF6W/Nq/jXyUyzFDbD",
"resourceName": "LIVE-RESOURCE",
"defaultRegion": "westeurope"
},
}{
"providerId": 31,
"name": "my-gcp-credentials",
"params": {
"projectName": "myCloudProject",
"authJson": {
"type": "service_account",
"project_id": "celtic-medium-936452",
"private_key_id": "ZOm76pt5AtMlAKhzLrwqngQC6OGTThlZfXIYI2eJ",
"private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATEKEY-GOES-HERE\n-----END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "182634629475355783532",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/98765473562-compute%40developer.gserviceaccount.com"
},
"keyPair": "myVmKeyPairName",
"network": "myOdpNetworkName"
},
"status": 1
}{
"type": 1,
"managementProtocol": 2,
"name": "Bluewolf",
"websiteUrl": "www.bluewolf.game.com",
"description": "Life is not the same after meeting your worst enemy",
"developerName": "Crywolf",
"publisherName": "ThePubs"
}[
{
"id": "245926280441350104",
"type": 1,
"managementProtocol": 2,
"name": "Bluewolf",
"websiteUrl": "www.bluewolf.game.com",
"description": "Life is not the same after meeting your worst enemy",
"developerName": "Crywolf",
"publisherName": "ThePubs",
"createdAt": 1568316402,
"inUse": 0
}
]{
"propertyType": 1,
"propertyKey": "gameport",
"propertyValue": "60100"
}[
{
"id": "521575199273317208",
"propertyType": 1,
"propertyKey": "gameport",
"propertyValue": "60100"
}
]{
"propertyType": 6,
"propertyKey": "managementport",
"propertyValue": "0"
}[
{
"id": "68643036590177757",
"propertyType": 6,
"propertyKey": "managementport",
"propertyValue": "0"
}
]{
"propertyType": 2,
"propertyKey": "managementpassword",
"propertyValue": ""
}[
{
"id": "519833085683350374",
"propertyType": 2,
"propertyKey": "managementport",
"propertyValue": ""
}
]{
"name": "Bluewolf-server PC",
"executable": "bluewolf-server",
"startupParameters": "-gameport VAR_GAMEPORT -managementport VAR_MANAGEMENTPORT -managementpassword VAR_MANAGEMENTPASSWORD",
"installId": 627322,
"osId": 151,
"label": [
{
"key": "platform",
"value": "pc"
}
]
}[
{
"id": "2324653987059528218",
"name": "Bluewolf-server PC",
"applicationId": "245926280441350104",
"type": 1,
"executable": "bluewolf-server",
"startupParameters": "-gameport VAR_GAMEPORT -managementport VAR_MANAGEMENTPORT -managementpassword VAR_MANAGEMENTPASSWORD",
"installId": 627322,
"osId": 151,
"createdAt": 1568319468,
"label": [
{
"key": "platform",
"value": "pc"
}
]
}
]Patching processes
Deployment
Deployment Templates
Host Capacity
Management Protocol
Arcus
Arcus V2
inUse
boolean
Read-only
Indicates whether this template is actively being used in a Fleet
createdAt
int
Read-only
A unix timestamp of when this element was created
gameDeploymentTemplateBuild
[]
Yes
List of GameDeploymentTemplateBuild elements, pointing to ApplicationBuilds
id
string
Read-only
Unique identifier of this element
fleetIds
[int]
Read-only
List of Fleet IDs this template is used in
name
string
Yes
applicationBuildId
string
Yes
Identifier of the ApplicationBuild you want to deploy

Name of the template
id
string
Read-only
Unique identifier of this element
name
string
Yes
Name of the DeploymentProfile
description
string
No
Table 1: DeploymentProfile element structure
When you enable automatic deployment or automatic scaling on a Fleet, our automatic scaling mechanism will start by deploying the number of Application Instances defined by the DeploymentProfile.minimumCapacity value. The number of deployed instances will never drop below this value, even if there are no players at all. The minimumCapacity value as such can be used in preparation for a new release, to ensure you have enough game servers to begin with upon release of your game.
If the DeploymentProfile.minimumCapacity value exceeds your bare metal capacity, the scaler will continue to deploy in the cloud, provided cloud locations have been defined for the relevant regions.
The DeploymentProfile.minimumCapacity value defines the minimum capacity - minimum amount of deployed game servers - for each individual region. You can override this value per region in case you would like more instances deployed in a region where you expect more players. But keep in mind, minimumCapacity is just for the initial deployment of instances. Our scaling mechanism will of course start scaling instances if more players are needed [in a certain region].
Besides the minimumCapacity setting, there is the bufferValue setting which determines the size of the pool of ApplicationInstances that must be available at all times. The purpose of this buffer is to catch sudden increases in the number of players and as such, to attempt (to ensure) there are always sufficient free game servers for your clients to join. In other words, the bufferValue is there to compensate for the time it takes to deploy game servers. The longer that takes (related to the size of your build files), the larger the buffer should be. The larger the buffer, the less risc there is of running out of available game servers. It is therefore important not to set this value too low.
Create a new DeploymentProfile within your i3D.net account.

Each ApplicationBuild in the UtilityDeploymentTemplate will be deployed once per host, unless indicated otherwise in a UtilityDeploymentTemplateBuild. There you can indicate whether a utility should be deployed onto bare metal only, VM only or both (UtilityDeploymentTemplate.deployOn). Additionally a limit can be set to the amount of hosts the utilities are deployed on (UtilityDeploymentTemplate.installsPerLocation). This can be useful for certain types of utilities such as ping servers, for which you may only need a limited number.
You can create as many UtilityDeploymentTemplates as you like within the platform. However, a Fleet can only point to one UtilityDeploymentTemplate at a time. A UtilityDeploymentTemplate can be shared (re-used) across multiple fleets though.
id
string
Read-only
Unique identifier of this element
fleetIds
[int]
Read-only
List of IDs this template is used in
name
string
Yes
Table 1: UtilityDeploymentTemplate element structure
applicationBuildId
string
Yes
Identifier of the you want to deploy
deployOn
int
No
1: bare metal 2: VM 3: both (default)
installsPerLocation
int
No
Table 2: UtilityDeploymentTemplateBuild element structure
Create a new GameDeploymentTemplate within your i3D.net account.
propertyId
string
N/A
Yes
Unique identifier of the element
propertyType
int
Yes
No
Type ID of the property
Table 1: ApplicationBuildProperty element structure
The characters allowed for a propertyKey are : a-z, 0-9, -, _ A property key must start with a lowercase character.
The maximum length of a propertyKey is 50 characters.
Any UTF-8 character is allowed in a propertyValue.
The maximum length of a propertyValue is 150 characters.
ApplicationBuildProperty elements consist of a propertyType, a propertyKey and a propertyValue. The propertyType indicates the functionality of the property. The propertyKey gives the property a name and the value a value. Not all property types require a value. E.g. if you have a property of propertyType password16, you can leave propertyValue empty. This means we will generate a password, in this case with a length of 16 characters. If however you do enter a propertyValue, then we take that as the password and the system will not generate a new random password. You can find all available property types and usages in the next chapter.
A propertyType is indicated by a numerical ID. The following types are available:
0
raw value
mixed
yes
A custom raw value. This property's key and value will be passed to ApplicationBuilds, ApplicationInstances and labels as-is.
1
public network port
0 or a number between 10240 - 29999
yes
Indicates a default or random network port for your application to use.
Table 2: Property types
An ApplicationBuild's properties will be inherited by all ApplicationInstance elements deployed for said ApplicationBuild.
An ApplicationProperty's value can be overridden at later stages, in the listed order:
an ApplicationBuild will inherit an Application's properties. Its values can be overridden in the ApplicationBuild (API documentation)
a DeploymentRegion can override a property on a per-region basis. This can be useful if you want to define different property values for each deployment region, allowing you to start your applications with region-based startup parameters (API documentation)
As such, an override on DeploymentRegion level always wins. If no override for a DeploymentRegion is present, an override of the ApplicationBuild will win. If no override for an ApplicationBuild is present, the original property value defined for the Application will win.
Every property you define will become available as platform variables that can be used in configuration related properties: ApplicationBuild.startupParameters and ApplicationBuildConfiguration.configContents. Please see the platform variables topic for more details.
You can assign any number of ApplicationBuildProperty to an ApplicationBuild. There is no limitation there. The only rule is that you must have unique propertyKey names per ApplicationBuild.
See also: Application element relations
LoginFailedAlreadyLoggedIn
LoginFailedIncorrectPassword
LoginFailedInvalidForm
LoginFailedIPNotWhitelisted
LoginFailedOTPExpired
LoginFailedOTPInvalid
EmailChangeRequested
EmailChangeRequestedResend
EmailChangeRequestFailedEmailConflict
EmailChangeRequestFailedWrongPassword
EmailChangeSuccessful
PasswordChangeFailedTooManyRequests
VmCreate
VM create started
VmCreated
VM is created successfully
VmDestroy
VM destroy started
VmDestroyed
VM is destroyed successfully
VmStarted
VM is started successfully
VmStopped
VM is stopped successfully
19001
Instance quota has been reached / exceeded
19015
Invalid key/pair name provided
19014
The instance configuration is not supported, check instance types, regions, and operating systems
19002
Instance zone resource pool exhausted
UNDEFINED_ERROR
variable error message
RESOURCE_EXHAUSTED
variable error message
QUOTA_EXCEEDED
variable error message
AIMCreate
Application instance create
AIMDeployed
Application instance is deployed
AIMStarted
Application instance couldn't be started because already inactive (0)
AIMCrashed
Application instance is crashed
AIMStopped
Application instance is stopped
AIMDestroy
Application instance delete
livestate
variable message
?
?
The DeploymentRegion element defines a geographical region that contains one or more i3D.net data center (dc) locations.
Figure 1: Highlighting where the DeploymentRegion elements belong in the overview
The amount of DeploymentRegion elements you can create is limited by the amount of i3D.net data center locations you are renting bare metal servers in.
Table 1: DeploymentRegion element structure
Create a new DeploymentRegion for a DeploymentProfile.
The classical approach to updating game servers is to update them all at the same time, within a maintenance window. Clients cannot go online during this window and they will usually have to upgrade their client software in order to go online afterwards, depending on whether it concerns a compatible update or not. No game servers with different versions will exist alongside each other afterwards.
No extra server resources are required. The total amount of game servers will remain equal during a forced update
Our platform uses a task system to communicate with the Host Agents installed on all your hosts (BM and VM). A Task as such is a wrapper for one or more commands sent to a Host Agent. This wrapper keeps track of which command is currently being executed and its execution status. A Task can also contain a schedule time, allowing Tasks to be performed somewhere in the future. You can find an API example below.
This document will explain the following:
{
"name": "MyGameDeploymentTemplate",
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "3776948653267321543"
}
]
}[
{
"id": "6537333393893172977",
"fleetIds": [
0
],
"name": "MyGameDeploymentTemplate",
"inUse": 0,
"createdAt": 1573060361,
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "3776948653267321543"
}
]
}
]{
"gameDeploymentTemplateId": "6537333393893172977",
}[
{
"id": "string",
"name": "string",
"deploymentEnvironmentId": "string",
"deploymentProfileId": "string",
"gameDeploymentTemplateId": "6537333393893172977",
"utilityDeploymentTemplateId": "string",
"operationalStatus": 0
}
]{
"name": "",
"description": "",
"strategyType": 0,
"minimumCapacity": 0,
"maximumCapacity": 0,
"bufferValue": 0,
"bufferValueType": 0,
"bufferValueMin": 0,
"bufferValueMax": 0,
}[
{
"id": 0,
"fleetIds": [
0
],
"name": "",
"description": "",
"strategyType": 0,
"minimumCapacity": 0,
"maximumCapacity": 0,
"bufferValue": 0,
"bufferValueType": 0,
"bufferValueMin": 0,
"bufferValueMax": 0,
"markedForDeletion": false,
"deploymentRegions": [],
"createdAt": 0
}
]{
"name": "MyUtilityDeploymentTemplate",
"utilityDeploymentTemplateBuild": [
{
"applicationBuildId": "3801243597300703061",
"deployOn": 3,
"installsPerLocation": 0
}
]
}[
{
"id": "5077110393967868847",
"fleetIds": [
0
],
"name": "MyUtilityDeploymentTemplate",
"inUse": 0,
"createdAt": 1573060365,
"utilityDeploymentTemplateBuild": [
{
"applicationBuildId": "3801243597300703061",
"deployOn": 3,
"installsPerLocation": 0
}
]
}
]{
"utilityDeploymentTemplateId": "8243136848298003197",
}[
{
"id": "string",
"name": "string",
"deploymentEnvironmentId": "string",
"deploymentProfileId": "string",
"gameDeploymentTemplateId": "string",
"utilityDeploymentTemplateId": "8243136848298003197",
"operationalStatus": 0
}
]A custom description
strategyType
int
Yes
Deployment strategy 1: round robin
minimumCapacity
int
Yes
The minimum amount of game instances that should always be deployed for each region in this fleet. Can be overridden per region
bufferValue
int
Yes
Global buffer value, to be applied to individual deployment regions. Can be overriden per region
bufferValueType
int
Yes
Interpretation of the bufferValue property: 0: absolute value 1: percentage value (must be accompanied by bufferValueMin and bufferValueMax)
bufferValueMin
int
No
The minimum absolute buffer value when using a percentage, to prevent bufferValue from going to low
bufferValueMax
int
No
The maximum absolute buffer value when using a percentage, to prevent bufferValue from going to high
markedForDeletion
boolean
Read-only
When true, we will also make sure markedForDeletion will be set to true in all subsequent deployment regions. We will then only scale down in those regions until all game servers and VMs have been removed. When that situation is reached, we will set the deployment profile to inactive
deploymentRegions
Read-only
All deployment regions of this profile
createdAt
int
Read-only
A unix timestamp of when this element was created
propertyKey
string
Yes
No
The name of the property
propertyValue
mixed
Only for network port
No
The value of the property
2
password8
string
no
An 8 character password. If no value provided, we generate a unique password for every ApplicationInstance.
3
password16
string
no
A 16 character password. If no value provided, we generate a unique password for every ApplicationInstance.
4
password24
string
no
A 24 character password. If no value provided, we generate a unique password for every ApplicationInstance.
5
public network port range
a number between 2 and 200
yes
A number indicating the size of the desired port range.
6
private network port
0 or a number between 30000 - 49151
yes
Indicates a default or random network port for your application to use.
7
private network port range
a number between 2 and 200
yes
A number indicating the size of the desired private port range.
LoginFailedOTPInvalidForm
LoginFailedTooManyRequests
LoginFailedUserNotFound
LoginSuccessful
LoginSuccessfulOTP
LogoutSuccessful
PasswordChangeFailedWrongPassword
PasswordChangeSuccessful
PasswordResetRequested
PasswordResetRequestedUnknownUser
AIMAllocated
Application instance is allocated.
AIMAllocatedArcus
Application instance is allocated by Arcus.
AIMOnline
Application instance was allocated and is now online again after match conclusion.
AIMOnlineArcus
Application instance is put in online state by Arcus. An allocated match may have concluded.
DependencyInstallerSuccess
Dependency Installer is stopped.
DependencyUninstallerSuccess
Dependency Uninstaller is stopped.
DependencyInstallerError
Dependency Installer failed - retrying.
DependencyUninstallerError
Dependency Uninstaller failed - retrying.
Downloading
Application instance is downloading (progress).
Downloaded
Application instance is downloaded.
Name of the template
inUse
boolean
Read-only
Indicates whether this template is actively being used in a Fleet
createdAt
int
Read-only
A unix timestamp of when this element was created
utilityDeploymentTemplateBuild
Yes
List of UtilityDeploymentTemplateBuild elements, pointing to ApplicationBuilds
The amount of hosts to deploy this utility on, on a per DC location basis. The value 0 means "install on all hosts". Defaults to 0 if omitted.
i3dDcLocationIdsToBeRemoved
[int]
No
i3D.net DC location IDs scheduled for removal from this region
minimumCapacity
int
No
The minimum amount of game instances that should always be deployed in this region. Leave null to use the global value set in DeploymentProfile.minimumCapacity
maximumCapacity
int
No
The maximum amount of game instances that can be deployed in this region. Leave null to use the global value set in DeploymentProfile.maximumCapacity
bufferValue
int
No
Override for deploymentRegion.bufferValue, to be applied only to this deployment region. Null value means that the bufferValue provided in the deploymentProfile will persist
bufferValueType
int
No
Override for deploymentRegion.bufferValueType. The bufferValue property must be interpreted as, 0: absolute value, 1: percentage value (must be accompanied by bufferValueMin and bufferValueMax). Null value means that the bufferValueType provided in the deploymentProfile will persist
bufferValueMin
int
No
Override for deploymentRegion.bufferValueMin. The minimum absolute buffer value when using a percentage, to prevent bufferValue from going to low. Null value means that the bufferValueMin provided in the deploymentProfile will persist
bufferValueMax
int
No
Override for deploymentRegion.bufferValueMax. The maximum absolute buffer value when using a percentage, to prevent bufferValue from going to high. Null value means that the bufferValueMax provided in the deploymentProfile will persist
strategyType
int
No
Override value for DeploymentProfile.strategyType - 0: use default, 1: round robin. Null value means that the strategyType provided in the deploymentProfile will persist
markedForDeletion
boolean
Read-only
If set to true, we will gracefully remove all game servers and VMs in this deployment region. Afterwards this deployment region will be set to inactive
containers
[]
No
Container that holds an array of DeploymentContainer elements, defining primary and secondary groups of cloud DC locations
inUse
int
Read-only
0: Deployment region has no active application instances 1: Deployment region has active application instance(s)
id
string
Read-only
Unique identifier of this element
name
string
Yes
Name of the deployment region
i3dDcLocationIds
[int]
Yes

All the i3D.net DC location IDs configured for this DeploymentRegion. You can get available IDs via
A maintenance window is required: results in a little downtime during which clients cannot play the game online. It does give your clients time to already update their client software
No way to test your newly deployed game server versions in production. As such, testing must be done beforehand!
Our platform performs several actions during the patching process. These actions can be split into configuration changes and actual deployments.
When a Patch Job starts, the Forced Deployment method will perform the following configuration changes:
Swap the old ID of the selected ApplicationBuild to the new ID, in either the game template or utility template
Disable automatic scaling on the selected Fleet(s). This is needed to prevent dynamic downscaling of all your game servers during the patching process
The following actions are performed in-order, for each individual application instance:
Download the new build
Stop instance (hard or soft with a timeout)
Remove the old build files while leaving behind any files newly generated by the instance
Deploy the new build files into the same folder as the old build
Start the instance
The Forced Deployment method requires a maintenance window because all instances will updated around the same time, with the option to drain instances allowing players to finish a match.
Patch Job creation and maintenance is done via the Job Queue and Job History pages.
On the Job Queue page you can see pending and running Patch Jobs. You can create a new one by clicking the button. This opens the following multi-step wizard:
Figure 1: Creating a new Patch Job - step 1
Deployment Environment: the process will only apply to instances in this environment
Application: the process will only apply to instances of this Application
Old Application Build: the process will only apply to instances running this Application Build - these builds must be of the Application type previously indicated
Fleet(s): the process will only apply to instances running in these Fleets running the aforementioned Application Build
The next screen asks you to provide runtime details for the Patch Job:
Figure 2: Creating a new Patch Job - step 2
Set Patch Job name
Set the new Application Build to deploy
Select patching method: Forced Deployment
Indicate whether to drain instances
If yes, with which timeout?
Set Patch Job start time
Add optional comment
Finally you can add any email addresses that you would like us to send reporting emails towards:
Figure 3: Creating a new Patch Job - step 3
add any email addresses that must receive reporting emails
indicate per address which reports they should receive
The same idea applies for creating a Patch Job via the API, as they do when creating them via the UI. You must pass the ID of the Deployment Environment within which you want to perform the patch, then define the Application ID, old Application Build ID and the Fleet ID(s) to create a selection of running Application Instances to update.
Upon successful submission of a new Patch Job, you can find it in your Patch Job overview: GET /v3/patchJob.
You can perform all of the above manually if you wish, bypassing our automated systems. For more details on how to do this, please see the Forced Deployment - Manually chapter. Note that you will not receive any live-reporting emails then.
Tasks are made up of TaskAction elements, each describing a single command to be executed by a host agent. A Task consists of one or more TaskActions. Each TaskAction has a status field to inform you about the result of command execution.
Here are some examples of TaskAction types, to give you an idea:
Download a build archive (e.g. your game server build, or a sidecar build)
Extract a build archive
Stop an instance
Deploy a build [to an instance]
Start an instance
These are the most frequently used actions and are also basic building blocks with which we can can deploy / update / control your instances. These actions also exactly describe an instance deployment task. So whenever any type of instance is deployed for you, we create a task containing the actions described above. These 6 actions are combined into 1 Task.
Here is a more thorough example of the actions of an instance deployment Task. These also contain the parameters that each action requires in order to operate properly:
When you create a Task, you will be given a Task ID. With this ID you can at any time check the status of the task. when doing that via the API you will get something like this:
id
The Task ID
batchId
The TaskBatch ID, in case this Task was part of a larger batch
categoryId
Task category. Normally 2, meaning ApplicationInstance
entityId
The ID of the entity (application instance) this Task was performed on
currentActionIdx
Index of the TaskAction currently being executed. If the Task itself is yet to be performed, this will be -1
executeAt
If 0, the Task will be executed as soon as possible. Otherwise it contains the unix timestamp of when the Task has been or will be executed
Table 1: Task element structure
A Task will reflect its status through the resultCode property. It will be one of the following values:
0: Pending Task execution
1: In progress
2: Paused
124: Cancelled
125: Timed out
126: Done, with error (the error can be found in the resultText field
127: Done
When executing the same command for multiple application instances, we create a task per instance and collect them all within a TaskBatch. When a TaskBatch is submitted, you will be given a TaskBatch ID. This allows you to easily track the execution result of all tasks within a batch.
id
int
A unique TaskBatch identifier
createdAt
int
Unix timestamp of creation time
executeAt
int
Unix timestamp of execution time
finishedAt
int
Table 2: TaskBatch element structure
You can cancel a (scheduled) Task by calling DELETE /v3/applicationInstance/task/{taskId}.
The Task's result code will then be set to 124 (Cancelled).
You can pause a (running) task by calling PUT /v3/applicationInstance/task/{taskId}.
To un-pause a paused Task, call the same endpoint.
Note that when a Task is paused, no other Tasks for the same ApplicationInstance can be run, until the paused Task is un-paused and finished again.
GLAD (Global Low-Latency anti-DDoS protection) is a collection of in-house tools that we offer at i3D.net that can prevent, detect, and thwart a strike. It's important to understand what a "strike" is, what strikes can do to disrupt services, and how our GLAD product can deter such attacks. For more information about how attacks work and how they can impact services, see the DDoS attack types overview.
Warden is i3D.net's advanced protocol-aware DDoS protection system, operating as a standalone add-on to GLAD Advanced. Unlike traditional DDoS protection that relies on volumetric filtering, Warden provides intelligent traffic analysis at the packet level, making it ideal for gaming, real-time communication, and applications using custom protocols.
Key Benefits of Warden:
Zero latency impact - Direct NIC-level processing bypasses OS overhead
Protocol-specific protection - Understands legitimate vs. malicious traffic patterns
Eliminates false positives - Prevents blocking of legitimate users during attacks
Real-time management - API-driven configuration with sub-second propagation
Below is an explanation of our i3D.net's GLAD's tooling and how each functionality can help to thwart DDoS attacks.
With automatic detection, it will discover incoming DDoS attacks. Once an attacker network is detected, this service blocks all traffic from it. Also, null routing silently discards (or "drops") malicious incoming traffic. The undesired traffic is directed to a route that goes nowhere, protecting the infrastructure. Null routing renders the target server inaccessible to anyone, including clean traffic.
Advanced also includes the features from the Standard package above.
If a specific destination IP/port combination is not critical to the continued operation of the application running on the server, it can be set to receive a limited amount of traffic.
It limits total traffic for a destination to a configurable Mbps value, such as “all traffic to a certain destination port.”
If the rate limit is exceeded, the overflow traffic is discarded randomly, affecting both legitimate and illegitimate traffic.
Understanding Rate Limits
Rate limits control the number of requests that a server can receive within a specific timeframe. These limits help maintain service quality and prevent abuse. Once exceeded, further requests may be blocked or delayed until the limit resets.
For example:
If you normally expect 10 Mbps traffic to a certain destination IP & destination port combination, you might decide to set a 20 Mbps rate limit.
But if you then receive a 90 Mbps attack, the 20 Mbps rate limit will drop exceeding 80 Mbps randomly meaning you’ll pass through approximately 4 Mbps of legitimate traffic and 16 Mbps of illegitimate traffic.
This means you effectively have 60% packet loss on your legitimate 10 Mbps of traffic when the rate limit is performing exactly as it was configured to do.
Clients often rate limit ICMP traffic to ensure servers respond to pings during normal operation, but halt responses during ICMP-based DDoS attacks. Meanwhile, the application/protocol/port which runs on the server remains unaffected by this ICMP traffic rate limit.
Premium also includes the features from the Advanced and Standard packages above.
Byte matching is a technique that identifies and filters out malicious or undesirable traffic from incoming network packets based on specific byte patterns. Customers can tailor specified signatures. As a result, it blocks the bytes that are not supposed to enter the network by taking appropriate actions to safeguard the targeted infrastructure.
Warden is a part of the GLAD Premium package and provides enterprise-grade, protocol-aware DDoS protection.
For unparalleled anti-DDoS protection, Warden is our custom software that filters traffic on a dynamic whitelist furnished by the customer. Its capabilities provide inline filtering, which allows you to achieve a higher level of specificity and detail when filtering their traffic stream.
Warden is designed to be flexible and adaptable. New features are continuously added whenever technically feasible, enabling you to benefit from the latest advancements in traffic filtering technology. In the event of server failures, Warden follows a fail-open system. If the redundant systems fail, instead of dropping traffic, Warden allows all traffic to pass through. This ensures that your network remains operational even in challenging situations.
Warden also supports Active-Active setups, allowing horizontal scaling. This means we can expand the capacity of our filtering infrastructure by adding more instances of Warden, distributing the workload, and ensuring scalability.
For more information on integrating Warden, please refer to Warden: Overview of how it works
Below is an overview of our product packages, detailing the features included.
Default ACL on VLAN
X
X
X
Automatic detection and auto null-route
X
X
X
Custom ACL on VLAN
-
X
GLAD packages are available immediately upon service activation
Warden requires initial configuration consultation
GLAD API access for Warden is provided with comprehensive documentation at https://glad-api.i3d.net/
For more information on integrating Warden, please refer to Warden: Overview of how it works
GLAD API reference: https://glad-api.i3d.net/
int
The error code.
errorMessage
string
Human readable version of the error.
errors
Array of ErrorDetail elements.
Table 1: Error element structure
The ErrorDetails (sub)element has the following structure:
property
string
Name of the form / element property that contains the error.
message
string
Detailed error message.
Table 2: ErrorDetails element structure
errorCode
The Fleet is the second layer within the deployment configuration hierarchy. It's a direct descendant of the DeploymentEnvironment.
Figure 1: Fleet's place in the Deployment Configuration
A Fleet is simply a sub-division of a DeploymentEnvironment. It does not represent a collection of hosts (bare metal or VM).
You can have as many Fleets under a DeploymentEnvironment as you like. There are no limits to this. The only limit we have is that only one fleet at a time can be deployed on a host.
Fleets are normally used to differentiate between different builds or platforms such as PC, Xbox, Playstation, Switch, etc. But it can also be used to deploy instances for temporary or testing purposes while keeping these separate from other fleets.
Each Fleet has a number of template properties that will point to the following template types:
: defines which game build to deploy
: defines which utility build(s) to deploy
: defines which dependency (un-)installer to run for each Host
: defines how many application instances can be deployed onto a Host of a certain type
Additionally you have to assign a , telling the Fleet in which regions and DC Locations to deploy.
Automatic deployment and scaling can be controlled per Fleet and is determined by its .
When you first create a new Fleet, you must provide a name and a deploymentEnvironmentId. All other properties / references can be left blank. This allows you to create a fleet before all other necessary elements have been created. Elements such as a and can be referenced at a later time. Note that a Fleet cannot be used before at least the DeploymentProfile and GameDeploymentTemplate properties have been populated.
A Fleet's operational status determines whether automatic deployment and / or automatic scaling of s is enabled or not.
Automatic deployment (operationalStatus = 1) will deploy ApplicationInstances according to the minimumCapacity setting of the DeploymentProfile linked to a Fleet. This will result in a statically deployed amount (DeploymentProfile.minimumCapacity) of ApplicationInstances. No dynamic up- or downscaling will occur.
To enable dynamic up- or downscaling for a Fleet, you must set its operationalStatus value to 2 (automatic scaling enabled - implies automatic deployment).
Setting operational status to disabled (operationalStatus = 0) means no deployment of any kind is performed. No up- or downscaling will be performed. If you have deployed applications in a Fleet, these will be left alone.
An explanation of how dynamic and automatic scaling works can be found in the chapter.
When isReserved is 0 you may deploy any Application Instance on the Host. As soon as the first Application Instance is deployed on the Host, the Host's fleetId is set to the Fleet that is attached to said Application Instance. From then on, the Host can only be used for Application Instances belonging to that Fleet.
When isReserved is 1 this behaviour remains the same, but in addition when a Host is drained of Application Instances it will not be made available for another Fleet.
When {:target=_blank} a Host for a Fleet which has Application Instances deployed you will need to manually remove these Application Instances in order for the Host to be eligible for deployment for Application Instances of another Fleet.
The behaviour is the same as above. With automatic deployment however, you generally never reach the state where you organically drain Application Instances on a Host to cause it to reset its fleetId, since they will be automatically deployed again.
A Host is assigned a fleetId when Application Instances are deployed on it. When isReserved is 0 the scaler will determine which Host is deployed for which Fleet. As soon as a Host drains of Application Instances, its fleetId will be reset to 0 and it may be used for any other Fleet that is eligible. When isReserved is 1 and automatic scaling is enabled the Host's fleetId will never be reset to 0 and the Host will always be available for said Fleet.
When you {:target=_blank} a Host for a Fleet the Host will keep serving Application Instances until all Application Instances have been organically drained and eventually its fleetId is reset to 0. At that point the Host may be occupied by any other eligible Fleet (or the same Fleet if capacity is required again).
Table 1: Fleet element structure
Create a new Fleet within your i3D.net account.
The operationalStatus property is currently 0. This means automatic deployment is disabled. We will enable this in the next chapter, Starting Automatic Deployment after all configuration elements are in place.
Reserving a Host{:target=_blank} for a Fleet is the act of making sure that your Host may only ever deploy Application Instances that belong to that Fleet. Even if the Host is empty and could otherwise be used to deploy Application Instances for another Fleet it will remain empty until Application Instances are required for the reserved Fleet.
The behaviour of the reserving of a Host is dependent on the Operational Status of the Fleet.
The ApplicationProperty is an element that adds meaning to the Application element. E.g. you can define that an application uses a certain network port, or requires a password or multiple ports, and a preset password, or have the system generate a unique password for each ApplicationInstance. These properties are necessary for the system to function properly.
ApplicationProperties can only be set for the Application type Game.
Table 1: ApplicationProperty element structure
The characters allowed for a propertyKey are : a-z, A-Z, 0-9, _ A property key must start with a lowercase character.
The maximum length of a propertyKey is 50 characters.
Any UTF-8 character is allowed in a propertyValue.
The maximum length of a propertyValue is 150 characters.
ApplicationProperty elements consist of a propertyType, a propertyKey and a propertyValue. The propertyType indicates the functionality of the property. The propertyKey gives the property a name and the value a value. Not all property types require a value. E.g. if you have a property of propertyType password16, you can leave propertyValue empty. This means we will generate a password, in this case with a length of 16 characters. If however you do enter a propertyValue, then we take that as the password and the system will not generate a new random password. You can find all available property types and usages in the next chapter.
A propertyType is indicated by its numerical ID. The following types are available:
Table 2: Property types
When the platform deploys a new ApplicationInstance and you have added an ApplicationProperty of type public network port or private network port (or multiple), it will find a unique network port to use, per host. Which port is selected depends on the following logic:
If you enter a value of 0 for the network port property, the platform will find a completely random port within the range of 10240 - 29999 (public range) or 30000 - 49151 (private range).
If you enter a value between 10240 - 29999 (public) or 30000 - 49151 (private), the platform will take that value as the starting point to find a free port. If the given value is a free network port, then that will be used. If the port is already occupied by another instance, it is incremented and checked for availability again. This increment continues until a free network ports has been found for your application instance to use.
Public network ports can be accessed from the internet and as such must be used for connections of players to your game server.
Just like with the single port property type, port ranges will be generated uniquely for each ApplicationInstance.
In the property value, you indicate the size of the desired port range by entering a number between 2 - 200 (inclusive). Our platform will then generate a port range for each ApplicationInstance and make it available via . The port range notation of the variable at that point will be e.g.: 10500-10520.
All rules for also apply for private network ports. The only difference is that all ports generated for a private network port are not accessible from the internet and should only be used for internal services.
All rules for also apply for private network port ranges. The only difference is that all ports generated for a private network port range are not accessible from the internet and should only be used for internal services.
An Application's properties will be inherited by all elements belonging to said Application.
An ApplicationProperty's value can be overridden at later stages, in the listed order:
an ApplicationBuild will inherit an Application's properties. Its values can be overridden in the ApplicationBuild ()
a DeploymentRegion can override a property on a per-region basis. This can be useful if you want to define different property values for each deployment region, allowing you to start your applications with region-based startup parameters ()
As such, an override on DeploymentRegion level always wins. If no override for a DeploymentRegion is present, an override of the ApplicationBuild will win. If no override for an ApplicationBuild is present, the original property value defined for the Application will win.
Every property you define will become available as platform variables that can be used in configuration related properties: ApplicationBuild.startupParameters and ApplicationBuildConfiguration.configContents. Please see the topic for more details.
You can assign any number of ApplicationProperties to an Application. There is no limitation there. The only rule is that you must have unique propertyKey names per Application.
See also:
Opcode: 0x01
Our Agent will connect to your Arcus port and send this initialization packet. You must reply with an Acknowledged packet when everything is ok. If something is wrong, e.g. an invalid password, you must close the connection.
Schema:
Body example:
Opcode: 0x10
Let the our Agent know that the packet has been received correctly.
Opcode: 0x02
The requested opcode is not implemented. Informs the caller that it does not support this opcode.
Opcode: 0x30
Send a request to stop itself when the round is over, or when the game server is empty, with a maximum timeout value defined in the body. It will force close after that timeout period.
Schema:
Body example:
Opcode: 0x60
Inform the application that it has been allocated by an external source, for example a matchmaking system.
Opcode: 0x40
Receive new metadata directly.
Schema:
Body example:
Opcode: 0x20
Request server information from the game server. Mandatory values are:
current players
max players
server name
map
Server Information Response Opcode: 0x21 Description: Response to the server information request packet that tells the current players, max players, server name, map, mode, version of that moment.
Schema:
Body example:
Opcode: 0x50
For any use case where a specific function call needs to be called we can send this request packet to let the software know that he need to perform that custom command.
opcode: this is just an identifier that you can use to identify what kind of custom command you receive and how to parse the data that has been provided. data: anything you want to pass through.
Schema:
Opposite the manual deployment process is the automatic deployment process whereby our platform takes care of deploying game servers and utilities (side cars) for you. This is done according to the Deployment Configuration you have setup for a Fleet.
For automatic deployment to be possible, you must first create the following elements:
a with:
at least a
optionally a
a with at least one
Of course you must also have created at least and , otherwise you have nothing to deploy.
There are two modes of automatic deployment, which are defined by the of a :
Automatic deployment
Automatic scaling
These two modes are explained in the following chapters:
In this mode, the amount of instances defined by will be (statically) deployed, per region. So if you want to deploy a certain, static amount of application instances, you can use this option.
You can adjust the number of deployed instances at any time by changing the value. The system will then create or destroy the amount of instances necessary to match the new value. Note that minimumCapacity can be as well.
For more information, refer to the chapter.
In this mode, at least the amount of instances defined by will be deployed, per region, as described in the previous paragraph. When additional capacity is required due to game servers becoming or occupied, more game servers will automatically be deployed, first on your bare metal servers, or when these have been saturated, on cloud VMs as defined in the s of each .
The same is valid for downscaling. If there are too many (empty) instances, the platform will remove any unused instances (on a per region basis).
For a full explanation on how automatic scaling works, please refer to the chapter.
When you enable or on a Fleet, our scaling mechanism will start by deploying the number of Application Instances defined by the value. The number of deployed instances will never drop below this value, even if there are no players at all. The minimumCapacity value as such can be used in preparation for a new release, to ensure you have enough game servers to begin with upon release of your game. Coincidentally, minimumCapacity could also be used by you to manually scale game servers, by changing this value whenever you need more or less game servers.
If the DeploymentProfile.minimumCapacity value exceeds your bare metal capacity, the scaler will continue to deploy in the cloud, provided cloud locations have been defined for the relevant regions.
The DeploymentProfile.minimumCapacity value defines minimumCapacity for each individual region. You can this value per region in case you would like more instances deployed in a region where you expect more players. But keep in mind, minimumCapacity is mainly meant for the initial deployment of instances. Our scaling mechanism will of course start scaling instances if more players are needed [in a certain region].
The bufferValue only applies to the automatic scaling mode of a Fleet.
Besides the minimumCapacity setting, there is the bufferValue setting which determines the size of the pool of ApplicationInstances that must be available at all times. The purpose of this buffer is to catch sudden increases in the number of players and as such, to attempt (to ensure) there are always sufficient free game servers for your clients to join. In other words, the bufferValue is there to compensate for the time it takes to deploy game servers. The longer that takes (related to the size of your build files), the larger the buffer should be. The larger the buffer, the less risc there is of running out of available game servers. It is therefore important not to set this value too low.
The bufferValue can be defined in and can be per region, just like the minimumCapacity from the previous paragraph.
This document describes the automation and integration between Amazon GameLift Anywhere and the i3D.net ONE Deployment Platform (ODP).
In our article , you can find more background information on the integration between Amazon GameLift Anywhere and i3D.net.
To get started with the integration, you can request a .
The classical approach to updating game servers is to update them all at the same time, within a maintenance window.
When you you can select the instances to create the tasks for you in multiple ways.
Normally this is quite easy, assuming you want to update all instances in a , or , or for example all instances currently running on a certain . In that case you can simply enter any of these IDs during task creation in the Task request body (see below) and deployment tasks for all instances in said element will be created.
In other cases you may want to update really specific instances. If you do, you can first do a listing of the application instances you are interested in, by using any
If you use a game with a matchmaker in its backend, it will want to figure out which game server to send players who are waiting to start a new match. Your matchmaker can request an unused game server with an API allocation call. This process is an application instance allocation which is the key to helping to host multiplayer games. I3d.net's service allows for a seamless experience when using an allocation request.
Here is an example with an API allocation call using the ApplicationInstance element:
"/v3/applicationInstance/game/{applicationId}/empty/allocateWithErrors?filters=regionId=1 and fleetId=456".
In this example you will be shown how to create and configure a deployment environment for your game. It will have a basic setup with one general purpose Fleet meant to host game servers for a PC build or community. You can easily duplicate this Fleet for other platforms like PS4 or XBOne, or any other platform you want to target. Here is a simple diagram of such a setup:
The following elements will be created in this chapter:
{
"name": 0,
"i3dDcLocationIds": [
0
],
"i3dDcLocationIdsToBeRemoved": [
0
],
"minimumCapacity": 0,
"maximumCapacity": 0,
"bufferValue": 0,
"bufferValueType": 0,
"bufferValueMin": 0,
"bufferValueMax": 0,
"strategyType": 0,
"containers": [
{
"id": 0,
"containerLocations": [
{
"id": 0,
"cloudProviderId": 0,
"dcLocationId": 0,
"primaryInstanceTypeName": 0,
"secondaryInstanceTypeName": 0,
"cpuPlatform": 0
}
]
}
]
}[
{
"id": 0,
"name": 0,
"i3dDcLocationIds": [
0
],
"i3dDcLocationIdsToBeRemoved": [
0
],
"minimumCapacity": 0,
"maximumCapacity": 0,
"bufferValue": 0,
"bufferValueType": 0,
"bufferValueMin": 0,
"bufferValueMax": 0,
"strategyType": 0,
"markedForDeletion": 0,
"containers": [
{
"id": 0,
"markedForDeletion": 0,
"containerLocations": [
{
"id": 0,
"cloudProviderId": 0,
"dcLocationId": 0,
"primaryInstanceTypeName": 0,
"secondaryInstanceTypeName": 0,
"cpuPlatform": 0,
"markedForDeletion": 0
}
]
}
]
}
]{
"deploymentEnvironmentId": "3142271489856081055",
"applicationId": "1623002410560965042",
"applicationBuild": [
{
"newApplicationBuildId": "5282598825997197979",
"oldApplicationBuildId": "7890311781321404840"
}
],
"fleet": [
{
"fleetId":"2329870940606592031"
}
],
"patchJobName": "Patch to build B",
"patchJobMethodId": 1,
"stopMethodId": 9,
"stopMethodTimeout": 900,
"comments": "",
"schedulerStartTime": 1593072000,
"email": [
{
"email": "[email protected]",
"progressReport": 1,
"resultReport":1
}
]
}[
{
"id":"6732998643443795030",
"deploymentEnvironmentId":"3142271489856081055",
"applicationId":"1623002410560965042",
"patchJobMethodId":1,
"patchJobMethod":"Forced deployment",
"patchJobName":"Patch to build B",
"status":1,
"stopMethodId":9,
"stopMethodName":"Arcus",
"stopMethodTimeout":900,
"comments":"",
"schedulerStartTime":1593072000,
"patchJobStartTime":0,
"patchJobOverallProgress":null,
"applicationBuild":[
{
"id":"2590904313587865362",
"oldApplicationBuildId":"7890311781321404840",
"newApplicationBuildId":"5282598825997197979"
}
],
"fleet":[
{
"id":"8956749585727486343",
"fleetId":"2329870940606592031"
}
],
"email":[
{
"id":"3804546952601287130",
"email":"[email protected]",
"progressReport":1,
"resultReport":1,
"createdAt":1592915978,
"changedAt":0
}
],
"createdAt":1592915978,
"changedAt":0,
"finishedAt":0,
"isRevertable":1
}
][
{
"idx": 0,
"actionType": "Download software build",
"requiredParams": {
"buildId": "The ID of the applicationBuild. Its build archive will be downloaded."
}
},
{
"idx": 1,
"actionType": "Extract software build",
"requiredParams": {
"buildId": "The ID of the applicationBuild. This action will extract the build archive that has been downloaded."
}
},
{
"idx": 2,
"actionType": "Stop instance",
"requiredParams": {
"methodId": "The ID of the stop-method, indicating how you want to stop the application instance.",
"timeout": "If the stop-method is graceful, you can indicate a maximum time to wait here, before the application instance is forcefully terminated."
}
},
{
"idx": 3,
"actionType": "Deploy software build to instance",
"requiredParams": {
"buildId": "The ID of the applicationBuild. This action expects the build archive to already have been downloaded and extracted onto the host."
}
},
{
"idx": 4,
"actionType": "Start instance",
"requiredParams": null
}
]none[
{
"id": 12278257,
"batchId": 0,
"categoryId": 2,
"entityId": 2897954287466354361,
"currentActionIdx": 6,
"executeAt": 1563469175,
"lastActivityAt": 1563469176,
"finishedAt": 1563469176,
"resultCode": 127,
"resultText": "Done"
}
]none[
{
"id": 9,
"createdAt": 1559829929,
"executeAt": 1559829929,
"finishedAt": 1559829934,
"numTasks": 8,
"numTasksOk": 8,
"numTasksFailed": 0,
"numTasksCancelled": 0,
"taskIds": {
"11238257": 127,
"11238258": 127,
"11238259": 127,
"11238260": 127,
"11238261": 127,
"11238262": 127,
"11238263": 127,
"11238264": 127
}
}
]{
"errorCode": 11001,
"errorMessage": "Errors in form",
"errors": [
{
"property": "propertyType",
"message": "Invalid propertyType, the possible values are: 0: raw value, 1: network port, 2: password (8 chars), 3: password (16 chars), 4: password (24 chars)"
}
]
}{
"errorCode": 11001,
"errorMessage": "Errors in form",
"errors": [
{
"property": "type",
"message": "Invalid application type, the possible values are: 1: Game, 2: Utility"
},
{
"property": "managementProtocol",
"message": "Invalid managementProtocol, the possible values are: 0: None, 1: A2S, 2: ARCUS"
}
]
}lastActivityAt
Unix timestamp of when the system received a sign of life for this Task
finishedAt
Unix timestamp of when this task finished processing
resultCode
The result of the Task in numerical form
resultText
The result of the Task in human readable form
Unix timestamp of when the last Tasks was finished executing
numTasks
int
Total number of Tasks in this TaskBatch
numTasksOk
int
Number of successfully executed Tasks
numTasksFailed
int
Number of failed Tasks
numTasksCancelled
int
Number of cancelled Tasks
taskIds
[int]
Array of key-value pairs indicating Task ID vs Task Result Code
X
Rate limiting
-
X
X
Byte matching
-
-
X
API Access
-
-
X
Priority Support
-
-
X
Dynamic IP Whitelisting (Warden)
-
-
X
Advanced Payload Fingerprinting (Warden)
-
-
X
Protocol-Aware Intelligence (Warden)
-
-
X
Zero-Latency Processing (Warden)
-
-
X
version.
UtilityDeploymentTemplate (optional)
The DeploymentEnviroment element encapsulates all the deployment related configuration elements for your game / application. The element itself is easy to create; you only need to supply a name:
This example Fleet represents deployments for a PC platform or community.
Amongst a Fleet's properties is deploymentEnvironmentId. We take this value from the response of previous request, assigning the Fleet to the DeploymentEnvironment we've just created. Other properties like deploymentProfileId, gameDeploymentTemplateId and utilityDeploymentTemplateId can be left empty for now. We will be creating these elements next and add them to the Fleet afterwards.
The operationalStatus property in the response is 0. This means automatic deployment is disabled. We will enable this in the next chapter, Starting Automatic Deployment after all configuration elements are in place.
The GameDeploymentTemplate element defines which game ApplicationBuild you want to deploy.
The UtilityDeploymentTemplate describes any utilities (sidecars) you want to deploy onto each host that we deploy game instances onto.
You can indicate whether these should be installed on BM, VM or both and how many per DC location.
Next, we create a DeploymentProfile. You create one per Fleet and as such has a 1:1 relation with a Fleet.
This element describes how to deploy your applications. You must set the deployment strategy, minimum deployment figures and the buffer value defining the pool of warm game servers that are ready to be allocated. These are global values that apply per DeploymentRegion and can be overridden on a per-DeploymentRegion basis.
A DeploymentProfile contains the DeploymentRegions that define where to deploy your applications. These are added to the DeploymentProfile afterwards.
Next add a DeploymentRegion to the profile we have just created. This tells the platform in which data center(s) you want to deploy your game. Each DeploymentRegion is based on an i3D.net bare metal location (PoP) to which cloud datacenters can be added for the purpose of bursting onto when running out of bare metal capacity.
You can optionally override global DeploymentProfile parameters such as deployment strategy, minimumCapacity and buffer value if desired.
You can repeat this step for all the DeploymentRegions you want to create in your profile.
Finally we can assign the previously created DeploymentTemplates and DeploymentProfile to the PC Fleet from earlier.
Everything you need to start your first deployment is in place!

{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "initialization",
"type": "object",
"title": "Initialization payload Schema",
"required": [
"password"
],
"properties": {
"password": {
"$id": "#/properties/password",
"type": "string",
"title": "Management password",
"default": "",
"examples": [
""
],
"pattern": "^(.*)$"
}
}
}{
"password": "9e74txt7o6"
}{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"timeout"
],
"properties": {
"timeout": {
"$id": "#/properties/timeout",
"type": "integer",
"title": "The Timeout Schema",
"default": 0,
"examples": [
1600
]
}
}
}{
"timeout": 100
}{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "metadata",
"type": "object",
"title": "Metadata Schema",
"required": [
"data"
],
"properties": {
"data": {
"$id": "#/properties/data",
"type": "array",
"title": "Metadata Schema",
"items": {
"$id": "#/properties/data/items",
"type": "string",
"title": "The Items Schema",
"default": "",
"examples": [
"key",
"value"
],
"pattern": "^(.*)$"
}
}
}
}{
"data": [
{
"key": "map",
"value": "tokyo_large"
},
{
"key": "maxPlayers",
"value": "16"
}
]
}{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"players",
"maxPlayers",
"name",
"map",
"mode",
"version"
],
"properties": {
"players": {
"$id": "#/properties/players",
"type": "integer",
"title": "The Players Schema",
"default": 0,
"examples": [
0
]
},
"maxPlayers": {
"$id": "#/properties/maxPlayers",
"type": "integer",
"title": "The Maxplayers Schema",
"default": 0,
"examples": [
16
]
},
"name": {
"$id": "#/properties/name",
"type": "string",
"title": "The Name Schema",
"default": "",
"examples": [
"My awesome Game Server"
],
"pattern": "^(.*)$"
},
"map": {
"$id": "#/properties/map",
"type": "string",
"title": "The Map Schema",
"default": "",
"examples": [
"islands"
],
"pattern": "^(.*)$"
},
"mode": {
"$id": "#/properties/mode",
"type": "string",
"title": "The Mode Schema",
"default": "",
"examples": [
"DEATHMATCH"
],
"pattern": "^(.*)$"
},
"version": {
"$id": "#/properties/version",
"type": "string",
"title": "The Version Schema",
"default": "",
"examples": [
"1.0.0.1"
],
"pattern": "^(.*)$"
}
}
}{
"players": 5,
"maxPlayers": 16,
"name": "My awesome Game Server",
"map": "islands",
"mode": "DEATHMATCH",
"version", "1.0.0.1"
}{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"opcode",
"data"
],
"properties": {
"opcode": {
"$id": "#/properties/code",
"type": "integer",
"title": "The OpCode Schema",
"default": 0,
"examples": [
0
]
},
"data": {
"$id": "#/properties/data",
"type": "object",
"title": "The Data Schema"
}
}
}{
"name": "Bluewolf"
}[
{
"id": "173892217340309897",
"name": "Bluewolf",
"createdAt": 1568312996
}
]{
"name": "Bluewolf PC",
"deploymentEnvironmentId": "173892217340309897",
"deploymentProfileId": "",
"gameDeploymentTemplateId": "",
"utilityDeploymentTemplateId": ""
}[
{
"id": "7420099900751948711",
"name": "Bluewolf PC",
"deploymentEnvironmentId": "173892217340309897",
"deploymentProfileId": "",
"gameDeploymentTemplateId": "",
"utilityDeploymentTemplateId": "",
"operationalStatus": 0
}
]{
"name": "Bluewolf-server PC Game Deployment Template",
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "2324653987059528218"
}
]
}[
{
"id": "4748702875218694016",
"fleetIds": [],
"name": "Bluewolf-server PC Game Deployment Template",
"inUse": 0,
"createdAt": 1568371305,
"gameDeploymentTemplateBuild": [
{
"applicationBuildId": "2324653987059528218"
}
]
}
]{
"name": "Bluewolf-server PC Utility Deployment Template",
"utilityDeploymentTemplateBuild": [
{
"applicationBuildId": "3801243597300703061",
"deployOn": 3,
"installsPerLocation": 0
}
]
}[
{
"id": "6793353982360875057",
"fleetIds": [],
"name": "Bluewolf-server PC Utility Deployment Template",
"inUse": 0,
"createdAt": 1568371472,
"utilityDeploymentTemplateBuild": [
{
"applicationBuildId": "3801243597300703061",
"deployOn": 3,
"installsPerLocation": 0
}
]
}
]{
"name": "Bluewolf-server PC Deployment Profile",
"description": "PC Fleet Deployment Profile",
"strategyType": 1,
"minimumCapacity": 0,
"maximumCapacity": 0,
"bufferValue": 0,
"bufferValueType": 0,
"bufferValueMin": 0,
"bufferValueMax": 0
}[
{
"id": "88465290039742335",
"fleetIds": [],
"name": "Bluewolf-server PC Deployment Profile",
"description": "PC Fleet Deployment Profile",
"strategyType": 1,
"minimumCapacity": 0,
"maximumCapacity": 0,
"bufferValue": 0,
"bufferValueType": 0,
"bufferValueMin": 0,
"bufferValueMax": 0,
"markedForDeletion": 0,
"inUse": 0,
"deploymentRegions": [],
"createdAt": 1568376027
}
]{
"name": "EU: Rotterdam",
"i3dDcLocationIds": [
6
],
"containers": [
{
"containerLocations": [
{
"cloudProviderId": 31,
"dcLocationId": 63,
"primaryInstanceTypeName": "n1-highcpu-64",
"secondaryInstanceTypeName": "n1-highcpu-32",
"cpuPlatform": "Intel Broadwell"
}
]
}
]
}[
{
"id": "2468882381297501628",
"name": "EU: Rotterdam",
"i3dDcLocationIds": [
6
],
"i3dDcLocationIdsToBeRemoved": [],
"minimumCapacity": null,
"maximumCapacity": null,
"bufferValue": null,
"bufferValueType": null,
"bufferValueMin": null,
"bufferValueMax": null,
"strategyType": null,
"markedForDeletion": 0,
"containers": [
{
"id": "345414563890737521",
"markedForDeletion": 0,
"containerLocations": [
{
"id": "403382638377965874",
"cloudProviderId": 31,
"dcLocationId": 63,
"primaryInstanceTypeName": "n1-highcpu-64",
"secondaryInstanceTypeName": "n1-highcpu-32",
"cpuPlatform": "Intel Broadwell",
"markedForDeletion": 0
}
]
}
],
"inUse": 0
}
]{
"deploymentProfileId": "88465290039742335",
"gameDeploymentTemplateId": "4748702875218694016",
"utilityDeploymentTemplateId": "6793353982360875057"
}[
{
"id": "7420099900751948711",
"name": "Bluewolf PC",
"deploymentEnvironmentId": "173892217340309897",
"deploymentProfileId": "88465290039742335",
"gameDeploymentTemplateId": "4748702875218694016",
"utilityDeploymentTemplateId": "6793353982360875057",
"operationalStatus": 0
}
]deploymentProfileId
string
No
Identifier of the for this Fleet.
gameDeploymentTemplateId
string
No
Identifier of the for this Fleet.
utilityDeploymentTemplateId
string
No
Identifier of the for this Fleet.
dependencyDeploymentTemplateId
string
No
Identifier of the for this Fleet.
hostCapacityTemplateId
string
No
Identifier of the for this Fleet.
operationalStatus
int
Yes
Indicator of how this Fleet is operating with regards to automatic deployment and scaling: 0: Disabled 1: Automatic deployment enabled 2: Automatic scaling enabled (implies automatic deployment)
id
string
Read-only
Unique identifier of this element
name
string
Yes
Name of the deployment environment
deploymentEnvironmentId
string
Yes

Identifier of the this Fleet belongs to.
No
The value of the property
password8
string
no
An 8 character password. If no value provided, we generate a unique password for every ApplicationInstance.
3
password16
string
no
A 16 character password. If no value provided, we generate a unique password for every ApplicationInstance.
4
password24
string
no
A 24 character password. If no value provided, we generate a unique password for every ApplicationInstance.
5
public network port range
a number between 2 and 200
yes
A number indicating the size of the desired public port range.
6
private network port
0 or a number between 30000 - 49151
yes
Indicates a default or random network port for your application to use. Please see the for more information.
7
private network port range
a number between 2 and 200
yes
A number indicating the size of the desired private port range.
propertyId
string
N/A
Yes
Unique identifier of the element
propertyType
int
Yes
No
Type ID of the property
propertyKey
string
Yes
No
The name of the property
propertyValue
mixed
0
raw value
mixed
yes
A custom raw value. This property's key and value will be passed to ApplicationBuilds, ApplicationInstances and labels as-is.
1
public network port
0 or a number between 10240 - 29999 (inclusive)
yes
Indicates a default or random network port for your application to use. Please see the paragraph below for more information.
Only for network port
2
To get started with the Amazon GameLift Anywhere integration, the following setup needs to be available for a customer. There are several prerequisites to run the i3D.net One Deployment Platform (ODP) together with Amazon GameLift Anywhere.
i3D.net account with ODP enabled
i3D.net account with CDN enabled (for the upload game servers)
To use the integration, you need to have an Amazon account with GameLift Anywhere enabled. This account needs to have the following permissions set:
To use the system the client needs to register in the i3D.net system the following:
AccessKeyId
SecretAccessKey
defaultRegion for deployment (all fleets created by ODP will be created in this region)
Go to one.i3d.net to create your GameLift Anywhere cloud account within the i3D.net One Deployment Platform (ODP). Navigate to the Game Hosting page. On the Game Hosting page, you will find the GameLift Accounts page.
In the overview below click on the “New account” button at the top right. See figure 2-1.
Figure 2-1: GameLift Accounts page
In the overview below you need to fill out the requested information. The default region is where your new GameLift Anywhere i3D.net bare metal fleets will live. Click the checkbox “Activate Game Lift Anywhere” and activate the account.
Figure 2-2: Add GameLift Anywhere Account
Be aware that that you can only create 10 fleets by default in Game Lift Anywhere and 20 custom regions. You can only have one GameLift Anywhere account in the system at this moment.
For the integration with Amazon GameLift Anywhere you need to setup everything within the i3D.net One Deployment Platform (ODP). To make it easier to follow we will use the frontend for the setup in this part of the documentation.
Navigate to Application Management within the i3D.net ODP.
In step 1 in the overview below you will fill out the form with the name of your application and all additional information that you want to add. In step 2 (see figure 3-1) you need to set the Application Type to Game and select the checkbox “Game Lift Anywhere”. When you clicked the checkbox, it will automatically generate and add specific GameLift Anywhere properties in step 3 (figure 3-2).
Figure 3-1: Create GameLift Anywhere application
Do not remove or change these specific GameLift Anywhere properties as they are important properties within the integration between i3D.net ODP and Amazon GameLift Anywhere. You need to fill these specific GameLift Anywhere properties in the start parameters in the application build. See in the next step (step 4) more details on the Application Build. See figure 3-2 for a view of the specific GameLift Anywhere properties. You are allowed to add your own properties if needed.
Figure 3-2: GameLift Anywhere application properties
The application build is the actual game server that will be deployed on the server. In the start parameters of the application build, you need to add the values which are specified inside of the application setup. The properties will automatically be copied over when you create the build.
Based on our test application, you can set the properties in the start parameters as follows:
Figure 4-1: start parameters
Figure 4-2: application build setup
In the current beta implementation, if you want to use a different build or a new version of your build, you must follow these steps:
Scale down your fleet.
Manually upload the new build.
Link it to the correct application and application template.
Scale up your fleet.
After creating your application build, you need to create a game template following our regular process. See more details here:
Create a game template in the below overview:
Figure 5-1: Game template overview
In the view below you create the game template and you need to select your game build in the drop-down menu:
Figure Figure 5-2: Create game template
In this section we explain how you can deploy your game servers on i3D.net Bare Metal servers.
You need to create a deployment environment according to the standard process.
Create a deployment environment in the below overview.
Figure 1-1: Deployment environment overview
Click on the create environment button and create your deployment environment.
Figure 1-2: Create deployment environment
Once the deployment environment is ready, create a deployment profile.
Figure 2-1: deployment profile
When you created the deployment profile, click on the gear button next to the just created deployment profile, to create your region. Click on the Create region button in the overview below.
It is very important to use a region name that does not already exist in Amazon GameLift Anywhere. The region name will automatically be transformed in an Amazon GameLift Anywhere region by the system.
Figure 2-2: Create region within the deployment profile
In the overview below please choose the Region in which you received the i3D.net Bare Metal servers and click next.
Figure 2-3: Select region
In this last step you need to create a fleet to finalize your deployment. The fleet name must be unique and cannot exist inside of your Amazon GameLift account. The fleet will automatically be generated inside of Amazon GameLift Anywhere.
To make a fleet a specific GameLift Anywhere fleet you need to check the checkbox Game Lift Anywhere on the fleet create page. When you have created a GameLift Anywhere fleet you cannot change it back to a normal fleet after saving. See figure 3-1.
Figure 3-1 Create fleet
Now click on the orange tool-icon and choose Fully Automatic deployment on the right side and proceed.
Figure 3-2 Deployment Mode
Select deployment environment that you have created
Create a new fleet
Region name cannot exist inside of GameLift Anywhere and must be unique
Region name will be automatically created in GameLift Anywhere as custom region
Add to the fleet the game deployment template
Add the deployment profile to the fleet
Check the checkbox for Game Lift Anywhere
Save the fleet
Make sure that your credentials are setup on the API, so that i3D.net can connect with GameLift Anywhere
After you are satisfied with your setup you need to activate the automatic process that will create the fleet in GameLift Anywhere
Change the deployment Mode from manual to automatic deployment
After you made this change automatically the fleet will be created in GameLift Anywhere
In this Beta we did not provide the following:
After the fleet is created it is as it is:
Update or delete the fleet
Add new regions to the fleet
The process of deploying a game server on the Bare Metal Servers is very straightforward. You need to change the minimum amount of game servers on the deployment profile to the amount of game servers that you want to deploy.
When everything is configured correctly the game servers will be deployed through the Host Agent. The game servers will be started and enriched with the Amazon GameLift Anywhere properties that you have set on the application build.
GETBelow is a task request body illustrating the options for instance selection:
The properties relevant for instance selection are:
applicationInstanceIds - supply an array of literal applicationInstance Ids
fleetId - supply a fleet Id to select all the application instances in it
regionId - supply a region Id to select all the application instances in it
labels - supply additional application instance labels for more precise selections:
application_id
host_id
dc_location_id
application_build_id
any custom label created by you
You are not limited to using one filter property at a time; you can combine properties to create the final selection of instances.
Below we will illustrate creating forced update tasks via the API.
Creating tasks is done by means of providing a Task Template for the task you want performed. A Task Template is a description of a certain task whereby a task contains one or more actions. An action can be a deployment, preload, start / stop instance, etc.
The template that we are interested in is displayed - the others have been snipped.
This template with ID 2 is the deployment template. You can see the 5 actions it contains: download, extract, stop instance, deploy instance and start instance. Each of these actions has a requiredParams parameter detailing what information the action needs in order to be performed successfully. If the requiredParams value is null, the action does not require any parameters. These parameters must be provided in the taskActionParam parameter of the HTTP request to create the task later on.
buildId refers to the applicationBuild ID you want to deploy. Note that you see this parameter in three actions. You only need to provide it once later on in the HTTP request body.
methodId refers to the stop method to perform. The default value of 1 stands for "kill the process immediately". Other methods depend on whether your game supports graceful stop methods, allowing a game to finish before we take down the instance. [make a note here of how to obtain the methodIds].
timeout refers to the maximum length of the grace period the stop action will adhere to. If an instance has not stopped after <timeout> seconds, it will be forcefully shut down.
These are all the parameters needed to use a deployment task template.
Now you can create the actual Tasks for the application instances you want to update. You do not have to create a Task for each ApplicationInstance individually; the following endpoint will create deployment Tasks for all the given application instances with one API call. They will all become part of a TaskBatch, an object that encapsulates and tracks the progress of all individual Tasks.
Here we request a deployment task to be created for:
two individual application instances
plus, all active application instances in the fleet with ID 1382702706111300109
Because executeAt is 0, the tasks will be performed immediately. If you want to schedule tasks for future execution, enter a unix timestamp here.
The taskActionParam field states:
deploy the ApplicationBuild with ID 3772131712593619554
stop all instances immediately (methodId = 1)
the timeout is 0, because the stop method is "immediately" and as such a timeout does not apply
The response contains a TaskBatch object, showing you a global status of all individual Tasks.
id
int
A unique TaskBatch identifier
createdAt
int
Unix timestamp of creation time
executeAt
int
Unix timestamp of execution time
finishedAt
int
Table 1: TaskBatch element structure
applicationId is the ID of the application.
Using allocateWithErrors will allow you (if the call comes back where you cannot allocate) to help you with error handling.
Using the regionId and fleetId filters will ensure that you are directed to the correct servers.
You must create a firewall rule to allow traffic into the following port:
6824
TCP
ODP uses HTTP to call into the Host Agent v2 to determine the current status of the application instance.
Here is a visual example:
On the visual above, you see that when you send an application instance allocation, that our platform will always prioritize allocations on Bare Metal before allocating game servers on a Virtual Machine (VM), unless you perform an allocation request with an explicit filter to allocate a games server on a VM.
Request an unused game server using an API allocation call. (Example with filters used: "/v3/applicationInstance/game/{applicationId}/empty/allocateWithErrors?filters=regionId=1 and fleetId=456") For more information, see the ApplicationInstance reference documentation.
The server will find Bare Metal (BM) application instances to use. The server will check for application instances with Status 4.
If there are no BM application instances to use, then the server will select a VM application instance. If there are no application instances available, you will receive a return error message stating the same. See the next section for more information about error messages and how to handle them.
Once an application instance is found, the server converts the Status from 4 (Online) to 6 (Allocating).
The hostagent API is called for allocation. Then the hostagent API responds back with a Status from 6 (Allocating) to 5 (Allocated).
Lastly, the customer/match maker receives a response back with the correct application instance.
Filtering on the following parameters is currently not supported:
autoRestart
liveGameVersion
liveHostName
liveMap
liveRules
manuallyDeployed
markedForDeletion
numPlayers
numPlayersMax
properties
ipAddress
labelReadOnly
labelPublic
metadata
pid
pidChangedAt
For your reference, here is a listing of the Status codes and descriptions:
Status code
Status name
Description
0
inactive
The instance is no longer in use
1
setup
The instance is being setup / deployed for the first time
2
offline
The instance is deployed but not running
3
starting
The instance is currently starting up (optional)
Our platform also has a mechanism in place that allows your backend to send custom data (metadata) to game servers in the form of key / value pairs. This mechanism has primarily been created to reconfigure game servers during allocation, based on what kind of map it should run. However, you can use metadata in any way you see fit.
Your matchmaker can collect game clients and then allocate (request and reserve) a game server by doing an allocation call towards the i3D.net API. During the allocation call, the matchmaker sends metadata along which will be stored for the allocated game servers. This same metadata can then be forwarded to the same game servers, which in turn can react to the metadata. For example, it can load another map or change the game mode.
In order for the platform to send metadata to your game servers, you must implement the Arcus protocol. This is currently the only game server management protocol that has a mechanism for receiving metadata.
If your game already supports a way to receive custom information similar to the metadata described here, and you would like our platform to be compatible with that, please contact us and we may be able to support your management protocol.
Code
Message
Description
HTTP status code
76000
Internal error in host agent
The host agent returned an unexpected response.
Internal Server Error (500)
76001
Unauthenticated
The provided token is invalid.
Unauthorized (403)
76002
Internal Server error
The host agent encountered an unspecified internal server error.
Unprocessable Entity (422)
400: deploymentEnvironmentId An invalid filter column is provided.
403: Invalid credentials.
404: Invalid applicationId, or if any of the following filters contain a value that cannot be resolved to their respective entity (labels and nested objects not supported):
1: deploymentEnvironmentId
2: deploymentEnvironmentName
3: fleetId
4: fleetName
5: regionId
6: regionName
7: dcLocationId
8: deLocationName
If no application instances can be allocated and if your application is configured to use the Arcus protocol, and there is a connection problem with Arcus or Arcus is not implemented properly in your application build, a separate error may be thrown. Alternatively, if your filters contain one (or more) of the following properties but they filter out application instances that would be available for allocation, a 404 error can be thrown detailing which filter caused no application instances to be found:
1: deploymentEnvironmentId
2: fleetId
3: regionId
4: dcLocationId
500: Internal service error For more information about this error see the Deployment-Platform Endpoints documentation.
When the match of a game server is over, the operational status of said game server needs to be updated to indicate it is free again for other clients to join. It can then be allocated again by your matchmaker for other clients to join and start a match. For this to be possible, the status of the game server needs to be changed from Allocated (5) to Online (4).
This can be achieved in several ways:
Your game server can make an API call to set its own status back to Online (4)
Your matchmaker, when aware of game match progression, can make an API call and set the status of a game server back to Online (4)
Your game server can shut itself down after a match. Our platform will automatically restart it with the result that the game server's status will automatically be set to a correct value again
A Host represent a machine with an operating system, be it a physical - bare metal - machine, or a virtual machine.
If a host is failing due to hardware problems, its category will be set to Broken. Our platform will no longer use this host, until its category has been reverted to the original value, e.g. Dedicated Game Server, after it is mended. Do not confuse the wording "Dedicated Game Server" with an application instance (e.g. a deployed Game Server).
See .
Table 1: Host element structure
List all your Hosts.
You can still add new templates, where there were none before, but changing or removing them can only be done when there are no ApplicationInstances in the Fleet.{
"name": "Bluewolf PC",
"deploymentEnvironmentId": "173892217340309897",
"deploymentProfileId": "8068976724396537810",
"gameDeploymentTemplateId": "2190484266497878757",
"utilityDeploymentTemplateId": "1316371245160957961"
"dependencyDeploymentTemplateId": "6537333393893172977",
"hostCapacityTemplateId": ""
}[
{
"id": "7420099900751948711",
"name": "Bluewolf PC",
"deploymentEnvironmentId": "173892217340309897",
"deploymentProfileId": "8068976724396537810",
"gameDeploymentTemplateId": "2190484266497878757",
"utilityDeploymentTemplateId": "1316371245160957961",
"dependencyDeploymentTemplateId": "6537333393893172977",
"hostCapacityTemplateId": "",
"operationalStatus": 0
}
]{
"version": "2012-10-17",
"statement": [
{
"sid": "Statement1",
"effect": "Allow",
"action": [
"gamelift:*"
],
"resource": []
}
]
} -port VAR_PORT -endpoint VAR_AWSGL_ENDPOINT -fleet-id VAR_AWSGL_FLEETID -host-id VAR_AWSGL_HOSTNAME -region VAR_AWSGL_REGION -auth_token VAR_AWSGL_TOKEN{
"taskTemplateId": 0,
"applicationInstanceIds": [
"string"
],
"fleetId": "",
"regionId": "",
"labels": [
{
"key": "string",
"value": "string"
}
],
"executeAt": 0,
"taskActionParam": [
{
"paramName": "string",
"paramValue": "string"
}
]
}[
{
...
},
{
"id": 2,
"name": "Deploy a software build",
"description": "Install a software build onto a server. This can be used to install an initial build of a new game instance, or to patch an existing instance. If the software build was previously downloaded (preloaded), it will not be downloaded again.",
"actions": [
{
"idx": 0,
"actionType": "Download software build",
"requiredParams": {
"buildId": "The ID of the applicationBuild. Its build archive will be downloaded."
}
},
{
"idx": 1,
"actionType": "Extract software build",
"requiredParams": {
"buildId": "The ID of the applicationBuild. This action will extract the build archive that has been downloaded."
}
},
{
"idx": 2,
"actionType": "Stop instance",
"requiredParams": {
"methodId": "The ID of the stop-method, indicating how you want to stop the application instance.",
"timeout": "If the stop-method is graceful, you can indicate a maximum time to wait here, before the application instance is forcefully terminated."
}
},
{
"idx": 3,
"actionType": "Deploy software build to instance",
"requiredParams": {
"buildId": "The ID of the applicationBuild. This action expects the build archive to already have been downloaded and extracted onto the host."
}
},
{
"idx": 4,
"actionType": "Start instance",
"requiredParams": null
}
]
},
{
...
}
]{
"taskTemplateId": 2,
"applicationInstanceIds": [
"7307311272729997509", "1803671638346755523"
],
"fleetId": "1382702706111300109",
"executeAt": 0,
"taskActionParam": [
{
"paramName": "buildId",
"paramValue": "3772131712593619554"
},
{
"paramName": "methodId",
"paramValue": "1"
},
{
"paramName": "timeout",
"paramValue": "0"
}
]
}[
{
"id": 3874,
"createdAt": 1567172470,
"executeAt": 1567172470,
"finishedAt": 0,
"numTasks": 78,
"numTasksOk": 0,
"numTasksFailed": 0,
"numTasksCancelled": 0,
"taskIds": [
285613,
285614,
285615,
... snipped ...
]
}
]Unix timestamp of when the last Tasks was finished executing
numTasks
int
Total number of Tasks in this TaskBatch
numTasksOk
int
Number of successfully executed Tasks
numTasksFailed
int
Number of failed Tasks
numTasksCancelled
int
Number of cancelled Tasks
taskIds
[int]
Array of key-value pairs indicating Task ID vs Task Result Code














startedAt
status
stoppedAt
updatedAt
4
online
The instance has started up and is fully working (and initialized)
5
allocated
The instance has been allocated by a matchmaker
6
allocating
The instance is in the stage of being allocated by a matchmaker
76003
The application instance does not exist on the host
The found application instance (=session) was removed from the host and thus cannot be allocated.
Not Found (404)
76004
The application instance is invalid and cannot be allocated on the host
The application instance is found but not in an allocatable state.
Not Found (404)
76005
The application instance is currently being allocated on the host
The application instance is already in the process of being allocated - cannot allocate it again.
Unprocessable Entity (422)
76006
The application instance is already allocated on the host
The application instance is already allocated - cannot allocate it again.
Unprocessable Entity (422)
76007
Failed to allocate the application instance on the host is aborted or timed out
The allocation process on the host agent has timed out (5 seconds) or was aborted for another reason.
Unprocessable Entity (422)
76007
Failed to allocate the application instance on the host is aborted or timed out
The host agent was not reachable or did not respond to a request in a timely fashion.
Gateway Timeout (504)

isVirtual
int
Read-only
0) a bare metal machine, 1) a virtual machine
category
string
Read-only
Host category. Normally "Dedicated Game Servers" or "Dedicated Servers", but can be "Broken" if the server is in a degraded state.
locationId
int
Read-only
Legacy location Id (not used for ODP)
dcLocationId
int
Read-only
Data center location Id. Points to one of /v3/cloud/dcLocation
fleetId
string
Read-only
The ODP fleet ID, if this host has been assigned to a fleet
fleetAssociatedSince
int
Read-only
Unix timestamp of the last Fleet association
dateStart
string
Read-only
The date at which this host was assigned to your account
dateEnd
string
Read-only
The date at which this host will expire
dateCancelled
string
Read-only
The date at which this host was cancelled
dateEndContract
string
Read-only
The date at which the contract ends (applicable only if a contract has been signed)
contractPeriod
int
Read-only
The contract period in months
extendPeriod
int
Read-only
The service extend period in months
purchaseOrder
string
Read-only
Purchase order, if one has been supplied via our billing department
paymentTerm
int
Read-only
The payment term in days (how many days are invoices generated before dateEnd)
ipAddress
[]
Read-only
All IP addresses assigned to this host. Note that the public IP address of a VM is also listed, even though it is assigned via NAT and not actually allocated on the host itself.
numCpu
int
Read-only
Number of CPUs in this host
cpuInfo
string
Read-only
CPU Type, Family, Model and Stepping information
cpuType
string
Read-only
CPU type. e.g. "Intel(R) Xeon(R) CPU E3-1230 @ 3.20GHz"
cpuLoad
int
Read-only
CPU load
cpu
[]
Read-only
CPU details
disk
[]
Read-only
Disk drive details
memory
[]
Read-only
Memory details
isReserve
int
Read-only
Indicates whether this host has been reserved for a fleet. This value can only be 1 if a fleetId is provided as well. You can set this property via
labels
[]
No
Collection of client-defined labels
isODP
int
Read-only
If 1, this host has been assigned for use by the Game Hosting Platform and can be used for game deployment
id
int
Read-only
Unique identifier of this element
serverId
int
Read-only
Identifier of the physical or virtual machine (internal Id)
serverName
string
Read-only
Name of the physical or virtual machine (internal name)
An ApplicationInstance is the element that represents a deployed (e.g. a deployed game server or utility). It describes an actual instance of your software deployed onto a host.
With automatic deployments enabled, an ApplicationInstance is created, destroyed and controlled by the platform. You can also do this manually though and additionally get information about all your ApplicationInstance elements using the .
The ApplicationBuild element points to your build archive which must be uploaded to the i3D.net CDN. You must provide information on how to run the build by assigning the name of the exectuable, provide startup parameters, which OS it must run on, etc.
[
{
"id": 42297,
"serverId": 16514,
"serverName": "Server 10309",
"isVirtual": 0,
"category": "Dedicated Game Servers",
"osId": 151,
"locationId": 18,
"dcLocationId": 6,
"fleetId": "0",
"dateStart": "2016-02-16",
"dateEnd": "2021-04-01",
"dateCancelled": "2018-08-07",
"dateEndContract": "2021-04-01",
"contractPeriod": 1,
"extendPeriod": 1,
"purchaseOrder": "",
"paymentTerm": 30,
"ipAddress": [
{
"ipAddress": "31.204.131.39",
"version": 4,
"type": 1,
"private": 0
},
{
"ipAddress": "172.16.38.144",
"version": 4,
"type": 2,
"private": 1
},
{
"ipAddress": "2a00:1630:2:1606::",
"version": 6,
"type": 1,
"private": 0
}
],
"numCpu": 1,
"cpuInfo": "Type 0, Family 6, Model 42, Stepping 7",
"cpuType": "Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz",
"cpuLoad": 0,
"disk": [
{
"diskType": "ATA Disk",
"diskMedium": "hdd",
"model": "Western Digital RE4",
"product": "WDC WD1003FBYX-18Y7B0",
"diskSerial": "WD-WCAW32130431",
"firmwareVersion": "01.01V02",
"rotationRate": 7200,
"sectorSizeLogical": 512,
"sectorSizePhysical": 512,
"size": 931000000000
}
],
"memory": [
{
"brand": "01980000002C",
"model": "9965669-033.A00G",
"size": 17179869184,
"speed": 2400,
"ecc": 1,
"memoryBank": 0,
"memoryType": "DIMM DDR4 2400 MHz Synchronous, Unbuffered (Unregistered), ECC",
"memorySlot": "A1",
"memorySerial": "EE203736"
},
{
"brand": "0198000000AD",
"model": "9965669-026.A00G",
"size": 17179869184,
"speed": 2133,
"ecc": 1,
"memoryBank": 1,
"memoryType": "DIMM DDR4 2133 MHz Synchronous, Unbuffered (Unregistered), ECC",
"memorySlot": "A2",
"memorySerial": "E73C5BC0"
}
],
"isReserve": 0,
"labels": []
},
]id
string
Read-only
Unique identifier of this element
deploymentEnvironmentId
string
Read-only
Unique identifier of the DeploymentEnvironment it's deployed in
deploymentEnvironmentName
string
Read-only
The name of the DeploymentEnvironment it's deployed in
fleetId
string
Read-only
Unique identifier of the Fleet it's deployed in
fleetName
Table 1: ApplicationInstance element structure
During the lifetime of an ApplicationInstance it goes through several operational statuses. This is stored in the status property of the element. The different status levels and what they represent are explained in the following tables:
0
inactive
The instance is no longer in use
1
setup
The instance is being setup / deployed for the first time
2
offline
The instance is deployed but not running
3
starting
Table 2: Game and Utility ApplicationInstance operational statuses
0
inactive
The instance is no longer in use
101
setup
The instance is being setup / deployed for the first time
102
offline
The instance is deployed but not running
103
starting
Table 2: Dependency (Un-)Installer ApplicationInstance operational statuses
By default the status of a game instance will be set to ONLINE (4) after it's been started. This status means your game instance is ready to accept players. If however your game server requires an initialization period before it can accept players and you want our system to know about this, then you can do the following:
In your ApplicationBuild, enable the instanceDoesReadyCallback option. With this checked, our platform will set the status of your game instances to STARTING (3). Next, you must have your game instance tell our backend when it is ready to accept players by having it perform a callback to our API. The status will then be set to ONLINE (4) and our platform then knows the game instance can be allocated (if applicable).
Any properties defined for an ApplicationBuild will be inherited by an ApplicationInstance.
A user can define custom labels (key / value pairs) for an ApplicationInstance, to allow for easy identification and filtering of ApplicationInstance elements.
Alongside client-defined labels there will also be additional read-only labels generated by the platform:
application_id
fleet_id
host_id
dc_location_id
region_id
application_build_id
Read more about Labels.
An ApplicationInstance is deployed according to an ApplicationBuild.
id
string
Read-only
Unique identifier of this element
name
string
Yes
User defined name of this element
applicationId
string
Read-only
Unique identifier of the Application element this belongs to
osId
int
Yes
ID of the operating system (see )
stopMethod
Table 1: ApplicationBuild element structure
You must provide us with the file name of the executable inside your build archive, in order for us to be able to run your application. If the executable is inside of a subfolder, you must provide this path as well. Note that the path here is relative.
When starting your application, we will append the contents of the startupParameters property to the executable. You can enter any command line arguments you need for your application to run properly. You can use variables inside the startupParameters to use dynamic values such as a game server's network port, IP address, host ID, game server ID, etc. All available variables are explained in the Platform Variables chapter. It includes an example with fictional startupParameters.
By default we will run your applications with the root or administrator user. If you prefer, for security reasons, to run your utilities and / or game servers with lowered privileges, you can set the property runAsNonePrivileged to 1.
The platform currently supports the following operating systems that you can use to run your applications on:
Ubuntu 18.04
Ubuntu 20.04
Ubuntu 22.04
Centos 8
Debian 10
Debian 12
Windows Server 2022 Standard
You can also programmatically fetch the list of supported operating systems via GET /v3/operatingsystem and applying a filter on the 'odpSupported' property.
If you need to use an OS that is currently not supported, you can request support for this by filing a ticket with us.
A user can define custom labels (key / value pairs) for an ApplicationBuild, to allow for easy identification and filtering of ApplicationBuild elements.
Just like with the Application element, an ApplicationBuild can be assigned properties, by assigning ApplicationBuildProperty elements to an ApplicationBuild.
Note that properties assigned to an Application will already be inherited by an ApplicationBuild, so there is no need to re-define those for each ApplicationBuild. Unless you want to override a certain property for an ApplicationBuild.
An ApplicationBuild is created by calling the endpoint POST /applicationBuild and is the final stage of the ApplicationBuild creation process:
See also: Application element relations
You can have any number of ApplicationBuilds on your account. There is no limit.
string
Read-only
The name of the Fleet it's deployed in
hostId
int
Read-only
Unique identifier of the Host it's deployed on
isVirtual
int
Read-only
1 if it's deployed onto a VM, 0 if deployed onto bare metal
applicationId
string
Read-only
Unique identifier of the Application this instance is based on
applicationName
string
Read-only
The name of the Application this instance is based on
applicationType
int
Read-only
The type of application as inherited from its parent Application: 1: Game server 2: Utility 3 DependencyInstaller 4 DependencyUninstaller
applicationBuildId
string
Read-only
Unique identifier of the ApplicationBuild this instance is based on
dcLocationId
int
Read-only
Host data center location ID
dcLocationName
string
Read-only
Host data center location name
regionId
int
Read-only
Unique identifier of the deployment region it's deployed in
regionName
string
Read-only
The name of the deployment region it's deployed in
status
int
Read-only
Game and Utility instances: 0: inactive 1: setup 2: offline 3: starting 4: online 5: allocated Dependency (Un-)Installer instances: 0: inactive 101: setup 102: offline 103: starting 104: running 105: completed 106: error
manuallyDeployed
int
Read-only
0: automatically deployed 1: manually deployed
createdAt
int
Read-only
Unix timestamp of when this element was created
updatedAt
int
Read-only
Unix timestamp of the last change to this element
startedAt
int
Read-only
Unix timestamp of when this element was last started
stoppedAt
int
Read-only
Unix timestamp of when this element was last stopped
deletedAt
int
Read-only
Unix timestamp of the Application instance deletion
pid
int
Read-only
PID of the instance
pidChangedAt
int
Read-only
Unix timestamp of the last PID change
startupParams
string
Read-only
The exact startup parameters that were used to start this application instance with all properties resolved to their respective values. Will be null if the instance has not been started, but will retain its previous value if it was stopped. Once set it will never be cleared again
executable
string
Read-only
The name of the executable that was ran when the application instance started. Will be null if the instance has not been started, but will retain its previous value if it was stopped. Once set it will never be cleared again
ipAddress
Read-only
All IP addresses active for this instance
numPlayersMax
int
Read-only
Maximum number of players allowed on a game server [only applies to instances of type Game Server]
numPlayers
int
Read-only
Current number of players on the game server [only applies to instances of type Game Server]
liveHostName
string
Read-only
Current game server name [only applies to instances of type Game Server]
liveMap
string
Read-only
Current map running on the game server [only applies to instances of type Game Server]
liveGameVersion
string
Read-only
Current version of the game server software [only applies to instances of type Game Server]
liveRules
string
Read-only
Current "rules" of the game server [only applies to instances of type Game Server]
autoRestart
int
Read-only
If auto restart is 1, the application instance will automatically restart after (self-)shutdown
properties
Read-only
Properties inherited from the related ApplicationBuild
labelReadOnly
[Label]
Read-only
Collection of read-only labels generated by the system
labelPublic
[Label]
No
Collection of client-defined labels
metadata
[Metadata]
No
Metadata
markedForDeletion
int
Read-only
1 if the application instance is about to be destroyed
The instance is currently starting up (optional)
4
online
The instance has started up and is fully working (and initialized)
5
allocated
The instance has been allocated by a matchmaker
6
allocating
The instance is in the process of being allocated by a matchmaker
The instance is currently starting up (optional)
104
running
The instance has started up and is currently running
105
completed
The instance has stopped without error
106
error
The instance has stopped with error. To get the console output of the instance, see /v3/applicationInstance/{applicationInstanceId}/log
int
No
The stop method that will be used on restart or destroy of an application instance. The default is taken from the value of Application.stopMethod - any value submitted here overrides that Application default
stopTimeout
int
No
The timeout that will be used on restart or destroy of an application instance. The default is taken from the value of Application.stopTimeout - any value submitted here overrides that Application default
executable
string
Yes
Name of the executable file that our system must run to start the application
startupParameters
string
Yes
Startup parameters passed to the executable
runAsNonePrivileged
int
No
0: run as root user (default) 1: run as non-privileged user. This currently only works for builds deployed onto a Linux operating system. Windows builds will always run as administrator.
instanceDoesReadyCallback
int
No
Set to 1 if a deployed application instance will inform the platform it's done with initializing and is ready to accept players. Defaults to 0 if not set, which means an instance's status will go directly to ONLINE (4) after starting
type
int
Read-only
The application build type. A list of types can be found in: GET /application/type
applicationBuildFile
ApplicationBuildFile
Yes
An object describing the location of the original build archive.
buildProvisioningStorageType
int
Yes
Type of storage being used. You can find all types in GET/v3/builds
hostCapacityTemplateId
int
No
ID of the HostCapacityTemplate to assign to this ApplicationBuild
label
[Label]
No
Collection of client-defined labels
createdAt
int
Read-only
A unix timestamp of when this element was created

The PatchJob element represents a scheduled patching process. This chapter only describes the PatchJob element itself and refers to directly related elements. For explanations on how the patching process itself works and which different patching methods are available (and how they work), please refer to the Patching Process chapter.
A PatchJob has several properties that define which ApplicationInstances you want to update:
DeploymentEnvironment ID (PatchJob.deploymentEnvironmentId property)
Application ID (PatchJob.applicationId property)
One or more old ApplicationBuild IDs (PatchJob.applicationBuild property)
One or more Fleet IDs (PatchJob.fleet property)
You can preview your instance selection using the endpoint which takes the above arguments and returns an array of regions along with the number of instances per region that fall within your selection.
All other properties define how the PatchJob behaves. An important one is the patchJobMethodId property which states which patching method will be used. E.g. forced update, rolling update or A/B deployment.
Table 1: PatchJob element structure
Updating a PatchJob is only allowed up to 5 minutes before the start time of the job. The only exception to this rule are the reporting email addresses, which can be updated at any time.
The reason for this is to prevent the system from becoming confused with sudden changes being introduced when the PatchJob has just started running. Additionally, the platform will perform certain operations in preparation for the start of the PatchJob. E.g. we will start distributing the new build software to the hosts 5 minutes before the start time of the job, in order to have a more swift patching process itself.
It is possible to create multiple PatchJobs and have them run in parallel, as long as the instance selections of the PatchJobs do not overlap. In other words, if you have more than one PatchJob scheduled at or around the same time and they will (partially) apply to the same ApplicationInstances, only one PatchJob will run at the time - the other one(s) will wait for the first to finish before starting.
You can cancel a pending or running PatchJob at any time. If it has not yet started, its status will simply be changed to CANCELLED and the PatchJob will never run.
When you attempt to cancel a PatchJob, you will have two choices:
Cancel and revert.
Cancel and wrap-up (don't do anything).
Create a new PatchJob within your i3D.net account.
patchJobMethodId
int
Yes
The patching method. You can find a list of available methods via
patchJobMethod
string
Read-only
The name of the selected patching method
patchJobName
string
Yes
The name of the PatchJob
status
int
Read-only
The status of the PatchJob. You can find a list of available codes via
stopMethodId
int
No
The stop method ID to apply if instances need to be stopped. You can find the list available stop methods via
stopMethodName
string
Read-only
The name of the selected stop method
stopMethodTimeout
int
No
The maximum time in seconds the system will wait for a graceful stop command to be executed. If the maximum timeout is reached, an implicit, forced stop will be performed
comments
string
No
Custom comments
schedulerStartTime
int
No
A unix timestamp for when to start the PatchJob. Must be at least 5 minutes from the time of submission
patchJobStartTime
int
Read-only
A unix timestamp indicating the actual start time of the PatchJob
patchJobRunTime
int
No
The maximum run time of a PatchJob. If exceeded, the PatchJob will be forcefully finalized
patchJobRuntimeType
int
No
patchJobRunTime unit: 0: seconds (default) 1: minutes 2: hours 3: days
patchJobRuntime
string
Read-only
The name of the patchJobRuntimeType
patchJobOverallProgress
Read-only
Current overall state of the PatchJob
applicationBuild
[]
Yes
A list of elements defining which ApplicationBuilds must be replaced
fleet
[]
Yes
The PatchJob will apply to instances in these Fleets
[]
No
A list of PatchJob related email addresses, indicating who to send reports to and which report types
createdAt
int
Read-only
A unix timestamp of when this element was created
updatedAt
int
Read-only
A unix timestamp of when this element was last updated
id
string
Read-only
Unique identifier of this element
deploymentEnvironmentId
string
Yes
The PatchJob will apply to instances within this DeploymentEnvironment
applicationId
string
Yes
The PatchJob will apply to instances of this
{
"deploymentEnvironmentId": "7089186347851060494",
"applicationId": "8939460394116420757",
"patchJobMethodId": 1,
"patchJobName": "Demo Patch Job",
"stopMethodId": 0,
"stopMethodTimeout": 0,
"comments": "Deployment of v2.0.5 - fixes a number of bugs",
"schedulerStartTime": 1587405918,
"patchJobRunTime": 0,
"patchJobRuntimeType": 0,
"applicationBuild": [
{
"oldApplicationBuildId": "7302942857359174099",
"newApplicationBuildId": "6257774125730552445"
}
],
"fleet": [
{
"fleetId": "7089186347851060494"
}
],
"email": [
{
"email": "[email protected]",
"progressReport": 1,
"resultReport": 1
}
]
}[
{
"id": "7089186347851060494",
"deploymentEnvironmentId": "6133202252238171791",
"applicationId": "8939460394116420757",
"patchJobMethodId": 1,
"patchJobMethod": "Forced deployment",
"patchJobName": "Demo Patch Job",
"status": 8,
"stopMethodId": 0,
"stopMethodName": "Hard kill",
"stopMethodTimeout": 0,
"comments": "Deployment of v2.0.5 - fixes a number of bugs",
"schedulerStartTime": 1587405918,
"patchJobStartTime": 0,
"patchJobInstanceRunTime": "Seconds",
"patchJobInstanceRuntimeTypeId": 0,
"patchJobInstanceRuntime": "Seconds",
"patchJobOverallProgress": null,
"applicationBuild": [
{
"id": "6585830247739430646",
"oldApplicationBuildId": "7302942857359174099",
"newApplicationBuildId": "6257774125730552445"
}
],
"fleet": [
{
"id": "2956430507214878357",
"fleetId": "7089186347851060494"
}
],
"email": [
{
"id": "5874260432191151466",
"email": "[email protected]",
"progressReport": 1,
"resultReport": 1,
"createdAt": 1587746121,
"changedAt": 0
}
],
"createdAt": 1587395426,
"changedAt": 0
}
]Arcus provides a health check mechanism that determines whether client and server properly respond to traffic.
The game server (server) must send a health packet when no data has been received by the host agent (client) within 30 seconds. In case the host agent (client) closed the connection but somehow the game server (server) didn't get notified about this, sending the health packet will fail and the game server must close the connection. The host agent will continuously attempt to re-establish the connection.
The host agent (client) uses the same mechanism but adds a small buffer to the interval and will never send a simple health packet when it didn't receive any message in the set interval + buffer value the connection will be closed and reopened.
Direction flow This request is sent from a game server (server) > host agent (client).
Packet structure
With a soft stop it's possible to inform the application to gracefully shut itself down. By providing a timeout value higher than "0" the platform will hard stop the application in case it didn't gracefully shutdown yet.
Soft stop can be applied for instance patching For more information on patching .
Direction flow This request is sent from the host agent (client) > game server (server).
Packet structure
Example payload
The default behavior of the platform will always hard stop your application, Its required to configure a soft stop method for your application before this packet will be send to your application.
Inside one platform, it's possible to mark a game server as allocated this way the platform knows that the server is in use. Most matchmakers are taking care of this part with the help of arcus we could inform the game servers them self about this as well. A game server can already start loading maps or doing other tasks before the players are connected to improve the player waiting times for example.
In a couple of cases game servers needs to know what to load for example: which map does it need to load? this can be controlled with the help of meta data. An allocation request has a optional body containing a JSON object with key value pairs for meta data this keys and values are definable by the customer.
Direction flow This request is sent from the host agent (client) > game server (server).
Packet structure
Example payload
With this packet it's possible to transfer from the ONE platform to the game server without the need of an allocation call first. This may be of use if you want to send extra information to the game server, such as: Load map "islands_large", Game mode: "Battle royal", Type: "Squads". The game server can prepare / load everything already before a single player has joined the server.
Direction flow This request is sent from the host agent (client) > game server (server).
Packet structure
Example payload
With this packet it's possible to transfer from the game server to the ONE platform. This may be of use if you want to send information from the game server to the ONE platform.
Example situation: There are situations where the game server made a decision which changed the inside the game server. To receive this information from the game server this packet can be used to send the changed metadata back to the ONE platform.
Direction flow This request is sent from the game server (server) > host agent (client).
Packet structure
Example payload
Live state packet is meant to sync up the game state in the server with the platform and inform if the game is in use by players. To make sure the data is in sync, this packet will always be sent to new connections to sync up the current state. After the connection has been established it will be sent on every game state that update the state with a new player amount.
The payload of the response will contain a JSON object with the mandatory values, an developer can always add more information to the response.
Mandatory values
current players
max players
server name
map
Direction flow This request is sent from a game server (server) > host agent (client).
Packet structure
Example payload
On all new connections the client will send the Host Information to the server. To inform the server on what type of host he is running.
Direction flow This request is sent from the host agent (client) > game server (server).
Packet structure
Example payload
On all new connections the client will send the ApplicationInstance information message to the server. This will contain information that is known for the instance by our one platform.
Below you will find an example object that will be send to indicate what kind of information you can expect.
Direction flow This request is sent from the host agent (client) > game server (server).
Packet structure
Example payload
This packet is meant to sync the game status in the server with the platform and inform on what status it's is running. To make sure the data is in sync, this packet will always been sent to new connections to sync up the current state. After the connection has been established it will be sent on every game status state update.
The payload of the response will contain a JSON object with the mandatory values.
List of possible values
More information see
Direction flow This request is sent from a game server (server) > host agent (client).
Packet structure
Example payload
This packet can be used to create your own custom commands to fit your needs. The structure of the packet is pre-defined, it's a simple key value object with 2 predefined keys command, arguments.
Example
An example command can be command:kickplayer argument:<name> <reason>. Below you will find an example object
Direction flow This request is sent from the host agent (client) > game server (server).
Packet structure
Example payload
PacketID
uint
Any positive integer, chosen by the server, will be mirrored back in the clients's response
Length
uint
Length of the payload data
Payload
JSON string
No payload
PacketID
uint
Any positive integer, chosen by the client, will be mirrored back in the server's response
Length
uint
Length of the payload data
Payload
JSON string
JSON object with key value pair that contains the timeout value.
PacketID
uint
Any positive integer, chosen by the client, will be mirrored back in the server's response
Length
uint
Length of the payload data
Payload
JSON string
(optional) JSON object with key value pair that contains the meta data object.
PacketID
uint
Any positive integer, chosen by the client. It will be mirrored back in the server's response
Length
uint
Length of the payload data
Payload
JSON string
(optional) JSON object with key value pair that contains the metadata object.
PacketID
uint
Any positive integer, chosen by the client. It will be mirrored back in the server's response
Length
uint
Length of the payload data
Payload
JSON string
(optional) JSON object with key value pair that contains the metadata object.
version.
PacketID
uint
Any positive integer, chosen by the server, will be mirrored back in the clients's response
Length
uint
Length of the payload data
Payload
JSON string
JSON object with key value pair that contains live state information.
PacketID
uint
Any positive integer, chosen by the client. It will be mirrored back in the server's response
Length
uint
Length of the payload data
Payload
JSON string
Below you can find a example payload.
PacketID
uint
Any positive integer, chosen by the client. It will be mirrored back in the server's response
Length
uint
Length of the payload data
Payload
JSON string
Payload see Example payload below
PacketID
uint
Any positive integer chosen by the server. Will be mirrored back in the clients's response
Length
uint
Length of the payload data
Payload
JSON string
Json object with key status which contains the new status of the instance
PacketID
uint
Any positive integer, chosen by the client. It will be mirrored back in the server's response
Length
uint
Length of the payload data
Payload
JSON string
Payload see Example payload below
Flags
byte
0
Opcode
byte
0x02
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x30
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x60
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x40
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x41
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x20
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x50
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x70
Reserved
byte
0
Reserved2
byte
0
3
starting
The instance is currently starting up (optional)
4
online
The instance has started up and is fully working (and initialized)
5
allocated
The instance has been allocated by a matchmaker
Flags
byte
0
Opcode
byte
0x71
Reserved
byte
0
Reserved2
byte
0
Flags
byte
0
Opcode
byte
0x45
Reserved
byte
0
Reserved2
byte
0
{
"timeout": 100
}{
"data": [
{
"key": "map",
"value": "islands_large"
},
{
"key": "maxPlayers",
"value": "16"
}
]
}{
"data": [
{
"key": "map",
"value": "islands_large"
},
{
"key": "mode",
"value": "BR"
},
{
"key": "type",
"value": "squads"
}
]
}{
"data": [
{
"key": "map",
"value": "islands_large_xl"
},
{
"key": "mode",
"value": "kingofhill"
},
{
"key": "type",
"value": "duos"
}
]
}{
"players": 5,
"maxPlayers": 16,
"name": "My awesome Game Server",
"map": "islands",
"mode": "DEATHMATCH",
"version": "1.0.0.1"
}[
{
"id": 0,
"serverId": 0,
"serverName": "string",
"projectName": "string",
"clientServerName": "string",
"clientState": "string",
"isVirtual": 0,
"locationId": 0,
"dcLocationId": 0,
"fleetId": "string",
"fleetAssociatedSince": 0,
"serviceTag": "string",
"ipAddress": [
{
"ipAddress": "string",
"version": 0,
"type": 0,
"private": 0,
"interface": 0,
"macAddress": "string",
"rDns": "string",
"vlanId": 0,
"gateway": "string",
"netmask": "string",
"prefix": 0
}
],
"brand": "string",
"model": "string",
"numCpu": 0,
"labels": [
{
"key": "string",
"value": "string"
}
]
}
]{
"fleetId": "string",
"hostId": 0,
"isVirtual": 0,
"applicationId": "string",
"applicationType": 0,
"applicationBuildId": "string",
"installId": "string",
"dcLocationId": 0,
"regionId": "string",
"status": 0,
"createdAt": 0,
"startedAt": 0,
"stoppedAt": 0,
"pid": 0,
"pidChangedAt": 0,
"manuallyDeployed": 0,
"properties": [
{
"id": "string",
"propertyType": 0,
"propertyKey": "string",
"propertyValue": "string"
}
],
"ipAddress": [
{
"ipAddress": "string",
"ipVersion": 0,
"private": 0
}
],
"labels": [
{
"key": "string",
"value": "string"
}
],
"metadata": [
{
"key": "string",
"value": "string"
}
],
"autoRestart": 0
}{
"status": 4
}{
"data": [
{
"key": "command",
"value": "kickplayer"
},
{
"key": "arguments",
"value": "player1 Hacking"
}
]
}These error group codes define error categories. Within each category there will be codes for specific errors. These are documented further down this page.
10000
GENERIC_ERROR
Table 1: Error group codes
Table 2: Generic error codes
Table 3: Account group codes
Table 4: AgentSoftwareRelease error codes
Table 5: SoftwareVersion error codes
Table 6: ApiKey error codes
Table 7: ApiKeyWhitelist error codes
Table 8: ApiLog error codes
Table 8: Application error codes
Table 9: ApplicationBuild error codes
Table 10: ApplicationBuildConfiguration error codes
Table 11: ApplicationBuildConfiguration error codes
Table 12: ApplicationDeployment error codes
Table 12: ApplicationInstall error codes
Table 13: ApplicationInstance error codes
Table 14: ApplicationProperty error codes
Table 15: ArcusCustomCommandError error codes
Table 16: AssignableFile error codes
Table 17: BuildProvisioning error codes
Table 18: BuildProvisioningFile error codes
Table 19: Calc error codes
Table 20: CalcQuote error codes
Table 21: CCU error codes
Table 22: CCU error codes
Table 23: CloudDetail error codes
Table 24: CloudProvider error codes
Table 25: CoLocation error codes
Table 26: CoLocationAccess error codes
Table 27: CoLocationAlert error codes
Table 28: Company error codes
Table 29: Create Game Install error codes
Table 30: CrossConnect error codes
Table 31: DeploymentEnvironment error codes
Table 32: DeploymentProfile error codes
Table 33: DeploymentTemplate error codes
Table 34: Email error codes
Table 35: Email error codes
Table 36: Fleet error codes
Table 37: FlexMetalOrder error codes
Table 38: Form error codes
Table 39: Game error codes
Table 40: Game Instance error codes
Table 41: Host error codes
Table 42: Host Agent error codes
Table 43: HostAgentAPIError codes
Table 44: HostAlert error codes
Table 45: HostCapacityTemplate error codes
Table 46: InstanceType error codes
Table 47: InstanceTypeCapacity error codes
Table 48: Invoice error codes
Table 49: Label error codes
Table 50: Location error codes
Table 51: Network error codes
Table 52: OdpAgent error codes
Table 53: OperatingSystem error codes
Table 54: OS error codes
Table 55: PatchJob error codes
Table 55: Postman error codes
Table 56: PxeServer error codes
Table 57: ReportEmail error codes
Table 58: RunAsRootError codes
Table 59: Slack error codes
Table 60: SshKey error codes
Table 61: Task error codes
Table 62: Telemetry error codes
Table 63: Ticket error codes
Table 64: Trigger error codes
Table 65: Vetting error codes
Table 66: Whitelist error codes
API Log
ApplicationBuildConfiguration
ApplicationBuildProperty
Application Deployment
For more information, see the documentation.
10007
Internal server error
10008
An invalid parameter was provided
10009
Entity cannot be deleted due to conflict
10010
The supplied JSON request body does not have a valid structure
10011
No request body supplied
10012
API route not found
10013
RANGED-DATA header not found
10014
RANGED-DATA results cannot be larger than than %d
10015
RANGED-DATA sum of start and results must be less than or equal to %d
10016
Invalid filter column
10017
%s is not a valid column to filter on
10018
Invalid sort column
10019
%s is not a valid column to sort on
10020
Invalid sort order
10021
%s is not the valid sort order, only ASC and DESC are allowed
10022
The page has expired, please try again
10023
The %s is invalid
10024
Invalid label key
10025
Only hyphens (-), underscores (_), lowercase characters and numbers are allowed. Keys must start with a lowercase character
10026
No application instance found for %s (%s)
10027
Service not available
10028
List of following fields are not available in model
10029
Not a valid field
10030
Invalid filter value
10031
%s value of '%s' is not a valid ID
45007
Cannot update the email address, it's already stored in your account
10008
An invalid parameter was provided
10009
Entity cannot be deleted due to conflict
10010
The supplied JSON request body does not have a valid structure
10011
No request body supplied
10012
API route not found
10013
RANGED-DATA header not found
10014
RANGED-DATA results cannot be larger than than %d
10015
RANGED-DATA sum of start and results must be less than or equal to %d
10016
Invalid filter column
10017
%s is not a valid column to filter on
10018
Invalid sort column
10019
%s is not a valid column to sort on
10020
Invalid sort order
10021
%s is not the valid sort order, only ASC and DESC are allowed
10022
The page has expired, please try again
10023
The %s is invalid
10024
Invalid label key
10025
Only hyphens (-), underscores (_), lowercase characters and numbers are allowed. Keys must start with a lowercase character
10026
No application instance found for %s (%s)
10027
Service not available
10028
List of following fields are not available in model
10029
Not a valid field
10030
Invalid filter value
10031
%s value of '%s' is not a valid ID
10008
An invalid parameter was provided
10009
Entity cannot be deleted due to conflict
10010
The supplied JSON request body does not have a valid structure
10011
No request body supplied
10012
API route not found
10013
RANGED-DATA header not found
10014
RANGED-DATA results cannot be larger than than %d
10015
RANGED-DATA sum of start and results must be less than or equal to %d
10016
Invalid filter column
10017
%s is not a valid column to filter on
10018
Invalid sort column
10019
%s is not a valid column to sort on
10020
Invalid sort order
10021
%s is not the valid sort order, only ASC and DESC are allowed
10022
The page has expired, please try again
10023
The %s is invalid
10024
Invalid label key
10025
Only hyphens (-), underscores (_), lowercase characters and numbers are allowed. Keys must start with a lowercase character
10026
No application instance found for %s (%s)
10027
Service not available
10028
List of following fields are not available in model
10029
Not a valid field
10030
Invalid filter value
10031
%s value of '%s' is not a valid ID
28007
The application used by the application build is no longer valid, please modify it. Find the possible applicationIds in: GET /application and update the application build in: PUT /applicationBuild/{%d}
28008
The application used by the application install is no longer valid, please modify it. Find the possible applicationIds in: GET /application and update the application install in: PUT /applicationInstall/{%d}
28009
At least one application build exist for this application, therefore the application cannot be deleted
28010
The application must be of type Game, find the possible ids in: GET /application
28011
You can only set a management protocol on application type game
28012
The applicationId %s you set doesn't match the id (%s) already saved
28013
The chosen stop method ID %s doesn't belong to the operating system ID %s
30007
The application build is currently in use by some application instances, please delete them before trying to delete the application build
30008
Invalid applicationBuildId (%s), find the possible ids in: GET /applicationBuild
30009
You can only assign one application build
30010
oldApplicationBuildId and newApplicationBuildId is same
30011
The old application build and the new application build have different operating systems
30012
The application build file gave an error on checking the file on the server. The HTTP response code from server: %s. The URL used for the request was %s. Please correct the error or contact our help desk to help you solve this problem
30013
The provided build provisioning registration id %s is not valid
30014
In an update you cannot change the file, please create a new build and use the patch job to change the build
30015
You cannot change an application build from build provisioning type %s to %s, please create a new application build
30016
You must supply the applicationBuildFile
30017
The application build is currently in use by %s deployment template(s) %s, and in fleet(s) %s
31007
Invalid active value, the possible values are: 0: not active, 1: active
31008
Cannot create application build an application install with Id %s is still in the process of being created
34011
The value of the filter parameter is invalid, possible values can be fleetId, regionId, dcLocationId
34012
The filter value is required
34013
The startTime parameter is invalid, only numeric values are allowed
34014
The endTime parameter is invalid, only numeric values are allowed
34015
The type parameter is invalid, it may only be %s
34016
The status parameter is invalid, possible values can be: 3) starting, 4) online, 5) allocated (only possible if previous status is online)
34017
There is no application instance found.
34018
There is no known operation system set on the application instance
34019
The chosen stop method doesn't match the operation system, you can find the stop methods in GET /application/stopMethod
34020
The chosen stop method is not valid, you can find the stop methods in GET /application/stopMethod
34021
To use the Arcus stop method you need to have selected Arcus as management protocol on the application
34022
To use the A2S stop method you need to have selected A2S as management protocol on the application
34023
The application instance that you want to use has an stop task assigned to it, please use an other application instance.
34024
Something went wrong when creating the task
34025
Unable to change an application instance that is marked for deletion
34026
No application instances available with filters '%s'
34027
There are application instances available for allocation with your filters - but Arcus is not working for these instances
34028
The deploymentEnvironmentId is valid - but there are no application instances available that match your deploymentEnvironmentId filter
34029
The fleetId is valid - but there are no application instances available that match your fleetId filter
34030
The regionId is valid - but there are no application instances available that match your regionId filter
34031
The dcLocationId is valid - but there are no application instances available that match your dcLocationId filter
34032
The application instance that you want to stop is automatically created by the scaler and can't be stopped manually
34033
This application instance cannot restart due to a temporary disruption in service - please contact support at https://www.i3d.net/support/
34034
This application instance cannot start due to a temporary disruption in service - please contact support at https://www.i3d.net/support/
34035
No online game application instances exist for this application - no application instance can be allocated
34036
No online game application instances available for allocation - unable to determine a reason at this time
34037
No online game application instances available for allocation - even without filters enabled
34038
Application instance session not found
34039
No application instances available with nested filters '%s'
29011
The value of a property of type private network port must be between %s and %s (inclusive), or 0 for a random private network port
12007
File is not pdf
12008
Only one file expected
12009
No file found
12010
Price does not match internally calculated
12011
Item not found
12020
Unknown configuration
24006
Invalid credentialName, find the possible names in: GET /cloud/configuration/credential
24013
Resource name %s does not exist. Create a new Resource using the Azure API first: https://docs.microsoft.com/en-us/rest/api/resources/resourcegroups/createorupdate
24007
The cloud credentials already exist for the given cloud provider. The same credentials can only be set once
24009
The cloud credentials are invalid. You may not have permissions to access this project
24005
The credential name already exists, the name must be unique
24012
The param %s for %s is not of type %s
24008
The param %s for %s is required
24014
Unable to activate cloud credentials while VMs exist using the current cloud credentials. Please remove all existing VMs for this cloud provider and try again.
24001
Unknown cloud provider, find the possible cloud provider in: GET /cloud/provider
19006
Could not terminate VM instance
19007
Could not query VM instance status
19008
Could not associate static IP to VM instance
13009
Could not get VM instance regions
19010
Could not get VM instance types
19011
Could not get VM images
19012
Could not copy VM image
19013
Could not get VM cpu platforms
19014
The instance configuration is not supported, check instance types, regions, and operating systems
19015
Invalid key/pair name provided
19016
IP address quota has been reached / exceeded
19017
Ubisoft cloud network UUID is not valid
19018
VM Image is not found
19019
No default subnet for availability zone
19020
Failed to allocate the network(s) with error No fixed IP addresses available
19021
Instance type not available
51007
Unable to find a PDU for this colocation
51008
The IP address is out of range for this colocation
51009
An error occurred adding the PTR record
18007
The file Id is already being used in another application install, the same file cannot be used more than once
18008
The application install name already exists, the name must be unique
32007
The strategy type is invalid, the possible values are: 1: Round Robin
32008
The cpuPlatform cannot be null (it can be empty string '')
32009
The cpuPlatform is invalid, find the possible values in: GET /cloud/cpuPlatform
32010
The primaryInstanceTypeName for providerId %d is invalid, find the possible values in: GET /cloud/instanceType
32011
The primaryInstanceTypeName is not supported by our AMIs, change the instance type or contact i3D in order to create a custom AMI
32012
The secondaryInstanceTypeName for providerId %d is invalid, find the possible values in: GET /cloud/instanceType
32013
The secondaryInstanceTypeName is not supported by our AMIs, change the instance type or contact i3D in order to create a custom AMI
32014
The cloudImageName is invalid, find the possible values in: GET /cloud/image
32015
The cloudImageName is required, find the possible values in: GET /cloud/image
32016
Invalid deploymentRegionId, find the possible ids in: GET /deploymentProfile/{deploymentProfileId}
32017
The deployment region requires at least one i3dDcLocationId, find the possible ids in: GET /cloud/dcLocation
32018
The bufferValueType is invalid, the possible values are: 0: absolute value, 1: percentage value
32019
The dcLocationId = %d is invalid, find the possible ids in: GET /cloud/dcLocation
32020
The i3dDcLocationId = %d is already set in another deployment region of the same deployment profile
32021
The dcLocationId = %d does not belong to providerId = (%d)
32022
The dcLocationId is required, find the possible ids in: GET /cloud/dcLocation
32023
The dcLocationId = %d is already set in the deployment region
32024
Invalid deploymentContainerId, find the possible ids in: GET /deploymentRegion/{deploymentRegionId}
32025
Invalid deploymentContainerLocationId, find the possible ids in: GET /deploymentRegion/{deploymentRegionId}
32026
The cloudProviderId is required, find the possible cloud provider Ids in: GET /cloud/provider
32027
The primary and secondary instance types must be different
32028
Not all existing deployment containers belonging to the deployment region have been provided in your request
32029
Not all existing deployment container locations belonging to the deployment region have been provided in your request
32030
End time must be zero or bigger than start time
32031
This deployment profile cannot be deleted because it is used in the following fleet(s): %s
32032
Deletion of deployment region cannot be cancelled because its profile is marked for deletion
32033
Deletion of deployment container cannot be cancelled because its region is marked for deletion
32034
Deletion of deployment container location cannot be cancelled because its container is marked for deletion
32035
The deployment region is missing in deployment profile, add a deployment region to your deployment profile in: POST /deploymentProfile/%s/deploymentRegion
32036
The I3D location is missing in deployment region of deployment profile, find the possible ids in: GET /deploymentProfile
32037
The cloud image is missing in deployment profile, find the possible ids in: GET /deploymentProfile
32038
The instance type is missing in deployment region of deployment profile, find the possible ids in: GET /deploymentProfile
32039
The bufferValue and/or bufferValueType are missing. When overriding bufferValueMin or bufferValueMax these properties are required
32040
Cannot remove location, there are secondary cloud locations still. Remove those first before removing the last primary cloud location
32041
The minimumCapacity has to be smaller than or equal to maximumCapacity (if not null)
32042
The bufferValueMax (%d) must be greater than or equal to bufferValueMin (%d)
32043
There are still (%d) manually deployed instances active in the i3D dcLocationId %s, you must delete them first before deleting the i3D dcLocation
32044
Deployment profile is already in use by another fleet, you can only use a deployment profile once
32045
The application property does not exist, find possible ids in GET /application/{applicationId}/property
32046
Cannot override application property for this deployment region: it is already overridden in deployment region property %s. Use PUT /deploymentRegion/%s/property/%s to update it instead
32047
The given applicationPropertyId has an invalid property type, only raw properties may be overridden by a deployment region property
32048
Invalid regionName, find the possible ids in: GET /deploymentProfile/{deploymentProfileId}
32049
Invalid dcLocationName , find the possible ids in: GET /cloud/dcLocation
32050
Invalid dcLocationId , find the possible ids in: GET /cloud/dcLocation
33007
Only application builds with an application of type game are allowed to be used in game deployment template
33008
Only application builds with an application of type utility are allowed to be used in utility deployment template
33009
The following fleet(s) %s, still have operational status automatic deployment or automatic scaling, change the operational status on the fleet before removing the game deployment template
33010
Game deployment template doesn't have valid applicationBuildId
33011
Utility deployment template doesn't have valid applicationBuildId
33012
Invalid deploymentTemplateId, find the possible ids in: GET /deploymentTemplate/dependency
33013
Only application build with an application of type dependency installer is allowed to be used in dependency deployment template
33014
Only application build with an application of type dependency uninstaller is allowed to be used in dependency deployment template
33015
The following fleet(s) %s, still have operational status automatic deployment or automatic scaling, change the operational status on the fleet before removing the dependency deployment template
33016
You can only assign one application build to a game deployment template
33017
The %s with id %s doesn't exists in our database
33018
The dependencyTemplate chosen has dependencyBuild with osId %s, this doesn't match the applicationBuild that has osId %s
33019
The dependencyBuild OS of the installer doesn't match the uninstaller, OS installer: %s and OS uninstaller: %s
33020
The chosen game deployment template doesn't have an build assigned to it
33021
Currently the %s template is in use by application instances, you cannot change the application build for this template, please use patching for this
33022
Dependency deployment template doesn't have valid dependency installer applicationBuildId
33023
Utility deployment template doesn't have valid dependency uninstaller applicationBuildId
26007
Invalid fleetId, find the possible ids in: GET /fleet
26008
The fleet used in the creation of the application instance is no longer valid, please create a new application instance
26009
The fleet name already exists, the name must be unique
26010
Fleet %s's operational status must be 0 to unset the game deployment Id (current: %s). Set the fleet's operational status to 0 first in: PUT /fleet/%s/operationalStatus
26011
The host is already assigned to this fleet
26012
There is no game deployment template configured, unable to change the operational status to %s. Update the fleet with a game deployment template in: PUT /fleet/%s
26013
The fleet operational status must be 0, to (un)set the dependency deployment template, use PUT /fleet/%s/operationalStatus, to set the operationalStatus to 0 first
26014
For change the operational status you must send the field operationalStatus
26015
Unable to reserve host for fleet, there are %s application instances that do not belong to this fleet running on the host (fleet: %s, application instances: %s)
26016
You cannot change the %s on this fleet, because there are instances running for this fleet
26017
Invalid fleetId(s) (%s), find the possible ids in: GET /v3/fleet
26018
Cannot change the status of the fleet, because it's currently used by a patch job
26019
Invalid fleetName, find the possible ids in: GET /v3/fleet
26020
The fleet has no assigned game deployment template, unable to verify the target OS of requested servers
26021
Not able to remove marked for deletion deployment profile with id %s
26022
Something went wrong well deleting fleet with id %s
39006
The startTime parameter is invalid, only numeric values are allowed
39007
The endTime parameter is invalid, only numeric values are allowed
39008
Invalid period
39009
Host was already cancelled on %s
39010
Host is already active
39011
Host has expired on %s; it cannot be renewed
39012
Invalid dedicatedServerId, find the possible ids in: GET /dedicatedServer
39013
End time must be after start time
39014
The requested period does not overlap the contract period
39015
The requested period may not be longer than 12 months
39016
The IP address is invalid for this host
39017
An error occurred adding the PTR record
39018
Host (%d) is already assigned to a fleet (%s)
39019
No active host available in your account
39020
Host (%d) is not a valid host, only Bare Metal can be reserved
39021
Host id(%d) uplink is invalid
39022
Host (%d) is already in the process of reservation
39023
The host (%d) osId (%d) is not matched with the fleet osId (%d)
76006
The application instance is already allocated on the host
76007
Failed to allocate the application instance on the host is aborted or timed out
50007
Patch job scheduled time is less than current time
50008
Invalid patchJobReportEmailId, find the possible ids in: GET /v3/patchJob
50009
A completed patch job cannot be edited
50010
No actions can performed on reverted patch job
50011
The patch job is finished and cannot be edited anymore
50012
The patch job is running and cannot be edited anymore
50013
Only a running patch job can be stopped
15011
An error occurred uploading the attachment. Please try again
15012
The uploaded attachment is too big, the maximum file size is %s
15013
You may only upload a maximum of %s attachments.
15014
The uploaded attachment has an incorrect extension, files must have one of the following extensions: %s
71007
Event Action with id %s is invalid
71008
Rule Action with id %s is invalid
71009
Email address %s is invalid
71010
The name provided for the trigger has already being used
71011
The rule data type provided with id %s is invalid
71012
The value of conditionValue must be a numeric string or a number
71013
The value of rule must be a valid object of MemoryTriggerRule or CPUTriggerRule
71014
The value of action parameters must be a valid object of ApplicationInstanceStopMethod
DeploymentProfile
Host
Operating System
11000
FORM_ERROR
12000
CALC_QUOTE_ERROR
13000
CALC_ERROR
15000
TICKET_ERROR
17000
GAME_INSTANCE
18000
CREATE_GAME_INSTALL_ERROR
21000
ODP_AGENT_ERROR
22000
LABELS_ERROR
23000
TASK_ERROR
24000
CLOUD_ERROR
25000
DEPLOYMENT_ENVIRONMENT_ERROR
26000
FLEET_ERROR
27000
ASSIGNABLE_FILE_ERROR
28000
APPLICATION_ERROR
29000
APPLICATION_PROPERTY_ERROR
30000
APPLICATION_BUILD_ERROR
31000
APPLICATION_INSTALL_ERROR
32000
DEPLOYMENT_PROFILE_ERROR
33000
DEPLOYMENT_TEMPLATE_ERROR
34000
APPLICATION_INSTANCE_ERROR
35000
APPLICATION_DEPLOYMENT_ERROR
36000
OPERATING_SYSTEM_ERROR
37000
APPLICATION_BUILD_CONFIGURATION_ERROR
38000
APPLICATION_BUILD_PROPERTY_ERROR
39000
HOST_ERROR
40000
API_LOG_ERROR
10001
Entity not found
10002
No (valid) entity ID provided
10003
No access to entity
10004
Unauthenticated / invalid credentials for API request
10005
You are already logged in
10006
Unknown API version
45001
Invalid account ID
45002
Account already exists
45003
Too many accounts
45004
The confirmation expired, request a new confirmation and try again
45005
The confirmation is no longer valid
45006
The email address is already in use
990001
Invalid agentSoftwareReleaseId, find the possible ids in: GET /automation/agent/software/release
990002
The version number you try to insert is already in use (%s)
990003
You have given an invalid version.
990004
The given runtime identifier (%s) is not supported in the system
45006
The email address is already in use
45007
Cannot update the email address, it's already stored in your account
48001
Invalid softwareId, find the possible ids in: GET /admin/odp/agent/software/version
48002
Invalid software version, find the possible versions in: GET /admin/odp/agent/software/version
52001
Invalid apiKeyId, find the possible ids in: GET /account/apiKey
48002
Invalid software version, find the possible versions in: GET /admin/odp/agent/software/version
56001
Invalid apiKeyWhitelistId, find the possible ids in: GET /account/apiKey/{apiKeyId}/whitelist
56002
The IP range already exists for this API key, find the already existing IP ranges in: GET /account/apiKey/{apiKeyId}/whitelist
40000
the possible values are: GET, POST, PUT, DELETE
56002
The IP range already exists for this API key / find the already existing IP ranges in: GET /account/apiKey/{apiKeyId}/whitelis
28001
The application type can not be changed because the given application is already in use in a game deployment template
28002
The application type can not be changed because the given application is already in use in a utility deployment template
28003
Invalid applicationId, find the possible ids in: GET /application
28004
The application name must be unique, but this name is already in use by application with ID %s
28005
Invalid application type, the possible values are: %s
28006
Invalid managementProtocol, the possible values are: 0: None, 1: A2S, 2: ARCUS
30001
The application used in the body is of type Game. It needs at least one property of type public network port. You can create this property in: POST /application/{applicationId}/property
30002
The application used in the body has a management protocol bigger than 0, a property called "managementPort" of type network port is needed, you can create this property in POST /application/{applicationId}/property
30003
Invalid applicationBuildId, find the possible ids in: GET /applicationBuild
30004
The application build name already exists, the name must be unique
30005
The application build use in the deploy is no longer valid, please create a new application instance, find the possible applicationBuildIds in: GET /applicationBuild
30006
The application build must belong to a deployment template of the fleet
37000
Invalid applicationBuildConfigurationId, find the possible ids in: GET /applicationBuild/%d/configuration
38000
Invalid propertyId, find the possible ids in: GET /applicationBuild/%d/property
38001
Invalid network port, the network port is already used by application build property '%s' (%s)
35000
Invalid bmInstanceTypeId, find the possible ids in: GET /host/instanceType
35001
Invalid vmInstanceTypeId, find the possible ids in: GET /cloud/instanceType
35002
The amount of application instances on this bare metal instance type cannot be bigger than %d (this is equal to numCpu _ numCoresPerCpu _ ' . RelationApplicationInstanceEntity::UPPER_LIMIT . ')
35003
The amount of application instances on this cloud instance type cannot be bigger than %d (this is equal to numCpu * ' . RelationApplicationInstanceEntity::UPPER_LIMIT . ')
31001
No application found, find the possible ids in: GET /application
31002
Application install already exists for that application
31003
Invalid installId, find the possible ids in: GET /applicationInstall
31004
This application install is being use in at least one application build, thus it can not be deleted
31005
The application install name already exists, the name must be unique
31006
Invalid osGroupId, the possible values are: 1: windows, 2: linux
34001
The selected host is assigned to a different fleet that the one provided, please select another host or the fleet the host has assigned
34002
The application instance status cannot be manually set if the application instance is not running
34003
The application instance status cannot be manually set to allocated if the application instance is not online
34004
Invalid applicationInstanceId, find the possible ids in: GET /applicationInstance
34006
This stop method requires a timeout value that must be greater than 0
34010
Parameter value is not valid
29001
Invalid propertyId, find the possible ids in: GET /application/%d/property
29004
The propertyKey = %s already exists for the applicationId = %d
29006
The value of a property of type public network port must be between %s and %s (inclusive), or 0 for a random public network port
29008
Invalid property password, the property value you have chosen needs to be %d characters long
29009
This network port already used by application property '%s' (%s)
29010
The amount of network ports for a network port range must be between %s and %s
75001
Custom command model is empty, need to provide at lease one command
75002
The host that you want to do the custom command on has no game instances with the Arcus protocol implemented
27001
Invalid fileId, find the possible ids in: GET /applicationInstall/assignable
60001
The provided userId %s doesn't match the userId %s in the database
60002
User with userId %s has not been found!
60003
The user id must be bigger than 0
60004
The name provided for the registration already exists for this user
68001
Invalid build provisioning file id, find the possible ids in: GET /buildProvisioning/storage/file
13001
Unknown configuration
13002
Error in order properties
13003
Failed to save the order
12001
Error in quote properties
12002
Error in item quote properties
12003
Failed to save the quote
12004
Failed to save the item
12005
Errors in form
12006
File upload(s) expected but not found
42001
The value of the filter parameter is invalid, possible values can be %s
42002
Parameter value is not valid
42003
The startTime parameter is invalid, only numeric values are allowed
42004
The endTime parameter is invalid, only numeric values are allowed
24010
%s is not a valid region name for %s, find the possible region name in: GET /cloud/dcLocation
24011
Error validating credentials with AWS: An unknown error occurred
24003
Error validating credentials with AWS: Invalid accessKeyId
24004
Error validating credentials with AWS: Invalid secretAccessKey
24002
Error validating credentials with AWS: You do not have enough permissions
24015
Error validating credentials with Azure
59001
Invalid ucSettingId, find the possible ids in: GET /cloud/provider/uc/setting
59002
Invalid Ubisoft cloud projectId
59003
Invalid Ubisoft cloud region name, find the possible name's in: GET /v3/cloud/provider/dcLocation
59004
Invalid Ubisoft cloud public network UUID
59005
Invalid Ubisoft cloud private network UUID
59006
Invalid Ubisoft cloud security group UUID
19000
Undefined / unhandled error
19001
Instance quota has been reached / exceeded
19002
Instance zone resource pool exhausted
19003
Could not create VM instance
19004
Could not start VM instance
19005
Could not stop VM instance
51001
Invalid colocationId, find the possible Ids in: GET /colocation
51002
Service was already cancelled on :date
51003
Service is already active
51004
Service contract end date is invalid
51005
Service has expired on :date
51006
The supplied PDU does not match the PDU found for this colocation, find the possible pduIds in: GET /colocation
56001
Errors in form Invalid accessId, find the possible Ids in: GET /colocation/access File upload(s) expected but not found
56002
Invalid status, the possible values are: all, granted, suspended, pending, denied or revoked
56003
You are not allowed to request Data Center access. You don't have an active colocation server
56004
Transition to revoked status is only possible from Granted or Suspended statuses.
56005
The white list entry may be deleted only if it is in denied state.
56006
Invalid documentId, find the possible Ids in: GET /colocation/access/{accessId}/document
57001
Invalid colocationAlertId, find the possible ids in: GET /colocation/{colocationId}/alert
44001
Invalid companyId, find the possible Ids in: GET /company
44002
Duplicate company
18001
Invalid fileId, find the possible ids in: GET /applicationInstall/create
18002
The game executable was not found in the archive
18003
The archive cannot be handled due an unknown error
18004
The archive has an unhandled extension, do not know how to process it
18005
No game found
18006
No files found
67001
Invalid crossConnectId, find the possible Ids in: GET /crossConnect
67002
Cross connect was already cancelled on %s
67003
Cross connect is already active
67004
Cross connect contract end date is invalid
67005
Cross connect contract has expired on %s
67006
Invalid uplinkId, find the possible Ids in: GET /crossConnect/%s
25001
Cannot delete this deployment environment because it is used in a fleet
25002
Invalid deploymentEnvironmentId, find the possible ids in: GET /deploymentEnvironment
25003
The deployment environment name already exists, the name must be unique
25004
Invalid deploymentEnvironmentName, find the possible ids in: GET /deploymentEnvironment
32001
The entity is marked for deletion and thus it cannot be modified
32002
Invalid deploymentProfileId, find the possible ids in: GET /deploymentProfile
32003
The deployment profile name already exists, the name must be unique
32004
The deployment region name already exists for the deployment profile, the name must be unique for a deployment profile
32005
The maximumCapacity (if not null) has to be larger or equal to minimumCapacity
32006
The bufferValueMin (%d) must be smaller or equal to bufferValueMax (%d)
33001
BuildId and NewBuildId cannot be same
33002
Sum of BuildIdPercentage and NewBuildIdPercentage must be equal to 100
33003
Cannot delete the deployment template, it is already in use
33004
The deployment template name already exists, the name must be unique
33005
Invalid gameDeploymentTemplateId, find the possible ids in: GET /deploymentTemplate/game
33006
Invalid utilityDeploymentTemplateId, find the possible ids in: GET /deploymentTemplate/utility
53001
Invalid emailConfirmationId
43001
Filter is invalid
43002
Filter parameter is invalid, its possible values can be '%s'
43003
Filter parameter '%s' is not a valid '%s' (must be of type '%s')
26001
Cannot delete this fleet, it is already in use
26002
Host is already reserved by fleet '%s' (%s)
26003
Only reset if there are no active application instances on this host
26004
The elements of the fleet are not correctly set to start deploying application instances
26005
Cannot delete this fleet, there are %s active application instances on this fleet. Find the application instances that are still running on this fleet with GET /applicationInstance?filters=fleetId%%3D%s
26006
The host selected does not have that fleetId assigned or the hostId is not correct
63001
Out of stock
63002
Invalid Flex Metal order ID
63003
No active instances found
63004
Not a Flex Metal server
11001
Errors in form
11002
File upload(s) expected but not found
16001
Invalid game ID
16002
Not the owner of the given game ID
17001
Invalid game server ID
17002
Game server is already running
17003
Game server is already stopped
17004
Game server's status cannot be manually set if the process is not running
17005
Game server's status cannot be manually set to allocated if the process is not online
17006
Invalid filter query parameter
39000
Invalid hostId, find the possible ids in: GET /host
39001
The selected host is assigned to a different fleet that the one provided, please select another host or the fleet the host has assigned
39002
Host is already reserved, you can un-reserve it in: PUT /fleet/{fleetId}/host/{hostId}/unreserve
39003
There are active application instances in the host, it cannot be unreserved
39004
The value of the filter parameter is invalid, possible values can be %s
39005
Parameter value is not valid
21001
No ODP agent exists for this hostId please select another host
76000
Internal error in host agent
76001
Unauthenticated
76002
Internal Server error
76003
The application instance does not exist on the host
76004
The application instance is invalid and cannot be allocated on the host
76005
The application instance is currently being allocated on the host
58001
Invalid hostAlertId, find the possible ids in: GET /host/{hostId}/alert
46001
Cannot delete this host capacity template because it is used in fleet %s (id: %s)
46002
Cannot delete this host capacity template because it is used in application build %s (id: %s)
46003
Invalid hostCapacityTemplateId, find the possible Ids in: GET /hostCapacityTemplate
46004
This host capacity template name already exists, the name must be unique
64001
Invalid instance type, find possible instance types in: GET /host/flexmetal/instanceType
47004
This instance type does not exist, find the possible instance types in GET /host/instanceType
47003
This instance type does not exist, find the possible instance types in GET /cloud/instanceType
47001
Invalid instanceTypeCapacityId, find the possible Ids in: GET /hostCapacityTemplate/{hostCapacityTemplateId}/instanceTypeCapacity
47005
Capacity limit exceeded; you may only have up to %s application instances on this instanceType (%s per core * %s cores%s). Review the amount of cores for your chosen instanceType and adjust the capacity accordingly
47002
An instance type capacity already exists for this host capacity template/providerId/instance type combination
70001
Invalid invoiceId, find the possible ids in: GET /v3/account/invoice
70002
Invalid invoice number
22001
Invalid character in query, only AND/OR operators are allowed.
22002
Label must have unique key
66001
Invalid location, find possible locations in: GET /locations
80001
The ip-range not found
21001
No ODP agent exists for this hostId please select another host
21002
Invalid agentId, find the possible ids in: GET /odp/web/agent
36000
Invalid osId, find the possible ids in: GET /operatingsystem
36001
The operating system of the application build and the server don't match, please use another host
36002
The osId provided belongs to a osGroupId that does not match the osGroupId set in the application install, find the possible osIds in: GET /operatingsystem
36003
The OS is not available for Flex Metal usage. Find the possible osIds in: GET /operatingsystem
36004
The osId provided belongs to a osGroupId that does not match the osGroupId set in the application, find the possible osIds in: GET /operatingsystem
36005
You cannot change the osId for an application build, create a new application build instead
65001
Invalid operating system, find possible operating systems in: GET /operatingsystem
50001
The patch job name already exists, the name must be unique
50002
Invalid patchJobId, find the possible ids in: GET /v3/patchJob
50003
Patch job can no longer be updated since its scheduled start time less than 5 minutes away
50004
Patch job can only be put on hold if the patch job status is active or preload
50005
Patch job can only be unhold if patch job is put on hold
50006
A completed or cancelled patch job cannot be canceled anymore
72001
Unable to parse schema JSON
14001
No cactiId available for this interface
14002
Category is not allowed for this action
14003
Invalid speed, please provide speed in duplex format.
14004
Invalid state
49001
Email address (%s) is not unique
73001
Windows builds can only run as administrator
73002
Dependency installer and uninstaller can only be run as root
41001
The validation of the webHookUrl failed
41002
The slack setting name already exists, the name must be unique
41003
Invalid slackSettingId, find the possible ids in: GET /slackSetting
73001
Invalid sshKeyId, find the possible ids in: GET /sshKey
23001
Invalid task template ID
23002
Invalid task ID
23003
Task creation is missing a required parameter %s
23004
Invalid task action parameter
23005
Task status cannot be changed (anymore)
23006
Invalid task batch ID
69001
Parameter value is not valid
69002
The startTime parameter is invalid
69003
The endTime parameter is invalid
69004
Invalid interval parameter
69005
The endTime parameter value is smaller than startTime parameter value
15005
Ticket is permanently closed
15006
Ticket is already closed
15007
Ticket is already open
15008
The ticket can not be created, rate limit exceeded
15009
Attachment not found, unable to attach to ticket
15010
Unable to delete attachment that is already coupled to a ticket (reply)
71001
Invalid trigger ID
71002
You can not use this event %s with a rule based on server
71003
Must be an array %s
71004
Condition with conditionId %s and value %s is invalid
71005
Condition with id %s is not valid
71006
For event Action with id %s the value must be NULL
61001
Vetting level is not sufficient
55001
Invalid whitelistId, find the possible ids in: GET /account/whitelist