curl --request POST \
--url https://console.advinservers.com/api/v1/client/ssh-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "gordon-workstation",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation",
"is_default": true
}
'import requests
url = "https://console.advinservers.com/api/v1/client/ssh-keys"
payload = {
"name": "gordon-workstation",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation",
"is_default": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'gordon-workstation',
public_key: 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation',
is_default: true
})
};
fetch('https://console.advinservers.com/api/v1/client/ssh-keys', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://console.advinservers.com/api/v1/client/ssh-keys",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'gordon-workstation',
'public_key' => 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation',
'is_default' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://console.advinservers.com/api/v1/client/ssh-keys"
payload := strings.NewReader("{\n \"name\": \"gordon-workstation\",\n \"public_key\": \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation\",\n \"is_default\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://console.advinservers.com/api/v1/client/ssh-keys")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"gordon-workstation\",\n \"public_key\": \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation\",\n \"is_default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://console.advinservers.com/api/v1/client/ssh-keys")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"gordon-workstation\",\n \"public_key\": \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation\",\n \"is_default\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "97721fd4-746a-40cc-8da0-4c9f623c112e",
"name": "gordon-workstation",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation",
"fingerprint": "SHA256:0wwKzu+9eBzR6xq9nUxZ18417RQ5GKXSzi7ScY39ing",
"algorithm": "ssh-ed25519",
"is_default": true,
"owner": {
"name": "Gordon Freeman",
"email": "gordon.freeman@blackmesa.example.com"
},
"belongs_to_server_owner": true,
"created_at": "2025-11-18T21:31:02+00:00"
}{
"message": "Unauthenticated."
}{
"message": "This API key is not allowed to do that in this team. It needs the \"snapshot.delete\" permission."
}{
"message": "The name field is required.",
"errors": {}
}{
"message": "Too Many Attempts."
}Add an SSH key
Overview
Adds an SSH public key for future server reinstalls. Existing servers are not changed.
Send a unique account-wide name of up to 64 characters and the complete one-line public_key of up to 4096 characters. Set is_default to preselect the key on the reinstall form. Multiple keys can be defaults.
Permissions
Requires the sshkey.update (Manage SSH keys) permission for the selected team. Resources outside that team return 404.
curl --request POST \
--url https://console.advinservers.com/api/v1/client/ssh-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "gordon-workstation",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation",
"is_default": true
}
'import requests
url = "https://console.advinservers.com/api/v1/client/ssh-keys"
payload = {
"name": "gordon-workstation",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation",
"is_default": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'gordon-workstation',
public_key: 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation',
is_default: true
})
};
fetch('https://console.advinservers.com/api/v1/client/ssh-keys', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://console.advinservers.com/api/v1/client/ssh-keys",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'gordon-workstation',
'public_key' => 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation',
'is_default' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://console.advinservers.com/api/v1/client/ssh-keys"
payload := strings.NewReader("{\n \"name\": \"gordon-workstation\",\n \"public_key\": \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation\",\n \"is_default\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://console.advinservers.com/api/v1/client/ssh-keys")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"gordon-workstation\",\n \"public_key\": \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation\",\n \"is_default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://console.advinservers.com/api/v1/client/ssh-keys")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"gordon-workstation\",\n \"public_key\": \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation\",\n \"is_default\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "97721fd4-746a-40cc-8da0-4c9f623c112e",
"name": "gordon-workstation",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation",
"fingerprint": "SHA256:0wwKzu+9eBzR6xq9nUxZ18417RQ5GKXSzi7ScY39ing",
"algorithm": "ssh-ed25519",
"is_default": true,
"owner": {
"name": "Gordon Freeman",
"email": "gordon.freeman@blackmesa.example.com"
},
"belongs_to_server_owner": true,
"created_at": "2025-11-18T21:31:02+00:00"
}{
"message": "Unauthenticated."
}{
"message": "This API key is not allowed to do that in this team. It needs the \"snapshot.delete\" permission."
}{
"message": "The name field is required.",
"errors": {}
}{
"message": "Too Many Attempts."
}Authorizations
Your API key, sent as a bearer token. Create one in the control panel under API Keys, give it only the permissions the integration needs, and copy it when it is created. It cannot be shown again. Each key is restricted to one owned team. The key determines the team for every request.
Body
Send a JSON object containing the fields below. Required fields are marked in the schema.
A name unique across the account, 1 to 64 characters, without control characters.
"gordon-workstation"
The complete SSH public key, up to 4096 characters. Never send a private key.
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation"
Whether to preselect this key for server reinstalls.
true
Response
The record, as a JSON object. There is no envelope.
A public SSH key used to access a server.
The uuid. A key's autoincrement id never leaves the server.
"97721fd4-746a-40cc-8da0-4c9f623c112e"
The name shown to customers.
"gordon-workstation"
The SSH public key in OpenSSH format.
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPDNr9XsCkWrb0LklstkNHufnF8gAVKsPIFsZeFdoZEO gordon@bmrf-workstation"
The value of fingerprint.
"SHA256:0wwKzu+9eBzR6xq9nUxZ18417RQ5GKXSzi7ScY39ing"
The algorithm as OpenSSH names it, read off the key material rather than stored beside it, so it cannot disagree with the key it labels.
"ssh-ed25519"
Ticked for the customer when a reinstall form opens; several keys can carry it, since a rebuild installs any number of them.
true
The key owner, when requested for a specific server.
Show child attributes
Show child attributes
{ "name": "Gordon Freeman", "email": "gordon.freeman@blackmesa.example.com" }
Which account's key this is, as a flag the reinstall form can act on: only the server owner's keys open ticked, never an administrator's own on somebody else's rebuild.
true
The date and time for created at, in UTC.
"2025-11-18T21:31:02+00:00"