Skip to content

XRPC API

The main app serves AT Protocol XRPC endpoints at /xrpc/{nsid}. All authenticated endpoints require a service JWT in the Authorization: Bearer <token> header, scoped to the called NSID (lxm claim).

Each endpoint also accepts kebab-case and lowercase NSID aliases (e.g. place.wisp.v2.domain.add-site, place.wisp.v2.domain.addsite).


Returns the registration status of any domain. Auth is optional β€” if authenticated, also returns ownership info for domains you own.

Params:

FieldTypeRequired
domainstringβœ…

Response:

FieldType
domainstring
status"unclaimed" | "pendingVerification" | "verified" | "alreadyClaimed"
kind"wisp" | "custom"
verifiedboolean
siteRkeystring
lastCheckedAtstring (datetime)
lastErrorstring

Returns all domains (wisp subdomains and custom domains) owned by the authenticated DID.

Response:

{
"domains": [
{
"domain": "alice.wisp.place",
"kind": "wisp",
"status": "verified",
"verified": true,
"siteRkey": "my-site"
},
{
"domain": "example.com",
"kind": "custom",
"status": "pendingVerification",
"verified": false,
"lastCheckedAt": "2024-01-15T10:30:00.000Z"
}
]
}

Errors: AuthenticationRequired


place.wisp.v2.domain.claimSubdomain β€” procedure πŸ”’

Section titled β€œplace.wisp.v2.domain.claimSubdomain β€” procedure πŸ”’β€

Claims a *.wisp.place subdomain for the authenticated DID. Max 3 wisp subdomains per DID.

Input:

FieldTypeRequiredNotes
handlestringβœ…Subdomain label only, e.g. alice (3–63 chars, a-z0-9-)
siteRkeystringMap a site immediately after claim

Response:

FieldType
domainstring
kind"wisp"
status"verified" | "alreadyClaimed"
siteRkeystring

Errors: AuthenticationRequired, InvalidDomain, AlreadyClaimed, DomainLimitReached, RateLimitExceeded


Claims a custom domain for the authenticated DID. Returns DNS challenge details for ownership verification.

Input:

FieldTypeRequiredNotes
domainstringβœ…Custom FQDN (3–253 chars)
siteRkeystringMap a site immediately after claim

Response:

FieldTypeNotes
domainstring
kind"custom"
status"alreadyClaimed" | "pendingVerification" | "verified"
challengeIdstringUsed to derive DNS targets
txtNamestringTXT record hostname for ownership proof
txtValuestringTXT record value (your DID)
cnameTargetstringAdvisory CNAME target
siteRkeystring

Errors: AuthenticationRequired, InvalidDomain, AlreadyClaimed, DomainLimitReached, RateLimitExceeded


place.wisp.v2.domain.addSite β€” procedure πŸ”’

Section titled β€œplace.wisp.v2.domain.addSite β€” procedure πŸ”’β€

Maps a site to a domain you own.

Input:

FieldTypeRequired
domainstringβœ…
siteRkeystringβœ…

Response:

FieldType
domainstring
kind"wisp" | "custom"
status"pendingVerification" | "verified"
siteRkeystring
mappedtrue

Errors: AuthenticationRequired, InvalidDomain, InvalidRequest, NotFound


Deletes a domain (wisp subdomain or custom domain) owned by the authenticated DID.

Params:

FieldTypeRequired
domainstringβœ…

Response:

{ "domain": "alice.wisp.place", "deleted": true }

Errors: AuthenticationRequired, InvalidDomain, NotFound


Returns all sites owned by the authenticated DID, with their mapped domains.

Response:

{
"sites": [
{
"siteRkey": "my-site",
"displayName": "My Site",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z",
"domains": [
{ "domain": "alice.wisp.place", "kind": "wisp", "status": "verified", "verified": true }
]
}
]
}

Errors: AuthenticationRequired


Returns all domains mapped to a specific site. Public β€” no auth required.

Params:

FieldTypeRequired
didstringβœ…
rkeystringβœ…

Response:

{
"domains": [
{ "domain": "alice.wisp.place", "kind": "wisp", "status": "verified", "verified": true }
]
}

Deletes a site and detaches all mapped domains.

Input:

FieldTypeRequired
siteRkeystringβœ…

Response:

{
"siteRkey": "my-site",
"deleted": true,
"unmappedDomains": [
{ "domain": "alice.wisp.place", "kind": "wisp", "status": "verified" }
]
}

Errors: AuthenticationRequired, InvalidRequest, NotFound