Skip to main content
  1. Writing/

A Look Under The Hood Of The Halo Infinite Exchange

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

Just yesterday the new build of Halo Infinite dropped (6.10025.17116.0 for those of you who are following). With this build, one of the biggest changes that graced us with its presence is The Exchange - a new virtual venue where a player can use a new in-game currency, Spartan Points, to acquire all sorts of already known cosmetics.

The Exchange tile in the Halo Infinite shop.
The Exchange tile in the Halo Infinite shop.

As I explored the content on The Exchange, the natural follow-up question was “How does it work behind the scenes?” This post is the answer to that question.

The new currency #

Before we start exploring the contents of The Exchange (I will use the capitalization that is used in-game), it’s worth first taking a look at the new currency that is being introduced, and that is Spartan Points. And by the way - this post takes no stance on micro-transactions (whether for or against them). It’s just a listing of facts of the current system.

It joins the list of other currency entities that existed:

Credits #

Credit coin in Halo Infinite.
Credit coin in Halo Infinite.

Currency that is a direct translation of “dollars to virtual points.” Can be used to obtain cosmetics in the Halo Infinite shop. Previously earned through Battle Pass progression, but nowadays only available as a special grant (e.g., by having a VIP ticket to Halo World Championship 2023) or by purchasing coins at a retailer or through Halo Infinite.

XP Boost #

XP Boost in Halo Infinite.
XP Boost in Halo Infinite.

Earned through progression in operations (prior to Banished Honor). Now only available in the shop. Can be used to double operation experience earnings during a one-hour block.

XP Grant #

XP Grant in Halo Infinite.
XP Grant in Halo Infinite.

Granted by purchasing level progression. Used to grant a fixed number of experience points (250XP, typically) towards operation progression.

Challenge Swap #

Challenge Swap in Halo Infinite.
Challenge Swap in Halo Infinite.

Earned through progression in operations (prior to Banished Honor). Now only available in the shop. Can be used to swap a given weekly challenge (other than the daily or the capstone/weekly ultimate) for another randomly-selected challenge.

Spartan Points #

Spartan Points in Halo Infinite.
Spartan Points in Halo Infinite.

Earned through completing daily and capstone challenges, as well as through progression in an operation. And yes, the visual is different than the rest - that’s what’s used in both Halo Waypoint and as defined in the API.

Wait, but this asset is different than what is rendered in the game. For a fact I saw different visualizations when looking inside the operation progression. Is there truly no proper Spartan Points set of assets represented in the API?

Great observation! The game assets are indeed different. Let’s take a look at the current operation (Banished Honor):

Spartan Points in Halo Infinite, as seen in the Banished Honor operation.
Spartan Points in Halo Infinite, as seen in the Banished Honor operation.

Notice that the Spartan Points are rendered either as a single unit or a stack (or even a large stack). These images, however, are completely missing from the API definitions. Typically, when I look for currency images, like those for aforementioned entities, I start with the guide endpoint:

https://gamecms-hacs.svc.halowaypoint.com
  /hi
  /images
  /guide
  /xo

There, we’d see something like this:

{
    "Uri": {
        "AuthorityId": "gamecms",
        "Path": "/hi/images/file/progression/Currencies/1102-000-xp-grant-c77c6396-1x1.png",
        "QueryString": "",
        "RetryPolicyId": "",
        "TopicName": "",
        "AcknowledgementTypeId": 0,
        "AuthenticationLifetimeExtensionSupported": false,
        "ClearanceAware": true
    },
    "ETag": "\"IcpPUcyyebm+WMbq7lwh/IY7A1UiODDpk/GwCA==\"",
    "ContentLength": 70013,
    "Usage": 1
},
{
    "Uri": {
        "AuthorityId": "gamecms",
        "Path": "/hi/images/file/progression/Currencies/1102-000-xp-grant-c77c6396-2x1.png",
        "QueryString": "",
        "RetryPolicyId": "",
        "TopicName": "",
        "AcknowledgementTypeId": 0,
        "AuthenticationLifetimeExtensionSupported": false,
        "ClearanceAware": true
    },
    "ETag": "\"kHO5JyUWrglKYUsbYoE5JFMKOReJsLzgZ6/5AQ==\"",
    "ContentLength": 70267,
    "Usage": 1
},
{
    "Uri": {
        "AuthorityId": "gamecms",
        "Path": "/hi/images/file/progression/currencies/1102-000-xp-grant-c77c6396-2x2.png",
        "QueryString": "",
        "RetryPolicyId": "",
        "TopicName": "",
        "AcknowledgementTypeId": 0,
        "AuthenticationLifetimeExtensionSupported": false,
        "ClearanceAware": true
    },
    "ETag": "\"N4mEbkitQhxA+29+ohA6me3jZTFRDoXCMTDlGQ==\"",
    "ContentLength": 287479,
    "Usage": 1
}

But in the latest guide snapshot, the Spartan Points currency was missing. My hunch was that maybe I could also find relevant information in the metadata endpoint:

https://gamecms-hacs.svc.halowaypoint.com
  /hi
  /Progression
  /file
  /metadata
  /metadata.json

That’s where I spotted the following:

 "Currencies": [
    {
        "CurrencyId": "Currency/Currencies/cR.json",
        "Title": "Credits",
        "Description": "",
        "Image": "progression/Currencies/Credit_Coin-SM.png",
        "IconType": "VirtualCurrency"
    },
    {
        "CurrencyId": "Currency/Currencies/softcurrency.json",
        "Title": "Spartan Points",
        "Description": "",
        "Image": "progression/StoreContent/ToggleTiles/SpartanPoints_Common_4x4.png",
        "IconType": "SoftCurrency"
    },
    {
        "CurrencyId": "Currency/Currencies/rerollcurrency.json",
        "Title": "Challenge Swap",
        "Description": "",
        "Image": "progression/Currencies/1104-000-data-pad-e39bef84-2x2.png",
        "IconType": "ChallengeReroll"
    },
    {
        "CurrencyId": "Currency/Currencies/xpboost.json",
        "Title": "XP Boost",
        "Description": "",
        "Image": "progression/Currencies/1103-000-xp-boost-5e92621a-2x2.png",
        "IconType": "XPBoost"
    },
    {
        "CurrencyId": "Currency/Currencies/xpgrant.json",
        "Title": "XP Grant",
        "Description": "",
        "Image": "progression/Currencies/1102-000-xp-grant-c77c6396-2x2.png",
        "IconType": "XPGrant"
    }
]

What we’re looking for is softcurrency, and it’s clear that the image for it is located at progression/StoreContent/ToggleTiles/SpartanPoints_Common_4x4.png, which is different from all other currencies. Hence why the graphic I am using here is what’s available through the API and not the one in the game.

The Exchange API #

Unlike the proper shop API, The Exchange is structured in a bit of an atypical fashion. Our first hint at that comes from a call that we spot in the shop itself:

https://gamecms-hacs.svc.halowaypoint.com
  /hi
  /Progression
  /file
  /StoreContent
  /Display
  /Offerings
  /ExchangeTest.json

ExchangeTest.json must be a left-over name, but nonetheless offers a glimpse into what the tile that takes us to The Exchange in the game does:

{
    "Title": "The Exchange",
    "Description": "Visit the Exchange",
    "Quality": "Common",
    "WidthHint": 2,
    "HeightHint": 2,
    "FlairText": "",
    "FlairIconPath": null,
    "FlairBackgroundPath": null,
    "ObjectImagePath": "progression/StoreContent/ToggleTiles/TheExchange_2x2.png",
    "StoreTileType": "StorefrontSoftCurrencyButton",
    "HasGleam": null,
    "IsOnSale": null,
    "SalePercentage": null,
    "IsEventItem": null,
    "IsNew": null,
    "FlairBackgroundColorOverrideRGB": null,
    "FlairTextColorOverrideRGB": null,
    "TitleColorOverrideRGB": null,
    "PriceColorOverrideRGB": null,
    "PriceShadowColorOverrideRGB": null,
    "HasFlair": null
}

So, it acts like any other store tile, but in this case it’s for something that is not for sale per-se.

The content of The Exchange page is populated by acquiring soft currency (that’s what Spartan Points are referred as inside the API) offers for a given player, like this:

https://economy.svc.halowaypoint.com
  /hi
  /players
  /xuid(YOUR_XUID)
  /stores
  /softcurrencyoffers
  ?flight=YOUR_CLEARANCE

This will return a response similar to this:

{
    "StoreId": "SoftCurrencyOffers",
    "StorefrontExpirationDate": {
        "ISO8601Date": "2024-06-04T17:00:00Z"
    },
    "StorefrontDisplayPath": "StoreContent/Display/Storefront/Exchange-20240306-00.json",
    "Offerings": [
        {
            "OfferingId": "20230210-01",
            "OfferingDisplayPath": "StoreContent/Display/Offerings/20230210-01.json",
            "OfferingExpirationDate": null,
            "IncludedItems": [],
            "Prices": [
                {
                    "Cost": 1000,
                    "CurrencyPath": "Currency/Currencies/cR.json"
                }
            ],
            "IncludedCurrencies": [],
            "IncludedRewardTracks": [],
            "BoostPath": null,
            "OperationXp": 0,
            "EventXp": 0,
            "MatchBoosts": null,
            "RewardTrackAdjustments": []
        },
        {
            "OfferingId": "20240306-00",
            "OfferingDisplayPath": "StoreContent/Display/Offerings/20240306-00.json",
            "OfferingExpirationDate": null,
            "IncludedItems": [
                {
                    "Amount": 1,
                    "ItemPath": "Inventory/Armor/Coatings/002-001-wlv-8e6a1dcb.json",
                    "ItemType": "ArmorCoating"
                }
            ],
            "Prices": [
                {
                    "Cost": 30000,
                    "CurrencyPath": "Currency/Currencies/softcurrency.json"
                }
            ],
            "IncludedCurrencies": [],
            "IncludedRewardTracks": [],
            "BoostPath": null,
            "OperationXp": 0,
            "EventXp": 0,
            "MatchBoosts": null,
            "RewardTrackAdjustments": []
        },
        [...MORE OFFERS HERE...]
    ]
}

A few peculiar things to observe here. First and foremost, there is an expiration date. We already know that the content in The Exchange will rotate. The date in StorefrontExpirationDate tells us when the rotation will occur. Second, the very first offer is for… credits?

Why would there be credits in The Exchange? I thought that this is all about Spartan Points and not actually buying things with real money. Can I bypass the process of earning Spartan Points by just buying them in bulk or something?

Not quite, but this is because very likely what we see is a shortcut back to the shop. To verify this, let’s open The Exchange on a console or PC and see what we get in terms of tiles rendered.

Content shown in The Exchange in Halo Infinite.
Content shown in The Exchange in Halo Infinite.

Stretched PNGs aside (that’s how it is in the game, don’t ask me), pay close attention to the first tile - “Return To The Main Store.” Let’s get the data for offering StoreContent/Display/Offerings/20230210-01.json and see what that is (it’s listed as 1000 credits, after all). We can do that by looking here:

https://gamecms-hacs.svc.halowaypoint.com
  /hi
  /Progression
  /file
  /StoreContent
  /Display
  /Offerings
  /20230210-01.json

And, as suspected, it’s a dummy offering:

{
    "Title": "STORE OFFERS",
    "Description": "RETURN TO THE MAIN STORE",
    "Quality": "Common",
    "WidthHint": 2,
    "HeightHint": 2,
    "FlairText": "",
    "FlairIconPath": null,
    "FlairBackgroundPath": null,
    "ObjectImagePath": "progression/StoreContent/ToggleTiles/MainStore_2x2.png",
    "StoreTileType": "StorefrontToggleButtonNoVCButton",
    "HasGleam": null,
    "IsOnSale": null,
    "SalePercentage": null,
    "IsEventItem": null,
    "IsNew": null,
    "FlairBackgroundColorOverrideRGB": null,
    "FlairTextColorOverrideRGB": null,
    "TitleColorOverrideRGB": null,
    "PriceColorOverrideRGB": null,
    "PriceShadowColorOverrideRGB": null,
    "HasFlair": null
}

Mystery solved! The rest of the offerings map to in-game entities that you might or might not already have, depending on how many challenges or past events you’ve completed:

Content shown in The Exchange in Halo Infinite.
Content shown in The Exchange in Halo Infinite.

And there you have it. Now, you can query data in The Exchange to see what offerings are there and what the cost for each is.

Some integration with this new shop section is still ongoing and is a bit rough around the edges, though. For example, if I go to Spartan customizations and try to look for things that I know for a fact are in The Exchange, I can’t really get to them or buy them with my points:

Needle Minder not available for purchase in Halo Infinite.
Needle Minder not available for purchase in Halo Infinite.

What’s also interesting is that if we look inside the operations data, there is an extra operation listed now - OperationGenBase, which can be seen here:

https://gamecms-hacs.svc.halowaypoint.com
  /hi
  /Progression
  /file
  /RewardTracks
  /Operations
  /OperationGenBase.json

It literally renders as any other operation, with 50 tiers, all awarding different amounts of Spartan Points (500, 1000, or 2500). I am not entirely sure what it does yet, but if you see it in OpenSpartan Workshop, of all places, don’t be surprised - it’s very likely just a “dummy” operation used as a base for future operation rewards.