Arosen Developer API arosen.us ↗

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.

For the standard Revolt (chat/messaging) API — channels, messages, servers, members, etc. — see the Revolt developer docs. Everything there works at the Arosen base URL below.

Overview

BASE URL https://arosen.us/api

All standard Revolt endpoints live under /api. Arosen-specific endpoints are at:

Path prefixService
/api/auth/*ParelBridge — Revolt auth proxied + mirrored to ParelVR
/api/pvr-sessionRetrieve the caller's linked ParelVR session token
/playit-regionBest voice relay region for the connecting client
/playit-ping-allLatency to all regional voice relays
/playit-statusVoice 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

POST /api/auth/account/create

Creates a new Arosen account. A ParelVR account is automatically created with the same credentials in the background.

Request body

FieldTypeDescription
emailrequiredstringAccount email address
passwordrequiredstringMinimum 8 characters
inviteoptionalstringInvite code (if required)
captchaoptionalstringhCaptcha 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

POST /api/auth/session/login

Authenticates an existing account and returns a session token. Also silently logs into ParelVR and stores the linked session server-side.

Request body

FieldTypeDescription
emailrequiredstringAccount email
passwordrequiredstringAccount password
friendly_nameoptionalstringDevice name shown in session list
mfa_responseoptionalobjectMFA 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

DELETE /api/auth/session/all

Invalidates all active sessions for the account. Also logs out of the linked ParelVR session.

Headers

HeaderDescription
x-session-tokenrequiredCurrent 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

GET /api/pvr-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

HeaderDescription
x-session-tokenrequiredArosen 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"
}
The ParelVR session ticket expires. If you get a 401 from the ParelVR API, call POST /api/auth/session/login again to refresh it.

Best Voice Region

GET /playit-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

GET /playit-ping-all

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

RegionTunnel hostIP:Port
North Americaunease-raleigh.with.playit.plus209.25.140.25:1296
Europe (Germany)thu-evaluated.deu.at.playit.plus69.9.185.18:1210
Asia (Japan)bid-aruba.jpn.at.playit.plus69.9.190.16:1026
Australia (Sydney)letter-nigeria.aus.at.playit.plus69.9.191.17:1073
South America (Chile)open-anytime.chl.at.playit.plus198.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

GET /playit-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
}

Every Arosen account is automatically linked to a ParelVR account using the same email and password. This means:

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.

Base URL: https://api.parelvr.parelllc.com/api/parelvr
Auth: Authorization: Bearer <sessionTicket> or X-PlayFab-Id: <pvrUserId>