curl --request POST \
--url https://{host}/Agent/Crypto/CreateKey \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Referer: <referer>' \
--data '
{
"localName": "<string>",
"namespace": "<string>",
"id": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
'import requests
url = "https://{host}/Agent/Crypto/CreateKey"
payload = {
"localName": "<string>",
"namespace": "<string>",
"id": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
headers = {
"Referer": "<referer>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Referer: '<referer>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
localName: '<string>',
namespace: '<string>',
id: '<string>',
nonce: '<string>',
keySignature: '<string>',
requestSignature: '<string>'
})
};
fetch('https://{host}/Agent/Crypto/CreateKey', 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://{host}/Agent/Crypto/CreateKey",
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([
'localName' => '<string>',
'namespace' => '<string>',
'id' => '<string>',
'nonce' => '<string>',
'keySignature' => '<string>',
'requestSignature' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Referer: <referer>"
],
]);
$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://{host}/Agent/Crypto/CreateKey"
payload := strings.NewReader("{\n \"localName\": \"<string>\",\n \"namespace\": \"<string>\",\n \"id\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Referer", "<referer>")
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://{host}/Agent/Crypto/CreateKey")
.header("Referer", "<referer>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"localName\": \"<string>\",\n \"namespace\": \"<string>\",\n \"id\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/Agent/Crypto/CreateKey")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Referer"] = '<referer>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"localName\": \"<string>\",\n \"namespace\": \"<string>\",\n \"id\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"created": "2023-11-07T05:31:56Z",
"updated": "2023-11-07T05:31:56Z"
}Create Key
Allows the client to create a cryptographic key on the server, and protect it with a password.
curl --request POST \
--url https://{host}/Agent/Crypto/CreateKey \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Referer: <referer>' \
--data '
{
"localName": "<string>",
"namespace": "<string>",
"id": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
'import requests
url = "https://{host}/Agent/Crypto/CreateKey"
payload = {
"localName": "<string>",
"namespace": "<string>",
"id": "<string>",
"nonce": "<string>",
"keySignature": "<string>",
"requestSignature": "<string>"
}
headers = {
"Referer": "<referer>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Referer: '<referer>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
localName: '<string>',
namespace: '<string>',
id: '<string>',
nonce: '<string>',
keySignature: '<string>',
requestSignature: '<string>'
})
};
fetch('https://{host}/Agent/Crypto/CreateKey', 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://{host}/Agent/Crypto/CreateKey",
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([
'localName' => '<string>',
'namespace' => '<string>',
'id' => '<string>',
'nonce' => '<string>',
'keySignature' => '<string>',
'requestSignature' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Referer: <referer>"
],
]);
$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://{host}/Agent/Crypto/CreateKey"
payload := strings.NewReader("{\n \"localName\": \"<string>\",\n \"namespace\": \"<string>\",\n \"id\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Referer", "<referer>")
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://{host}/Agent/Crypto/CreateKey")
.header("Referer", "<referer>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"localName\": \"<string>\",\n \"namespace\": \"<string>\",\n \"id\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/Agent/Crypto/CreateKey")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Referer"] = '<referer>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"localName\": \"<string>\",\n \"namespace\": \"<string>\",\n \"id\": \"<string>\",\n \"nonce\": \"<string>\",\n \"keySignature\": \"<string>\",\n \"requestSignature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"created": "2023-11-07T05:31:56Z",
"updated": "2023-11-07T05:31:56Z"
}Key identifier
The caller choosesid. A successful response returns storage timestamps, not a newly generated key identifier. Persist the submitted id; later operations call it keyId.
Signature construction
Lets1 = username + ":" + HTTP-Host + ":" + localName + ":" + namespace + ":" + id.
keySignature = Base64(HMAC-SHA256(UTF8(keyPassword), UTF8(s1)))- Generate at least 32 random bytes and Base64-encode them as
nonce. - Let
s2 = s1 + ":" + keySignature + ":" + nonce. requestSignature = Base64(HMAC-SHA256(UTF8(accountPassword), UTF8(s2)))
Host header value, including a non-default port. String order and casing are significant. Never reuse a nonce.
See the copy-paste key guide for JavaScript.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Your application's HTTPS URL, for example https://app.example.com/. Include this header on every Agent API request, including backend calls, login, and account creation. Browser clients must use a referrer policy that sends the application origin. See /neuron-api/api-basics#required-referer-header.
Body
Algorithm local name returned by GetAlgorithms.
Algorithm namespace returned by GetAlgorithms.
Caller-chosen key identifier. Persist this value as the keyId used by later operations.
Unique random string of at least 32 characters. The maintained client uses Base64 of 32 random bytes.
32Base64-encoded HMAC-SHA256 over the documented key message, keyed by the key password.
Base64-encoded HMAC-SHA256 over the documented request message, keyed by the account password.