curl --request POST \
--url "https://directory.example.com/personas/example.com/transfer/dns-challenges" \
--header "Content-Type: application/json" \
--data '{
"current_operator_did": "did:openpayload:1111111111111111111111",
"new_operator_did": "did:openpayload:2222222222222222222222"
}'
Personas
Create a Persona transfer DNS challenge
Begin an authenticated transfer to a new operator DID
curl --request POST \
--url "https://directory.example.com/personas/example.com/transfer/dns-challenges" \
--header "Content-Type: application/json" \
--data '{
"current_operator_did": "did:openpayload:1111111111111111111111",
"new_operator_did": "did:openpayload:2222222222222222222222"
}'
Create a short-lived DNS challenge before transferring an active Persona to a different operator DID.
Publish
current_operator_did must match the Persona’s finalized operator, and new_operator_did must exist and be active in finalized chain state.
Transfer requires three independent proofs: fresh DNS control, acceptance by a signing key of the new operator, and authorization by a current Persona controller. This endpoint only creates the DNS challenge.
Request
string
required
Active canonical Persona to transfer.
string
required
Operator DID currently registered for the Persona.
string
required
Different, active DID that will receive control of the Persona.
curl --request POST \
--url "https://directory.example.com/personas/example.com/transfer/dns-challenges" \
--header "Content-Type: application/json" \
--data '{
"current_operator_did": "did:openpayload:1111111111111111111111",
"new_operator_did": "did:openpayload:2222222222222222222222"
}'
Response
201 Response
{
"challenge_id": "<challenge-id>",
"persona": "example.com",
"action": "transfer_persona",
"challenge_nonce": "3",
"operator_nonce": "7",
"record_name": "_openpayload-persona.example.com",
"record_type": "TXT",
"record_value": "openpayload-persona-v1=<challenge>",
"expires_at": "2026-09-17T18:00:00Z",
"current_operator_did": "did:openpayload:1111111111111111111111",
"new_operator_did": "did:openpayload:2222222222222222222222"
}
record_value exactly at record_name, then continue with Verify a Persona transfer challenge.
Straight to the point
POST /personas/{persona}/transfer/dns-challenges
- Requires an active Persona, its matching current operator, and a different active new operator DID
- Challenge is bound to the Persona, both operators, current nonces, and
transfer_persona - Challenge is single-use and expires at
expires_at - Does not transfer the Persona

