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).
place.wisp.v2.domain.getStatus β query
Section titled βplace.wisp.v2.domain.getStatus β queryβReturns the registration status of any domain. Auth is optional β if authenticated, also returns ownership info for domains you own.
Params:
| Field | Type | Required |
|---|---|---|
domain |
string |
β |
Response:
| Field | Type |
|---|---|
domain |
string |
status |
"unclaimed" | "pendingVerification" | "verified" | "alreadyClaimed" |
kind |
"wisp" | "custom" |
verified |
boolean |
siteRkey |
string |
lastCheckedAt |
string (datetime) |
lastError |
string |
place.wisp.v2.domain.getList β query π
Section titled βplace.wisp.v2.domain.getList β query πβ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:
| Field | Type | Required | Notes |
|---|---|---|---|
handle |
string |
β | Subdomain label only, e.g. alice (3β63 chars, a-z0-9-) |
siteRkey |
string |
Map a site immediately after claim |
Response:
| Field | Type |
|---|---|
domain |
string |
kind |
"wisp" |
status |
"verified" | "alreadyClaimed" |
siteRkey |
string |
Errors: AuthenticationRequired, InvalidDomain, AlreadyClaimed, DomainLimitReached, RateLimitExceeded
place.wisp.v2.domain.claim β procedure π
Section titled βplace.wisp.v2.domain.claim β procedure πβClaims a custom domain for the authenticated DID. Returns DNS challenge details for ownership verification.
Input:
| Field | Type | Required | Notes |
|---|---|---|---|
domain |
string |
β | Custom FQDN (3β253 chars) |
siteRkey |
string |
Map a site immediately after claim |
Response:
| Field | Type | Notes |
|---|---|---|
domain |
string |
|
kind |
"custom" |
|
status |
"alreadyClaimed" | "pendingVerification" | "verified" |
|
challengeId |
string |
Used to derive DNS targets |
txtName |
string |
TXT record hostname for ownership proof |
txtValue |
string |
TXT record value (your DID) |
cnameTarget |
string |
Advisory CNAME target |
siteRkey |
string |
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:
| Field | Type | Required |
|---|---|---|
domain |
string |
β |
siteRkey |
string |
β |
Response:
| Field | Type |
|---|---|
domain |
string |
kind |
"wisp" | "custom" |
status |
"pendingVerification" | "verified" |
siteRkey |
string |
mapped |
true |
Errors: AuthenticationRequired, InvalidDomain, InvalidRequest, NotFound
place.wisp.v2.domain.delete β procedure π
Section titled βplace.wisp.v2.domain.delete β procedure πβDeletes a domain (wisp subdomain or custom domain) owned by the authenticated DID.
Params:
| Field | Type | Required |
|---|---|---|
domain |
string |
β |
Response:
{ "domain": "alice.wisp.place", "deleted": true }Errors: AuthenticationRequired, InvalidDomain, NotFound
place.wisp.v2.site.getList β query π
Section titled βplace.wisp.v2.site.getList β query πβ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
place.wisp.v2.site.getDomains β query
Section titled βplace.wisp.v2.site.getDomains β queryβReturns all domains mapped to a specific site. Public β no auth required.
Params:
| Field | Type | Required |
|---|---|---|
did |
string |
β |
rkey |
string |
β |
Response:
{ "domains": [ { "domain": "alice.wisp.place", "kind": "wisp", "status": "verified", "verified": true } ]}place.wisp.v2.site.delete β procedure π
Section titled βplace.wisp.v2.site.delete β procedure πβDeletes a site and detaches all mapped domains.
Input:
| Field | Type | Required |
|---|---|---|
siteRkey |
string |
β |
Response:
{ "siteRkey": "my-site", "deleted": true, "unmappedDomains": [ { "domain": "alice.wisp.place", "kind": "wisp", "status": "verified" } ]}Errors: AuthenticationRequired, InvalidRequest, NotFound
Signing Secrets
Section titled βSigning SecretsβServer-managed HMAC signing secrets for webhooks. The token is returned once at creation time and never stored in plaintext β it cannot be retrieved again, only rotated.
All four endpoints require authentication (AuthenticationRequired on failure).
place.wisp.v2.secret.create β procedure π
Section titled βplace.wisp.v2.secret.create β procedure πβCreates a new signing secret scoped to the authenticated DID.
Input:
| Field | Type | Required | Notes |
|---|---|---|---|
name |
string (record-key) |
β | Unique per DID, a-z0-9- |
Response:
| Field | Type | Notes |
|---|---|---|
name |
string |
|
token |
string |
wsk_ prefixed β store this now, never shown again |
createdAt |
string (datetime) |
Errors: AuthenticationRequired, InvalidRequest, AlreadyExists
place.wisp.v2.secret.list β query π
Section titled βplace.wisp.v2.secret.list β query πβLists all secrets for the authenticated DID. Token values are never returned.
Response:
{ "secrets": [ { "name": "my-secret", "createdAt": "2024-01-15T10:30:00.000Z", "lastRotatedAt": "2024-02-01T09:00:00.000Z" } ]}Errors: AuthenticationRequired
place.wisp.v2.secret.rotate β procedure π
Section titled βplace.wisp.v2.secret.rotate β procedure πβGenerates a new token for an existing secret. The old token is invalidated immediately.
Input:
| Field | Type | Required |
|---|---|---|
name |
string |
β |
Response:
| Field | Type | Notes |
|---|---|---|
name |
string |
|
token |
string |
New token β store this now, never shown again |
rotatedAt |
string (datetime) |
Errors: AuthenticationRequired, NotFound
place.wisp.v2.secret.delete β procedure π
Section titled βplace.wisp.v2.secret.delete β procedure πβDeletes a signing secret. Any webhooks referencing this secretId will stop being signed.
Input:
| Field | Type | Required |
|---|---|---|
name |
string |
β |
Response: {}
Errors: AuthenticationRequired, NotFound