Create a package
Since 7.1.0Create a package from its name alone, or with any field the update endpoint accepts. It starts disabled with the admin page's defaults.
Try it
Sent from this browser to your panel with your token. Changes live data.
⌘↵Request
Authorization
Authorization header when making requests to protected resources.Example:
Authorization: Bearer ********************Body Paramsapplication/json#
The package, in the shape the package GET returns.
MB.
GB.
GB per period; 0 is unlimited.
The same six fields the GET returns; null inherits.
A backup plan id, or null for none.
PackageAdditionalDisk fields
Which of the two extra disks. Required on write; a slot not sent is unchanged.
PackageSelfService fields
IPv4 addresses a self-service server gets.
Text shown in self service instead of the raw figures; null shows the figure.
Sizes a self-service user may pick from, as real values. An empty list with a null default means the resource is not variable.
fields
{
"name": "Starter"
}{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}Request Code Samples
curl --location --request POST 'https://cp.domain.com/api/v1/packages' \
--header 'Authorization: Bearer <token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Starter"
}'wget --quiet --output-document=- \
--method=POST \
--header='Authorization: Bearer <token>' \
--header='Accept: application/json' \
--header='Content-Type: application/json' \
--body-data='{
"name": "Starter"
}' \
'https://cp.domain.com/api/v1/packages'http POST 'https://cp.domain.com/api/v1/packages' \
'Authorization: Bearer <token>' \
'Accept: application/json' \
'Content-Type: application/json' <<< '{
"name": "Starter"
}'const response = await fetch("https://cp.domain.com/api/v1/packages", {
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "Starter"
}),
});
const data = await response.json();
console.log(response.status, data);import axios from "axios";
const response = await axios({
method: "post",
url: "https://cp.domain.com/api/v1/packages",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
},
data: {
"name": "Starter"
},
});
console.log(response.status, response.data);const https = require("https");
const payload = JSON.stringify({
"name": "Starter"
});
const req = https.request({
hostname: "cp.domain.com",
path: "/api/v1/packages",
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(payload),
},
}, (res) => {
let data = "";
res.on("data", (chunk) => (data += chunk));
res.on("end", () => console.log(res.statusCode, JSON.parse(data)));
});
req.on("error", (err) => console.error(err));
req.write(payload);
req.end();import requests
url = "https://cp.domain.com/api/v1/packages"
headers = {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
}
payload = {
"name": "Starter",
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.status_code)
print(response.json())import http.client
import json
conn = http.client.HTTPSConnection("cp.domain.com")
headers = {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
}
payload = json.dumps({
"name": "Starter",
})
conn.request("POST", "/api/v1/packages", payload, headers)
response = conn.getresponse()
print(response.status)
print(json.loads(response.read()))<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://cp.domain.com/api/v1/packages',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Starter',
]),
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer <token>',
'Accept: application/json',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('POST', 'https://cp.domain.com/api/v1/packages', [
'headers' => [
'Authorization' => 'Bearer <token>',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Starter',
],
]);
echo $response->getStatusCode() . "\n";
echo $response->getBody();package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
url := "https://cp.domain.com/api/v1/packages"
payload := strings.NewReader(`{
"name": "Starter"
}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Accept", "application/json")
req.Header.Add("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res.StatusCode, string(body))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://cp.domain.com/api/v1/packages"))
.header("Authorization", "Bearer <token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"name\":\"Starter\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}import okhttp3.*;
public class Main {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
MediaType json = MediaType.get("application/json");
RequestBody body = RequestBody.create("{\"name\":\"Starter\"}", json);
Request request = new Request.Builder()
.url("https://cp.domain.com/api/v1/packages")
.method("POST", body)
.addHeader("Authorization", "Bearer <token>")
.addHeader("Accept", "application/json")
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.code());
System.out.println(response.body().string());
}
}
}using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
var client = new HttpClient();
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://cp.domain.com/api/v1/packages");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Content = new StringContent("{\"name\":\"Starter\"}", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());require "net/http"
require "json"
uri = URI("https://cp.domain.com/api/v1/packages")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer <token>"
request["Accept"] = "application/json"
request["Content-Type"] = "application/json"
request.body = "{\"name\":\"Starter\"}"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.code
puts JSON.pretty_generate(JSON.parse(response.body))import Foundation
var request = URLRequest(url: URL(string: "https://cp.domain.com/api/v1/packages")!)
request.httpMethod = "POST"
request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = "{\"name\":\"Starter\"}".data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { print(error ?? "request failed"); return }
print((response as! HTTPURLResponse).statusCode)
print(String(data: data, encoding: .utf8) ?? "")
}
task.resume()// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use reqwest::blocking::Client;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.request(reqwest::Method::POST, "https://cp.domain.com/api/v1/packages")
.bearer_auth("<token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.body(r#"{
"name": "Starter"
}"#)
.send()?;
println!("{}", response.status());
let json: serde_json::Value = response.json()?;
println!("{}", serde_json::to_string_pretty(&json)?);
Ok(())
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.request(reqwest::Method::POST, "https://cp.domain.com/api/v1/packages")
.bearer_auth("<token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.body(r#"{
"name": "Starter"
}"#)
.send()
.await?;
println!("{}", response.status());
let json: serde_json::Value = response.json().await?;
println!("{}", serde_json::to_string_pretty(&json)?);
Ok(())
}import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
fun main() {
val client = OkHttpClient()
val body = """{
"name": "Starter"
}""".toRequestBody("application/json".toMediaType())
val request = Request.Builder()
.url("https://cp.domain.com/api/v1/packages")
.method("POST", body)
.addHeader("Authorization", "Bearer <token>")
.addHeader("Accept", "application/json")
.build()
client.newCall(request).execute().use { response ->
println(response.code)
println(response.body?.string())
}
}// pubspec.yaml: http: ^1.2.0
import 'dart:convert';
import 'package:http/http.dart' as http;
Future<void> main() async {
final request = http.Request('POST', Uri.parse('https://cp.domain.com/api/v1/packages'));
request.headers['Authorization'] = 'Bearer <token>';
request.headers['Accept'] = 'application/json';
request.headers['Content-Type'] = 'application/json';
request.body = r'''{
"name": "Starter"
}''';
final response = await http.Response.fromStream(await request.send());
print(response.statusCode);
print(const JsonEncoder.withIndent(' ').convert(jsonDecode(response.body)));
}#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl = curl_easy_init();
if (!curl) return 1;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://cp.domain.com/api/v1/packages");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"name\":\"Starter\"}");
CURLcode result = curl_easy_perform(curl);
if (result != CURLE_OK) fprintf(stderr, "%s\n", curl_easy_strerror(result));
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
return result == CURLE_OK ? 0 : 1;
}$headers = @{
Authorization = "Bearer <token>"
Accept = "application/json"
}
$body = @'
{
"name": "Starter"
}
'@
$response = Invoke-RestMethod -Uri "https://cp.domain.com/api/v1/packages" -Method POST -Headers $headers -ContentType "application/json" -Body $body
$response | ConvertTo-Json -Depth 10POST /api/v1/packages HTTP/1.1
Host: cp.domain.com
Authorization: Bearer <token>
Accept: application/json
Content-Type: application/json
Content-Length: 25
{
"name": "Starter"
}curl --location --request POST 'https://cp.domain.com/api/v1/packages' \
--header 'Authorization: Bearer <token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}'wget --quiet --output-document=- \
--method=POST \
--header='Authorization: Bearer <token>' \
--header='Accept: application/json' \
--header='Content-Type: application/json' \
--body-data='{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}' \
'https://cp.domain.com/api/v1/packages'http POST 'https://cp.domain.com/api/v1/packages' \
'Authorization: Bearer <token>' \
'Accept: application/json' \
'Content-Type: application/json' <<< '{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}'const response = await fetch("https://cp.domain.com/api/v1/packages", {
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}),
});
const data = await response.json();
console.log(response.status, data);import axios from "axios";
const response = await axios({
method: "post",
url: "https://cp.domain.com/api/v1/packages",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
},
data: {
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
},
});
console.log(response.status, response.data);const https = require("https");
const payload = JSON.stringify({
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
});
const req = https.request({
hostname: "cp.domain.com",
path: "/api/v1/packages",
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(payload),
},
}, (res) => {
let data = "";
res.on("data", (chunk) => (data += chunk));
res.on("end", () => console.log(res.statusCode, JSON.parse(data)));
});
req.on("error", (err) => console.error(err));
req.write(payload);
req.end();import requests
url = "https://cp.domain.com/api/v1/packages"
headers = {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
}
payload = {
"name": "Medium",
"enabled": True,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough",
},
"templateCollections": [
2,
],
"firewallRulesets": [
7,
],
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.status_code)
print(response.json())import http.client
import json
conn = http.client.HTTPSConnection("cp.domain.com")
headers = {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
}
payload = json.dumps({
"name": "Medium",
"enabled": True,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough",
},
"templateCollections": [
2,
],
"firewallRulesets": [
7,
],
})
conn.request("POST", "/api/v1/packages", payload, headers)
response = conn.getresponse()
print(response.status)
print(json.loads(response.read()))<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://cp.domain.com/api/v1/packages',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Medium',
'enabled' => true,
'memory' => 4096,
'cpuCores' => 2,
'primaryStorage' => 80,
'traffic' => 2000,
'virtualization' => [
'cpuModel' => 'host-passthrough',
],
'templateCollections' => [
2,
],
'firewallRulesets' => [
7,
],
]),
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer <token>',
'Accept: application/json',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('POST', 'https://cp.domain.com/api/v1/packages', [
'headers' => [
'Authorization' => 'Bearer <token>',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Medium',
'enabled' => true,
'memory' => 4096,
'cpuCores' => 2,
'primaryStorage' => 80,
'traffic' => 2000,
'virtualization' => [
'cpuModel' => 'host-passthrough',
],
'templateCollections' => [
2,
],
'firewallRulesets' => [
7,
],
],
]);
echo $response->getStatusCode() . "\n";
echo $response->getBody();package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
url := "https://cp.domain.com/api/v1/packages"
payload := strings.NewReader(`{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Accept", "application/json")
req.Header.Add("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res.StatusCode, string(body))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://cp.domain.com/api/v1/packages"))
.header("Authorization", "Bearer <token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"name\":\"Medium\",\"enabled\":true,\"memory\":4096,\"cpuCores\":2,\"primaryStorage\":80,\"traffic\":2000,\"virtualization\":{\"cpuModel\":\"host-passthrough\"},\"templateCollections\":[2],\"firewallRulesets\":[7]}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}import okhttp3.*;
public class Main {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
MediaType json = MediaType.get("application/json");
RequestBody body = RequestBody.create("{\"name\":\"Medium\",\"enabled\":true,\"memory\":4096,\"cpuCores\":2,\"primaryStorage\":80,\"traffic\":2000,\"virtualization\":{\"cpuModel\":\"host-passthrough\"},\"templateCollections\":[2],\"firewallRulesets\":[7]}", json);
Request request = new Request.Builder()
.url("https://cp.domain.com/api/v1/packages")
.method("POST", body)
.addHeader("Authorization", "Bearer <token>")
.addHeader("Accept", "application/json")
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.code());
System.out.println(response.body().string());
}
}
}using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
var client = new HttpClient();
var request = new HttpRequestMessage(new HttpMethod("POST"), "https://cp.domain.com/api/v1/packages");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Content = new StringContent("{\"name\":\"Medium\",\"enabled\":true,\"memory\":4096,\"cpuCores\":2,\"primaryStorage\":80,\"traffic\":2000,\"virtualization\":{\"cpuModel\":\"host-passthrough\"},\"templateCollections\":[2],\"firewallRulesets\":[7]}", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());require "net/http"
require "json"
uri = URI("https://cp.domain.com/api/v1/packages")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer <token>"
request["Accept"] = "application/json"
request["Content-Type"] = "application/json"
request.body = "{\"name\":\"Medium\",\"enabled\":true,\"memory\":4096,\"cpuCores\":2,\"primaryStorage\":80,\"traffic\":2000,\"virtualization\":{\"cpuModel\":\"host-passthrough\"},\"templateCollections\":[2],\"firewallRulesets\":[7]}"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.code
puts JSON.pretty_generate(JSON.parse(response.body))import Foundation
var request = URLRequest(url: URL(string: "https://cp.domain.com/api/v1/packages")!)
request.httpMethod = "POST"
request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = "{\"name\":\"Medium\",\"enabled\":true,\"memory\":4096,\"cpuCores\":2,\"primaryStorage\":80,\"traffic\":2000,\"virtualization\":{\"cpuModel\":\"host-passthrough\"},\"templateCollections\":[2],\"firewallRulesets\":[7]}".data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { print(error ?? "request failed"); return }
print((response as! HTTPURLResponse).statusCode)
print(String(data: data, encoding: .utf8) ?? "")
}
task.resume()// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use reqwest::blocking::Client;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.request(reqwest::Method::POST, "https://cp.domain.com/api/v1/packages")
.bearer_auth("<token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.body(r#"{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}"#)
.send()?;
println!("{}", response.status());
let json: serde_json::Value = response.json()?;
println!("{}", serde_json::to_string_pretty(&json)?);
Ok(())
}// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.request(reqwest::Method::POST, "https://cp.domain.com/api/v1/packages")
.bearer_auth("<token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.body(r#"{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}"#)
.send()
.await?;
println!("{}", response.status());
let json: serde_json::Value = response.json().await?;
println!("{}", serde_json::to_string_pretty(&json)?);
Ok(())
}import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
fun main() {
val client = OkHttpClient()
val body = """{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}""".toRequestBody("application/json".toMediaType())
val request = Request.Builder()
.url("https://cp.domain.com/api/v1/packages")
.method("POST", body)
.addHeader("Authorization", "Bearer <token>")
.addHeader("Accept", "application/json")
.build()
client.newCall(request).execute().use { response ->
println(response.code)
println(response.body?.string())
}
}// pubspec.yaml: http: ^1.2.0
import 'dart:convert';
import 'package:http/http.dart' as http;
Future<void> main() async {
final request = http.Request('POST', Uri.parse('https://cp.domain.com/api/v1/packages'));
request.headers['Authorization'] = 'Bearer <token>';
request.headers['Accept'] = 'application/json';
request.headers['Content-Type'] = 'application/json';
request.body = r'''{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}''';
final response = await http.Response.fromStream(await request.send());
print(response.statusCode);
print(const JsonEncoder.withIndent(' ').convert(jsonDecode(response.body)));
}#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl = curl_easy_init();
if (!curl) return 1;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://cp.domain.com/api/v1/packages");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"name\":\"Medium\",\"enabled\":true,\"memory\":4096,\"cpuCores\":2,\"primaryStorage\":80,\"traffic\":2000,\"virtualization\":{\"cpuModel\":\"host-passthrough\"},\"templateCollections\":[2],\"firewallRulesets\":[7]}");
CURLcode result = curl_easy_perform(curl);
if (result != CURLE_OK) fprintf(stderr, "%s\n", curl_easy_strerror(result));
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
return result == CURLE_OK ? 0 : 1;
}$headers = @{
Authorization = "Bearer <token>"
Accept = "application/json"
}
$body = @'
{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}
'@
$response = Invoke-RestMethod -Uri "https://cp.domain.com/api/v1/packages" -Method POST -Headers $headers -ContentType "application/json" -Body $body
$response | ConvertTo-Json -Depth 10POST /api/v1/packages HTTP/1.1
Host: cp.domain.com
Authorization: Bearer <token>
Accept: application/json
Content-Type: application/json
Content-Length: 290
{
"name": "Medium",
"enabled": true,
"memory": 4096,
"cpuCores": 2,
"primaryStorage": 80,
"traffic": 2000,
"virtualization": {
"cpuModel": "host-passthrough"
},
"templateCollections": [
2
],
"firewallRulesets": [
7
]
}Responses
201Created.
#
A server package. trafficPolicy carries the per-package traffic policy overrides; null values inherit.
Package fields
fields
Which direction counts towards the allowance.
| Value | Meaning |
|---|---|
0 | Inherit from the hypervisor, then the global setting |
1 | Inbound and outbound |
2 | Inbound only |
3 | Outbound only |
What happens when the allowance is reached.
| Value | Meaning |
|---|---|
1 | Nothing |
2 | Throttle the network |
null | Inherit |
Inbound throttle speed in kB/s; null inherits.
Outbound throttle speed in kB/s; null inherits.
First usage alert as a percentage of the allowance; null inherits.
Second usage alert as a percentage of the allowance; null inherits.
The name of the storage profile primaryStorageProfile refers to. Read-only.
The name of the network profile primaryNetworkProfile refers to. Read-only.
The longer description shown in self service.
What Backup Manager access servers built from the package get.
The two optional extra disks, slot 1 and slot 2, always both present.
PackageAdditionalDisk fields
Which of the two extra disks. Required on write; a slot not sent is unchanged.
PackageSelfService fields
IPv4 addresses a self-service server gets.
Text shown in self service instead of the raw figures; null shows the figure.
Sizes a self-service user may pick from, as real values. An empty list with a null default means the resource is not variable.
fields
In order. Their rules are copied to a server built from the package.
{
"data": {
"id": 7,
"name": "Medium",
"description": "Two cores, 4 GB",
"enabled": true,
"memory": 4096,
"primaryStorage": 80,
"traffic": 2000,
"trafficPolicy": {
"trafficCountDirection": 0,
"trafficLimitAction": 2,
"trafficLimitThrottleIn": 1000,
"trafficLimitThrottleOut": null,
"trafficLimitNotification1": null,
"trafficLimitNotification2": null
},
"cpuCores": 2,
"primaryNetworkSpeedIn": 100,
"primaryNetworkSpeedOut": 100,
"primaryDiskType": "qcow2",
"backupPlanId": 5,
"primaryStorageReadBytesSec": null,
"primaryStorageWriteBytesSec": null,
"primaryStorageReadIopsSec": 5000,
"primaryStorageWriteIopsSec": null,
"primaryStorageProfile": 1,
"primaryStorageProfileName": "Fast NVMe",
"primaryNetworkProfile": 0,
"primaryNetworkProfileName": "Any",
"selfServiceDescription": "Good for web",
"tokenValue": 10,
"backupType": "full",
"virtualization": {
"cpuModel": "host-passthrough",
"machineType": "q35",
"pciPorts": 20,
"cpuShares": 2048,
"cpuTopology": {
"enabled": true,
"sockets": 1,
"cores": 2,
"threads": 1
},
"forceIpv6": false
},
"additionalDisks": [
{
"slot": 1,
"enabled": true,
"sizeGb": 50,
"format": "raw",
"storageProfile": 1,
"qos": {
"readIops": 3000,
"writeIops": null,
"readBytes": null,
"writeBytes": null
}
},
{
"slot": 2,
"enabled": false,
"sizeGb": 10,
"format": "inherit",
"storageProfile": 0,
"qos": {
"readIops": null,
"writeIops": null,
"readBytes": null,
"writeBytes": null
}
}
],
"selfService": {
"ipv4Addresses": 2,
"display": {
"name": "Medium VPS",
"memory": null,
"storage": null,
"cores": null,
"traffic": null
},
"variable": {
"memoryMb": {
"options": [
2048,
4096,
8192
],
"default": 4096
},
"storageGb": {
"options": [],
"default": null
},
"cores": {
"options": [],
"default": null
}
}
},
"templateCollections": [
{
"id": 2,
"name": "Windows"
}
],
"firewallRulesets": [
{
"id": 7,
"name": "Web"
}
],
"hypervisorAssetGroups": [
{
"id": 4,
"name": "Pinned cores",
"type": "cpu"
}
],
"created": "2026-10-07T09:14:02.000000Z",
"updated": "2026-10-07T09:20:11+00:00"
}
}401The bearer token is missing, invalid, or expired. The response has no body.
#
422Validation failed, or a read-only or unknown field was sent. Nothing was written.
#
{
"errors": {
"memory": [
"must be a whole number from 64 to 2097152"
]
}
}429Too many requests. Either the token's requests per minute are used up (see the `X-RateL…
#
Too many requests. Either the token's requests per minute are used up (see the X-RateLimit-* headers) or the calling address has failed authentication 10 times in a minute (the body then includes retry_after_seconds). Retry-After gives the seconds to wait.
Seconds to wait before retrying. Present on the failed-authentication limit only.
Seconds to wait before retrying.
The token's requests per minute (token limit only).
Requests left in the current minute (token limit only).
Unix timestamp at which the minute resets (token limit only).
{
"errors": [
"Too Many Requests"
]
}{
"errors": [
"Too many authentication attempts. Try again later."
],
"retry_after_seconds": 42
}