space.highport.manage.reserveDomain
Reserve a name directly under a delegation-enabled base for another identity. The name answers /.well-known/atproto-did with the subject before the subject has published anything, and the subject may then publish a site there. The caller must be the base's registered identity. An unproven claim on the name, held by any identity, is replaced. Reserving a name again for the subject that already holds it is answered with the reservation as it stands, writes nothing, and does not count against maxNames, so a retry is safe. A reservation has no expiry: it is held for as long as the base is.
Details · procedure
| Kind | procedure |
|---|---|
| Authority | manage.highport.space |
| Indexed |
Showing version bafyreibzjqnehgxdmtrkmmn3ih2gcj5l3u2wafnzk63rc4acimqek4c3cy. Show the latest
Checks
Validunlimited-stringdefs.main.output.schema.properties.hostnameNo maxLength, maxGraphemes or format limits this string.
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"main": {
"description": "Reserve a name directly under a delegation-enabled base for another identity. The name answers /.well-known/atproto-did with the subject before the subject has published anything, and the subject may then publish a site there. The caller must be the base's registered identity. An unproven claim on the name, held by any identity, is replaced. Reserving a name again for the subject that already holds it is answered with the reservation as it stands, writes nothing, and does not count against maxNames, so a retry is safe. A reservation has no expiry: it is held for as long as the base is.",
"errors": [
{
"description": "Not a syntactically valid, non-reserved domain.",
"name": "InvalidDomain"
},
{
"description": "The hostname or the subject is on the operator denylist.",
"name": "DomainDenied"
},
{
"description": "The name is not under a delegation-enabled base whose verified or active registration belongs to the caller.",
"name": "NotBaseOwner"
},
{
"description": "The name is held and cannot be reserved: a proven registration of it exists, including one the base owner made the ordinary way, a live reservation for a different subject, or a suspended one; an unproven claim on it is itself a base carrying a delegation or a certificate grant; or it is released but still carries a delegation or a grant, such as one whose wildcard is still being retired. Release it, or wait for the retirement, first.",
"name": "DomainTaken"
},
{
"description": "The base's wildcard has not been shown to route to this service: its delegation probe has not passed yet, or the base's routing has lapsed. The message names the probe hostname and the *.<base> record to publish or restore. The name being reserved is never resolved.",
"name": "DelegationNotVerified"
},
{
"description": "The subject is not a well-formed did:plc or did:web, or is a did:web rooted at the hostname being reserved, or a genesisOp was given that does not prove the subject. The message says which rule failed.",
"name": "InvalidSubject"
},
{
"description": "The name is more than one label under the base. A wildcard covers exactly one label, so a deeper name could never complete a handshake.",
"name": "DelegatedNameTooDeep"
},
{
"description": "The base already holds its maxNames reservations. Never returned for a name the subject already holds.",
"name": "DelegationQuotaExceeded"
}
],
"input": {
"encoding": "application/json",
"schema": {
"properties": {
"genesisOp": {
"description": "Optional proof for a did:plc subject: its signed genesis operation, as submitted to a PLC directory. Verified offline, without resolving anything. The call is refused with InvalidSubject unless the operation is a genesis operation (prev is null) that hashes to the subject, is signed by one of its own rotation keys, and lists at://<hostname> in alsoKnownAs. A subject that is not a did:plc cannot carry one.",
"type": "unknown"
},
"hostname": {
"description": "A name exactly one label under a delegation-enabled base the caller owns.",
"maxLength": 253,
"type": "string"
},
"subject": {
"description": "The identity the name is reserved for. Without genesisOp it is checked for syntax only: it need not resolve, and its DID document need not name the hostname yet.",
"format": "did",
"type": "string"
}
},
"required": [
"hostname",
"subject"
],
"type": "object"
}
},
"output": {
"encoding": "application/json",
"schema": {
"properties": {
"hostname": {
"type": "string"
},
"status": {
"ref": "space.highport.defs#domainStatus",
"type": "ref"
},
"subject": {
"format": "did",
"type": "string"
}
},
"required": [
"hostname",
"status",
"subject"
],
"type": "object"
}
},
"type": "procedure"
}
},
"id": "space.highport.manage.reserveDomain",
"lexicon": 1
}