Halo Infinite Career Ranks
Table of Contents
I talked about Halo Infinite career ranks some time ago, but I kept needing to come back to the idea that I just wanted to have a quickly accessible list that just tells me what rank experience requirements are and how far along to Hero each rank is. No ads, no, fluff, just the table. Said table is now here.
Rank table #
Rank Image | Rank Adornment Image | Title | XP | Percent To Hero |
---|---|---|---|---|
Recruit | 100 | 0.00% | ||
Bronze Cadet 1 | 1,000 | 0.00% | ||
Bronze Cadet 2 | 1,250 | 0.01% | ||
Bronze Cadet 3 | 1,500 | 0.03% | ||
Bronze Private 1 | 1,000 | 0.04% | ||
Bronze Private 2 | 1,250 | 0.05% | ||
Bronze Private 3 | 1,750 | 0.07% | ||
Bronze Lance Corporal 1 | 1,250 | 0.08% | ||
Bronze Lance Corporal 2 | 1,500 | 0.10% | ||
Bronze Lance Corporal 3 | 1,750 | 0.11% | ||
Bronze Corporal 1 | 1,250 | 0.13% | ||
Bronze Corporal 2 | 1,500 | 0.15% | ||
Bronze Corporal 3 | 2,000 | 0.16% | ||
Bronze Sergeant 1 | 1,500 | 0.18% | ||
Bronze Sergeant 2 | 1,750 | 0.20% | ||
Bronze Sergeant 3 | 2,250 | 0.22% | ||
Bronze Staff Sergeant 1 | 1,500 | 0.24% | ||
Bronze Staff Sergeant 2 | 1,750 | 0.26% | ||
Bronze Staff Sergeant 3 | 2,500 | 0.28% | ||
Bronze Gunnery Sergeant 1 | 1,750 | 0.30% | ||
Bronze Gunnery Sergeant 2 | 2,000 | 0.32% | ||
Bronze Gunnery Sergeant 3 | 2,750 | 0.34% | ||
Bronze Master Sergeant 1 | 1,750 | 0.37% | ||
Bronze Master Sergeant 2 | 2,250 | 0.39% | ||
Bronze Master Sergeant 3 | 3,000 | 0.42% | ||
Bronze Lieutenant 1 | 2,000 | 0.45% | ||
Bronze Lieutenant 2 | 2,500 | 0.47% | ||
Bronze Lieutenant 3 | 3,250 | 0.50% | ||
Bronze Captain 1 | 2,250 | 0.53% | ||
Bronze Captain 2 | 2,750 | 0.56% | ||
Bronze Captain 3 | 3,500 | 0.59% | ||
Bronze Major 1 | 2,500 | 0.62% | ||
Bronze Major 2 | 3,000 | 0.65% | ||
Bronze Major 3 | 3,750 | 0.68% | ||
Bronze Lt Colonel 1 | 2,750 | 0.72% | ||
Bronze Lt Colonel 2 | 3,250 | 0.75% | ||
Bronze Lt Colonel 3 | 4,000 | 0.79% | ||
Bronze Colonel 1 | 3,000 | 0.83% | ||
Bronze Colonel 2 | 3,500 | 0.86% | ||
Bronze Colonel 3 | 4,500 | 0.90% | ||
Bronze Brigadier General 1 | 3,250 | 0.95% | ||
Bronze Brigadier General 2 | 3,750 | 0.98% | ||
Bronze Brigadier General 3 | 5,000 | 1.02% | ||
Bronze General 1 | 3,500 | 1.08% | ||
Bronze General 2 | 4,000 | 1.11% | ||
Bronze General 3 | 5,250 | 1.16% | ||
Silver Cadet 1 | 2,250 | 1.21% | ||
Silver Cadet 2 | 2,500 | 1.24% | ||
Silver Cadet 3 | 3,250 | 1.26% | ||
Silver Private 1 | 2,250 | 1.30% | ||
Silver Private 2 | 2,750 | 1.32% | ||
Silver Private 3 | 3,750 | 1.35% | ||
Silver Lance Corporal 1 | 2,500 | 1.39% | ||
Silver Lance Corporal 2 | 3,000 | 1.42% | ||
Silver Lance Corporal 3 | 4,000 | 1.45% | ||
Silver Corporal 1 | 2,750 | 1.50% | ||
Silver Corporal 2 | 3,250 | 1.52% | ||
Silver Corporal 3 | 4,250 | 1.56% | ||
Silver Sergeant 1 | 3,000 | 1.61% | ||
Silver Sergeant 2 | 3,750 | 1.64% | ||
Silver Sergeant 3 | 4,750 | 1.68% | ||
Silver Staff Sergeant 1 | 3,250 | 1.73% | ||
Silver Staff Sergeant 2 | 4,000 | 1.76% | ||
Silver Staff Sergeant 3 | 5,250 | 1.81% | ||
Silver Gunnery Sergeant 1 | 3,750 | 1.86% | ||
Silver Gunnery Sergeant 2 | 4,250 | 1.90% | ||
Silver Gunnery Sergeant 3 | 5,750 | 1.95% | ||
Silver Master Sergeant 1 | 4,000 | 2.01% | ||
Silver Master Sergeant 2 | 4,750 | 2.05% | ||
Silver Master Sergeant 3 | 6,250 | 2.10% | ||
Silver Lieutenant 1 | 4,250 | 2.17% | ||
Silver Lieutenant 2 | 5,250 | 2.22% | ||
Silver Lieutenant 3 | 6,750 | 2.27% | ||
Silver Captain 1 | 4,750 | 2.35% | ||
Silver Captain 2 | 5,750 | 2.40% | ||
Silver Captain 3 | 7,250 | 2.46% | ||
Silver Major 1 | 5,250 | 2.54% | ||
Silver Major 2 | 6,250 | 2.59% | ||
Silver Major 3 | 8,000 | 2.66% | ||
Silver Lt Colonel 1 | 5,750 | 2.75% | ||
Silver Lt Colonel 2 | 6,750 | 2.81% | ||
Silver Lt Colonel 3 | 8,750 | 2.88% | ||
Silver Colonel 1 | 6,250 | 2.97% | ||
Silver Colonel 2 | 7,500 | 3.04% | ||
Silver Colonel 3 | 9,500 | 3.12% | ||
Silver Brigadier General 1 | 6,750 | 3.22% | ||
Silver Brigadier General 2 | 8,000 | 3.30% | ||
Silver Brigadier General 3 | 10,000 | 3.38% | ||
Silver General 1 | 7,250 | 3.49% | ||
Silver General 2 | 8,750 | 3.57% | ||
Silver General 3 | 12,500 | 3.66% | ||
Gold Cadet 1 | 4,500 | 3.79% | ||
Gold Cadet 2 | 5,500 | 3.84% | ||
Gold Cadet 3 | 7,250 | 3.90% | ||
Gold Private 1 | 5,000 | 3.98% | ||
Gold Private 2 | 6,000 | 4.03% | ||
Gold Private 3 | 7,750 | 4.10% | ||
Gold Lance Corporal 1 | 5,500 | 4.18% | ||
Gold Lance Corporal 2 | 6,500 | 4.24% | ||
Gold Lance Corporal 3 | 8,500 | 4.31% | ||
Gold Corporal 1 | 6,000 | 4.40% | ||
Gold Corporal 2 | 7,250 | 4.46% | ||
Gold Corporal 3 | 9,250 | 4.54% | ||
Gold Sergeant 1 | 6,500 | 4.64% | ||
Gold Sergeant 2 | 7,750 | 4.71% | ||
Gold Sergeant 3 | 10,000 | 4.79% | ||
Gold Staff Sergeant 1 | 7,000 | 4.90% | ||
Gold Staff Sergeant 2 | 8,500 | 4.98% | ||
Gold Staff Sergeant 3 | 10,000 | 5.07% | ||
Gold Gunnery Sergeant 1 | 7,750 | 5.18% | ||
Gold Gunnery Sergeant 2 | 9,250 | 5.26% | ||
Gold Gunnery Sergeant 3 | 12,500 | 5.36% | ||
Gold Master Sergeant 1 | 8,500 | 5.49% | ||
Gold Master Sergeant 2 | 10,000 | 5.58% | ||
Gold Master Sergeant 3 | 12,500 | 5.69% | ||
Gold Lieutenant 1 | 9,250 | 5.82% | ||
Gold Lieutenant 2 | 10,000 | 5.92% | ||
Gold Lieutenant 3 | 15,000 | 6.03% | ||
Gold Captain 1 | 10,000 | 6.19% | ||
Gold Captain 2 | 12,500 | 6.30% | ||
Gold Captain 3 | 15,000 | 6.43% | ||
Gold Major 1 | 10,000 | 6.59% | ||
Gold Major 2 | 12,500 | 6.70% | ||
Gold Major 3 | 17,500 | 6.84% | ||
Gold Lt Colonel 1 | 12,500 | 7.02% | ||
Gold Lt Colonel 2 | 15,000 | 7.16% | ||
Gold Lt Colonel 3 | 20,000 | 7.32% | ||
Gold Colonel 1 | 12,500 | 7.53% | ||
Gold Colonel 2 | 15,000 | 7.67% | ||
Gold Colonel 3 | 20,000 | 7.83% | ||
Gold Brigadier General 1 | 15,000 | 8.04% | ||
Gold Brigadier General 2 | 17,500 | 8.20% | ||
Gold Brigadier General 3 | 22,500 | 8.39% | ||
Gold General 1 | 15,000 | 8.63% | ||
Gold General 2 | 20,000 | 8.79% | ||
Gold General 3 | 25,000 | 9.01% | ||
Platinum Cadet 1 | 9,750 | 9.28% | ||
Platinum Cadet 2 | 12,500 | 9.38% | ||
Platinum Cadet 3 | 15,000 | 9.52% | ||
Platinum Private 1 | 10,000 | 9.68% | ||
Platinum Private 2 | 12,500 | 9.78% | ||
Platinum Private 3 | 17,500 | 9.92% | ||
Platinum Lance Corporal 1 | 12,500 | 10.11% | ||
Platinum Lance Corporal 2 | 15,000 | 10.24% | ||
Platinum Lance Corporal 3 | 17,500 | 10.40% | ||
Platinum Corporal 1 | 12,500 | 10.59% | ||
Platinum Corporal 2 | 15,000 | 10.72% | ||
Platinum Corporal 3 | 20,000 | 10.88% | ||
Platinum Sergeant 1 | 15,000 | 11.10% | ||
Platinum Sergeant 2 | 17,500 | 11.26% | ||
Platinum Sergeant 3 | 22,500 | 11.45% | ||
Platinum Staff Sergeant 1 | 15,000 | 11.69% | ||
Platinum Staff Sergeant 2 | 17,500 | 11.85% | ||
Platinum Staff Sergeant 3 | 22,500 | 12.04% | ||
Platinum Gunnery Sergeant 1 | 17,500 | 12.28% | ||
Platinum Gunnery Sergeant 2 | 20,000 | 12.47% | ||
Platinum Gunnery Sergeant 3 | 25,000 | 12.68% | ||
Platinum Master Sergeant 1 | 17,500 | 12.95% | ||
Platinum Master Sergeant 2 | 22,500 | 13.14% | ||
Platinum Master Sergeant 3 | 27,500 | 13.38% | ||
Platinum Lieutenant 1 | 20,000 | 13.67% | ||
Platinum Lieutenant 2 | 25,000 | 13.89% | ||
Platinum Lieutenant 3 | 30,000 | 14.16% | ||
Platinum Captain 1 | 22,500 | 14.48% | ||
Platinum Captain 2 | 25,000 | 14.72% | ||
Platinum Captain 3 | 32,500 | 14.99% | ||
Platinum Major 1 | 22,500 | 15.34% | ||
Platinum Major 2 | 27,500 | 15.58% | ||
Platinum Major 3 | 37,500 | 15.87% | ||
Platinum Lt Colonel 1 | 25,000 | 16.28% | ||
Platinum Lt Colonel 2 | 30,000 | 16.54% | ||
Platinum Lt Colonel 3 | 40,000 | 16.87% | ||
Platinum Colonel 1 | 27,500 | 17.30% | ||
Platinum Colonel 2 | 35,000 | 17.59% | ||
Platinum Colonel 3 | 45,000 | 17.97% | ||
Platinum Brigadier General 1 | 30,000 | 18.45% | ||
Platinum Brigadier General 2 | 37,500 | 18.77% | ||
Platinum Brigadier General 3 | 47,500 | 19.17% | ||
Platinum General 1 | 32,500 | 19.68% | ||
Platinum General 2 | 40,000 | 20.03% | ||
Platinum General 3 | 52,500 | 20.46% | ||
Diamond Cadet 1 | 20,000 | 21.02% | ||
Diamond Cadet 2 | 25,000 | 21.24% | ||
Diamond Cadet 3 | 32,500 | 21.51% | ||
Diamond Private 1 | 22,500 | 21.86% | ||
Diamond Private 2 | 27,500 | 22.10% | ||
Diamond Private 3 | 35,000 | 22.39% | ||
Diamond Lance Corporal 1 | 25,000 | 22.77% | ||
Diamond Lance Corporal 2 | 30,000 | 23.04% | ||
Diamond Lance Corporal 3 | 40,000 | 23.36% | ||
Diamond Corporal 1 | 27,500 | 23.79% | ||
Diamond Corporal 2 | 32,500 | 24.08% | ||
Diamond Corporal 3 | 42,500 | 24.43% | ||
Diamond Sergeant 1 | 30,000 | 24.89% | ||
Diamond Sergeant 2 | 35,000 | 25.21% | ||
Diamond Sergeant 3 | 47,500 | 25.58% | ||
Diamond Staff Sergeant 1 | 32,500 | 26.09% | ||
Diamond Staff Sergeant 2 | 40,000 | 26.44% | ||
Diamond Staff Sergeant 3 | 50,000 | 26.87% | ||
Diamond Gunnery Sergeant 1 | 35,000 | 27.41% | ||
Diamond Gunnery Sergeant 2 | 42,500 | 27.78% | ||
Diamond Gunnery Sergeant 3 | 55,000 | 28.24% | ||
Diamond Master Sergeant 1 | 40,000 | 28.83% | ||
Diamond Master Sergeant 2 | 47,500 | 29.26% | ||
Diamond Master Sergeant 3 | 60,000 | 29.77% | ||
Diamond Lieutenant 1 | 42,500 | 30.41% | ||
Diamond Lieutenant 2 | 50,000 | 30.87% | ||
Diamond Lieutenant 3 | 65,000 | 31.41% | ||
Diamond Captain 1 | 47,500 | 32.10% | ||
Diamond Captain 2 | 55,000 | 32.61% | ||
Diamond Captain 3 | 72,500 | 33.20% | ||
Diamond Major 1 | 50,000 | 33.98% | ||
Diamond Major 2 | 60,000 | 34.52% | ||
Diamond Major 3 | 80,000 | 35.16% | ||
Diamond Lt Colonel 1 | 55,000 | 36.02% | ||
Diamond Lt Colonel 2 | 65,000 | 36.61% | ||
Diamond Lt Colonel 3 | 85,000 | 37.31% | ||
Diamond Colonel 1 | 60,000 | 38.22% | ||
Diamond Colonel 2 | 72,500 | 38.86% | ||
Diamond Colonel 3 | 95,000 | 39.64% | ||
Diamond Brigadier General 1 | 65,000 | 40.66% | ||
Diamond Brigadier General 2 | 80,000 | 41.36% | ||
Diamond Brigadier General 3 | 100,000 | 42.22% | ||
Diamond General 1 | 72,500 | 43.29% | ||
Diamond General 2 | 85,000 | 44.07% | ||
Diamond General 3 | 100,000 | 44.98% | ||
Onyx Cadet 1 | 45,000 | 46.05% | ||
Onyx Cadet 2 | 55,000 | 46.54% | ||
Onyx Cadet 3 | 70,000 | 47.13% | ||
Onyx Private 1 | 50,000 | 47.88% | ||
Onyx Private 2 | 57,500 | 48.41% | ||
Onyx Private 3 | 77,500 | 49.03% | ||
Onyx Lance Corporal 1 | 52,500 | 49.86% | ||
Onyx Lance Corporal 2 | 65,000 | 50.43% | ||
Onyx Lance Corporal 3 | 82,500 | 51.12% | ||
Onyx Corporal 1 | 57,500 | 52.01% | ||
Onyx Corporal 2 | 70,000 | 52.63% | ||
Onyx Corporal 3 | 90,000 | 53.38% | ||
Onyx Sergeant 1 | 62,500 | 54.34% | ||
Onyx Sergeant 2 | 77,500 | 55.01% | ||
Onyx Sergeant 3 | 100,000 | 55.84% | ||
Onyx Staff Sergeant 1 | 70,000 | 56.92% | ||
Onyx Staff Sergeant 2 | 82,500 | 57.67% | ||
Onyx Staff Sergeant 3 | 100,000 | 58.55% | ||
Onyx Gunnery Sergeant 1 | 75,000 | 59.63% | ||
Onyx Gunnery Sergeant 2 | 90,000 | 60.43% | ||
Onyx Gunnery Sergeant 3 | 125,000 | 61.40% | ||
Onyx Master Sergeant 1 | 82,500 | 62.74% | ||
Onyx Master Sergeant 2 | 100,000 | 63.62% | ||
Onyx Master Sergeant 3 | 125,000 | 64.70% | ||
Onyx Lieutenant 1 | 90,000 | 66.04% | ||
Onyx Lieutenant 2 | 100,000 | 67.00% | ||
Onyx Lieutenant 3 | 150,000 | 68.08% | ||
Onyx Captain 1 | 100,000 | 69.69% | ||
Onyx Captain 2 | 125,000 | 70.76% | ||
Onyx Captain 3 | 150,000 | 72.10% | ||
Onyx Major 1 | 100,000 | 73.71% | ||
Onyx Major 2 | 125,000 | 74.78% | ||
Onyx Major 3 | 175,000 | 76.12% | ||
Onyx Lt Colonel 1 | 125,000 | 78.00% | ||
Onyx Lt Colonel 2 | 150,000 | 79.34% | ||
Onyx Lt Colonel 3 | 175,000 | 80.95% | ||
Onyx Colonel 1 | 125,000 | 82.83% | ||
Onyx Colonel 2 | 150,000 | 84.17% | ||
Onyx Colonel 3 | 200,000 | 85.78% | ||
Onyx Brigadier General 1 | 150,000 | 87.93% | ||
Onyx Brigadier General 2 | 175,000 | 89.54% | ||
Onyx Brigadier General 3 | 225,000 | 91.42% | ||
Onyx General 1 | 150,000 | 93.83% | ||
Onyx General 2 | 175,000 | 95.44% | ||
Onyx General 3 | 250,000 | 97.32% | ||
Hero | 1 | 100.00% |
How I got this data #
To compile the table, I put together a new project - OpenSpartan/career
. It’s a Python script that talks to the game CMS API to get the list of ranks, and then dumps all the career data locally, where it stores the JSON response, all images for the rank (large icon, small icon, and nameplate adornment), and produces a Markdown table - the very artifact you saw in the blog post above.
The script looks like this:
import sys
import os
import requests
import json
import locale
locale.setlocale(locale.LC_ALL, '')
IMAGE_FOLDER = 'media'
LANGUAGE = 'en-us'
USER_AGENT = 'OpenSpartan.Career/1.0'
CAREER_ENDPOINT = 'https://gamecms-hacs.svc.halowaypoint.com/hi/Progression/file/RewardTracks/CareerRanks/careerRank1.json'
IMAGE_ENDPOINT = 'https://gamecms-hacs.svc.halowaypoint.com/hi/images/file/'
IMAGE_PREFIX = 'https://assets.den.dev/images/postmedia/halo-infinite-career-ranks/'
def download_image(image_id, token):
if not image_id:
return
headers = {
"User-Agent": USER_AGENT,
"Accept-Language": LANGUAGE,
"X-343-Authorization-Spartan": token
}
folder_name, filename = os.path.split(image_id)
os.makedirs(os.path.join(IMAGE_FOLDER, folder_name), exist_ok=True)
file_path = os.path.join(IMAGE_FOLDER, folder_name, filename)
if not os.path.exists(file_path):
with open(file_path, "wb") as file:
response = requests.get(f'{IMAGE_ENDPOINT}{image_id}', headers=headers)
file.write(response.content)
def main():
if len(sys.argv) < 2:
print("Usage: python -m career [spartan_token]")
return
spartan_token = sys.argv[1]
headers = {
"User-Agent": USER_AGENT,
"Accept-Language": LANGUAGE,
"X-343-Authorization-Spartan": spartan_token
}
if not os.path.exists(IMAGE_FOLDER):
os.makedirs(IMAGE_FOLDER)
try:
response = requests.get(CAREER_ENDPOINT, headers=headers)
if response.status_code == 200:
print("Got career details.")
raw_data = response.text
with open("career_details.json", "w") as file:
file.write(raw_data)
json_data = json.loads(raw_data)
ranks = json_data.get("Ranks", [])
total_xp = sum(rank.get("XpRequiredForRank", 0) for rank in ranks)
print(f'XP required overall: {locale.format_string("%d", total_xp, grouping=True)}')
print('Processing rank data...')
md_table = '''| Rank Image | Rank Adornment Image | Title | XP | Percent To Hero |
|:-----------|:---------------------|:------|:---------|:----------------|'''
for rank in ranks:
xp_required = rank.get("XpRequiredForRank", 0)
rank_icon = rank.get("RankIcon", None)
rank_large_icon = rank.get("RankLargeIcon", None)
rank_adornment_icon = rank.get("RankAdornmentIcon", None)
tier_type = rank.get("TierType", None)
rank_tier = rank.get("RankTier", None)
rank_title = rank.get("RankTitle", None)
rank_subtitle = rank.get("RankSubTitle", None)
current_rank = rank.get("Rank", 0)
total_prior_xp = sum(other_rank.get("XpRequiredForRank", 0) for other_rank in ranks if other_rank.get("Rank", 0) < current_rank)
percent_progress = total_prior_xp / total_xp
formatted_percentage = "%.2f%%" % (percent_progress * 100)
formatted_xp = locale.format_string("%d", xp_required, grouping=True)
download_image(rank_icon, spartan_token)
download_image(rank_large_icon, spartan_token)
download_image(rank_adornment_icon, spartan_token)
md_table += f'\n| <img src="{IMAGE_PREFIX}{rank_icon}" alt="Large rank icon for {rank_title} {rank_subtitle}"/> | <img src="{IMAGE_PREFIX}{rank_adornment_icon}" alt="Adornment rank icon for {rank_title} {rank_subtitle}"/> | {rank_subtitle} {rank_title} { rank_tier } | {formatted_xp} | {formatted_percentage} |'
with open("career_table.md", "w") as file:
file.write(md_table)
else:
print(f"Failed to get response. Status code: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
main()
This script can be invoked from the terminal (I myself built it on macOS) and requires only one parameter - the Spartan Token V4. I intentionally didn’t bake in the authentication logic here because I wanted a quick and dirty solution to my problem, but if you want to do it the right way, you can read my other blog post on how to authenticate against the Halo Infinite API. For the time being, however, you can grab a token from Halo Waypoint after you log in (look for the X-343-Authorization-Spartan
header).
Run it like this:
python -m career YOUR_SPARTAN_TOKEN
Don't I need to also install some required dependencies for this to run properly? I see that there is a requirements.txt file in the repository.
Indeed, but the only package that is needed is requests
. You can install it from requirements.txt
like this:
pip install -r requirements.txt
Or, you can just call pip install requests
and be on your way! Once the execution of the script completes, you should have:
- A
media
directory where the script is, containing all the icons for every single rank. - A
career_details.json
file containing the 1:1 response from the game CMS endpoint. - A
career_table.md
file containing a Markdown representation of all the ranks, with images linked to this blog.
And that’s about it - once I got the images, I used rclone
to drop them into my Cloudflare R2 bucket, in a predictable location, from where they can be included on my blog. You can also easily adjust the script above to point the image link prefix to any other location.