Skip to main content
  1. Writing/

Halo Infinite Medal API Now Returns Infection, VIP, Extraction Medals

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

Just last month I was talking about how Halo Infinite’s Waypoint API for medals is a bit inconsistent, in that it was missing Infection medals, along with some newer additions like Blind Fire and Counter-Snipe. Instead of just blogging about it, I also bought the discrepancy up internally. I just checked the same medal data today and noticed that the new medals started rolling out in the web experience - awesome! I am not kidding, the medal sprite sheet has been updated with all the goodness. Compare for yourself!

Old medal sprite sheet (plenty of white space)

Image of the old medal sprite sheet

New medal sprite sheet (not so much white space)

Image of the new medal sprite sheet

The sheet is available through the exact same URL as before (you will need to be authenticated and have a clearance assigned):

Delightful! Thank you to the folks at 343 Industries for pushing the fix! You can now see that the sheet also contains medals for the upcoming modes as well, like VIP and Extraction.

And because I am using the same endpoint for OpenSpartan, I automatically got the missing medals rendering as well:

Image of the medal view in OpenSpartan

What’s interesting is that the medals are added to the sprite sheet, and some of them do render in the Halo Waypoint stats view, but quite a few (like the aforementioned Blind Fire and Counter-Snipe) are missing.

Image of new medals added to the sprite sheet

There’s also a few additions in the medal sheet that are not shown anywhere, like these two fellas:

Image of new medals added to the sprite sheet

Let’s see if we can use some deduction to understand what those are. To get the medal configuration, we can query the well-known endpoint:

Just like the image, this is a static JSON file that has the mapping of every single medal in existence (or, the ones indexed on Halo Waypoint) to a specific part of the sprite sheet. It’s easier to take an example, so let’s take Hell’s Janitor as our experimental entity. In the medal mapping it’s represented like this:

    "name": {
        "value": "Hell's Janitor",
        "translations": {
            "pt-BR": "Zelador do Inferno",
            "zh-CN": "地狱清洁工",
            "zh-TW": "地獄清潔工",
            "de-DE": "Hausmeister der Hölle",
            "fr-FR": "Gardien des enfers",
            "it-IT": "Custode dell'Inferno",
            "ja-JP": "ヘル ジャニター",
            "ko-KR": "지옥의 청소부",
            "es-MX": "Conserje infernal",
            "nl-NL": "Helse conciërge",
            "pl-PL": "Z piekła rodem",
            "ru-RU": "Уборщик из ада",
            "es-ES": "La conserjería del infierno"
    "description": {
        "value": "Kill 30 Infected without dying",
        "translations": {
            "pt-BR": "Mate 30 Infectados sem morrer",
            "zh-CN": "在不死亡的情况下杀死 30 个僵尸",
            "zh-TW": "活著連續殺死 30 個殭屍",
            "de-DE": "30 Infizierte ausschalten, ohne selbst zu sterben.",
            "fr-FR": "Tuez 30 infectés sans mourir.",
            "it-IT": "Uccidi 30 infetti senza morire",
            "ja-JP": "自分は倒されずに感染者 30 名を倒す",
            "ko-KR": "감염된 적 30명을 죽지 않고 처치하십시오",
            "es-MX": "Mata a 30 oponentes sin morir",
            "nl-NL": "Dood 30 geïnfecteerden zonder dood te gaan",
            "pl-PL": "Zabij 30 zainfekowanych, nie umierając.",
            "ru-RU": "Убейте 30 заражённых подряд, не умирая.",
            "es-ES": "Mata a 30 infectados sin morir."
    "spriteIndex": 36,
    "sortingWeight": 200,
    "difficultyIndex": 3,
    "typeIndex": 1,
    "personalScore": 0,
    "nameId": 217730222

The interesting part here is spriteIndex - this tells us the counted number of the medal in the sprite sheet. To make this easier, let’s look at said sheet as a numbered grid, where columns are zero-indexed and rows are positive-indexed (starting from 1).

Image showing where in the sprite sheet the Hell’s Janitor medal is highlighted

Because Hell’s Janitor is medal at index 36, it’s three rows down, four columns in.

The two medals in question I spotted above are at spriteIndex 160 and 161. A quick scan of the medal mapping file tells us that those medals are not in the response. The one at 159 is Counter-Snipe and is also missing from the mapping file. That actually explains why Halo Waypoint displays the Infection medals but not the new mode ones (although Extraction is already there) - the source of truth is not the sprite sheet but the JSON file listing medal assignments. Once the JSON file updates, everything from the sprite sheet will properly render.

Let’s wait for Season 5 and see if we get another update soon!