MCOCHUB · Champion data · Getting started
Champion data, the short version
Every playable champion in the Contest, their class, tags, what they do and what they resist, plus the Alliance War season running now, available as five small downloads for your own tools. This page gets you from nothing to working data without assuming you write code.
Don't have a key yet?
Access is by request. Message me directly on LINE or Discord and say what you're building, or send an email; keys usually go out the same day.
Credit MCOCHUB with a link wherever the data appears.
See it working right now
Take the web address below, replace YOUR-KEY with
the key you were given, and paste the whole thing into your browser's address bar.
You should see a wall of text appear. That's the champion list, all 328 of them. It looks dense because it's written for programs to read rather than people, but you now know two important things: your key works, and the data is reaching you.
There are five addresses in total, each a separate small download. Your key is issued for the ones you need, which may be all five or only some:
| Address | What's in it |
|---|---|
| /champions | Every champion and what they have |
| /champions?id={id} | The same list narrowed to one champion, by its short code |
| /tags | The list of tags, with proper names |
| /abilities | The list of abilities, with proper names |
| /immunities | The list of immunities, with proper names |
| /aw | The Alliance War season running now: its tactics, the buff on each map, and who qualifies |
Swap /champions in the address for any of the
others to see them. If one answers
Invalid ability provided, your key was not issued for that address:
ask and we will widen it.
One catch
Your key has a | character in it. Browsers
sometimes mangle that. If you get a message saying Unauthenticated,
replace the | with
%7C and try again, everything else stays the same.
Nicer to read
Chrome, Edge and Firefox all show this kind of data as a neat, foldable tree if you install any free “JSON viewer” extension. Worth two minutes if you'll be looking at it more than once.
Each address, with an example
They all work the same way: one GET request, your key either on the end of the address or as a Bearer token, and a single block of JSON back. Pick an address below to see the request and a sample of what comes back. The samples are real responses with most of the entries cut out so they fit on the page; the real thing is the same shape, just longer.
https://mcochub.insaneskull.com/api/v1/champions
Every playable champion: who they are, their class and portrait, their tags, and what they do and resist. Tags, abilities and immunities appear as short codes; the other three tabs turn those into proper names.
Request
// in the browser https://mcochub.insaneskull.com/api/v1/champions?api_key=YOUR-KEY // from the command line curl "https://mcochub.insaneskull.com/api/v1/champions" \ -H "Authorization: Bearer YOUR-KEY" \ -H "Accept: application/json"
Just one champion
Add ?id= and a champion’s short code to the same address and the list comes back holding only that champion, same shape, same record, without the rest of the roster around it. Handy for a quick lookup or a bot reply. A code nobody has simply gives an empty list, not an error, and the same trick works on the three dictionaries (/tags?id=villain). Don’t use it to collect the roster one champion at a time: every call counts against the same hourly allowance, and there are more champions than calls in an hour.
// in the browser https://mcochub.insaneskull.com/api/v1/champions?id=absorbingman&api_key=YOUR-KEY // from the command line curl "https://mcochub.insaneskull.com/api/v1/champions?id=absorbingman" \ -H "Authorization: Bearer YOUR-KEY"
Sample response (trimmed)
{
"version": "9ba0f9e60be2976421dd8d35265c6dd6",
"updated_at": "2026-08-18T09:41:17+00:00",
"champions": [
{
"id": "absorbingman",
"name": "Absorbing Man",
"class": "mystic",
"image_url": "https://mcochub.insaneskull.com/images/champions/absorbingman",
"release_year": 2023,
"tags": ["defensive-tank", "mercenary", "villain", "gamma"],
"abilities": [
{ "name": "regeneration", "type": "full" },
{ "name": "cruelty", "type": "full" },
{
"name": "armor-break",
"type": "partial",
"source": "synergy",
"synergy_with": ["thor", "thor-jane-foster"],
"note": "The second Medium Attack inflicts an Armor Break Debuff, reducing Armor by 500 for 9 seconds. Max stacks: 5"
}
],
"immunities": [
{ "name": "bleed-immunity", "type": "full" },
{
"name": "poison-immunity",
"type": "partial",
"source": "synergy",
"synergy_with": ["abomination-immortal", "hulk-immortal"],
"note": "Gain Immunity to all Poison effects, and Omni-Morph Forms last 3 seconds longer."
}
]
},
// and so on, one object like this per champion
]
}
image_url is a ready-to-use link to the champion’s round portrait, a 256×256 image with a transparent background. It needs no key, so it can go straight into an <img>. The address is always /images/champions/ followed by the champion’s id, so you can build it yourself from the id alone.
https://mcochub.insaneskull.com/api/v1/abilities
The dictionary for the codes in a champion’s abilities list, same three fields.
Request
// in the browser https://mcochub.insaneskull.com/api/v1/abilities?api_key=YOUR-KEY // from the command line curl "https://mcochub.insaneskull.com/api/v1/abilities" \ -H "Authorization: Bearer YOUR-KEY" \ -H "Accept: application/json"
Sample response (trimmed)
{
"version": "e332c62f15…",
"updated_at": "2026-08-18T09:41:17+00:00",
"abilities": [
{ "id": "acid-burn", "name": "Acid Burn", "champion_count": 1 },
{ "id": "armor-break", "name": "Armor Break", "champion_count": 61 },
{ "id": "fury", "name": "Fury", "champion_count": 149 },
// and so on for every ability
]
}
https://mcochub.insaneskull.com/api/v1/immunities
The dictionary for the codes in a champion’s immunities list, same three fields.
Request
// in the browser https://mcochub.insaneskull.com/api/v1/immunities?api_key=YOUR-KEY // from the command line curl "https://mcochub.insaneskull.com/api/v1/immunities" \ -H "Authorization: Bearer YOUR-KEY" \ -H "Accept: application/json"
Sample response (trimmed)
{
"version": "88e7cc42ee…",
"updated_at": "2026-08-18T09:41:17+00:00",
"immunities": [
{ "id": "armor-break-immunity", "name": "Armor Break Immunity", "champion_count": 13 },
{ "id": "bleed-immunity", "name": "Bleed Immunity", "champion_count": 88 },
{ "id": "poison-immunity", "name": "Poison Immunity", "champion_count": 64 },
// and so on for every immunity
]
}
The three dictionaries are identical in shape, only the array name changes. champion_count is how many champions have it, handy for sorting or for sanity-checking your own totals.
https://mcochub.insaneskull.com/api/v1/aw
The Alliance War season running right now, as one object rather than a list: its name, the defense and attack tactics (the tag that qualifies a champion, and the tactic text), the tactic buff on each war map, and the champions who carry each tag. Champion entries use the same id, name, class and image_url as the Champions tab, so a roster can be shown without pulling the full list.
Request
// in the browser https://mcochub.insaneskull.com/api/v1/aw?api_key=YOUR-KEY // from the command line curl "https://mcochub.insaneskull.com/api/v1/aw" \ -H "Authorization: Bearer YOUR-KEY" \ -H "Accept: application/json"
Sample response (trimmed)
{
"version": "810efbdda9…",
"updated_at": "2026-08-18T09:41:17+00:00",
"aw": {
"name": "Season 68 & 69",
"defense": {
"tag": { "id": "ricochet", "name": "Ricochet" },
"buff": { "id": "ricochet", "name": "RICOCHET", "description": "In this Defense Tactic, players will need to deal with Severe Unsteady Debuffs, stalling players from maximizing their damage in Alliance War if they do not shorten the duration of these Severe Debuffs." },
"map_buffs": [
{
"map": { "id": "elite-map", "name": "Elite Map" },
"buff": { "id": "ricochet-3", "name": "Ricochet – 3", "description": "If the Defender is #Ricochet, every 12 seconds the Attacker is inflicted with a Severe 20% Unsteady Debuff for 15 seconds, paused while the Attacker is far away. Max stacks: 3." }
},
// one entry per war map that runs a tactic buff this season
],
"champions": [
{
"id": "antman-future",
"name": "Ant-Man (Future)",
"class": "tech",
"image_url": "https://mcochub.insaneskull.com/images/champions/antman-future"
},
// every champion carrying the defense tactic tag, by name
]
},
"attack": {
"tag": { "id": "stabilize", "name": "Stabilize" },
"buff": { "id": "stabilize", "name": "STABILIZE", "description": "If the Attacker is #Stabilize, they start with a 20% Endurance Passive for 10 seconds, paused during Special Attacks. Max stacks: 3." },
"champions": [
{
"id": "angela",
"name": "Angela",
"class": "cosmic",
"image_url": "https://mcochub.insaneskull.com/images/champions/angela"
},
// every champion carrying the attack tactic tag, by name
]
}
}
}
Between seasons, when nothing is active, this address answers 404 with {"message":"No active Alliance War season."}. That is the site saying there is no season yet, not a problem with your key, so treat it as "check back later". ?id= does nothing here; there is only ever one season to return.
What you're looking at
The champion list and the dictionaries are separate downloads. Understanding that split is really the only thing you need to grasp.
The champion list uses short codes, armor-break,
villain, bleed-immunity,
instead of proper names. The tags, abilities and immunities addresses turn those
codes into readable names. Codes never change even if a name is corrected later,
which is exactly why it's built this way.
Here is one champion again, stripped to the fields that matter for matching (the full record is in section 2):
{
"id": "absorbingman", // short code, use this to match records
"name": "Absorbing Man",
"class": "mystic",
"image_url": "https://mcochub.insaneskull.com/images/champions/absorbingman",
"tags": ["villain", "mercenary"], // codes, look them up in /tags
"abilities": [
{ "name": "regeneration", "type": "full" } // code, look it up in /abilities
],
"immunities": [
{ "name": "bleed-immunity", "type": "full" } // code, look it up in /immunities
]
}
Always, or only sometimes?
Every ability and immunity is marked either full or
partial. This is the part most worth getting right:
-
fullmeans always. The champion has this, no conditions. -
partialmeans it depends. There'll be anotealongside it explaining when. Perhaps only against certain classes, or only while a particular teammate is in the squad.
If a partial entry also says
"source": "synergy", the champion only gets it when
one of the teammates listed in synergy_with is on the team.
Rule of thumb
If you only want things a champion can be relied on to have, keep the
full entries and ignore the rest. If you want the
complete picture, show the partial ones too and
display their note next to them.
Getting it into something useful
Pick whichever of these matches how you work.
Save it as a file
With the page open in your browser, press Ctrl +
S (or Cmd +
S on a Mac) and save it as
champions.json. That file is now yours to open in
any tool that reads JSON, which is most of them.
Use Postman (free, no coding)
Postman is a point-and-click app for exactly this. Create a request, set the method
to GET, paste in the web address
without the ?api_key=… part, then open the
Authorization tab, choose
Bearer Token, and paste your key
there. Press Send.
This is the tidier way to work, your key stays out of the address, and Postman formats the response so you can browse it comfortably.
Hand it to whoever builds your tool
If someone else is doing the wiring, give them the web address and your key, and point them at this page. Ask us for the full technical reference if they want the complete contract, we will send it over. It's a standard setup and should take minutes, not days.
Staying up to date without re-downloading
The data changes rarely, when champions are added or their details are corrected. Near the top of every response is a line like this:
"version": "3a948469e559b106347ef898daeb54ef"
That jumble is a fingerprint of the data. Same fingerprint means nothing has changed. So the simple approach is: save the fingerprint alongside your copy, check back now and then, and only replace your copy when the fingerprint is different. Each of the five addresses has its own, so a change to the tag list leaves your champion copy valid.
There's a more efficient version of this that skips the download entirely when nothing has changed, worth mentioning to your developer, who'll know it as ETag and If-None-Match. Ask us for the technical reference and it's covered there.
Don't check too often
You can make 100 requests an hour and 1,000 a day with your key, shared across all five addresses. Refreshing everything costs 5, so that is 200 full refreshes a day, far more than data that changes a few times a week needs. Go over and you'll be turned away until the window rolls over.
Looking after your key
Your key is a password. Anyone who has it can pull this data as you, and it can be traced back to you.
- Don't post it in a public repository, a screenshot, or a group chat.
-
Putting it in the web address (the
?api_key=approach in step 1) is fine for trying things out, but it gets recorded in browser history and server logs. For anything ongoing, use the Bearer Token method instead. - If it leaks, just say so, it can be switched off and replaced in seconds, and nobody else's key is affected.
Things worth knowing before you build
- Match on id, not name
-
Two champions can share a name, Ultron and Ultron (Classic), for instance. Their
idcodes are always different, so match your own records onidand you'll never mix them up. - Portrait images
-
image_urlpoints at the same round portrait the MCOCHUB site shows, a 256×256 image on a transparent background. It needs no key, so an<img>tag can use it as-is, and it always follows the same pattern,/images/champions/plus the champion’sid, so you can build one without the list. The site paints a colour behind it that matches the champion’s class; do the same if you want it to look familiar, or leave it plain. - Immunity names
- These currently read “Bleed Immunity” rather than “Bleed”. If you're comparing them against war node buffs, drop the word “Immunity” from the end first.
- The note field
- Written for people to read, in the game's own words. Show it as-is; don't try to pull rules out of it automatically.
- Whole list, or one champion
-
/championsgives you the whole set, about 285 KB, smaller than a photo. Fetch it once, keep it, and work from your copy./champions?id={id}narrows it to one champion by its short code, for a quick lookup. Don't use it to collect the whole roster one at a time: every call counts against the same allowance, and 328 calls is more than an hour's worth. - Playable champions only
- The list matches the roster on the public MCOCHUB site.
If something isn't working
- “Unauthenticated.”
-
The key didn't arrive, or it isn't right. Check for a stray space, and try
%7Cin place of the|. - “Too Many Attempts.”
- You've hit either the hourly cap (100) or the daily one (1,000). Wait for the window to roll over, then check back less often.
- Nothing comes back at all
-
Make sure the address starts with
https://and has no line breaks in it from being copied out of a chat window.
Anything else, get in touch, it's usually a two-minute fix at this end.