Skip to content

Main App API

Internal REST API for the main app (Bun + Elysia). Authenticated routes require a signed did cookie. Admin routes require a signed admin_session cookie and return 401 { error: 'Unauthorized' } otherwise.

For the AT Protocol XRPC endpoints, see XRPC API.


Redirects to the AT Protocol OAuth authorize URL.

  • 302 → OAuth URL
  • 302/?error=missing_handle if no handle provided
  • 302/?error=auth_failed on failure
{ "url": "https://..." }

On failure: { "error": "Authentication failed", "details": "..." }

  • 302/onboarding (new user)
  • 302/editor (returning user)
  • 302/?error=auth_failed on failure
{ "success": true }
{ "authenticated": true, "did": "did:plc:..." }
{ "authenticated": false }

{
"did": "did:plc:...",
"hasSites": true,
"hasDomain": false,
"domain": null,
"sitesCount": 3
}
{ "did": "did:plc:...", "handle": "user.bsky.social" }
{ "sites": [ /* site rows */ ] }
{
"wispDomains": [{ "domain": "name.wisp.place", "rkey": "site-rkey" }],
"customDomains": [ /* custom domain rows */ ]
}
{ "success": true, "synced": 2, "errors": [] }
{ "rkey": "site-rkey", "domains": [ /* domain rows */ ] }

{ "available": true, "domain": "name.wisp.place" }
{ "available": false, "reason": "invalid" }
{ "registered": true, "type": "wisp", "domain": "name.wisp.place", "did": "did:plc:...", "rkey": "site-rkey" }
{ "registered": true, "type": "custom", "domain": "example.com", "did": "did:plc:...", "rkey": "site-rkey", "verified": true }
{ "registered": false }
{ "success": true, "domain": "name.wisp.place" }
{ "success": true, "domain": "name.wisp.place" }
{ "success": true, "id": "abcdef1234567890", "domain": "example.com", "verified": false }
{ "success": true, "verified": true, "error": null, "found": true }
{ "success": true }
{ "success": true }
{ "success": true }
{ "success": true }

{ "success": true, "message": "Site deleted successfully" }

On failure: { "success": false, "error": "..." }

Returns the place.wisp.settings record or defaults:

{ "indexFiles": ["index.html"], "cleanUrls": false, "directoryListing": false }
{ "success": true, "uri": "at://...", "cid": "bafy..." }

On failure: { "success": false, "error": "Only one of spaMode, directoryListing, or custom404 can be enabled" }


{ "success": true, "jobId": "...", "message": "Upload started. Connect to /wisp/upload-progress/..." }

Empty upload: { "success": true, "uri": "at://...", "cid": "bafy...", "fileCount": 0, "siteName": "my-site" }

Server-sent events stream:

  • progress{ status, progress, result, error }
  • doneresult
  • error{ error }

{ "success": true }

On failure (401): { "error": "Invalid credentials" }

{ "success": true }
{ "authenticated": true, "username": "admin" }
{ "authenticated": false }
{ "stats": {}, "recentSites": [], "recentDomains": [] }
{ "sites": [ /* sites */ ], "customDomains": [ /* domains */ ] }
{
"uptime": 12345,
"memory": { "heapUsed": 123, "heapTotal": 456, "rss": 789 },
"timestamp": "2026-01-22T00:00:00.000Z"
}