Epic Online Services for Unreal Engine — fully Blueprint

Auth · Connect · Sessions · Lobby · Voice (RTC) · Friends · Achievements · Stats · Leaderboards · Ecom · Storage · Anti-Cheat · P2P — and more, with no C++ required.

262Blueprint nodes
26categories
5platforms
1.19EOS SDK
UE 4.27–5.7.0 Win64 Mac Linux iOS Android
Download packaged build (Windows & Linux) — itch.io
EOSpro Auth Blueprint nodes EOSpro Sessions Blueprint nodes EOSpro Lobby Blueprint nodes EOSpro RTC voice Blueprint nodes EOSpro Friends Blueprint nodes EOSpro Ecom Blueprint nodes EOSpro Achievements Blueprint nodes EOSpro Leaderboards Blueprint nodes EOSpro Stats Blueprint nodes EOSpro Player Data Storage Blueprint nodes EOSpro Connect Blueprint nodes
Open the documentation
EOSpro v1.0.0 UE 4.27–5.7.0 SDK 1.19.0.7 262 BP nodes
Overview Gallery Setup Voice Purchases FAQ

Overview

EOSpro is a UE 4.27 – 5.7.0 plugin that wraps Epic Online Services SDK 1.19.0.7 with a comprehensive Blueprint surface — 262 BP nodes across 26 categories, including voice chat (RTC), an editor-side voice debugger, an Anti-Cheat scaffold, and an OSS bridge that routes purchases through whichever store (Epic Games / Steam / Google Play / App Store) is active at runtime.

It's a direct EOS SDK wrapper, not a custom OnlineSubsystem implementation — meaning you call EOS interfaces directly from Blueprint instead of going through UE's OSS layer. (The OSS bridge for purchases is the one exception, since it needs to route across multiple stores.)

2 modules
EOSpro (Runtime) + EOSproEditor (Editor) — editor-only widget for voice debugging won't ship with packaged builds.
5 platforms
Win64, Mac, Linux, iOS, Android. Console (PS / Xbox / Switch) require NDA SDK drops separately.
21 sub-subsystems
UEOSAuthSubsystem, UEOSSessionsSubsystem, etc — typed Blueprint accessors per category.

Blueprint nodes — explained

What each category does, with the screenshot of its nodes. Click any image to open it full-size.

Auth Blueprint nodes

Auth 10 nodes

Epic Games account authentication. Use EOSLoginWithPlatform for the simplified path across Epic Games / Steam / Google / Apple / Device / DevAuth, then read GetLocalEpicAccountId. Also covers logout, token refresh and ID-token verification.

Connect Blueprint nodes

Connect 10 nodes

Maps an authenticated account to a Product User ID (PUID) — the identity every other interface uses. Create connect users, link external accounts, and create device IDs for anonymous login.

Sessions Blueprint nodes

Sessions 15 nodes

Server/peer game sessions — EOSCreateSession, find by attributes, join, update, and send invites. The matchmaking surface for session-based games, plus register/unregister players.

Lobby Blueprint nodes

Lobby 18 nodes

Player-owned lobbies with attributes, member management and built-in RTC voice rooms. Create / find / join / update / invite, plus kick & promote members and read the lobby roster.

P2P Blueprint nodes

P2P 2 nodes

Direct peer-to-peer packets over EOS relays — SendPacket / ReceivePacket. NAT-punched transport for custom networking without a dedicated server.

Friends Blueprint nodes

Friends 10 nodes

Query the Epic friends list, send / accept / reject friend invites, and read each friend's status (online, away, in-game).

Presence Blueprint nodes

Presence 3 nodes

Set and query rich presence — status text and joinable state shown in the social overlay and to friends.

UserInfo Blueprint nodes

UserInfo 3 nodes

Resolve display names and external-account info for any account ID, with a cached GetCachedDisplayName for UI lookups.

CustomInvites Blueprint nodes

Custom Invites 13 nodes

App-defined invites with your own payload — send / accept / reject, plus an event receiver with a BlueprintAssignable delegate for incoming invites.

UI overlay Blueprint nodes

UI Overlay 3 nodes

Show / hide the EOS social overlay (friends, invites, account) and query whether it's currently visible.

Achievements Blueprint nodes

Achievements 5 nodes

Unlock achievements, query achievement definitions, and read a player's unlocked progress. Driven by Stats thresholds where configured.

Stats Blueprint nodes

Stats 4 nodes

Ingest stat values and query them back — the data source behind leaderboards and stat-threshold achievements.

Leaderboards Blueprint nodes

Leaderboards 6 nodes

Query leaderboard definitions, global ranks, and specific users' scores.

Ecom Blueprint nodes

Ecom 13 nodes

Epic Games Store commerce — query offers (all / by-id), run EOSCheckout, verify ownership, and read entitlements & receipts.

Platform purchase bridge Blueprint nodes

Platform — OSS purchase bridge 6 nodes

Cross-platform purchases — EOSPlatformPurchase routes through the engine's IOnlinePurchase for whichever store (Epic / Steam / Google Play / App Store) is active at runtime. No Blueprint branching needed.

Progression Blueprint nodes

Progression Snapshot 4 nodes

Submit key/value progression snapshots of a player's progress to Epic's Progression service.

Player Data Storage Blueprint nodes

Player Data Storage 10 nodes

Per-player encrypted cloud saves — read / write / list / delete / duplicate player files, plus metadata copy.

Title Storage Blueprint nodes

Title Storage 4 nodes

Read-only, title-wide cloud files (config, content manifests) shared by every player.

RTC voice Blueprint nodes

RTC voice 19 nodes

Real-time voice chat — join / leave rooms, manage input/output devices, mute, and a global push-to-talk. Lobbies can host their own RTC room automatically.

Anti-Cheat Blueprint nodes

Anti-Cheat 9 nodes

Easy Anti-Cheat scaffolding — begin / end protected sessions, register peers, and bridge AC messages on both client and server.

Reports Blueprint nodes

Reports 2 nodes

Submit player-behaviour reports (cheating, harassment, etc.) to Epic's moderation backend.

Sanctions Blueprint nodes

Sanctions 2 nodes

Query the active sanctions (bans, restrictions) applied to a player.

Metrics Blueprint nodes

Metrics 2 nodes

Begin / end player-session metrics that feed the analytics dashboards in the Epic Developer Portal.

Mods Blueprint nodes

Mods 9 nodes

mod.io-backed mods — enumerate, install, uninstall and update mods for the title.

Integrated Platform Blueprint nodes

Integrated Platform 4 nodes

Report Steam / EGS login status to EOS so the overlay and friends integrate with the native platform.

Core subsystem Blueprint nodes

Core & Subsystems 46 nodes

The central UEOSproSubsystem owns the EOS platform handle and exposes every interface accessor, plus 21 typed per-category sub-subsystems (UEOSAuthSubsystem, UEOSSessionsSubsystem, …) for clean Blueprint access.

Installation & settings

1. Enable the plugin

EOSpro is already listed in PluginCore.uproject. In a new project add:

"Plugins": [
  { "Name": "EOSpro", "Enabled": true }
]

2. Fill credentials in Project Settings

Project Settings → Plugins → EOSpro → Credentials:

FieldSource
ProductIdEpic Developer Portal → Product Settings
SandboxIdDev / Stage / Live sandbox for this build
DeploymentIdDeployment for the selected sandbox
ClientId / ClientSecretCredential pair for this build
EncryptionKey64-hex string used for PlayerDataStorage encryption

3. (Optional) Voice Chat section

Persistent device selection saves to DefaultEngine.ini and ships with packaged builds:

  • DefaultMicrophoneDeviceId — empty = system default
  • DefaultSpeakerDeviceId — empty = system default
  • bDefaultMicMuted — start muted on JoinRoom
  • bPlatformAEC — OS-level acoustic echo cancellation
  • RTCBackgroundMode — leave rooms vs keep alive when backgrounded

4. (Optional) Anti-Cheat section

  1. Download AC certificates from Epic Developer Portal → Anti-Cheat → Download integrity keys.
  2. Place base_public.cer and base_private.key in Build/NoRedist/ (create the folder if missing).
  3. Flip bAntiCheatEnabled = true in settings.
  4. Make sure network authentication is enabled in Project Settings (default in new projects).

5. Build

"C:/Program Files/Epic Games/UE_5.7/Engine/Build/BatchFiles/Build.bat" \
  PluginCoreEditor Win64 Development \
  -Project="C:/AlphaCore/ASUS/MY-Cmd/UE4-Plugin/PluginCore/PluginCore.uproject" \
  -WaitMutex -FromMsBuild
Note Live Coding can be unreliable for plugin DLLs. After any .cpp change, the safest path is: fully close the editor, delete Plugins/EOSpro/{Binaries,Intermediate}, rebuild, reopen.

Unified login

The simplest path. One BP node with a platform dropdown:

EOSLoginWithPlatform(Platform, Token, Id?, DisplayName?)

Async Category: EOS|Auth Search: "Login With Platform"

The Platform dropdown shows:

PlatformWhat goes in TokenNotes
Epic Games (Account Portal)Opens browser. Auth→Connect chained.
Steam (App Ticket)Steamworks app ticketConnect-only.
Google PlayGoogle id tokenConnect-only.
AppleApple id tokenConnect-only.
Discord / Nintendo / PSN / Xbox Live / OpenID / itch.io / Amazonplatform-specific access tokenConnect-only.
Device ID (Anonymous)Call EOSCreateDeviceId once first.
DevAuth Toolcredential name from DevAuthToolSet Id = "127.0.0.1:6547".

On success, UEOSproSubsystem::GetLocalEpicAccountId() and GetLocalProductUserId() are populated. The OnInitialized, OnAuthLoginChanged, and OnConnectLoginChanged multicast delegates fire.

PIE / dev testing

  1. Install Epic Games Launcher and sign in once.
  2. Unzip Source/ThirdParty/EOSSDK/DevAuth/EOS_DevAuthTool-win32-x64-1.2.1.zip anywhere.
  3. Run the tool, click Login, give it a credential name like DevUser1. Default port is 6547.
  4. In PIE call EOSLoginWithPlatform(Developer, Token="DevUser1", Id="127.0.0.1:6547").
  5. Press Shift+F1 in PIE — the EOS Social Overlay appears (only after successful Auth).
  6. For RTC: open Window → EOS Voice Chat Debugger.

Auth

Epic Games account authentication. Use EOSLoginWithPlatform for the simplified path.

EOSAuthLogin EOSLoginWithPlatform EOSDeletePersistentAuth EOSVerifyUserAuth EOSVerifyIdToken EOSRefreshAuth EOSQueryAuthIdToken Logout IsLoggedIn GetLocalEpicAccountId CopyUserAuthAccessToken CopyEpicIdToken

Connect (Product User)

Game-side identity that bridges Epic, Steam, Google, etc. into a single Product User ID.

EOSConnectLogin EOSCreateConnectUser EOSLinkAccount EOSCreateDeviceId EOSDeleteDeviceId EOSQueryProductUserIdMappings GetLocalProductUserId IsConnected ListConnectedExternalAccountIds GetEpicAccountForProductUser GetProductUserExternalAccountCount
Known issue Continuance token flow is broken from pure BP. EOSCreateConnectUser / EOSLinkAccount need a live EOS_ContinuanceToken* which has no _FromString. C++-only *FromHandle(void*) siblings exist as workaround.

Sessions

Player-hosted matchmaking sessions (advertised via EOS service).

EOSCreateSession EOSFindSessions EOSJoinSession EOSUpdateSession EOSSendSessionInvite EOSQuerySessionInvites EOSRejectSessionInvite EOSJoinSessionByInvite DestroySession / StartSession / EndSession RegisterPlayer / UnregisterPlayer

Lobby

Same shape as Sessions but designed for pre-game / persistent groups. Lobbies can auto-create an associated RTC voice room.

EOSCreateLobby EOSFindLobbies EOSJoinLobby EOSUpdateLobby EOSSendLobbyInvite EOSQueryLobbyInvites EOSRejectLobbyInvite EOSJoinLobbyByInvite LeaveLobby / DestroyLobby Kick / Promote member GetLobbyMembers SetLobbyAttribute GetLobbyRTCRoomName IsLobbyRTCRoomConnected

P2P

EOS-relayed peer-to-peer packets.

SendPacket(target, reliability, channel, bytes) ReceivePacket

Friends

EOSQueryFriends EOSSendFriendInvite EOSAcceptFriendInvite EOSRejectFriendInvite GetFriendsList GetFriendStatus

Presence

EOSQueryPresence SetPresence(Status, RichText)

UserInfo

EOSQueryUserInfo GetCachedDisplayName

Custom Invites

Modern app-defined invite path independent of sessions / lobby.

EOSSendCustomInvite EOSAcceptCustomInvite EOSRejectCustomInvite RegisterForCustomInviteEvents GetPendingCustomInvites UEOSCustomInvitesEventReceiver::OnCustomInviteReceived

The receiver UObject singleton exposes a BlueprintAssignable multicast delegate; bind it from any BP that needs invite-received events. Polling alternative via GetPendingCustomInvites.

EOS Overlay UI

ShowSocialOverlay HideOverlay IsOverlayVisible

Programmatic control over the EOS Social Overlay (the friends list / invite UI). The overlay also appears via Shift+F1 by default once authenticated.

Achievements

EOSUnlockAchievement EOSQueryAchievementDefs EOSQueryPlayerAchievements

Stats

EOSIngestStat(Name, Amount) EOSQueryStats(Names)

Leaderboards

EOSQueryLeaderboardRanks EOSQueryLeaderboardDefinitions EOSQueryLeaderboardUserScores

Ecom (Epic Games Store)

Direct EOS Ecom integration — Epic Games Store only. For multi-platform purchases see the OSS bridge.

EOSQueryOffers EOSQueryOffersById EOSCheckout EOSQueryOwnership EOSRedeemEntitlements EOSQueryEntitlements EOSGetReceipts

The OSS-v1 FinalizeReceiptValidationInfo call maps to EOSRedeemEntitlements — pass entitlement IDs from EOSGetReceipts.

Note FEOSEcomCheckoutEntry::Quantity is currently a no-op (SDK 1.19.0.7 EOS_Ecom_CheckoutEntry has no Quantity field). Submit duplicate entries for Quantity > 1.

OSS purchase bridge — cross-platform billing

EOSpro ships with a small bridge that routes purchases through the engine's IOnlinePurchase for whichever Online Subsystem is loaded. You get Epic Games / Steam / Google Play / App Store from one BP graph without branching.

EOSPlatformPurchase(OfferId, Namespace, Quantity) EOSPlatformQueryReceipts(bRestoreReceipts) EOSPlatformFinalizePurchase(TransactionId) EOSGetActivePlatformOSS EOSPlatformPurchaseAvailable

Enable per-platform engine OSS plugins

PlatformEnable in .uprojectPlus
Win64 EGSOnlineSubsystemEOS (auto via EOSpro)
SteamOnlineSubsystemSteamSteamDevAppId in DefaultEngine.ini
Google PlayOnlineSubsystemGooglePlayPlay Console product IDs
iOS App StoreOnlineSubsystemIOSApp Store Connect IAP setup
Important — Google Play After a successful purchase you must call EOSPlatformFinalizePurchase(TransactionId) within 3 days or the purchase is automatically refunded.

Progression Snapshot

Server-side snapshot of arbitrary progression key/value pairs. Used for analytics / cross-save bridging.

EOSSubmitProgressionSnapshot(entries) EOSDeleteProgressionSnapshot

Player Data Storage

Per-player cloud-saved files. Encrypted with the EncryptionKey in settings.

EOSReadPlayerFile EOSWritePlayerFile EOSQueryPlayerFileList EOSDeletePlayerFile EOSDuplicatePlayerFile CopyPlayerFileMetadata

Title Storage

Read-only server-published files (game assets, remote configs).

EOSQueryTitleFileList(Tags) EOSReadTitleFile

RTC — Voice chat

Full Epic RTC interface exposure: join voice rooms, mute self/others, switch devices, get the participant list with talking indicators.

EOSJoinRTCRoom EOSLeaveRTCRoom EOSUpdateRTCSending EOSUpdateRTCReceiving EOSUpdateRTCParticipantVolume EOSBlockRTCParticipant GetAudioInputDevices GetAudioOutputDevices SetAudioInputSettings SetAudioOutputSettings GetRoomParticipants GetJoinedRoomNames IsRoomJoined TransmitToAllRooms(bSend) SetRTCSetting(key,value) SetRoomSetting(room,key,value)

Push-to-talk

Wire TransmitToAllRooms(true) to a key-press event and TransmitToAllRooms(false) to release. The same call applies across every joined room.

Audio processing knobs

Set these before JoinRoom for them to take effect:

SetRTCSetting("DisableEchoCancelation",  "false")  // = AEC on
SetRTCSetting("DisableNoiseSuppression", "false")  // = NS on
SetRTCSetting("DisableAutoGainControl",  "false")  // = AGC on
SetRTCSetting("DisableDtx",              "false")  // = DTX on (saves bandwidth)

Joining a lobby's auto-voice room

1. EOSCreateLobby(bEnableRTCRoom = true)
2. const FString Room = GetLobbyRTCRoomName(LobbyId)
3. Use Room with GetRoomParticipants / SendSessionInvite / etc.
JoinToken Joining a standalone RTC room requires a ParticipantToken minted by your backend via the EOS REST API — the client SDK cannot mint it itself. Lobby auto-rooms don't need this (they're joined transparently when you join the lobby).

Voice debugger (editor)

The EOSproEditor module registers a Slate widget that lives in the editor only (not shipped):

Open via:

  • Window → EOS Voice Chat Debugger menu entry
  • Console command EOSpro.ShowVoiceDebugger (works in PIE too)

Shows live state: current room selector, joined-room participant list (with talking indicators, mute/block buttons per row), local mic-mute toggle, input/output device combo boxes. Polls subsystem state every 0.5s via an active timer.

Anti-Cheat scaffold

EAC client-side wiring. Scaffold means the message bridge and session lifecycle are exposed; you still need to plumb the outbound messages through your game's network channel.

IsAntiCheatAvailable BeginClientSession(Mode) EndClientSession ReceiveMessageFromServer(bytes) RegisterPeer / UnregisterPeer ReceiveMessageFromPeer(handle, bytes) PollOutboundServerMessages PollOutboundPeerMessages

Flow (Client-Server mode)

  1. EOSConnectLogin succeeds → local PUID available.
  2. BeginClientSession(ClientServer).
  3. Each tick: drain PollOutboundServerMessages → forward bytes over your normal server transport.
  4. When your server sends AC bytes back to the client → call ReceiveMessageFromServer(bytes).
  5. On disconnect: EndClientSession.

P2P mode also requires RegisterPeer per remote player + symmetric peer-message bridging.

Reports

Player behavior reports (moderation).

EOSSendPlayerReport(target, category, message, context)

Category mapping (BP enum is broader than SDK enum): Harassment / HateSpeech / Profanity → VerbalAbuse, NameViolation → OffensiveProfile, ChildAbuse → Other.

Sanctions

EOSQueryActivePlayerSanctions(target)

Metrics

BeginPlayerSession(displayName, serverIp, gameSessionId) EndPlayerSession

Mods

Desktop game-mod manager (Epic Mod Marketplace).

EOSEnumerateMods(Type) EOSInstallMod(modId, bRemoveAfterExit) EOSUninstallMod(modId) EOSUpdateMod(modId) GetEnumeratedMods(Type)

Integrated Platform

Notify EOS about the player's login state on the integrated platform (Steam, EGS, etc).

EOSSetIntegratedPlatformLoginStatus EOSFinalizeDeferredUserLogout

Per-category subsystems

21 thin UGameInstanceSubsystem proxies — typed Blueprint accessors per domain. Each exposes:

  • Get(WorldContextObject) — static, returns the subsystem
  • IsReady() — pure, true if the underlying EOS interface handle is available

The proxies delegate to UEOSproSubsystem which owns the platform handle. They exist for BP discoverability — "search 'Get EOS Sessions Subsystem'" surfaces the right subsystem cleanly.

UEOSAuthSubsystem, UEOSConnectSubsystem, UEOSFriendsSubsystem,
UEOSPresenceSubsystem, UEOSSessionsSubsystem, UEOSLobbySubsystem,
UEOSUserInfoSubsystem, UEOSAchievementsSubsystem, UEOSStatsSubsystem,
UEOSLeaderboardsSubsystem, UEOSP2PSubsystem, UEOSEcomSubsystem,
UEOSPlayerDataStorageSubsystem, UEOSTitleStorageSubsystem,
UEOSUISubsystem, UEOSMetricsSubsystem, UEOSCustomInvitesSubsystem,
UEOSReportsSubsystem, UEOSSanctionsSubsystem, UEOSRTCSubsystem,
UEOSAntiCheatSubsystem

FAQ

From the Epic Developer Portal → your Product → Product Settings (Product ID), Sandboxes (Sandbox/Deployment IDs), Client Credentials (Client ID / Secret). Paste into Project Settings → Plugins → EOSpro → Credentials.

Most common: missing or invalid credentials. Check the Output Log for LogEOSpro errors. For PIE specifically the easiest auth flow is DevAuthTool — run the tool, log in, pick a credential name, then use EOSLoginWithPlatform(Developer, Token="YourName", Id="127.0.0.1:6547").

Pass bEnableEcho = true to EOSJoinRTCRoom — the EOS server echoes your audio back so you can validate the round trip with a single client.

The matching engine plugin isn't enabled. For Steam: enable OnlineSubsystemSteam in .uproject AND set [OnlineSubsystem] DefaultPlatformService=Steam + SteamDevAppId=... in DefaultEngine.ini. Then EOSGetActivePlatformOSS() should return "STEAM".

Check that (a) base_public.cer is at the path specified in AntiCheatCertPath (default Build/NoRedist/base_public.cer), (b) network authentication is enabled in Project Settings, (c) EOSConnectLogin succeeded before you called BeginClientSession, and (d) you activated an EAC build in the EOS portal.

Known limitation. The BP EOSCreateConnectUser / EOSLinkAccount nodes take a token string, but EOS continuance tokens are opaque pointers with no _FromString API. Workaround: call the C++-only *FromHandle(void*) siblings from a custom function bound to UEOSConnectLoginAsync::OnContinuanceRequired in C++.

EOS SDK 1.19.0.7's EOS_Ecom_CheckoutEntry struct only has OfferId — there's no Quantity field. The BP struct exposes Quantity for forward compatibility, but for now submit duplicate entries to buy multiples.

Live Coding can be unreliable for plugin DLLs. The robust path: (1) Fully close the editor (verify UnrealEditor.exe is gone from Task Manager), (2) delete Plugins/EOSpro/{Binaries,Intermediate}, (3) run Build.bat PluginCoreEditor Win64 Development -Project=..., (4) reopen the project.

Organizational. Each EOS interface gets its own subfolder so Solution Explorer / IDE browsers don't dump 100+ files in a flat list. The Build.cs sets bLegacyPublicIncludePaths = true so unqualified #include "EOSproTypes.h" still resolves no matter which subfolder the including file lives in.

Troubleshooting

Build errors

  • "Cannot open include file: 'EOSproTypes.h'" — your Build.cs is missing bLegacyPublicIncludePaths = true. Dependent modules need this too.
  • Duplicate function definition under unity build — two .cpp files have the same file-scope static helper (typical: AccountIdToString). Rename one with a file-unique prefix.
  • "Target is up to date" but no DLL produced — check that EOSpro is "Enabled": true in your .uproject.

Runtime issues

  • EOS Overlay (Shift+F1) doesn't appear — requires successful Auth login. Check UEOSproSettings.bEnableOverlay is true. Renderer must be D3D11/D3D12 (engine default).
  • RTC initialization fails on Windowsxaudio2_9redist.dll not at the path passed in EOS_Windows_RTCOptions.XAudio29DllPath. The subsystem resolves this via IPluginManager::FindPlugin("EOSpro")->GetBaseDir() + "/Binaries/Win64/xaudio2_9redist.dll". Verify the DLL was staged.
  • SetAudioInputSettings returns failure — requires a valid Connect-logged-in PUID. Make sure EOSConnectLogin completed first; the subsystem applies persisted device settings in SetLocalProductUserId.

SDK version quirks (1.19.0.7)

  • EOS_SAT_STRING doesn't exist as an enum value — use EOS_AT_STRING (uppercase) or the macro alias EOS_SAT_String (CamelCase).
  • EOS_ECustomInviteFinalizeResult enum doesn't exist — use EOS_EResult::EOS_Success for accept, EOS_Canceled for reject.
  • EOS_ACCCP_iOS has a lowercase 'i' (most other platform enum values are uppercase).
  • EOS_Auth_VerifyIdTokenCallbackInfo has no AccountId field — decode the JWT sub claim client-side if you need it.
  • EOS_PlayerDataStorage_GetFileMetadataCount returns EOS_EResult with out-param count; EOS_TitleStorage_GetFileMetadataCount returns uint32_t directly.

Source layout

Source/EOSpro/
├── EOSpro.Build.cs         (bLegacyPublicIncludePaths = true)
├── Public/
│   ├── Core/                Module, Settings, Subsystem, Types
│   ├── Auth/                AuthLibrary + AuthSubsystem + LoginWithPlatform + …
│   ├── Connect/             ConnectLibrary + DeviceId / Mappings / etc.
│   ├── Sessions/            SessionsLibrary + Find/Join/Update/Invite
│   ├── Lobby/               LobbyLibrary + same shape + RTC-room helpers
│   ├── Friends/ Presence/ UserInfo/
│   ├── Achievements/ Stats/ Leaderboards/
│   ├── Ecom/                Offers, Checkout, Ownership, Receipts
│   ├── Storage/ TitleStorage/
│   ├── P2P/ UI/ Metrics/
│   ├── CustomInvites/ Reports/ Sanctions/
│   ├── RTC/                 EOSRTCLibrary.h holds all 7 voice async classes
│   ├── AntiCheat/
│   ├── Mods/ IntegratedPlatform/ Progression/
│   └── Platform/            OSS bridge for cross-platform purchases
└── Private/                 (mirrors Public)

Source/EOSproEditor/
├── EOSproEditor.Build.cs
├── Public/
│   ├── EOSproEditor.h
│   └── SEOSVoiceChatDebugger.h
└── Private/
    ├── EOSproEditor.cpp    Module + Window menu + console command
    └── SEOSVoiceChatDebugger.cpp