Epic Games publishes the engine’s source code only to registered users under its own licence, and publishes no file specification. This page is based on the open-source reader UAssetAPI, which follows that code, and is limited to what such public reverse-engineering work establishes. It covers uncompressed packages saved by Unreal Engine 4 and 5; very old packages with package-level compression are not covered.
The summary (FPackageFileSummary) has no fixed size: fields are switched
on by version numbers read earlier in it. All integers are little-endian. Strings are
FStrings. Every offset is in bytes
from the start of the file.
Version fields
| Type | Name | Present when | Meaning |
|---|---|---|---|
| uint32 | Tag | Always | 0x9E2A83C1, bytes C1 83 2A 9E |
| int32 | LegacyFileVersion | Always | A negative number giving the layout of the summary itself; see below |
| int32 | LegacyUE3Version | LegacyFileVersion ≠ −4 | Kept for Unreal Engine 3 tools: 864 in versioned packages, 0 in unversioned ones |
| int32 | FileVersionUE4 | Always | The UE4 object version, such as 522; 0 in an unversioned package |
| int32 | FileVersionUE5 | LegacyFileVersion ≤ −8 | The UE5 object version, from 1000 upwards; 0 when unversioned |
| int32 | FileVersionLicenseeUE | Always | Version number of a licensee’s own engine changes; 0 for Epic’s engine |
| byte[20] | SavedHash | UE5 version ≥ 1016 | Hash of the saved package |
| int32 | TotalHeaderSize | UE5 version ≥ 1016 (here) | Size of everything before the export data |
| array | CustomVersions | LegacyFileVersion ≤ −2 | Version numbers of engine systems and plug-ins; see below |
| int32 | TotalHeaderSize | UE5 version < 1016 (here instead) | Size of everything before the export data |
Legacy file versions
| Value | Effect on the summary |
|---|---|
| −2 | Custom versions are stored as enums (an old form that UAssetAPI does not read) |
| −3 to −5 | Custom versions are stored as GUID, number and name |
| −4 | Also has no LegacyUE3Version |
| −6 and below | Custom versions are stored as GUID and number only |
| −7 and below | The texture allocation count is gone |
| −8 and below | FileVersionUE5 is present; written by Unreal Engine 5 |
Unversioned packages
Cooked games often save packages unversioned: the object versions are 0 and the
custom version list is empty, and a reader must be told the engine version from
elsewhere. Their properties are also usually saved without names
(PKG_UnversionedProperties), which needs a mapping file from the game to
read.
Custom versions
An int32 count, then for each entry, in the GUID forms:
| Type | Name | Meaning |
|---|---|---|
| GUID (16 bytes) | Key | Which engine system or plug-in the version belongs to |
| int32 | Version | That system’s own version number |
| FString | Friendly name | Only for legacy versions −3 to −5 |
Summary fields
After the version fields come these, in order. A UE4 version or UE5 version in the last column means the field is present only from that version on.
| Type | Name | Present when | Meaning |
|---|---|---|---|
| FString | FolderName | Always | Folder name of the package |
| uint32 | PackageFlags | Always | See package flags |
| int32 × 2 | NameCount, NameOffset | Always | The name table |
| int32 × 2 | SoftObjectPathsCount, …Offset | UE5 ≥ 1008 | A list of soft object paths |
| FString | LocalizationId | UE4 ≥ 516, and not PKG_FilterEditorOnly | Localisation ID of the package |
| int32 × 2 | GatherableTextDataCount, …Offset | UE4 ≥ 459 | Text to be translated |
| int32 × 2 | ExportCount, ExportOffset | Always | The export table |
| int32 × 2 | ImportCount, ImportOffset | Always | The import table |
| int32 × 4 | Cell export and import counts and offsets | UE5 ≥ 1015 | Tables for Verse cells |
| int32 | MetaDataOffset | UE5 ≥ 1014 | Offset of the metadata |
| int32 | DependsOffset | Always | Offset of the per-export dependency lists |
| int32 × 2 | SoftPackageReferencesCount, …Offset | UE4 ≥ 384 | Packages referred to by soft references |
| int32 | SearchableNamesOffset | UE4 ≥ 510 | Names that can be searched for |
| int32 | ThumbnailTableOffset | Always | Offset of the editor thumbnails, or 0 |
| int32 × 2 | Import type hierarchies count and offset | UE5 ≥ 1018 | Class hierarchies of imported types |
| GUID | Guid | UE5 < 1016 | Package GUID |
| GUID | PersistentGuid | UE4 ≥ 518, and not PKG_FilterEditorOnly | GUID that stays the same when the package is saved again |
| GUID | (owner GUID) | UE4 518 and 519 only, and not PKG_FilterEditorOnly | Removed in version 520; skip it |
| int32, then pairs | Generations | Always | A count, then for each save generation its export count and name count (two int32) |
| FEngineVersion | SavedByEngineVersion | UE4 ≥ 336 | Engine that saved the file; before 336 only a uint32 changelist |
| FEngineVersion | CompatibleWithEngineVersion | UE4 ≥ 444 | Oldest engine the file is compatible with |
| uint32 | CompressionFlags | Always | Compression of the package; 0 for current packages |
| int32, then chunks | CompressedChunks | Always | Count of package-level compressed chunks; 0 for current packages |
| uint32 | PackageSource | Always | A value identifying where the package came from |
| int32, then FStrings | AdditionalPackagesToCook | Always | Count and names of further packages to cook |
| int32 | NumTextureAllocations | Legacy version −2 to −6 | Old texture allocation count; 0 |
| int32 | AssetRegistryDataOffset | Always | Offset of the asset registry data |
| int64 | BulkDataStartOffset | Always | Where bulk data starts, at the end of the file or in a .ubulk file |
| int32 | WorldTileInfoDataOffset | UE4 ≥ 224 | World composition tile information, or 0 |
| int32, then int32s | ChunkIDs | UE4 ≥ 326 (a single int32 from 278 to 325) | Streaming chunk numbers the package belongs to |
| int32 × 2 | PreloadDependencyCount, …Offset | UE4 ≥ 507 | Preload dependencies for cooked packages |
| int32 | NamesReferencedFromExportDataCount | UE5 ≥ 1001 | How many names, from the start of the table, the export data uses |
| int64 | PayloadTocOffset | UE5 ≥ 1002 | Offset of the payload table of contents, or −1 |
| int32 | DataResourceOffset | UE5 ≥ 1009 | Offset of the bulk data resource table, or −1 |
Engine version
An FEngineVersion is three uint16 values, major, minor and patch, then a
uint32 changelist, then an FString branch name such as
++UE5+Release-5.3.
Version numbers used above
| Number | Name in the engine |
|---|---|
| 224 | VER_UE4_WORLD_LEVEL_INFO |
| 278 | VER_UE4_ADDED_CHUNKID_TO_ASSETDATA_AND_UPACKAGE |
| 326 | VER_UE4_CHANGED_CHUNKID_TO_BE_AN_ARRAY_OF_CHUNKIDS |
| 336 | VER_UE4_ENGINE_VERSION_OBJECT |
| 384 | VER_UE4_ADD_STRING_ASSET_REFERENCES_MAP |
| 444 | VER_UE4_PACKAGE_SUMMARY_HAS_COMPATIBLE_ENGINE_VERSION |
| 459 | VER_UE4_SERIALIZE_TEXT_IN_PACKAGES |
| 507 | VER_UE4_PRELOAD_DEPENDENCIES_IN_COOKED_EXPORTS |
| 510 | VER_UE4_ADDED_SEARCHABLE_NAMES |
| 516 | VER_UE4_ADDED_PACKAGE_SUMMARY_LOCALIZATION_ID |
| 518 | VER_UE4_ADDED_PACKAGE_OWNER |
| 520 | VER_UE4_NON_OUTER_PACKAGE_IMPORT |
| 522 | VER_UE4_CORRECT_LICENSEE_FLAG, the last UE4 version |
| 1000 | UE5 INITIAL_VERSION |
| 1001 | NAMES_REFERENCED_FROM_EXPORT_DATA |
| 1002 | PAYLOAD_TOC |
| 1008 | ADD_SOFTOBJECTPATH_LIST |
| 1009 | DATA_RESOURCES |
| 1014 | METADATA_SERIALIZATION_OFFSET |
| 1015 | VERSE_CELLS |
| 1016 | PACKAGE_SAVED_HASH |
| 1018 | IMPORT_TYPE_HIERARCHIES |
Package flags
| Value | Name | Meaning |
|---|---|---|
| 0x00000001 | PKG_NewlyCreated | Newly created, not yet saved |
| 0x00000002 | PKG_ClientOptional | Optional for clients |
| 0x00000004 | PKG_ServerSideOnly | Only needed on servers |
| 0x00000010 | PKG_CompiledIn | Package of compiled-in classes |
| 0x00000020 | PKG_ForDiffing | Loaded only for comparing |
| 0x00000040 | PKG_EditorOnly | Editor-only content |
| 0x00000080 | PKG_Developer | Developer content |
| 0x00000100 | PKG_UncookedOnly | Used only by uncooked builds |
| 0x00000200 | PKG_Cooked | Cooked for a game |
| 0x00000400 | PKG_ContainsNoAsset | Holds no asset |
| 0x00002000 | PKG_UnversionedProperties | Properties saved without names or types |
| 0x00004000 | PKG_ContainsMapData | Holds data of a map |
| 0x00010000 | PKG_Compiling | Being compiled |
| 0x00020000 | PKG_ContainsMap | Holds a map (a .umap) |
| 0x00040000 | PKG_RequiresLocalizationGather | Has text to gather for translation |
| 0x00100000 | PKG_PlayInEditor | Made for playing in the editor |
| 0x00200000 | PKG_ContainsScript | Holds script |
| 0x00400000 | PKG_DisallowExport | Must not be exported |
| 0x10000000 | PKG_DynamicImports | Imports resolved at run time |
| 0x20000000 | PKG_RuntimeGenerated | Generated at run time |
| 0x40000000 | PKG_ReloadingForCooker | Being reloaded by the cooker |
| 0x80000000 | PKG_FilterEditorOnly | Editor-only data has been removed; several fields are then absent |
The meanings are short readings of the flag names; Epic gives no public description beyond its source code.