We received a question in the Community Discord Server over the weekend from user Charodey:
Achievements are very complicated in WoW, and the API reflects all of the nuances. Unfortunately, it might not reflect it as clearly as we would like!
Before we start: I’d like to briefly go over “achievement criteria” or just “criteria”. Achievement criteria are the checkpoints required by the achievement in order to gain that achievement. Sometimes there’s one criterion. Other times there’s many. Sometimes there’s an operator that affects the criteria. All of this information can be gathered from the /data/wow/achievement/{id}
endpoint.
Now, not all achievements may be shown in the API the way you expect them to. Achievements respect the “Display Only Character Achievements To Others” in-game option, found in-game at Game Menu | Interface | Social | Display Only Character Achievements To Others. Data returned from the /profile/wow/character/{realm}/{character}/achievements
endpoint will reflect achievements as viewed in-game when inspecting another character. The in-game option changes this view.
This last point is important: it will not appear as your achievements appear in your personal achievements pane when playing the character. It will instead show as another character sees you when you are inspected.
In WoW, there are a two different types of achievements: account achievements and character achievements. This distinction is made by the is_account_wide
flag returned from the /data/wow/achievement/{id}
endpoint. For now, let’s assume we’re in the most common case: “Display Only Character Achievements To Others” is disabled.
For account achievements:
- The achievement criteria completion,
criteria.is_completed
, is true when the conditions for the criteria have been met for any character across the account. - The child criteria,
criteria.child_criteria
, are tracked across the account. If any character has fulfilled a particular criterion,criteria.child_criteria[].is_completed
will betrue
for all characters on the account. - The completion timestamp,
completed_timestamp
, appears when the achievement has been completed by the account. - An example of an account achievement is ID 12807.
Because of this, account achievements look the same for all characters across the account, provided the “Display Only Character Achievements To Others” flag is disabled. When criteria.is_completed
is true, completed_timestamp
will be available. If completed_timestamp
is not available, criteria.is_completed
should be false.
This is how you would expect all achievements to work. However, this is not how character achievements work.
For character achievements:
- The achievement criteria completion,
criteria.is_completed
, is only tracked for the character that you requested, and will only be true when the conditions for the criteria has been met for that character. - The child criteria,
criteria.child_criteria
, are only tracked for the character that you requested, andis_completed
will only betrue
if the specified character has completed the criterion. - The completion timestamp,
completed_timestamp
, appears when the achievement has been completed by any character on the account. - An example of a character achievement is ID 32.
Therefore, provided the “Display Only Character Achievements To Others” flag is disabled, a character achievement with criteria.is_completed
as false
but with a completed_timestamp
appearing means that the achievement was completed by another character on the account.
For both account and character achievements, this behavior changes if “Display Only Character Achievements To Others” is enabled:
- The achievement criteria completion,
criteria.is_completed
, is only tracked for the character that you requested, and will only be true when the conditions for the criteria has been met for that character. - The child criteria,
criteria.child_criteria
, are only tracked for the character that you requested, andis_completed
will only betrue
if the specified character has completed the criterion. - The completion timestamp,
completed_timestamp
, appears when the achievement has been completed by the requested character.
Effectively, enabling the in-game option removes all links to your other characters for both achievement types, only showing that one character’s progress. For data protection reasons, we do not explicitly expose whether or not a character has the in-game option enabled or disabled.
In all situations, this should reflect how achievements are displayed in-game when your character is inspected.
You can actually verify some of this without finding someone to inspect you. For example, achievements that you gained on other characters will be visible via the achievements pane in-game and show as acquired even if your current character has not yet completed the achievement. The criteria for the achievement, however, will reflect your current character’s progress.
ANYWAYS! I’ve spoken enough. I hope that answers the question! If there are any other questions, let us know.