Duplicate a package
Since 7.1.0A disabled copy of the package under a new name, with its settings, template collections, firewall rulesets and hypervisor asset groups.
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 ********************Request Code Samples
curl --location --request POST 'https://cp.domain.com/api/v1/packages/7/duplicate' \
--header 'Authorization: Bearer <token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Medium copy"
}'wget --quiet --output-document=- \
--method=POST \
--header='Authorization: Bearer <token>' \
--header='Accept: application/json' \
--header='Content-Type: application/json' \
--body-data='{
"name": "Medium copy"
}' \
'https://cp.domain.com/api/v1/packages/7/duplicate'http POST 'https://cp.domain.com/api/v1/packages/7/duplicate' \
'Authorization: Bearer <token>' \
'Accept: application/json' \
'Content-Type: application/json' <<< '{
"name": "Medium copy"
}'const response = await fetch("https://cp.domain.com/api/v1/packages/7/duplicate", {
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "Medium copy"
}),
});
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/7/duplicate",
headers: {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
},
data: {
"name": "Medium copy"
},
});
console.log(response.status, response.data);const https = require("https");
const payload = JSON.stringify({
"name": "Medium copy"
});
const req = https.request({
hostname: "cp.domain.com",
path: "/api/v1/packages/7/duplicate",
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/7/duplicate"
headers = {
"Authorization": "Bearer <token>",
"Accept": "application/json",
"Content-Type": "application/json",
}
payload = {
"name": "Medium copy",
}
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 copy",
})
conn.request("POST", "/api/v1/packages/7/duplicate", 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/7/duplicate',
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 copy',
]),
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/7/duplicate', [
'headers' => [
'Authorization' => 'Bearer <token>',
'Accept' => 'application/json',
],
'json' => [
'name' => 'Medium copy',
],
]);
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/7/duplicate"
payload := strings.NewReader(`{
"name": "Medium copy"
}`)
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/7/duplicate"))
.header("Authorization", "Bearer <token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"name\":\"Medium copy\"}"))
.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 copy\"}", json);
Request request = new Request.Builder()
.url("https://cp.domain.com/api/v1/packages/7/duplicate")
.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/7/duplicate");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Content = new StringContent("{\"name\":\"Medium copy\"}", 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/7/duplicate")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer <token>"
request["Accept"] = "application/json"
request["Content-Type"] = "application/json"
request.body = "{\"name\":\"Medium copy\"}"
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/7/duplicate")!)
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 copy\"}".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/7/duplicate")
.bearer_auth("<token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.body(r#"{
"name": "Medium copy"
}"#)
.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/7/duplicate")
.bearer_auth("<token>")
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.body(r#"{
"name": "Medium copy"
}"#)
.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 copy"
}""".toRequestBody("application/json".toMediaType())
val request = Request.Builder()
.url("https://cp.domain.com/api/v1/packages/7/duplicate")
.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/7/duplicate'));
request.headers['Authorization'] = 'Bearer <token>';
request.headers['Accept'] = 'application/json';
request.headers['Content-Type'] = 'application/json';
request.body = r'''{
"name": "Medium copy"
}''';
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/7/duplicate");
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"name\":\"Medium copy\"}");
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 copy"
}
'@
$response = Invoke-RestMethod -Uri "https://cp.domain.com/api/v1/packages/7/duplicate" -Method POST -Headers $headers -ContentType "application/json" -Body $body
$response | ConvertTo-Json -Depth 10POST /api/v1/packages/7/duplicate HTTP/1.1
Host: cp.domain.com
Authorization: Bearer <token>
Accept: application/json
Content-Type: application/json
Content-Length: 29
{
"name": "Medium copy"
}Responses
201The copy.
#
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": {
"description": "string",
"id": 1,
"name": "Example",
"enabled": true,
"memory": 1,
"primaryStorage": 1,
"traffic": 1,
"trafficPolicy": {
"trafficCountDirection": 1,
"trafficLimitAction": 1,
"trafficLimitThrottleIn": 1,
"trafficLimitThrottleOut": 1,
"trafficLimitNotification1": 1,
"trafficLimitNotification2": 1
},
"cpuCores": 1,
"primaryNetworkSpeedIn": 1,
"primaryNetworkSpeedOut": 1,
"primaryDiskType": "string",
"backupPlanId": 1,
"primaryStorageReadBytesSec": 1,
"primaryStorageWriteBytesSec": 1,
"primaryStorageReadIopsSec": 1,
"primaryStorageWriteIopsSec": 1,
"primaryStorageProfile": 1,
"primaryNetworkProfile": 1,
"created": "2026-01-15T09:30:00+00:00",
"updated": "2026-01-15T09:30:00+00:00",
"primaryStorageProfileName": "string",
"primaryNetworkProfileName": "string",
"selfServiceDescription": "string",
"tokenValue": 1,
"backupType": "inherit",
"virtualization": {
"cpuModel": "string",
"machineType": "inherit",
"pciPorts": 10,
"cpuShares": 2,
"cpuTopology": {
"enabled": true,
"sockets": 1,
"cores": 1,
"threads": 1
},
"forceIpv6": true
},
"additionalDisks": [
{
"slot": 1,
"enabled": true,
"sizeGb": 1,
"format": "inherit",
"storageProfile": 0,
"qos": {
"readIops": 1,
"writeIops": 1,
"readBytes": 1,
"writeBytes": 1
}
}
],
"selfService": {
"ipv4Addresses": 0,
"display": {
"name": "Example",
"memory": "string",
"storage": "string",
"cores": "string",
"traffic": "string"
},
"variable": {
"memoryMb": {
"options": [
1
],
"default": 1
},
"storageGb": {
"options": [
1
],
"default": 1
},
"cores": {
"options": [
1
],
"default": 1
}
}
},
"templateCollections": [
{
"id": 1,
"name": "Example"
}
],
"firewallRulesets": [
{
"id": 1,
"name": "Example"
}
],
"hypervisorAssetGroups": [
{
"id": 1,
"name": "Example",
"type": "device"
}
]
}
}401The bearer token is missing, invalid, or expired. The response has no body.
#
404The package was not found.
#
{
"msg": "server package not found"
}422The name is missing or outside 3 to 150 characters.
#
{
"errors": {
"name": [
"must be 3 to 150 characters"
]
}
}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
}