> ## Documentation Index
> Fetch the complete documentation index at: https://docs.openpayload.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a Persona DNS challenge

> Request the TXT record needed to prove control of a Persona domain

Create a short-lived DNS challenge before registering or renewing a Persona. The Directory does not create or renew a Persona until it observes the exact TXT value and the chain accepts the attested proof.

Registration first checks finalized chain state for uniqueness. An existing canonical Persona returns `409 persona_conflict`; a renewal requires the currently registered operator DID.

## Request

<ParamField path="persona" type="string" required>
  A DNS name, URL-encoded when necessary. The Directory returns its canonical lowercase ASCII IDNA form.
</ParamField>

The name must be fully qualified and contain at least two DNS labels. URLs, paths, ports, wildcard names, IP addresses, and names whose top-level label is numeric-only are rejected.

<ParamField body="operator_did" type="string" required>
  The DID that will operate the Persona.
</ParamField>

<ParamField body="action" type="string">
  `register_persona` or `renew_persona`. Defaults to `register_persona`.
</ParamField>

<RequestExample>
  ```bash Request theme={null}
  curl --request POST \
    --url "https://directory.example.com/personas/example.com/dns-challenges" \
    --header "Content-Type: application/json" \
    --data '{
      "operator_did": "did:openpayload:1111111111111111111111",
      "action": "register_persona"
    }'
  ```
</RequestExample>

## Response

```json 201 Response theme={null}
{
  "challenge_id": "<challenge-id>",
  "persona": "example.com",
  "operator_did": "did:openpayload:1111111111111111111111",
  "action": "register_persona",
  "challenge_nonce": "0",
  "operator_nonce": "0",
  "record_name": "_openpayload-persona.example.com",
  "record_type": "TXT",
  "record_value": "openpayload-persona-v1=<challenge>",
  "expires_at": "2026-09-17T18:00:00Z"
}
```

Publish `record_value` exactly at `record_name`. DNS responses can be cached, so wait for propagation before submitting the Persona update.

## Straight to the point

```http theme={null}
POST /personas/{persona}/dns-challenges
```

* Does not register the Persona
* Challenge is bound to the action, Persona, operator DID, network, and nonce
* Challenge is single-use and expires at `expires_at`


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.