Bug - many opposing-faction mounts missing from API

Many (though not all) mounts from the opposing faction are no longer being returned by the character collection API. With the API rework it was intended for the entire account’s collection to be returned for any player, but this is no longer the case.

Looking at the list of mounts that I own that aren’t appearing, I can’t see a defining factor. Since there are so many missing it’s easier to define which do still appear:

  • racial mounts still appear
  • the original “Black War” pvp mounts still appear (the later Black War Mammoths, Black War Bears, etc. do not)
  • the pair of mounts from the “Two Sides to Every Tale” achievement still appear
    But not much else…
2 Likes

Hi Wain,

We did recently make some changes to the way PvP gladiator mounts are included in the collections document, however I would not expect those changes to impact the collections document in the way you are describing. We are having some conversation internally to determine if there is a bug here.

Thanks for the report!

3 Likes

I see the same behavior, I lost over 50 mounts from my Horde toons (all one account) when I lookup my Alliance character (that used to show say a month ago). I see it’s consistent across all of the sites that I use to track this so I would say it must be something within the API. An example of this is the Great Golden Kodo - for some reason this particular one has disappeared but not all Kodos.

3 Likes

So the API, and my website, have been broken now for two weeks. I hope by now you’ve at least determined the cause. While I don’t expect new features, I think the existing API , which affects all your users, needs to remain reasonably stable.

Greetings all,

First, we apologize for the delay in circling back to this issue.

While we are continuing to look into this and other related issues that have arisen, we want to provide some additional information that we hope will help.

With the API rework it was intended for the entire account’s collection to be returned for any player, but this is no longer the case.

While this is correct, with changes made in support of the World of Warcraft 8.3.7 update, the Character Collections Mount Summary API was modified with the intention of better representing the mounts that are available as well as actually usable at the character level while continuing to maintain the Account Mounts Collection Summary API as a holistic view of the mounts collected at the account level. One of these changes was the addition of an “is_useable” boolean, as well as the addition of an “is_character_specific” boolean, on each mount in the Character Collections Mount Summary document where they apply.

We’ve since discovered that some unintended changes may have also been introduced, and we continue to evaluate the scope and impact of these changes. Additionally, we realize that we failed to communicate the intended changes, and failed to recognize the unintended changes, and for that, we apologize.

As we know now, an unintended change introduced with the World of Warcraft 8.3.7 update is that when a player logs out of World of Warcraft for the first time on a character which hasn’t played since the update was released, the Character Collection Mount Summary documents for other characters on that player’s account will become unavailable until those specific characters also experience a logout. At this time, we are advising that API consumers encourage users who may be experiencing this issue to log their characters out of World of Warcraft, which will cause these documents to once again become available.

We will continue to investigate the additional issues that have been communicated in this thread and provide an update when we have one.

Thank you for the feedback and reports.

1 Like

Thanks for your response!

Unfortunately I’ve logged in and out many times since then and I’ve tested several of my characters soon after logging them out, and they’re still missing opposing-faction mounts from their collections. So it’s clearly not the only issue here.

Thanks for looking into it!

Hi again. To add further, I’ve taken a look at the API response for my particular character, and the “is_character_specific” flag only appears for one mount, which is the Vashj’ir Seahorse (we all know why that is). I’m seeing the “is_favorite” and “is_useable” flags properly. What doesn’t make sense is that for my alliance character (US-Llane/Stormfire), Timber Wolf (Horde only mount) does show up in the list, marked “is_useable” = “false”. However, Great Golden Kodo (also a horde mount and a mount you get automatically when acquiring the cross faction version), does not show up anywhere on the list. The same horde character on my account is supplying both Timber Wolf and Great Golden Kodo.

I was thinking perhaps it was all of the mounts that you get “automatically” when acquiring the opposite faction, but it is not. Another example is the Captured Swampstalker. You have to purchase this for 90k with Exalted Taljan’s Expedition and do not get it automatically. This mount also does not appear on my Alliance character records.

Another example - Armored Blue Dragonhawk shows on Ally character, Armored Red Dragonhawk shows on Horde (achievement mount). I would have expected it to show up on either characters API output, just with the is_useable flags flipped.

Hopefully this can be of some help.

All the behavior you describe in your post mirrors how it works in-game. If you open up the mounts collection in-game and check all the boxes (Collected, Not Collected, Unusable), on an Alliance character, then you will see the Timber Wolf listed (though dimmed) and not the Great Golden Kodo.

I don’t know why Blizzard flagged some mounts to show cross-faction and not others, but the API appears to mirror in-game behavior, which seems like the right thing to do.

It’s just different to how it has been the last few months - most people that are high achievers don’t care about character usable - we care about all mounts on the accounts. Once you pass 400 the character usable becomes much less important. It should just be consistent, either show them all or show none of them. I agree it does seem that they have sync’ed up with how the game does it which it never did before.

Yes, that is the problem. They established a new API behaviour that we adapted our sites for and it has suddenly changed. The changes I made because of this were not trivial and will be difficult to reverse if I have to get users to add multiple characters to their profiles again, to get a full set of mounts. It’ll be an awful lot of work and I’m hoping this new API change is temporary.

So are you guys using the account mounts collection API, or the character mounts collection API?

It sounds like you’re saying “the character mounts API used to return all mounts on the account. The character mounts API now returns all mounts for the character. I want all mounts on the account.” which is what the account mounts collection API is for…

Greetings all,

To get right to it, we’ve determined that the Character Collections Mount Summary API is currently working as is intended. To be more specific, the API reflects the same data presented in-game should a player inspect their own mounts collection with all filters turned off, or more precisely, with the “Collected” and “Unusable” boxes both checked.

Additionally, the is_useable flag intends to allow consumers further to filter the document data to only useable mounts, as if the “Unusable” box was unchecked in-game. We understand this is not immediately apparent, and again we apologize for the lack of communication, documentation, and added confusion surrounding the addition of the is_useable flag property.

When possible, our intent with Character specific documents is to represent the data directly as a player would consume it in-game, and any deviation from this strategy is likely unintended or undesired. It is not our intention for Character specific documents to expose data that would be considered ‘account-wide’ when that same data would not be presented to the player in-game. An example of a deviation here is Achievement data, where the player can choose to display their account-wide achievements at the character level.

To best allow the player agency over their account-wide data and who consumes it, we recommend consumers interested in account-wide data integrate with the Account Mounts Collection Summary API available via the Battlenet OAuth Code Authorization flow, which provides a full picture of the mounts collected for an authorized account.

We understand and sympathize with the complexities and challenges this introduces for some projects. We wholeheartedly apologize for the lack of preparation you were given, and our failure to communicate the changes ahead of time. We failed to keep you informed that the previously observed behavior was being changed.

We much appreciate everyone’s patience and involvement in this discussion. Please continue to report any challenges you experience with the WoW APIs so that we can continue to grow and improve upon them together.

– Maguthul

Right. Well I guess I’ll be working out how to implement OAuth. Thank you for your reply.

While it may not have been the intended for the new API for it to work the way it has been, the reality is that it’s been working that way from inception, and for most of a year. When the opposing-faction Alabaster mounts weren’t being returned by the new character API they were actually fixed to do so. In most of a year and multiple discussions nobody said that the API wasn’t intended to work this way, and the fact it took most of a month to get an answer on this tells me that the confusion isn’t just the end users. My frustration is mostly the sheer number of hours this has cost me, as an amateur coder, and will continue to do so.

The OAuth2 system is confusing to me, but I’m trying to work out what changes are needed. I can see the curl/PHP calls that are needed (thanks Schiller!!) but I’m not yet sure what I need to save on my end so the authorization persists over a user session. Hopefully it’ll make sense.

Hi Maguthul - just wanted to say that I really appreciate the responses here. I think my confusion is - what is the criteria for opposite faction to appear in the list at all? I actually think this is a bug in the game itself, but if it is working as intended it would be useful to know the logic.

I’ll go back to my example - why does Great Brown Kodo show up in my mount journal as Horde / unusable, but Great Golden Kodo does not show up at all? If it truly were character specific, none of the horde mounts should should show. I won’t get into the class order hall mounts showing up as most likely the other alliance mounts that I can’t use show up because of wanting them to count for achievements.

I think the way you have described is how used to work up until March 2020. Then from then on, it must have been a bug in the API (which unfortunately all mount websites changed to adapt to), and now it’s been reverted to be like it was before. The “total mount” count in the journal has always been a bit of a mystery and no one really looks at it - it would be great if there was clarity on exactly what goes into it.

Again, thanks for all the replies and communication on this topic.

Is there any rule I can apply to the mount data returned by data/wow/mount/{id} to determine if that mount will appear on a cross-faction profile/wow/character/{realm}/{name} response? (Or any method at all, including using other non-API sources?)

I like that the APIs mirror in-game results. I’m a little confused as to why the game operates as inconsistently as it does – I might even call it a bug – but I realize that’s unlikely to be addressed here.

To maybe answer my own question, here’s what I derived empirically from my own data set. This results could easily be off with regards to very rare or newer mounts. I’m still interested in an authoritative answer or any corrections on the below.

  id  |              name               | faction | shows_cross_faction
------+---------------------------------+---------+---------------------
    6 | Brown Horse                     | A       | t
    9 | Black Stallion                  | A       | t
   11 | Pinto                           | A       | t
   14 | Timber Wolf                     | H       | t
   18 | Chestnut Mare                   | A       | t
   19 | Dire Wolf                       | H       | t
   20 | Brown Wolf                      | H       | t
   21 | Gray Ram                        | A       | t
   24 | White Ram                       | A       | t
   25 | Brown Ram                       | A       | t
   26 | Striped Frostsaber              | A       | t
   27 | Emerald Raptor                  | H       | t
   31 | Spotted Frostsaber              | A       | t
   34 | Striped Nightsaber              | A       | t
   36 | Turquoise Raptor                | H       | t
   38 | Violet Raptor                   | H       | t
   39 | Red Mechanostrider              | A       | t
   40 | Blue Mechanostrider             | A       | t
   41 | Warhorse                        | A       | f
   42 | White Mechanostrider Mod B      | A       | f
   45 | Black Nightsaber                | A       | f
   46 | Ancient Frostsaber              | A       | f
   50 | Red Wolf                        | H       | f
   51 | Arctic Wolf                     | H       | f
   52 | Palomino                        | A       | f
   53 | White Stallion                  | A       | f
   54 | Mottled Red Raptor              | H       | f
   55 | Winterspring Frostsaber         | A       | f
   56 | Ivory Raptor                    | H       | f
   57 | Green Mechanostrider            | A       | t
   58 | Unpainted Mechanostrider        | A       | t
   62 | Icy Blue Mechanostrider Mod A   | A       | f
   63 | Frost Ram                       | A       | f
   64 | Black Ram                       | A       | f
   65 | Red Skeletal Horse              | H       | t
   66 | Blue Skeletal Horse             | H       | t
   67 | Brown Skeletal Horse            | H       | t
   68 | Green Skeletal Warhorse         | H       | t
   71 | Gray Kodo                       | H       | t
   72 | Brown Kodo                      | H       | t
   73 | Green Kodo                      | H       | f
   74 | Teal Kodo                       | H       | f
   75 | Black War Steed                 | A       | t
   76 | Black War Kodo                  | H       | t
   77 | Black Battlestrider             | A       | t
   78 | Black War Ram                   | A       | t
   79 | Black War Raptor                | H       | t
   80 | Red Skeletal Warhorse           | H       | t
   81 | Black War Tiger                 | A       | t
   82 | Black War Wolf                  | H       | t
   84 | Charger                         | A       | f
   85 | Swift Mistsaber                 | A       | t
   87 | Swift Frostsaber                | A       | t
   88 | Swift Yellow Mechanostrider     | A       | t
   89 | Swift White Mechanostrider      | A       | t
   90 | Swift Green Mechanostrider      | A       | t
   91 | Swift Palomino                  | A       | t
   92 | Swift White Steed               | A       | t
   93 | Swift Brown Steed               | A       | t
   94 | Swift Brown Ram                 | A       | t
   95 | Swift Gray Ram                  | A       | t
   96 | Swift White Ram                 | A       | t
   97 | Swift Blue Raptor               | H       | t
   98 | Swift Olive Raptor              | H       | t
   99 | Swift Orange Raptor             | H       | t
  100 | Purple Skeletal Warhorse        | H       | t
  101 | Great White Kodo                | H       | t
  102 | Great Gray Kodo                 | H       | t
  103 | Great Brown Kodo                | H       | t
  104 | Swift Brown Wolf                | H       | t
  105 | Swift Timber Wolf               | H       | t
  106 | Swift Gray Wolf                 | H       | t
  107 | Swift Stormsaber                | A       | t
  108 | Frostwolf Howler                | H       | f
  109 | Stormpike Battle Charger        | A       | f
  129 | Golden Gryphon                  | A       | f
  130 | Ebon Gryphon                    | A       | f
  131 | Snowy Gryphon                   | A       | f
  132 | Swift Blue Gryphon              | A       | f
  133 | Tawny Wind Rider                | H       | f
  134 | Blue Wind Rider                 | H       | f
  135 | Green Wind Rider                | H       | f
  136 | Swift Red Wind Rider            | H       | f
  137 | Swift Red Gryphon               | A       | f
  138 | Swift Green Gryphon             | A       | f
  139 | Swift Purple Gryphon            | A       | f
  140 | Swift Green Wind Rider          | H       | f
  141 | Swift Yellow Wind Rider         | H       | f
  142 | Swift Purple Wind Rider         | H       | f
  146 | Swift Pink Hawkstrider          | H       | t
  147 | Brown Elekk                     | A       | t
  149 | Thalassian Charger              | H       | f
  150 | Thalassian Warhorse             | H       | f
  152 | Red Hawkstrider                 | H       | t
  157 | Purple Hawkstrider              | H       | t
  158 | Blue Hawkstrider                | H       | t
  159 | Black Hawkstrider               | H       | t
  160 | Swift Green Hawkstrider         | H       | t
  161 | Swift Purple Hawkstrider        | H       | t
  162 | Swift Warstrider                | H       | t
  163 | Gray Elekk                      | A       | t
  164 | Purple Elekk                    | A       | t
  165 | Great Green Elekk               | A       | t
  166 | Great Blue Elekk                | A       | t
  167 | Great Purple Elekk              | A       | t
  220 | Black War Elekk                 | A       | t
  240 | Mechano-Hog                     | H       | f
  254 | Black War Mammoth               | A       | f
  255 | Black War Mammoth               | H       | f
  256 | Wooly Mammoth                   | A       | f
  257 | Wooly Mammoth                   | H       | f
  258 | Ice Mammoth                     | H       | f
  259 | Ice Mammoth                     | A       | f
  269 | Armored Brown Bear              | A       | f
  270 | Armored Brown Bear              | H       | f
  271 | Black War Bear                  | A       | f
  272 | Black War Bear                  | H       | f
  275 | Mekgineer's Chopper             | A       | f
  276 | Armored Snowy Gryphon           | A       | f
  277 | Armored Blue Wind Rider         | H       | f
  280 | Traveler's Tundra Mammoth       | A       | f
  284 | Traveler's Tundra Mammoth       | H       | f
  286 | Grand Black War Mammoth         | A       | f
  287 | Grand Black War Mammoth         | H       | f
  288 | Grand Ice Mammoth               | H       | f
  289 | Grand Ice Mammoth               | A       | f
  291 | Blue Dragonhawk                 | A       | f
  292 | Red Dragonhawk                  | H       | f
  294 | Stormwind Steed                 | A       | t
  295 | Darkspear Raptor                | H       | t
  296 | Ironforge Ram                   | A       | t
  297 | Darnassian Nightsaber           | A       | t
  298 | Gnomeregan Mechanostrider       | A       | t
  299 | Exodar Elekk                    | A       | t
  300 | Orgrimmar Wolf                  | H       | t
  301 | Thunder Bluff Kodo              | H       | t
  302 | Silvermoon Hawkstrider          | H       | t
  303 | Forsaken Warhorse               | H       | t
  309 | White Kodo                      | H       | t
  310 | Black Wolf                      | H       | t
  311 | Venomhide Ravasaur              | H       | f
  314 | Black Skeletal Horse            | H       | t
  318 | Great Red Elekk                 | A       | t
  319 | Swift Moonsaber                 | A       | t
  320 | Swift Red Hawkstrider           | H       | t
  321 | Swift Gray Steed                | A       | t
  322 | Great Golden Kodo               | H       | f
  323 | Turbostrider                    | A       | t
  324 | Swift Violet Ram                | A       | t
  325 | Swift Purple Raptor             | H       | t
  326 | White Skeletal Warhorse         | H       | t
  327 | Swift Burgundy Wolf             | H       | t
  329 | Silver Covenant Hippogryph      | A       | f
  330 | Sunreaver Dragonhawk            | H       | f
  331 | Quel'dorei Steed                | A       | f
  332 | Sunreaver Hawkstrider           | H       | f
  336 | Ochre Skeletal Warhorse         | H       | t
  337 | Striped Dawnsaber               | A       | t
  342 | Swift Horde Wolf                | H       | f
  343 | Swift Alliance Steed            | A       | f
  344 | Crusader's White Warhorse       | A       | f
  345 | Crusader's Black Warhorse       | H       | f
  350 | Sunwalker Kodo                  | H       | f
  351 | Great Sunwalker Kodo            | H       | f
  367 | Exarch's Elekk                  | A       | f
  368 | Great Exarch's Elekk            | A       | f
  388 | Goblin Trike                    | H       | t
  389 | Goblin Turbo-Trike              | H       | t
  403 | Golden King                     | A       | f
  405 | Spectral Steed                  | A       | f
  406 | Spectral Wolf                   | H       | f
  409 | Kor'kron Annihilator            | H       | f
  422 | Vicious War Steed               | A       | f
  423 | Vicious War Wolf                | H       | f
  435 | Mountain Horse                  | A       | t
  436 | Swift Mountain Horse            | A       | t
  440 | Spectral Gryphon                | A       | f
  441 | Spectral Wind Rider             | H       | f
  450 | Pandaren Kite                   | H       | f
  516 | Pandaren Kite                   | A       | f
  526 | Grand Armored Gryphon           | A       | f
  527 | Grand Armored Wyvern            | H       | f
  528 | Grand Gryphon                   | A       | f
  529 | Grand Wyvern                    | H       | f
  545 | Golden Primal Direhorn          | A       | f
  546 | Crimson Primal Direhorn         | H       | f
  548 | Armored Red Dragonhawk          | H       | f
  549 | Armored Blue Dragonhawk         | A       | f
  554 | Vicious Kaldorei Warsaber       | A       | f
  555 | Vicious Skeletal Warhorse       | H       | f
  617 | Dusty Rockhide                  | A       | f
  618 | Armored Irontusk                | A       | f
  640 | Vicious War Ram                 | A       | f
  641 | Vicious War Raptor              | H       | f
  645 | Ironside Warwolf                | H       | f
  648 | Swift Frostwolf                 | H       | f
  651 | Warlord's Deathwheel            | H       | t
  652 | Champion's Treadblade           | A       | t
  678 | Chauffeured Mechano-Hog         | H       | f
  679 | Chauffeured Mekgineer's Chopper | A       | f
  755 | Vicious War Mechanostrider      | A       | f
  756 | Vicious War Kodo                | H       | f
  775 | Prestigious War Steed           | A       | f
  784 | Prestigious War Wolf            | H       | f
  841 | Vicious Gilnean Warhorse        | A       | f
  842 | Vicious War Trike               | H       | f
  843 | Vicious Warstrider              | H       | f
  844 | Vicious War Elekk               | A       | f
  873 | Vicious War Bear                | A       | f
  874 | Vicious War Bear                | H       | f
  876 | Vicious War Lion                | A       | f
  882 | Vicious War Scorpion            | H       | f
  900 | Vicious War Turtle              | A       | f
  901 | Vicious War Turtle              | H       | f
  926 | Alabaster Hyena                 | H       | f
  945 | Vicious War Fox                 | A       | f
  946 | Vicious War Fox                 | H       | f
  958 | Spectral Pterrorwing            | H       | f
  959 | Stormwind Skychaser             | A       | f
  960 | Orgrimmar Interceptor           | H       | f
  996 | Seabraid Stallion               | A       | f
  997 | Gilded Ravasaur                 | H       | f
 1006 | Lightforged Felcrusher          | A       | f
 1007 | Highmountain Thunderhoof        | H       | f
 1008 | Nightborne Manasaber            | H       | f
 1009 | Starcursed Voidstrider          | A       | f
 1010 | Admiralty Stallion              | A       | f
 1013 | Honeyback Harvester             | A       | t
 1015 | Dapple Gray                     | A       | f
 1016 | Smoky Charger                   | A       | f
 1026 | Vicious War Basilisk            | H       | f
 1027 | Vicious War Basilisk            | A       | f
 1038 | Zandalari Direhorn              | H       | f
 1044 | Mag'har Direwolf                | H       | f
 1045 | Vicious War Clefthoof           | H       | f
 1046 | Darkforge Ram                   | A       | f
 1047 | Dawnforge Ram                   | A       | f
 1048 | Dark Iron Core Hound            | A       | f
 1049 | Undercity Plaguebat             | H       | f
 1050 | Vicious War Riverbeast          | A       | f
 1054 | Teldrassil Hippogryph           | A       | f
 1058 | Cobalt Pterrordax               | H       | f
 1059 | Captured Swampstalker           | H       | f
 1060 | Voldunai Dunescraper            | H       | f
 1061 | Expedition Bloodswarmer         | H       | f
 1062 | Dusky Waycrest Gryphon          | A       | f
 1063 | Stormsong Coastwatcher          | A       | f
 1064 | Proudmoore Sea Scout            | A       | f
 1173 | Broken Highland Mustang         | H       | f
 1174 | Highland Mustang                | A       | f
 1194 | Vicious White Warsaber          | A       | f
 1195 | Vicious Black Warsaber          | A       | f
 1196 | Vicious Black Bonesteed         | H       | f
 1197 | Vicious White Bonesteed         | H       | f
 1198 | Kul Tiran Charger               | A       | f
 1210 | Bloodthirsty Dreadwing          | H       | f
 1214 | Azureshell Krolusk              | A       | f
 1215 | Rubyshell Krolusk               | H       | f
 1216 | Priestess' Moonsaber            | A       | f
 1225 | Crusader's Direhorn             | H       | f
 1245 | Bloodflank Charger              | H       | t
 1246 | Ironclad Frostclaw              | A       | t
 1255 | Deepcoral Snapdragon            | A       | t
 1256 | Snapdragon Kelpstalker          | H       | t
 1266 | Alabaster Stormtalon            | A       | f
 1267 | Alabaster Thunderwing           | H       | f
 1283 | Mechagon Mechanostrider         | A       | f
 1285 | Frostwolf Snarler               | H       | f
 1286 | Caravan Hyena                   | H       | f
 1292 | Stormpike Battle Ram            | A       | f