Files
DorkNet/docs/recroom-2020-client-api-sweep.md
T
Alexa 4edf25b2d5 Import december-2020-12-18 from private repo (scrubbed 2026-05-27)
Targets Rec Room 2020.12.18 client.

Re-import after adding:
- DorkNet.ClientMod/dorknet-clientmod.json.template — config schema
  the launcher's manifest-driven patcher renders into UserData/.
- tools/build-patcher-zip.ps1 — produces the dorknet-clientpatch-{key}.zip
  Release asset the launcher fetches.
- .github/workflows/release.yml — auto-publishes both Release assets
  on v1-december-* tag push.

Scrubbed via maintainer-side scrub-for-public.ps1: same drop rules as
the prior import, plus build-patcher-zip.ps1 added to the tools/
allow-list so it survives the scrub.
2026-05-27 01:04:12 +03:00

11 KiB

Rec Room 2020 Client RecNet API Sweep

This is a first-pass audit of the decompiled March and December 2020 client material, focused on RecNet URLs, API route fragments, request wrappers, and response DTO shapes.

Sources

  • December C# declarations: dist/RecRoom-2020.12.18-dump/DiffableCs
  • December native/ISIL body dump: dist/RecRoom-2020.12.18-isil/IsilDump
  • March archive: C:/Users/you/Documents/Recnet-archive/decompiled

The December readable C# dump preserves class names, fields, enum members, and method signatures, but most method bodies are empty. For actual URL strings and call context, the ISIL dump is the useful source. The March archive exposes a large Il2CppDump/stringliteral.json; that is best for literal comparison, but it does not always preserve call-site context.

Generated companion files:

  • docs/recroom-2020-client-endpoint-inventory.csv: raw endpoint/string inventory with build, type, method, file, line, and literal string.
  • docs/recroom-2020-client-dto-inventory.md: public field/property inventory for the December Assembly-CSharp/RecNet DTO namespace.

Central RecNet Stack

The central December network wrapper is the obfuscated global class BPHGKAEDBPE.

Important declarations found in dist/RecRoom-2020.12.18-dump/DiffableCs/Assembly-CSharp/BPHGKAEDBPE.cs:

  • NameServerResponse fields: RecNetStatus, Auth, API, WWW, Notifications, Images, CDN, Commerce, Matchmaking, Storage, Chat, Leaderboard, Accounts, Link, RoomComments, Clubs, Rooms.
  • request queue item IPJHBGCCNGH: stores HTTPMethods, service enum, relative URI, retry flag, request configuration callback, and a promise for HOOILIHKMEG.
  • public wrapper methods cover GET/POST-style calls with JSON strings, typed request objects, URL encoded forms, multipart forms, and arbitrary request configuration callbacks.

The service enum is LDCMJEDOFCO:

  • Auth
  • API
  • Commerce
  • Matchmaking
  • Notifications
  • Images
  • CDN
  • Storage
  • Chat
  • Leaderboard
  • Accounts
  • Link
  • RoomComments
  • Clubs
  • Rooms

The March literal table includes the bootstrap URL https://ns.rec.net/?v=2. The December ISIL confirms the same name-server shape through BPHGKAEDBPE.NameServerResponse.

Confirmed Route Families

These route families were found in the December ISIL dump. Many are assembled from multiple adjacent string literals, for example a base like api/inventions/ plus a format string like {0}v1/details?inventionId={1}.

Account, Login, And Bootstrap

  • https://ns.rec.net/?v=2 in March literals.
  • https://rec.net/password/recover in March literals.
  • .rec.net host suffix in March literals.
  • account/bulk, account/bulk?, and account/bulk/ in December ISIL.
  • RecNet connectivity test string: http://www.google.com/generate_204.

Player State

  • api/players/v2/objectives
  • /api/players/v1/progression/{0}
  • /api/players/v1/progression/bulk
  • /api/playerReputation/v1/{0}
  • /api/playerReputation/v1/bulk
  • api/avatar/v1/lockeditems?

The response/request DTO coverage here is outside the small RecNet folder in many cases, so the raw CSV should be used with rg follow-up on the owning obfuscated class names.

Rooms

  • rooms/{0}
  • rooms/bulk
  • rooms/base
  • rooms/createdby/me
  • rooms/ownedby/me
  • rooms/moderatedby/me
  • rooms/cheeredby/me
  • rooms/favoritedby/me
  • rooms/visitedby/me
  • rooms/createdby/{0}
  • rooms/rro_ids
  • rooms/{0}/subrooms/{1}/datahistory
  • rooms/{0}/roles
  • rooms/{0}/roles/{1}
  • rooms/recommendations
  • rooms/search
  • rooms/hot
  • featuredrooms/current
  • rooms/{0}/clone
  • rooms/{0}/name
  • rooms/{0}/description
  • rooms/{0}/image
  • rooms/{0}/tags
  • api/rooms/v1/roomRolePermissions
  • api/rooms/v4/saveData
  • api/rooms/v2/report
  • api/rooms/v1/verifyRole
  • api/rooms/v1/filters
  • rooms/{0}/subrooms/{1}/data

The DorkNet server already implements many of these surfaces under Controllers/API/Rooms/V2, Controllers/Rooms, Controllers/Storage, and Controllers/Cdn.

Matchmaking

December RecNet/Matchmaking ISIL contains:

  • goto/room/
  • room/{0}/instances

The client expects matchmaking and goto responses to contain room instance identity, room/sub-room ids, Photon room ids, privacy/full/in-progress state, and location-like fields. This matches the DorkNet notes about GoToController, MatchController, GameSessionService, and PrivateInstanceService.

Inventions

The invention API is one of the clearest route clusters.

Base:

  • api/inventions/

Fragments:

  • {0}v1?inventionId={1}
  • {0}v1/update?inventionId={1}&name={2}
  • {0}v1/update?inventionId={1}&description={2}
  • {0}v1/update?inventionId={1}&imgName={2}
  • {0}v1/update?inventionId={1}&permission={2}
  • {0}v1/details?inventionId={1}
  • {0}v1/versions?inventionId={1}
  • {0}v1/delete?inventionId={1}
  • {0}v3/publish?inventionId={1}&permissionLevel={2}
  • {0}v1/unpublish?inventionId={1}
  • {0}v1/download?inventionId={1}
  • {0}v1/version?inventionId={1}&version={2}
  • api/inventions/v4/save in December
  • api/inventions/v3/addversion in December
  • api/inventions/v1/fulllineageowner?
  • /invention/{0} link route

March literals show similar routes, but older save/publish strings include:

  • api/inventions/v3/save
  • api/inventions/v3/addversion
  • {0}v2/publish?inventionId={1}&permissionLevel={2}

That suggests December moved at least the save path from v3 to v4 and the publish path from v2 to v3.

Relevant December DTOs:

  • NewInventionRequestDTO
  • AddVersionInventionRequestDTO
  • NewRoomKeyRequestDTO
  • UpdateRoomKeyRequestDTO
  • InventionBatchRequest
  • CheerRequest
  • UpdatePriceRequest
  • ReportRequest

See docs/recroom-2020-client-dto-inventory.md for the field list.

Room Keys

  • api/roomkeys/v1/create
  • api/roomkeys/v1/update
  • api/roomkeys/v1/mine

Relevant DTOs:

  • NewRoomKeyRequestDTO
  • UpdateRoomKeyRequestDTO

Player Events

  • api/playerevents/v1/deleteResponse
  • api/playerevents/v1/bulkInvite
  • api/playerevents/v1/all
  • api/playerevents/v1/report
  • api/playerevents/v1/searchlive?
  • api/playerevents/v1/search?
  • api/playerevents/v1/tagfilters

Relevant DTOs:

  • GetEventsForClubsRequest
  • BulkInviteRequest
  • DeleteResponseRequest
  • PlayerEventDTOPage

Messages And Notifications

  • api/messages/v3/delete
  • api/messages/v1/IOSSaveDeviceToken
  • api/messages/v1/IOSClearDeviceToken
  • api/messages/v1/IOSResetNotificationPreferencesBadgeCount
  • api/messages/v1/IOSModifyNotificationPreferences

Relevant DTO:

  • DeleteMessagesRequestDTO

The NameServerResponse includes Notifications and Chat service bases, so SignalR and chat routes are likely partly constructed outside the RecNet DTO namespace.

Clubs

  • members/bulk
  • members/bulk?
  • api/clubreporting/v1/report

The NameServerResponse includes Clubs, and the DorkNet server has club/event adjacent models. A second pass should focus on JDJGIBLMFKK and related club/member UI/data classes.

Store, Economy, Rewards

  • api/gamerewards/v1/pending
  • api/gamerewards/v1/select
  • /consume

The purchase error strings include token support email text, and invention purchase flows are wired through the invention/store UI.

Config And Announcements

  • api/config/
  • api/config/v1/freegiftbutton
  • /config/{0}
  • api/announcement/v1/get
  • api/activities/charades/v1/words

User Reporting

  • https://userreporting.cloud.unity3d.com
  • https://userreporting.cloud.unity3d.com/api/userreporting/projects/{0}/ping
  • {0}/api/userreporting
  • api/PlayerReporting/v1/voteToKickReasons

This is partly Unity user reporting, partly RecNet player reporting.

Request And Response Shape Notes

The December RecNet C# namespace gives the best directly-readable request DTOs. Examples:

  • AddVersionInventionRequestDTO: inventionId, costs, creationRoomId, inventionDataFilename, referencedInventions.
  • NewInventionRequestDTO: name/description, costs, room id, data/image names, and referenced inventions.
  • UpdatePriceRequest: price-style request object for paid inventions.
  • GetRankRequestDTO, GetRanksRequestDTO, GetNearbyScoresRequestDTO, and GetLeaderboardRequestDTO: leaderboard/ranking inputs.
  • BulkInviteRequest, DeleteResponseRequest, GetEventsForClubsRequest: player-event request inputs.
  • DeleteMessagesRequestDTO: message deletion body.
  • ReportRequest: generic report payload.

Matchmaking.cs and room model classes contain response model declarations, but the most important server-facing shape is already known from DorkNet behavior: room instances must include room instance id, room id, sub-room id, location, Photon region and room id, capacity/full/private/in-progress flags, and enough room data URL information to make the client download binary room blobs.

March Vs December

Observed March literals include:

  • https://ns.rec.net/?v=2
  • https://rec.net
  • https://rec.net/password/recover
  • .rec.net
  • api/inventions/v3/save
  • api/inventions/v3/addversion
  • {0}v2/publish?inventionId={1}&permissionLevel={2}
  • api/rooms/v4/saveData
  • the same player progression and reputation routes as December.

Observed December ISIL includes:

  • api/inventions/v4/save
  • api/inventions/v3/addversion
  • {0}v3/publish?inventionId={1}&permissionLevel={2}
  • the larger rooms route cluster listed above.

The safest server strategy is to support both March and December variants for invention save/publish, and to keep room save/data endpoints tolerant of both legacy room API and api/rooms/v4/saveData.

Important Caveats

This is not yet a literal function-by-function human annotation of every call site. The reason is practical: the December C# decompile has declarations but empty bodies, while the ISIL dump has bodies but obfuscated names and low-level instructions. The generated CSV gives the call-site line numbers needed for that next pass.

For any route that matters to gameplay, verify all three things before changing DorkNet behavior:

  • the service base selected by LDCMJEDOFCO;
  • the route string assembled around the literal fragments;
  • the DTO or response class used by the promise continuation.

Best next search commands:

rg -n "api/inventions|rooms/|goto/room|playerevents|roomkeys|messages" dist/RecRoom-2020.12.18-isil/IsilDump/Assembly-CSharp
rg -n "class .*Request|class .*Response|public .*;" dist/RecRoom-2020.12.18-dump/DiffableCs/Assembly-CSharp/RecNet
rg -n "https://ns.rec.net|api/inventions|api/rooms|playerevents|roomkeys" C:/Users/you/Documents/Recnet-archive/decompiled/Il2CppDump/stringliteral.json