EOS Integration KitAlpha
v5.0.1

Title Storage

Access shared game data and configuration files stored on EOS servers

Title Storage provides read-only access to files uploaded through the EOS Developer Portal. Use it for game configurations, patch data, or any shared content that all players should access.

Title Storage files are read-only from the game. Upload and manage files through the EOS Developer Portal.

Files are encrypted. You must configure the encryption key in EIK Settings to match the key used when uploading.

Portal Setup

  1. Go to the EOS Developer Portal
  2. Navigate to Game ServicesTitle Storage
  3. Click + New Title Data
  4. Generate an Encryption Key (64 hex characters) using a generator like numbergenerator.org
  5. Upload your file and optionally add tags for filtering

Copy the encryption key to your EIK Settings in Unreal Engine. Without it, files cannot be decrypted.

Enumerate Files

List all available title storage files.

Enumerate Title Files node
Copy and paste into Unreal Engine Blueprint editor
  • Tag (optional): Filter files by tag (empty = all files)

Returns an array of file metadata including filename and size.

#include "EIKCore/Public/Interfaces/IEIKTitleFile.h"

void UMyClass::ListTitleFiles()
{
    TSharedPtr<IEIKTitleFile> TitleFile = GetTitleFileInterface();
    if (!TitleFile.IsValid()) return;

    FEIKEnumerateTitleFilesParams Params;
    // Params.Tags.Add(TEXT("config")); // Optional tag filter

    TitleFile->EnumerateFiles(0, Params,
        FEIKAsyncCallback<FEIKEnumerateTitleFilesResult>::CreateLambda(
            [](const TEIKAsyncResult<FEIKEnumerateTitleFilesResult>& Result)
            {
                if (Result.IsSuccessful())
                {
                    for (const FEIKTitleFileMetadata& File : Result.GetValue().Files)
                    {
                        UE_LOG(LogTemp, Log, TEXT("%s (%lld bytes)"),
                            *File.Filename, File.FileSizeBytes);
                    }
                }
            }));
}
#include "Online/OnlineServices.h"
#include "Online/TitleFile.h"

using namespace UE::Online;

void UMyClass::ListTitleFiles()
{
    IOnlineServicesPtr Services = GetServices(EOnlineServices::Epic);
    ITitleFilePtr TitleFile = Services->GetTitleFileInterface();

    FTitleFileEnumerateFiles::Params Params;
    Params.LocalAccountId = GetLocalAccountId();

    TitleFile->EnumerateFiles(MoveTemp(Params))
        .OnComplete([](const TOnlineResult<FTitleFileEnumerateFiles>& Result)
        {
            if (Result.IsOk())
            {
                UE_LOG(LogTemp, Log, TEXT("Title files enumerated"));
            }
        });
}
#include "OnlineSubsystem.h"
#include "Interfaces/OnlineTitleFileInterface.h"

void UMyClass::ListTitleFiles()
{
    IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(FName(TEXT("EIK")));
    IOnlineTitleFilePtr TitleFile = OnlineSub->GetTitleFileInterface();

    FPagedQuery Page;
    TitleFile->EnumerateFiles(Page);

    TitleFile->AddOnEnumerateFilesCompleteDelegate_Handle(
        FOnEnumerateFilesCompleteDelegate::CreateLambda(
            [TitleFile](bool bWasSuccessful, const FString& Error)
            {
                if (bWasSuccessful)
                {
                    TArray<FCloudFileHeader> Files;
                    TitleFile->GetFileList(Files);

                    for (const FCloudFileHeader& File : Files)
                    {
                        UE_LOG(LogTemp, Log, TEXT("%s (%d bytes)"),
                            *File.FileName, File.FileSize);
                    }
                }
            }));
}

Read File

Download and read a title storage file.

Read Title File node
Copy and paste into Unreal Engine Blueprint editor
  • Filename: Name of the file to read
  • File Data (output): Raw bytes of the file content
void UMyClass::LoadTitleFile(const FString& Filename)
{
    TSharedPtr<IEIKTitleFile> TitleFile = GetTitleFileInterface();

    FEIKReadTitleFileParams Params;
    Params.Filename = Filename;

    TitleFile->ReadFile(0, Params,
        FEIKAsyncCallback<FEIKReadTitleFileResult>::CreateLambda(
            [](const TEIKAsyncResult<FEIKReadTitleFileResult>& Result)
            {
                if (Result.IsSuccessful())
                {
                    const TArray<uint8>& Data = Result.GetValue().FileContents.Data;
                    FString Content = FString(UTF8_TO_TCHAR(
                        reinterpret_cast<const char*>(Data.GetData())));
                    UE_LOG(LogTemp, Log, TEXT("Content: %s"), *Content);
                }
            }));
}
void UMyClass::LoadTitleFile(const FString& Filename)
{
    ITitleFilePtr TitleFile = GetTitleFileInterface();

    FTitleFileReadFile::Params Params;
    Params.LocalAccountId = GetLocalAccountId();
    Params.Filename = Filename;

    TitleFile->ReadFile(MoveTemp(Params))
        .OnComplete([](const TOnlineResult<FTitleFileReadFile>& Result)
        {
            if (Result.IsOk())
            {
                const TArray<uint8>& Data = *Result.GetOkValue().FileContents;
                // Process file data
            }
        });
}
void UMyClass::LoadTitleFile(const FString& Filename)
{
    IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(FName(TEXT("EIK")));
    IOnlineTitleFilePtr TitleFile = OnlineSub->GetTitleFileInterface();

    TitleFile->ReadFile(Filename);

    TitleFile->AddOnReadFileCompleteDelegate_Handle(
        FOnReadFileCompleteDelegate::CreateLambda(
            [TitleFile](bool bWasSuccessful, const FString& FileName)
            {
                if (bWasSuccessful)
                {
                    TArray<uint8> FileData;
                    TitleFile->GetFileContents(FileName, FileData);
                    // Process file data
                }
            }));
}

Common Use Cases

Use CaseExample
Game ConfigBalance values, difficulty settings
Patch NotesVersion info displayed in-game
Event DataLimited-time event configurations
Asset ListsURLs for downloadable content
LocalizationText overrides without app update

Helper Functions

The EIK Title File Library provides utilities:

FunctionDescription
TitleFileBytesToStringConvert file bytes to string
TitleFileBytesToJsonStringConvert file bytes to JSON string
ParseTitleFileAsConfigParse as key-value config (TMap)
ParseTitleFileAsLinesParse as line array

On this page