Arosen Developer API
Arosen is a self-hosted social platform at arosen.us, built on Revolt and operated by Parel LLC. This reference covers the Arosen-specific APIs layered on top of the standard Revolt API — including the ParelVR account bridge and the regional voice routing service.
Overview
All standard Revolt endpoints live under /api. Arosen-specific endpoints are at:
| Path prefix | Service |
|---|---|
/api/auth/* | ParelBridge — Revolt auth proxied + mirrored to ParelVR |
/api/pvr-session | Retrieve the caller's linked ParelVR session token |
/playit-region | Best voice relay region for the connecting client |
/playit-ping-all | Latency to all regional voice relays |
/playit-status | Voice relay health check |
Authentication
Arosen uses Revolt session tokens. After logging in, pass the token on every request:
x-session-token: <your session token>
Some endpoints also accept Authorization: Bearer <token>.
When you register or log in through Arosen, the bridge automatically creates or links a ParelVR account using the same credentials — no separate signup needed.
Register
Creates a new Arosen account. A ParelVR account is automatically created with the same credentials in the background.
Request body
| Field | Type | Description |
|---|---|---|
emailrequired | string | Account email address |
passwordrequired | string | Minimum 8 characters |
inviteoptional | string | Invite code (if required) |
captchaoptional | string | hCaptcha response token |
Example
curl -X POST https://arosen.us/api/auth/account/create \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"hunter2hunter2"}'
Response
{} // 204 No Content on success — check email for verification link
Log In
Authenticates an existing account and returns a session token. Also silently logs into ParelVR and stores the linked session server-side.
Request body
| Field | Type | Description |
|---|---|---|
emailrequired | string | Account email |
passwordrequired | string | Account password |
friendly_nameoptional | string | Device name shown in session list |
mfa_responseoptional | object | MFA code if 2FA is enabled |
Example
curl -X POST https://arosen.us/api/auth/session/login \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"hunter2hunter2","friendly_name":"My App"}'
Response
{
"_id": "session_id",
"token": "your_session_token",
"user_id": "01ABCDEF...",
"name": "My App"
}
Log Out
Invalidates all active sessions for the account. Also logs out of the linked ParelVR session.
Headers
| Header | Description |
|---|---|
x-session-tokenrequired | Current session token |
Example
curl -X DELETE https://arosen.us/api/auth/session/all \ -H "x-session-token: your_session_token"
Response
{} // 204 No Content
ParelVR Session
Returns the linked ParelVR session ticket for the authenticated Arosen user. Use this to make authenticated calls to the ParelVR API on behalf of the user.
Headers
| Header | Description |
|---|---|
x-session-tokenrequired | Arosen session token |
Example
curl https://arosen.us/api/pvr-session \ -H "x-session-token: your_session_token"
Response
{
"pvrUserId": "pvr_ENXF-KDT-76LQ",
"sessionTicket": "<parelvr session ticket>",
"displayName": "PlayerName"
}
POST /api/auth/session/login again to refresh it.
Best Voice Region
Returns the lowest-latency PlayIt.gg relay region as measured from the Arosen server, along with the tunnel address clients should use for UDP voice (LiveKit RTC). No auth required.
Example
curl https://arosen.us/playit-region
Response
{
"id": "Germany",
"name": "Frankfurt, Germany",
"host": "deu.rt.playit.gg",
"region": "europe",
"latencyMs": 18,
"tunnel": {
"host": "thu-evaluated.deu.at.playit.plus",
"port": 1210,
"ip": "69.9.185.18"
}
}
Connect voice calls to tunnel.ip:tunnel.port (UDP) for the best regional path to LiveKit.
All Voice Regions
Returns latency to every regional relay. Use this if you want the client to pick its own region based on a self-ping rather than the server's view.
Voice tunnels by region
| Region | Tunnel host | IP:Port |
|---|---|---|
| North America | unease-raleigh.with.playit.plus | 209.25.140.25:1296 |
| Europe (Germany) | thu-evaluated.deu.at.playit.plus | 69.9.185.18:1210 |
| Asia (Japan) | bid-aruba.jpn.at.playit.plus | 69.9.190.16:1026 |
| Australia (Sydney) | letter-nigeria.aus.at.playit.plus | 69.9.191.17:1073 |
| South America (Chile) | open-anytime.chl.at.playit.plus | 198.22.205.18:1067 |
All tunnels forward UDP to the LiveKit media server on port 50000. LiveKit signaling (TCP) goes through wss://arosen.us/livekit.
Voice Status
Health check for the voice relay system.
Response
{
"ok": true,
"best": { "id": "Germany", "name": "Frankfurt, Germany", "latencyMs": 18 },
"cached_at": "2026-07-23T20:00:00.000Z",
"cache_age_s": 12
}
Linked ParelVR Accounts
Every Arosen account is automatically linked to a ParelVR account using the same email and password. This means:
- One registration creates accounts on both platforms
- One login authenticates both
- Use
GET /api/pvr-sessionto get a ParelVR session ticket, then call the ParelVR API directly
Making ParelVR API calls
// 1. Get the ParelVR token from Arosen
const { sessionTicket, pvrUserId } = await fetch('https://arosen.us/api/pvr-session', {
headers: { 'x-session-token': arosenToken }
}).then(r => r.json());
// 2. Use it directly with the ParelVR API
const worlds = await fetch('https://api.parelvr.parelllc.com/api/parelvr/worlds', {
headers: { 'Authorization': `Bearer ${sessionTicket}` }
}).then(r => r.json());
ParelVR Full API
The complete ParelVR API (worlds, avatars, instances, etc.) is documented at docs.parelvr.parelllc.com.
https://api.parelvr.parelllc.com/api/parelvrAuth:
Authorization: Bearer <sessionTicket> or X-PlayFab-Id: <pvrUserId>