Skip to content

Create a server

POST
/servers
curl --request POST \
--url https://example.com/api/v1/servers \
--header 'Content-Type: application/json' \
--cookie __Host-shardkeep_session=<__Host-shardkeep_session> \
--data '{ "name": "example", "teamId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "nodeId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "software": { "template": "paper", "version": "1.21.4", "build": "example" }, "resources": { "cpuMillis": 1, "memoryBytes": 1 }, "ports": [ { "name": "game", "hostPort": 1, "protocol": "TCP" } ], "restartPolicy": { "maxRestarts": 1, "windowSeconds": 1 }, "start": false, "eulaAccepted": true, "restoreFrom": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "inNetwork": true, "initialProperties": { "additionalProperty": "example" } }'

Needs servers.create over the owning team. The operator must accept the Minecraft EULA.

Without nodeId, the server is placed on the ENABLED and HEALTHY Node with the most unreserved memory that has room for its CPU and memory reservation. Choosing a Node with nodeId needs global nodes.read; that Node must be ENABLED (node_unavailable) and have room. No room fails with insufficient_capacity and creates nothing.

Without a game port, the first free TCP port in the Controller’s game port range (25565-25664 by default) is assigned on the chosen Node. A requested host port already used on that Node fails with port_conflict.

Media typeapplication/json
object
name
required
string
>= 1 characters <= 64 characters /^[A-Za-z0-9][A-Za-z0-9._-]*$/
teamId
required

The owning team.

string format: uuid
nodeId

Place the server on this Node; needs global nodes.read. Omit to let placement choose.

string format: uuid
software
required

What the server runs. A Shardkeep template, never a container image.

object
template
required
string
>= 1 characters <= 64 characters /^[a-z0-9][a-z0-9-]*$/
Example
paper
version
required
string
>= 1 characters <= 64 characters
Example
1.21.4
build
string
<= 64 characters
resources
required

A reservation, held even while the server is idle.

object
cpuMillis
required

CPU in thousandths of a core.

integer format: int64
>= 1
memoryBytes
required
integer format: int64
>= 1
ports

Host ports to publish. A game port is assigned when none is given.

Array<object>
<= 16 items
object
name
required
string
>= 1 characters <= 32 characters
Example
game
hostPort
required
integer
>= 1 <= 65535
protocol
required
string
Allowed values: TCP UDP
restartPolicy
object
maxRestarts
required

Zero disables automatic restarts.

integer
<= 100
windowSeconds
required
integer
>= 1 <= 86400
start

Start the server once it is provisioned.

boolean
eulaAccepted
required

The operator accepts the Minecraft EULA for this server.

boolean
restoreFrom

Create the server from this backup (needs backups.restore on its server too): it runs the backup’s software (the given software is ignored) and gets its data before it first starts.

string format: uuid
inNetwork

Make the server a network member, reached through the proxy. Defaults to true for Paper, Purpur and Folia once the network is set up; Vanilla servers cannot be members (not_a_member_template).

boolean
initialProperties

Server.properties settings to start with, written before the first start: difficulty, gamemode, pvp, hardcore, view-distance, simulation-distance, max-players, motd, level-seed, white-list and spawn-protection. Change them later through the server’s properties.

object
<= 16 properties
key
additional properties
string
<= 256 characters

Server created, provisioning.

Media typeapplication/json
object
id
required
string format: uuid
name
required
string
teamId
required
string format: uuid
nodeId
string format: uuid
kind
required

VELOCITY_PROXY is the network’s proxy, created with POST /network/proxy.

string
Allowed values: MINECRAFT_SERVER VELOCITY_PROXY
inNetwork
required

A network member, which players reach through the proxy (Paper, Purpur and Folia only).

boolean
desiredState
required
string
Allowed values: RUNNING STOPPED DELETED
generation
required

Increases with every change to the desired spec.

integer format: int64
phase
required

The workflow the Controller is running.

string
Allowed values: PROVISIONING READY MIGRATING RESTORING UPDATING DELETING FAILED
software
required

What the server runs. A Shardkeep template, never a container image.

object
template
required
string
>= 1 characters <= 64 characters /^[a-z0-9][a-z0-9-]*$/
version
required
string
>= 1 characters <= 64 characters
build
string
<= 64 characters
resources
required

A reservation, held even while the server is idle.

object
cpuMillis
required

CPU in thousandths of a core.

integer format: int64
>= 1
memoryBytes
required
integer format: int64
>= 1
ports
required
Array<object>
object
name
required
string
>= 1 characters <= 32 characters
hostPort
required
integer
>= 1 <= 65535
protocol
required
string
Allowed values: TCP UDP
restartPolicy
required
object
maxRestarts
required

Zero disables automatic restarts.

integer
<= 100
windowSeconds
required
integer
>= 1 <= 86400
acknowledgedConditionIds
required
Array<string>
eulaAcceptedAt
string format: date-time
createdAt
required
string format: date-time
status
required

Observed state, written only from Agent reports.

object
runtimeState

Absent until the Agent first reports.

string
Allowed values: STOPPED STARTING RUNNING STOPPING CRASHED
appliedGeneration
required
integer format: int64
removed
required
boolean
usage
required
object
cpuMillis
required

CPU in thousandths of a core.

integer format: int64
memoryBytes
required
integer format: int64
diskBytes
required
integer format: int64
observedAt
string format: date-time
conditions
required
Array<object>

Why observed state differs from desired state, or why a Node is under pressure.

object
id
required
string
source
required
string
Allowed values: AGENT CONTROLLER
reason
required

Machine-readable cause, such as DISK_PRESSURE. New reasons may appear; treat unknown ones as unrecognised conditions.

string
message
required
string
since
required
string format: date-time
convergence
required

How observed state relates to desired state. UNKNOWN while the Node is unreachable.

string
Allowed values: CONVERGED IN_PROGRESS DISCREPANCY UNKNOWN
Example
{
"kind": "MINECRAFT_SERVER",
"desiredState": "RUNNING",
"phase": "PROVISIONING",
"software": {
"template": "paper",
"version": "1.21.4"
},
"ports": [
{
"name": "game",
"protocol": "TCP"
}
],
"status": {
"runtimeState": "STOPPED",
"conditions": [
{
"source": "AGENT"
}
]
},
"convergence": "CONVERGED"
}

The request is invalid.

Media typeapplication/problem+json

An RFC 9457 problem with a machine-readable code.

object
type
required
string
title
required
string
status
required
integer
detail
string
code
required

Stable machine-readable error code.

string
Example
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "conflict"
}

Not signed in, or the credentials are invalid.

Media typeapplication/problem+json

An RFC 9457 problem with a machine-readable code.

object
type
required
string
title
required
string
status
required
integer
detail
string
code
required

Stable machine-readable error code.

string
Example
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "conflict"
}

Signed in, but not allowed.

Media typeapplication/problem+json

An RFC 9457 problem with a machine-readable code.

object
type
required
string
title
required
string
status
required
integer
detail
string
code
required

Stable machine-readable error code.

string
Example
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "conflict"
}

Clashes with existing data or state.

Media typeapplication/problem+json

An RFC 9457 problem with a machine-readable code.

object
type
required
string
title
required
string
status
required
integer
detail
string
code
required

Stable machine-readable error code.

string
Example
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "conflict"
}