Register a single-label Persona
curl --request PUT \
--url https://api.example.com/personas/{persona}/named \
--header 'Content-Type: application/json' \
--data '
{
"action": "<string>",
"operator_did": "<string>",
"controller_keys": [
"<string>"
],
"controller_threshold": 123,
"nonce": "<string>",
"valid_until": "<string>",
"signer_key_id": "<string>",
"canonical_payload": "<string>",
"signature": "<string>"
}
'import requests
url = "https://api.example.com/personas/{persona}/named"
payload = {
"action": "<string>",
"operator_did": "<string>",
"controller_keys": ["<string>"],
"controller_threshold": 123,
"nonce": "<string>",
"valid_until": "<string>",
"signer_key_id": "<string>",
"canonical_payload": "<string>",
"signature": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
action: '<string>',
operator_did: '<string>',
controller_keys: ['<string>'],
controller_threshold: 123,
nonce: '<string>',
valid_until: '<string>',
signer_key_id: '<string>',
canonical_payload: '<string>',
signature: '<string>'
})
};
fetch('https://api.example.com/personas/{persona}/named', 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://api.example.com/personas/{persona}/named",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'action' => '<string>',
'operator_did' => '<string>',
'controller_keys' => [
'<string>'
],
'controller_threshold' => 123,
'nonce' => '<string>',
'valid_until' => '<string>',
'signer_key_id' => '<string>',
'canonical_payload' => '<string>',
'signature' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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://api.example.com/personas/{persona}/named"
payload := strings.NewReader("{\n \"action\": \"<string>\",\n \"operator_did\": \"<string>\",\n \"controller_keys\": [\n \"<string>\"\n ],\n \"controller_threshold\": 123,\n \"nonce\": \"<string>\",\n \"valid_until\": \"<string>\",\n \"signer_key_id\": \"<string>\",\n \"canonical_payload\": \"<string>\",\n \"signature\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
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.put("https://api.example.com/personas/{persona}/named")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"<string>\",\n \"operator_did\": \"<string>\",\n \"controller_keys\": [\n \"<string>\"\n ],\n \"controller_threshold\": 123,\n \"nonce\": \"<string>\",\n \"valid_until\": \"<string>\",\n \"signer_key_id\": \"<string>\",\n \"canonical_payload\": \"<string>\",\n \"signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/personas/{persona}/named")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"<string>\",\n \"operator_did\": \"<string>\",\n \"controller_keys\": [\n \"<string>\"\n ],\n \"controller_threshold\": 123,\n \"nonce\": \"<string>\",\n \"valid_until\": \"<string>\",\n \"signer_key_id\": \"<string>\",\n \"canonical_payload\": \"<string>\",\n \"signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyPersonas
Register a single-label Persona
Submit a prepared, signed Persona registration without DNS proof
Register a single-label Persona
curl --request PUT \
--url https://api.example.com/personas/{persona}/named \
--header 'Content-Type: application/json' \
--data '
{
"action": "<string>",
"operator_did": "<string>",
"controller_keys": [
"<string>"
],
"controller_threshold": 123,
"nonce": "<string>",
"valid_until": "<string>",
"signer_key_id": "<string>",
"canonical_payload": "<string>",
"signature": "<string>"
}
'import requests
url = "https://api.example.com/personas/{persona}/named"
payload = {
"action": "<string>",
"operator_did": "<string>",
"controller_keys": ["<string>"],
"controller_threshold": 123,
"nonce": "<string>",
"valid_until": "<string>",
"signer_key_id": "<string>",
"canonical_payload": "<string>",
"signature": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
action: '<string>',
operator_did: '<string>',
controller_keys: ['<string>'],
controller_threshold: 123,
nonce: '<string>',
valid_until: '<string>',
signer_key_id: '<string>',
canonical_payload: '<string>',
signature: '<string>'
})
};
fetch('https://api.example.com/personas/{persona}/named', 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://api.example.com/personas/{persona}/named",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'action' => '<string>',
'operator_did' => '<string>',
'controller_keys' => [
'<string>'
],
'controller_threshold' => 123,
'nonce' => '<string>',
'valid_until' => '<string>',
'signer_key_id' => '<string>',
'canonical_payload' => '<string>',
'signature' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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://api.example.com/personas/{persona}/named"
payload := strings.NewReader("{\n \"action\": \"<string>\",\n \"operator_did\": \"<string>\",\n \"controller_keys\": [\n \"<string>\"\n ],\n \"controller_threshold\": 123,\n \"nonce\": \"<string>\",\n \"valid_until\": \"<string>\",\n \"signer_key_id\": \"<string>\",\n \"canonical_payload\": \"<string>\",\n \"signature\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
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.put("https://api.example.com/personas/{persona}/named")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"<string>\",\n \"operator_did\": \"<string>\",\n \"controller_keys\": [\n \"<string>\"\n ],\n \"controller_threshold\": 123,\n \"nonce\": \"<string>\",\n \"valid_until\": \"<string>\",\n \"signer_key_id\": \"<string>\",\n \"canonical_payload\": \"<string>\",\n \"signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/personas/{persona}/named")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"<string>\",\n \"operator_did\": \"<string>\",\n \"controller_keys\": [\n \"<string>\"\n ],\n \"controller_threshold\": 123,\n \"nonce\": \"<string>\",\n \"valid_until\": \"<string>\",\n \"signer_key_id\": \"<string>\",\n \"canonical_payload\": \"<string>\",\n \"signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyFirst prepare the single-label registration. Sign the decoded
Repeat any
canonical_payload with the declared operator DID controller key. Submit the same intent fields with that payload and signature.
Request
string
required
Single-label Persona prepared earlier.
string
required
register_named_persona.string
required
Active operator DID.
string[]
required
Same one through eight controller keys used during preparation.
integer
required
Must equal
1.string
required
Same current operator nonce used during preparation.
string
required
Same future expiration used during preparation.
string
required
Controller key used to sign the payload.
string
required
Exact payload returned by preparation, in
0x-prefixed hexadecimal.string
required
64-byte Ed25519 signature over the decoded payload, encoded as Base64 or hexadecimal.
delivery_constraints from preparation. The Directory reconstructs the intent and rejects a changed payload with 403 canonical_payload_mismatch.
202 Accepted returns status, persona, extrinsic, and tx_hash. It confirms chain submission, not finalization. Poll Get a Persona until the record is active. A single-label Persona does not claim control of a DNS domain and cannot supply DNS proof for an Application Call.
Straight to the point
PUT /personas/{persona}/named
Sign: decoded canonical_payload bytes
Accepted submission: 202; verify finalized Persona state

