Achievements API (Retail — Patch 12.0.0)
Comprehensive reference for achievements, statistics, and criteria APIs.
Source: https://warcraft.wiki.gg/wiki/World_of_Warcraft_API
Current as of: Patch 12.0.0 (Build 65655) — January 28, 2026
Scope: Retail only.
Scope
- Achievement Functions — GetAchievementInfo, criteria, categories
- Statistics — GetStatistic, comparison
- Tracking — Tracked achievements
- Guild Achievements — Guild-specific achievements
Achievement Info
Core Functions
| Function |
Returns |
Description |
GetAchievementInfo(achievementID) |
id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy, isStatistic |
Achievement details |
GetAchievementInfoFromCriteria(criteriaID) |
id, name, points, completed, ... |
Achievement from criteria |
GetAchievementLink(achievementID) |
link |
Achievement hyperlink |
GetAchievementNumRewards(achievementID) |
numRewards |
Reward count |
GetAchievementReward(achievementID, rewardIndex) |
text, type, ... |
Reward info |
GetPreviousAchievement(achievementID) |
prevAchievementID |
Achievement chain prev |
GetNextAchievement(achievementID) |
nextAchievementID |
Achievement chain next |
GetTotalAchievementPoints([isGuild]) |
points |
Total achievement points |
GetComparisonAchievementPoints() |
points |
Compared player's points |
SetAchievementSearchString(searchText) |
numResults |
Search achievements |
GetAchievementSearchSize() |
numResults |
Search result count |
GetAchievementSearchProgress() |
progress |
Search progress |
GetFilteredAchievementID(index) |
achievementID |
Filtered result at index |
Achievement Criteria
| Function |
Returns |
Description |
GetAchievementNumCriteria(achievementID) |
numCriteria |
Number of criteria |
GetAchievementCriteriaInfo(achievementID, criteriaIndex) |
criteriaString, criteriaType, completed, quantity, reqQuantity, charName, flags, assetID, quantityString, criteriaID, eligible, duration, elapsed |
Criteria details |
GetAchievementCriteriaInfoByID(achievementID, criteriaID) |
criteriaString, criteriaType, completed, quantity, reqQuantity, charName, flags, assetID, quantityString, criteriaID, eligible |
Criteria by ID |
Achievement Categories
| Function |
Returns |
Description |
GetCategoryList() |
categoryIDs |
All achievement categories |
GetCategoryInfo(categoryID) |
title, parentCategoryID, flags |
Category info |
GetCategoryNumAchievements(categoryID [, includeAll]) |
numAchievements, numCompleted, numIncomplete |
Category stats |
GetAchievementCategory(achievementID) |
categoryID |
Achievement's category |
Achievement Comparison (Inspect)
| Function |
Returns |
Description |
GetComparisonStatistic(achievementID) |
value |
Compared player's statistic |
ClearAchievementComparisonUnit() |
— |
Clear comparison |
SetAchievementComparisonUnit(unit) |
success |
Set comparison target |
Statistics
| Function |
Returns |
Description |
GetStatistic(achievementID) |
value |
Statistic value (string) |
GetStatisticsCategoryList() |
categoryIDs |
Statistic categories |
GetCategoryAchievementPoints(categoryID, includeAll) |
points, completedPoints |
Category points |
Achievement Tracking
| Function |
Returns |
Description |
GetTrackedAchievements() |
... (achievementIDs) |
All tracked achievements |
GetNumTrackedAchievements() |
numTracked |
Tracked count |
AddTrackedAchievement(achievementID) |
— |
Track achievement |
RemoveTrackedAchievement(achievementID) |
— |
Untrack achievement |
IsTrackedAchievement(achievementID) |
isTracked |
Is tracked? |
Common Patterns
Check Achievement Completion
local function IsAchievementDone(achievementID)
local _, _, _, completed = GetAchievementInfo(achievementID)
return completed
end
Display Achievement Criteria Progress
local function PrintCriteriaProgress(achievementID)
local _, name = GetAchievementInfo(achievementID)
print("Achievement:", name)
local numCriteria = GetAchievementNumCriteria(achievementID)
for i = 1, numCriteria do
local criteriaString, _, completed, quantity, reqQuantity =
GetAchievementCriteriaInfo(achievementID, i)
local status = completed and "DONE" or (quantity .. "/" .. reqQuantity)
print(" ", criteriaString, status)
end
end
Search Achievements
local function SearchAchievements(text)
local numResults = SetAchievementSearchString(text)
local results = {}
for i = 1, GetAchievementSearchSize() do
local achievementID = GetFilteredAchievementID(i)
local _, name, points, completed = GetAchievementInfo(achievementID)
table.insert(results, {id = achievementID, name = name, points = points, done = completed})
end
return results
end
Key Events
| Event |
Payload |
Description |
ACHIEVEMENT_EARNED |
achievementID, alreadyEarned |
Achievement completed |
CRITERIA_EARNED |
achievementID, criteriaString |
Criteria completed |
CRITERIA_UPDATE |
— |
Criteria progress updated |
CRITERIA_COMPLETE |
— |
All criteria complete |
TRACKED_ACHIEVEMENT_LIST_CHANGED |
achievementID, added |
Tracking changed |
TRACKED_ACHIEVEMENT_UPDATE |
achievementID |
Tracked achievement updated |
ACHIEVEMENT_SEARCH_UPDATED |
— |
Search results ready |
INSPECT_ACHIEVEMENT_READY |
guid |
Inspect achievement data ready |
RECEIVED_ACHIEVEMENT_MEMBER_LIST |
achievementID |
Member list received |
Gotchas & Restrictions
- GetAchievementInfo returns 15 values — Destructure carefully. The
completed boolean is the 4th return.
- Guild vs personal — Pass
true as isGuild to GetCategoryNumAchievements() for guild achievements.
- Statistics are strings —
GetStatistic() returns a formatted string, not a number. Parse with tonumber() if needed.
- Criteria index is 1-based — Criteria indices start at 1, up to
GetAchievementNumCriteria().
- Achievement chains — Some achievements are chained (10/25/50 kills etc.). Use
GetPreviousAchievement()/GetNextAchievement().
- Search is async —
SetAchievementSearchString() may not return all results immediately. Wait for ACHIEVEMENT_SEARCH_UPDATED.
- Tracking limit — There's a maximum number of tracked achievements.
- Inspect data — Achievement comparison requires
SetAchievementComparisonUnit() and waiting for INSPECT_ACHIEVEMENT_READY.
1---2name: wow-api-achievements3description: Complete reference for WoW Retail Achievement, Statistics, and Achievement Criteria APIs. Covers C_AchievementInfo, global achievement functions (GetAchievementInfo, GetAchievementCriteriaInfo, GetStatistic, GetComparisonStatistic), achievement categories, guild achievements, achievement links, tracked achievements, toast notifications, and achievement-related events. Use when working with achievement tracking, achievement display, statistics, achievement criteria, guild achievements, or achievement completion detection.4---5
6# Achievements API (Retail — Patch 12.0.0)
7
8Comprehensive reference for achievements, statistics, and criteria APIs.
9
10> **Source:** https://warcraft.wiki.gg/wiki/World_of_Warcraft_API
11> **Current as of:** Patch 12.0.0 (Build 65655) — January 28, 2026
12> **Scope:** Retail only.
13
14---
15
16## Scope
17
18- **Achievement Functions** — GetAchievementInfo, criteria, categories
19- **Statistics** — GetStatistic, comparison
20- **Tracking** — Tracked achievements
21- **Guild Achievements** — Guild-specific achievements
22
23---
24
25## Achievement Info
26
27### Core Functions
28
29| Function | Returns | Description |
30|----------|---------|-------------|
31| `GetAchievementInfo(achievementID)` | `id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy, isStatistic` | Achievement details |
32| `GetAchievementInfoFromCriteria(criteriaID)` | `id, name, points, completed, ...` | Achievement from criteria |
33| `GetAchievementLink(achievementID)` | `link` | Achievement hyperlink |
34| `GetAchievementNumRewards(achievementID)` | `numRewards` | Reward count |
35| `GetAchievementReward(achievementID, rewardIndex)` | `text, type, ...` | Reward info |
36| `GetPreviousAchievement(achievementID)` | `prevAchievementID` | Achievement chain prev |
37| `GetNextAchievement(achievementID)` | `nextAchievementID` | Achievement chain next |
38| `GetTotalAchievementPoints([isGuild])` | `points` | Total achievement points |
39| `GetComparisonAchievementPoints()` | `points` | Compared player's points |
40| `SetAchievementSearchString(searchText)` | `numResults` | Search achievements |
41| `GetAchievementSearchSize()` | `numResults` | Search result count |
42| `GetAchievementSearchProgress()` | `progress` | Search progress |
43| `GetFilteredAchievementID(index)` | `achievementID` | Filtered result at index |
44
45### Achievement Criteria
46
47| Function | Returns | Description |
48|----------|---------|-------------|
49| `GetAchievementNumCriteria(achievementID)` | `numCriteria` | Number of criteria |
50| `GetAchievementCriteriaInfo(achievementID, criteriaIndex)` | `criteriaString, criteriaType, completed, quantity, reqQuantity, charName, flags, assetID, quantityString, criteriaID, eligible, duration, elapsed` | Criteria details |
51| `GetAchievementCriteriaInfoByID(achievementID, criteriaID)` | `criteriaString, criteriaType, completed, quantity, reqQuantity, charName, flags, assetID, quantityString, criteriaID, eligible` | Criteria by ID |
52
53### Achievement Categories
54
55| Function | Returns | Description |
56|----------|---------|-------------|
57| `GetCategoryList()` | `categoryIDs` | All achievement categories |
58| `GetCategoryInfo(categoryID)` | `title, parentCategoryID, flags` | Category info |
59| `GetCategoryNumAchievements(categoryID [, includeAll])` | `numAchievements, numCompleted, numIncomplete` | Category stats |
60| `GetAchievementCategory(achievementID)` | `categoryID` | Achievement's category |
61
62### Achievement Comparison (Inspect)
63
64| Function | Returns | Description |
65|----------|---------|-------------|
66| `GetComparisonStatistic(achievementID)` | `value` | Compared player's statistic |
67| `ClearAchievementComparisonUnit()` | — | Clear comparison |
68| `SetAchievementComparisonUnit(unit)` | `success` | Set comparison target |
69
70---
71
72## Statistics
73
74| Function | Returns | Description |
75|----------|---------|-------------|
76| `GetStatistic(achievementID)` | `value` | Statistic value (string) |
77| `GetStatisticsCategoryList()` | `categoryIDs` | Statistic categories |
78| `GetCategoryAchievementPoints(categoryID, includeAll)` | `points, completedPoints` | Category points |
79
80---
81
82## Achievement Tracking
83
84| Function | Returns | Description |
85|----------|---------|-------------|
86| `GetTrackedAchievements()` | `... (achievementIDs)` | All tracked achievements |
87| `GetNumTrackedAchievements()` | `numTracked` | Tracked count |
88| `AddTrackedAchievement(achievementID)` | — | Track achievement |
89| `RemoveTrackedAchievement(achievementID)` | — | Untrack achievement |
90| `IsTrackedAchievement(achievementID)` | `isTracked` | Is tracked? |
91
92---
93
94## Common Patterns
95
96### Check Achievement Completion
97
98```lua
99local function IsAchievementDone(achievementID)
100 local _, _, _, completed = GetAchievementInfo(achievementID)
101 return completed
102end
103```
104
105### Display Achievement Criteria Progress
106
107```lua
108local function PrintCriteriaProgress(achievementID)
109 local _, name = GetAchievementInfo(achievementID)
110 print("Achievement:", name)
111 local numCriteria = GetAchievementNumCriteria(achievementID)
112 for i = 1, numCriteria do
113 local criteriaString, _, completed, quantity, reqQuantity =
114 GetAchievementCriteriaInfo(achievementID, i)
115 local status = completed and "DONE" or (quantity .. "/" .. reqQuantity)
116 print(" ", criteriaString, status)
117 end
118end
119```
120
121### Search Achievements
122
123```lua
124local function SearchAchievements(text)
125 local numResults = SetAchievementSearchString(text)
126 local results = {}
127 for i = 1, GetAchievementSearchSize() do
128 local achievementID = GetFilteredAchievementID(i)
129 local _, name, points, completed = GetAchievementInfo(achievementID)
130 table.insert(results, {id = achievementID, name = name, points = points, done = completed})
131 end
132 return results
133end
134```
135
136---
137
138## Key Events
139
140| Event | Payload | Description |
141|-------|---------|-------------|
142| `ACHIEVEMENT_EARNED` | achievementID, alreadyEarned | Achievement completed |
143| `CRITERIA_EARNED` | achievementID, criteriaString | Criteria completed |
144| `CRITERIA_UPDATE` | — | Criteria progress updated |
145| `CRITERIA_COMPLETE` | — | All criteria complete |
146| `TRACKED_ACHIEVEMENT_LIST_CHANGED` | achievementID, added | Tracking changed |
147| `TRACKED_ACHIEVEMENT_UPDATE` | achievementID | Tracked achievement updated |
148| `ACHIEVEMENT_SEARCH_UPDATED` | — | Search results ready |
149| `INSPECT_ACHIEVEMENT_READY` | guid | Inspect achievement data ready |
150| `RECEIVED_ACHIEVEMENT_MEMBER_LIST` | achievementID | Member list received |
151
152---
153
154## Gotchas & Restrictions
155
1561. **GetAchievementInfo returns 15 values** — Destructure carefully. The `completed` boolean is the 4th return.
1572. **Guild vs personal** — Pass `true` as `isGuild` to `GetCategoryNumAchievements()` for guild achievements.
1583. **Statistics are strings** — `GetStatistic()` returns a formatted string, not a number. Parse with `tonumber()` if needed.
1594. **Criteria index is 1-based** — Criteria indices start at 1, up to `GetAchievementNumCriteria()`.
1605. **Achievement chains** — Some achievements are chained (10/25/50 kills etc.). Use `GetPreviousAchievement()`/`GetNextAchievement()`.
1616. **Search is async** — `SetAchievementSearchString()` may not return all results immediately. Wait for `ACHIEVEMENT_SEARCH_UPDATED`.
1627. **Tracking limit** — There's a maximum number of tracked achievements.
1638. **Inspect data** — Achievement comparison requires `SetAchievementComparisonUnit()` and waiting for `INSPECT_ACHIEVEMENT_READY`.