ryOS backend APIs use Node-style route handlers in api/, served by the standalone Bun API server.
Most actively refactored JSON routes use the shared apiHandler utility (api/_utils/api-handler.ts) for CORS, method checks, auth resolution, and consistent error handling. Some specialized routes (for example multipart upload handlers) still use explicit/manual handling.
apiHandler: shared wrapper for CORS preflight, origin checks, method allowlists, optional JSON parsing, unified logger wiring, and default JSON error handling.
request-auth: shared auth resolver for token endpoints, expecting:
Authorization: Bearer {token}
X-Username: {username}
Partial auth headers return 400.
Invalid token/username pairs return 401.
Optional-auth endpoints can be anonymous while still validating provided auth headers.
Infrastructure Adapters
Redis (api/_utils/redis.ts): Centralized Redis client factory supporting Upstash REST (REDIS_KV_REST_API_URL) and standard Redis (REDIS_URL) backends with a unified API.
Storage (api/_utils/storage.ts): Switchable object storage adapter for Sync v2 blobs and media assets.
Quick Reference
AI Endpoints
Endpoint
Purpose
/api/chat
Main AI chat with tool calling
/api/ai/conversations/:channel
Synced Chat and Assistant history
/api/ai/conversations/:channel/reset
Clear synced history and process memories
/api/ai/attachments/:id
Private synced chat images
/api/applet-ai
Applet text + image generation
/api/ie-generate
Time-travel page generation
/api/parse-title
Music metadata extraction
/api/ai/extract-memories
Daily-note and long-term memory extraction
/api/ai/process-daily-notes
Background daily-note processing
/api/ai/cursor-run-status
Cursor Cloud agent run polling
/api/ai/cursor-run-followup
Follow-up prompt for an existing Cursor run
Media Endpoints
Endpoint
Purpose
/api/songs/
Song library CRUD
/api/songs/[id]
Individual song operations
/api/speech
Text-to-speech
/api/audio-transcribe
Speech-to-text
/api/youtube-search
YouTube music search
/api/apple-music-artwork
Apple Music artwork proxy
Communication Endpoints
Endpoint
Purpose
/api/rooms
Room list + create
/api/rooms/[id]
Room detail + delete
/api/rooms/[id]/join
Join a room
/api/rooms/[id]/leave
Leave a room
/api/rooms/[id]/users
Get active users in room
/api/rooms/[id]/messages
List/send messages
/api/rooms/[id]/messages/[msgId]
Delete message (admin)
/api/messages/bulk
Bulk message fetch
/api/presence/switch
Presence switching
/api/presence/heartbeat
Global online presence heartbeat
/api/rooms/[id]/typing
Broadcast typing indicator
/api/users
User search
/api/ai/ryo-reply
AI reply in rooms
/api/listen/sessions
List/create listen-together sessions
/api/listen/sessions/[id]
Get session state
/api/listen/sessions/[id]/join
Join listen session
/api/listen/sessions/[id]/leave
Leave listen session
/api/listen/sessions/[id]/sync
Sync playback state (DJ only)
/api/listen/sessions/[id]/assign-dj
Assign the session DJ
/api/listen/sessions/[id]/transfer-host
Transfer session host
/api/listen/sessions/[id]/remote-command
Submit remote playback command
/api/listen/sessions/[id]/reaction
Send emoji reaction
/api/irc/servers
List/create IRC server configs
/api/irc/servers/[id]
DELETE — remove IRC server config (admin only)
/api/irc/servers/[id]/channels
Browse IRC channels
/api/pusher/auth
Authorize private/presence Pusher channels
/api/realtime/ticket
Mint local WebSocket realtime tickets
/api/telegram/link/create
Create Telegram account link
/api/telegram/link/status
Check Telegram link status
/api/telegram/link/disconnect
Disconnect Telegram account
Utility Endpoints
Endpoint
Purpose
/api/link-preview
URL metadata extraction
/api/iframe-check
Embeddability checking
/api/share-applet
Applet sharing
/api/stocks
Real-time stock quotes
/api/currency-rate
Currency conversion rates
/api/mapkit-token
MapKit JS token
/api/musickit-token
MusicKit JS token
/api/tv/create-channel
AI-assisted TV channel creation
/api/sync/auto-sync-preference
Read/update the cross-device Auto Sync toggle
/api/sync/v2/ops
Apply batched journal ops
/api/sync/v2/changes
Read journal ops after a cursor
/api/sync/v2/snapshot
Read full key-value sync snapshot
/api/sync/v2/blobs
Prepare/dedupe content-addressed blob uploads
/api/cron/sync-maintenance
Garbage-collect unreferenced sync blobs and heal user records
/api/analytics/events
Record lightweight client analytics events
/api/admin
Admin operations
/api/airdrop/heartbeat
AirDrop presence heartbeat
/api/airdrop/discover
Discover nearby AirDrop users
/api/airdrop/send
Send file via AirDrop
/api/airdrop/respond
Accept/decline AirDrop transfer
Endpoint Categories Overview
graph TD
API["/api/*"]
API --> AI[AI Services]
API --> Media[Media Services]
API --> Comm[Communication]
API --> Util[Utilities]
AI --> chat["/chat"]
AI --> applet["/applet-ai"]
AI --> ie["/ie-generate"]
AI --> parse["/parse-title"]
Media --> song["/song/*"]
Media --> speech["/speech"]
Media --> transcribe["/audio-transcribe"]
Media --> yt["/youtube-search"]
Comm --> rooms["/rooms"]
Comm --> messages["/messages/bulk"]
Comm --> presence["/presence/switch"]
Comm --> users["/users"]
Comm --> ryo["/ai/ryo-reply"]
Comm --> listen["/listen/sessions"]
Comm --> telegram["/telegram/link"]
Util --> preview["/link-preview"]
Util --> iframe["/iframe-check"]
Util --> share["/share-applet"]
Util --> stocks["/stocks"]
Util --> sync["/sync/v2/* + backup"]
Util --> admin["/admin"]
Authentication
Browser sessions use an httpOnly ryos_auth cookie set by register, login, token/verify, token/refresh, and session. Programmatic clients may still use Bearer + X-Username headers:
Token-based sessions use a 1-year TTL, refreshed on each validated request. Auth-required endpoints use the shared request-auth validation boundary for consistent 400/401 semantics.