Skip to main content
  1. Writing/

Identifying Your Halo Infinite Build GUID

·906 words
This blog post is part of a series on exploring the Halo game API.

Back in June I wrote about a little process that I put together to aggregate Halo Infinite stats in the cloud. As part of this process, I am running a tool I built called Composer that pulls information about matches, ranks, medals, and stats that are embedded directly into build metadata. To do that, I run a command like this:

dotnet Den.Dev.Orion.Composer.dll get buildstats
  --build-id '70f9339184764222b79125cf4f244c2b'
  --domain /$AZ_BATCH_TASK_WORKING_DIR/playstore.db

What this does is send a request to the build metadata endpoint to get the information about all the game, engine, and map variants available in the build, or, as otherwise known:

This is one of the requests that is usually sent the first time you launch an updated build, after which it is cached and pulled from disk. You can easily spot it with a tool like Fiddler:

Game manifest request as captured through Fiddler on Windows.
Game manifest request as captured through Fiddler on Windows.

Erm... Wait a second. So the build identifier is a GUID and not a typical semantic versioning string? I thought I saw the build version when Halo Infinite launches - it's right there in the bottom right corner!

Indeed it is! The game has a build ID that is shown when you start it:

Halo Infinite build ID as shown when the game launches.
Halo Infinite build ID as shown when the game launches.

Sending a GET request to the endpoint above with proper tokens will return a bunch of data, that also includes build metadata, including the “readable” build number:

"CustomData": {
    "BranchName": "HI_1_5_1",
    "BuildNumber": "6.10025.12948",
    "Kind": 1,
    "ContentVersion": "",
    "BuildGuid": "70f93391-8476-4222-b791-25cf4f244c2b",
    "Visibility": 0

When requesting the data, the build GUID can be used with (like BuildGuid above) or without hyphens (like in the request example). The output will be identical.

However, this identifier is not really used for the manifest request. A fun fact is that at some point in the past one could, in fact, obtain the game manifest through the build ID, like this:

That capability has since gone away and a GUID is the only public way of getting the build metadata. The build GUID is completely detached from the semantic version - it’s an opaque value that is assigned by the developers and you can’t “transform” it to the readable build ID or back. Here is a historical snapshot of builds since May 2023 that I captured through my data aggregator to prove this point:

Build Number Build GUID
6.10024.10518 22727c81-2415-4095-827d-a4d2fe27b51b
6.10024.11251 eb24d936-4138-4c3d-8e77-a801baf5a242
6.10024.11943 c9c1cc92-e295-4c5a-9434-42c3d9df8829
6.10024.13134 e8e0ff34-f783-4dca-8304-7e00fc505df4
6.10024.15436 1bb8f58e-c3b1-4a1e-8f7f-db9244269443
6.10024.17792 0e54eda5-e3b3-4ebd-807c-4e46c4f48fc5
6.10025.10367 125eafb5-5cf7-4cc5-82c3-7c2990f2c716
6.10025.11703 691f0016-9639-4261-b576-a8139216fa84
6.10025.12948 70f93391-8476-4222-b791-25cf4f244c2b

So, long story longer - for me to be able to constantly update the data I need to get the build GUID. So, process is simple, right? Fire up Fiddler, set up the proxy for WinHTTP to actually pipe everything through Fiddler, then launch Halo Infinite and monitor for /game requests. Not the worst flow, but also quite cumbersome. Can I do this better? Surely, the build GUID is embedded somewhere locally.

To do this, we can use a tool built for this exact purpose - strings. We will use it to peek inside binary files to see if there is anything anywhere that can point us to the build GUID.

On Windows, through Steam, Halo Infinite game files are located in:

C:\Program Files (x86)\Steam\steamapps\common\Halo Infinite

Before we go on a GUID fishing expedition, is it possible that the HaloInfinite.exe launcher contains the build GUID in the executable details?

Halo Infinite executable details window.
Halo Infinite executable details window.

It does not. Away we go into the Terminal, and running the following command within the Halo Infinite installation folder:

strings.exe -n 8 -s | findstr /i 70f93391

Because we already know the build GUID (from current build), we can start looking for the specific character sequence across all files. And because I don’t know whether hyphens are used or not inside the various files that might exist here I limit myself to the first 8 hexadecimal digits of the GUID - I limit strings to 8 characters via -n 8, request it to recurse all folders in the current directory with -s, and then passing the output to the Windows findstr command that is looking for the first chunk of the build GUID. Piece of cake - now we just wait for the search to conclude.

As it turns out, the file we’re looking for is here:

C:\Program Files (x86)\Steam\steamapps\common\Halo Infinite\

The string we’re seeing there is:

Bingo! It’s a test endpoint, but nonetheless - we now have the build GUID. If we open the file in a HEX editor, we can also easily spot the build ID - we can look for the GUID directly or we can look for /manifests/guids/.

Halo Infinite build GUID as seen in a cache file in a HEX editor.
Halo Infinite build GUID as seen in a cache file in a HEX editor.

From now on, I can easily get the build GUID even if I missed capturing it through Fiddler. That also means that I can now write a one-liner to extract the GUID from the file (when copying and pasting you can consolidate the snippet below into one line):

Select-String -Pattern "\/manifests\/guids\/([0-9a-fA-F]+)\/game"
              -Path ".\CacheMap.wcache"
  | Select Matches
  | Foreach-Object {$_.Matches}
  | Foreach-Object {$_.Groups[1].Value}
Build GUID extracted from CacheMap.wcache for Halo Infinite.
Build GUID extracted from CacheMap.wcache for Halo Infinite.

The data collection script can now live on with minimal friction of getting the build GUIDs with every new Halo Infinite release.