Steam Achievements API - How to get achievement unlocking date?

Akki picture Akki · May 12, 2014 · Viewed 7k times · Source

Is this possible to get achievement unlocking date in Steam Acheivements API? I have read a bunch of documentation, but found no mention of this.

Answer

Andy picture Andy · May 13, 2014

The answer to this is yes it is possible, but you have to use the old XML API, not the newer web API and it has to be a "newer" achievement.

The old style URL looks like this

http://steamcommunity.com/id/<profilename>/stats/<appid>/achievements/?xml=1

OR

http://steamcommunity.com/profiles/<profileid>/stats/<appid>/achievements/?xml=1

A couple notes at this point:

  • <profilename> is the unique URL name selected by the user. The <profileid> is the unique 64 bit number assigned by Valve
  • <appid> is the numerical app id. I assume you know how to find this, correct?

If you pull the XML from that link you end up with a structure that looks like this:

playerstats
  game
  player
  stats
  achievements
    achievement
      iconClosed
      iconOpened
      name
      apiname
      description
      unlockTimestamp

An important note: unlockTimestamp is not always available. Without digging into it to much, it appears this was added much later in the case of older games (ie. TF2). Thus, you have some of the original achievements that return data similar to this:

<achievement closed="1">
  <iconClosed>http://media.steampowered.com/steamcommunity/public/images/apps/440/tf_play_game_everyclass.jpg</iconClosed>
  <iconOpen>http://media.steampowered.com/steamcommunity/public/images/apps/440/tf_play_game_everyclass_bw.jpg</iconOpen>
  <name>Head of the Class</name>
  <apiname>tf_play_game_everyclass</apiname>
  <description>Play a complete round with every class.</description>
</achievement>

Versus newer achievements that look like this:

<achievement closed="1">
  <iconClosed>http://media.steampowered.com/steamcommunity/public/images/apps/440/bb590c7ca44dfc7eb6a31abb39fae07c47502ac7.jpg</iconClosed>
  <iconOpen>http://media.steampowered.com/steamcommunity/public/images/apps/440/4f244b30a76e9de5287a82cc3829c7930baa38c7.jpg</iconOpen>
  <name>Got A Light?</name>
  <apiname>tf_pyro_burn_spy_taunt</apiname>
  <description>Ignite an enemy Spy while he's flicking a cigarette.</description>
  <unlockTimestamp>1301887931</unlockTimestamp>
</achievement>

If a player hasn't earned an achievement yet, then the closed attribute on the achievement node will equal 0, and the returned data will look similar to the older achievements (without the unlockTimestamp)

<achievement closed="0">
  <iconClosed>http://media.steampowered.com/steamcommunity/public/images/apps/440/957daad8f6b9f237620e0326f38cbf941c60a9d1.jpg</iconClosed>
  <iconOpen>http://media.steampowered.com/steamcommunity/public/images/apps/440/34b787ce4e47ef0e206ecd52626b053da13e18c4.jpg</iconOpen>
  <name>Krazy Ivan</name>
  <apiname>tf_heavy_kill_underwater</apiname>
  <description>Kill 50 enemies while both you and your victim are underwater.</description>
</achievement>

In the above XML structure, the achievement node will repeat for each achievement that is available for the selected game.