Tired of ads? Buy Me a Coffee members (any tier) browse MCOCHUB ad-free. Go ad-free

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.

1

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.

https://mcochub.insaneskull.com/api/v1/champions?api_key=YOUR-KEY

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.

2

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.

GET 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.

GET https://mcochub.insaneskull.com/api/v1/tags

The dictionary for the codes in a champion’s tags list. Each entry is the code, its proper name and how many champions carry it.

Request

// in the browser
https://mcochub.insaneskull.com/api/v1/tags?api_key=YOUR-KEY

// from the command line
curl "https://mcochub.insaneskull.com/api/v1/tags" \
  -H "Authorization: Bearer YOUR-KEY" \
  -H "Accept: application/json"

Sample response (trimmed)

{
  "version": "b7d2e4c0a9f1…",
  "updated_at": "2026-08-18T09:41:17+00:00",
  "tags": [
    { "id": "10-year-challenge", "name": "10 Year Challenge", "champion_count": 18 },
    { "id": "defensive-tank", "name": "Defensive: Tank", "champion_count": 94 },
    { "id": "villain", "name": "Villain", "champion_count": 141 },
    // and so on for every tag
  ]
}
GET 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
  ]
}
GET 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.

GET 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.

3

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:

  • full means always. The champion has this, no conditions.
  • partial means it depends. There'll be a note alongside 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.

4

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.

5

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.

6

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.
7

Things worth knowing before you build

Match on id, not name
Two champions can share a name, Ultron and Ultron (Classic), for instance. Their id codes are always different, so match your own records on id and you'll never mix them up.
Portrait images
image_url points 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’s id, 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
/champions gives 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 %7C in 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.