1---2name: wow-api-quests3description: Complete reference for WoW Retail Quest, Quest Log, Quest Info, Quest Offer, Quest Session, Quest Task, Campaign, Content Tracking, Quest Hub, and Quest Line APIs. Covers C_QuestLog (70+ functions for quest state, objectives, tracking, completion), C_QuestInfoSystem (quest type/tag info), C_QuestOffer (quest accept/decline), C_QuestSession (party sync quests), C_QuestTaskInfo (bonus objectives/world quests), C_ContentTracking, C_CampaignInfo, C_QuestHubUI, C_QuestLineUI, C_QuestItemUse, C_WarCampaign (legacy), quest POI functions, and quest gossip patterns. Use when working with quest tracking, quest log display, quest objectives, quest accept/complete flows, world quests, campaign progress, bonus objectives, or content tracking systems.4---5
6# Quest API (Retail — Patch 12.0.0)
7
8Comprehensive reference for all quest-related APIs in WoW Retail.
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- **C_QuestLog** — Quest log management, tracking, completion, objectives
19- **C_QuestInfoSystem** — Quest type/tag info, quest classification
20- **C_QuestOffer** — Quest accept/decline/complete flows
21- **C_QuestSession** — Party sync quest sessions
22- **C_QuestTaskInfo** — Bonus objectives, world quests
23- **C_ContentTracking** — Content tracking system
24- **C_CampaignInfo** — Campaign (story chapter) tracking
25- **C_QuestHubUI** — Quest hub display
26- **C_QuestLineUI** — Quest line (chain) info
27- **C_QuestItemUse** — Quest item use tracking
28- **Quest POI** — POI data for quest objectives
29- **Quest Gossip** — NPC gossip quest interaction
30
31---
32
33## C_QuestLog — Quest Log
34
35### Quest State & Info
36
37| Function | Returns | Description |
38|----------|---------|-------------|
39| `C_QuestLog.GetNumQuestLogEntries()` | `numEntries, numQuests` | Number of quest log entries |
40| `C_QuestLog.GetInfo(questLogIndex)` | `info` | Quest info at log index |
41| `C_QuestLog.GetQuestIDForLogIndex(questLogIndex)` | `questID` | Quest ID at index |
42| `C_QuestLog.GetLogIndexForQuestID(questID)` | `questLogIndex` | Log index for quest |
43| `C_QuestLog.GetTitleForQuestID(questID)` | `title` | Quest title |
44| `C_QuestLog.GetQuestTagInfo(questID)` | `tagInfo` | Quality, frequency, tag |
45| `C_QuestLog.GetQuestType(questID)` | `questType` | Quest type enum |
46| `C_QuestLog.GetQuestDifficultyLevel(questID)` | `level` | Suggested level |
47| `C_QuestLog.GetRequiredMoney(questID)` | `money` | Money required |
48| `C_QuestLog.GetSuggestedGroupSize(questID)` | `groupSize` | Suggested group size |
49| `C_QuestLog.GetTimeAllowed(questID)` | `totalTime, elapsedTime` | Timed quest info |
50| `C_QuestLog.GetZoneStoryInfo(uiMapID)` | `storyInfo` | Zone story progress |
51| `C_QuestLog.GetMapForQuestPOIs()` | `uiMapID` | Map with quest POIs |
52| `C_QuestLog.GetQuestAdditionalHighlights(questID)` | `highlights` | Additional highlight info |
53
54### Quest Completion & Tracking
55
56| Function | Returns | Description |
57|----------|---------|-------------|
58| `C_QuestLog.IsComplete(questID)` | `isComplete` | Is quest complete? |
59| `C_QuestLog.IsFailed(questID)` | `isFailed` | Has quest failed? |
60| `C_QuestLog.IsOnQuest(questID)` | `isOnQuest` | Is quest in log? |
61| `C_QuestLog.IsQuestCalling(questID)` | `isCalling` | Is it a calling? |
62| `C_QuestLog.IsQuestDisabledForSession(questID)` | `isDisabled` | Disabled for session? |
63| `C_QuestLog.IsQuestFlaggedCompleted(questID)` | `isCompleted` | Flagged completed (ever)? |
64| `C_QuestLog.IsQuestReplayable(questID)` | `isReplayable` | Can be replayed? |
65| `C_QuestLog.IsQuestReplayedRecently(questID)` | `isRecent` | Replayed recently? |
66| `C_QuestLog.IsQuestTrivial(questID)` | `isTrivial` | Below player level? |
67| `C_QuestLog.IsRepeatableQuest(questID)` | `isRepeatable` | Is repeatable? |
68| `C_QuestLog.IsWorldQuest(questID)` | `isWorldQuest` | Is a world quest? |
69| `C_QuestLog.IsQuestBounty(questID)` | `isBounty` | Is an emissary/bounty? |
70| `C_QuestLog.IsImportantQuest(questID)` | `isImportant` | Is important (landmark)? |
71| `C_QuestLog.IsLegendaryQuest(questID)` | `isLegendary` | Is legendary? |
72| `C_QuestLog.ReadyForTurnIn(questID)` | `ready` | Ready to turn in? |
73
74### Quest Tracking
75
76| Function | Returns | Description |
77|----------|---------|-------------|
78| `C_QuestLog.GetNumQuestWatches()` | `numWatches` | Number of tracked quests |
79| `C_QuestLog.GetQuestWatchType(questID)` | `watchType` | How quest is tracked |
80| `C_QuestLog.AddQuestWatch(questID [, watchType])` | `wasWatched` | Track a quest |
81| `C_QuestLog.RemoveQuestWatch(questID)` | `wasRemoved` | Untrack a quest |
82| `C_QuestLog.IsQuestWatched(questID)` | `isWatched` | Is quest tracked? |
83| `C_QuestLog.GetQuestIDForQuestWatchIndex(watchIndex)` | `questID` | Quest at watch index |
84
85### Quest Objectives
86
87| Function | Returns | Description |
88|----------|---------|-------------|
89| `C_QuestLog.GetNumQuestObjectives(questID)` | `numObjectives` | Number of objectives |
90| `C_QuestLog.GetQuestObjectives(questID)` | `objectives` | All objectives data |
91| `C_QuestLog.GetQuestProgressBarPercent(questID)` | `percent` | Progress bar % |
92
93### Quest Actions
94
95| Function | Returns | Description |
96|----------|---------|-------------|
97| `C_QuestLog.AbandonQuest()` | — | Abandon selected quest |
98| `C_QuestLog.SetSelectedQuest(questID)` | — | Select quest in log |
99| `C_QuestLog.GetSelectedQuest()` | `questID` | Currently selected quest |
100| `C_QuestLog.SetAbandonQuest(questID)` | — | Prepare to abandon |
101| `C_QuestLog.RequestLoadQuestByID(questID)` | — | Request quest data load |
102| `C_QuestLog.ShouldShowQuestRewards(questID)` | `shouldShow` | Show rewards? |
103| `C_QuestLog.GetNextWaypoint(questID)` | `mapID, x, y` | Next waypoint |
104| `C_QuestLog.GetNextWaypointForMap(questID, uiMapID)` | `x, y` | Waypoint on map |
105| `C_QuestLog.GetNextWaypointText(questID)` | `waypointText` | Waypoint text |
106
107### Quest Rewards (from quest log)
108
109| Function | Returns | Description |
110|----------|---------|-------------|
111| `GetNumQuestLogRewards(questID)` | `numRewards` | Number of item rewards |
112| `GetQuestLogRewardInfo(rewardIndex, questID)` | `name, texture, count, quality, isUsable, itemID, itemLevel` | Reward item info |
113| `GetQuestLogRewardMoney(questID)` | `money` | Money reward |
114| `GetQuestLogRewardXP(questID)` | `xp` | XP reward |
115| `GetQuestLogRewardCurrencies(questID)` | `currencies` | Currency rewards |
116| `GetQuestLogRewardSpell(rewardIndex, questID)` | `texture, name, isTradeskillSpell, isSpellLearned, hideSpellLearnText, isBoostSpell, garrFollowerID, genericUnlock, spellID` | Spell reward |
117| `GetNumQuestLogRewardSpells(questID)` | `numSpells` | Number of spell rewards |
118
119---
120
121## C_QuestInfoSystem
122
123| Function | Returns | Description |
124|----------|---------|-------------|
125| `C_QuestInfoSystem.GetQuestRewardCurrencies(questID)` | `currencies` | Quest reward currencies |
126| `C_QuestInfoSystem.GetQuestRewardSpells(questID)` | `spellRewards` | Quest reward spells |
127| `C_QuestInfoSystem.GetQuestShouldToastCompletion(questID)` | `shouldToast` | Show completion toast? |
128| `C_QuestInfoSystem.HasQuestRewardCurrencies(questID)` | `hasCurrencies` | Has currency rewards? |
129| `C_QuestInfoSystem.HasQuestRewardSpells(questID)` | `hasSpells` | Has spell rewards? |
130
131---
132
133## C_QuestOffer — Quest Accept/Decline
134
135| Function | Returns | Description |
136|----------|---------|-------------|
137| `AcceptQuest()` | — | Accept the offered quest |
138| `DeclineQuest()` | — | Decline the offered quest |
139| `CompleteQuest()` | — | Complete quest at NPC |
140| `GetQuestReward(rewardIndex)` | — | Choose reward item |
141| `GetGreetingText()` | `text` | NPC greeting text |
142| `GetObjectiveText()` | `text` | Quest objective text |
143| `GetQuestText()` | `text` | Quest description text |
144| `GetRewardText()` | `text` | Reward text |
145| `GetProgressText()` | `text` | Turn-in progress text |
146| `GetTitleText()` | `title` | Quest title |
147| `GetNumQuestChoices()` | `numChoices` | Reward choices count |
148| `GetNumQuestRewards()` | `numRewards` | Fixed rewards count |
149| `GetQuestItemInfo(itemType, index)` | `name, texture, count, quality, isUsable, itemID` | Quest item info |
150| `GetQuestItemLink(itemType, index)` | `link` | Item link |
151| `GetNumQuestItems()` | `numItems` | Required items count |
152| `IsQuestCompletable()` | `isCompletable` | Can turn in? |
153| `QuestGetAutoAccept()` | `isAutoAccept` | Auto-accepted quest? |
154
155---
156
157## C_QuestSession — Party Sync
158
159| Function | Returns | Description |
160|----------|---------|-------------|
161| `C_QuestSession.Exists()` | `exists` | In a quest session? |
162| `C_QuestSession.GetAvailableSessionCommand()` | `command` | Available session command |
163| `C_QuestSession.GetSessionBeginDetails()` | `details` | Session begin details |
164| `C_QuestSession.GetSuperTrackedQuest()` | `questID` | Super tracked quest |
165| `C_QuestSession.HasJoined()` | `hasJoined` | Has joined session? |
166| `C_QuestSession.RequestSessionStart()` | — | Start quest session |
167| `C_QuestSession.RequestSessionStop()` | — | Stop quest session |
168| `C_QuestSession.SendSessionBeginResponse(accept)` | — | Respond to session invite |
169
170---
171
172## C_QuestTaskInfo — Bonus Objectives / World Quests
173
174| Function | Returns | Description |
175|----------|---------|-------------|
176| `C_TaskQuest.GetQuestsForPlayerByMapID(uiMapID)` | `quests` | World quests on map |
177| `C_TaskQuest.GetQuestInfoByQuestID(questID)` | `title, factionID, capped, displayAsObjective` | Task quest info |
178| `C_TaskQuest.GetQuestProgressBarInfo(questID)` | `progress` | Progress bar data |
179| `C_TaskQuest.GetQuestTimeLeftMinutes(questID)` | `minutesLeft` | Time remaining |
180| `C_TaskQuest.GetQuestTimeLeftSeconds(questID)` | `secondsLeft` | Time remaining (seconds) |
181| `C_TaskQuest.GetQuestZoneID(questID)` | `zoneID` | Zone for task quest |
182| `C_TaskQuest.IsActive(questID)` | `isActive` | Is task quest active? |
183| `C_TaskQuest.DoesMapShowTaskQuestObjectives(uiMapID)` | `showsObjectives` | Does map show objectives? |
184
185---
186
187## C_CampaignInfo — Campaigns
188
189| Function | Returns | Description |
190|----------|---------|-------------|
191| `C_CampaignInfo.GetAvailableCampaigns()` | `campaignIDs` | Available campaigns |
192| `C_CampaignInfo.GetCampaignID(questID)` | `campaignID` | Campaign for quest |
193| `C_CampaignInfo.GetCampaignInfo(campaignID)` | `info` | Campaign info |
194| `C_CampaignInfo.GetChapterIDs(campaignID)` | `chapterIDs` | Campaign chapters |
195| `C_CampaignInfo.GetChapterInfo(chapterID)` | `info` | Chapter info |
196| `C_CampaignInfo.GetCurrentChapterID(campaignID)` | `chapterID` | Current chapter |
197| `C_CampaignInfo.GetState(campaignID)` | `state` | Campaign state |
198| `C_CampaignInfo.IsCampaignQuest(questID)` | `isCampaign` | Is quest a campaign quest? |
199| `C_CampaignInfo.UsesNormalQuestIcons(campaignID)` | `usesNormal` | Uses normal icons? |
200
201---
202
203## C_QuestLineUI — Quest Lines
204
205| Function | Returns | Description |
206|----------|---------|-------------|
207| `C_QuestLineUI.GetAvailableQuestLineQuests(textFilter, uiMapID)` | `quests` | Available quest line quests |
208| `C_QuestLineUI.GetQuestLineInfo(questID, uiMapID)` | `questLineInfo` | Quest line info |
209| `C_QuestLineUI.GetQuestLineQuests(questLineID)` | `questIDs` | All quests in line |
210| `C_QuestLineUI.IsComplete(questLineID)` | `isComplete` | Is quest line done? |
211| `C_QuestLineUI.RequestQuestLinesForMap(uiMapID)` | — | Request quest line data |
212
213---
214
215## C_ContentTracking
216
217| Function | Returns | Description |
218|----------|---------|-------------|
219| `C_ContentTracking.GetCurrentTrackingTarget(trackableType)` | `targetType, targetID` | Current tracked target |
220| `C_ContentTracking.GetObjectiveText(trackableType, trackableID)` | `text` | Objective text |
221| `C_ContentTracking.GetTitle(trackableType, trackableID)` | `title` | Tracking title |
222| `C_ContentTracking.GetTrackedIDs(trackableType)` | `trackableIDs` | All tracked IDs |
223| `C_ContentTracking.IsTracking(trackableType, trackableID)` | `isTracking` | Is it tracked? |
224| `C_ContentTracking.SetTracked(trackableType, trackableID, tracked)` | — | Set tracking |
225| `C_ContentTracking.StopTracking(trackableType, trackableID)` | — | Stop tracking |
226
227---
228
229## Quest POI Functions
230
231| Function | Returns | Description |
232|----------|---------|-------------|
233| `C_QuestLog.GetQuestPOIs()` | — | Request quest POI data |
234| `QuestPOIGetIconInfo(questID)` | `completed, posX, posY, objective` | POI icon position |
235| `QuestPOI_FindButton(parent, questID)` | `button` | Find POI button |
236
237---
238
239## Common Patterns
240
241### Iterate Quest Log
242
243```lua
244local numEntries, numQuests = C_QuestLog.GetNumQuestLogEntries()
245for i = 1, numEntries do
246 local info = C_QuestLog.GetInfo(i)
247 if info and not info.isHeader then
248 local questID = info.questID
249 local title = info.title
250 local isComplete = C_QuestLog.IsComplete(questID)
251 print(title, isComplete and "(Complete)" or "")
252 end
253end
254```
255
256### Track/Untrack Quest
257
258```lua
259local function ToggleQuestWatch(questID)
260 if C_QuestLog.IsQuestWatched(questID) then
261 C_QuestLog.RemoveQuestWatch(questID)
262 else
263 C_QuestLog.AddQuestWatch(questID, Enum.QuestWatchType.Automatic)
264 end
265end
266```
267
268### World Quests on Map
269
270```lua
271local function GetWorldQuestsOnMap(uiMapID)
272 local quests = C_TaskQuest.GetQuestsForPlayerByMapID(uiMapID)
273 if quests then
274 for _, quest in ipairs(quests) do
275 local title = C_TaskQuest.GetQuestInfoByQuestID(quest.questId)
276 local timeLeft = C_TaskQuest.GetQuestTimeLeftMinutes(quest.questId)
277 print(title, timeLeft and (timeLeft .. " min left") or "")
278 end
279 end
280end
281```
282
283### Quest Completion Event Handling
284
285```lua
286local frame = CreateFrame("Frame")
287frame:RegisterEvent("QUEST_TURNED_IN")
288frame:RegisterEvent("QUEST_ACCEPTED")
289frame:RegisterEvent("QUEST_REMOVED")
290frame:SetScript("OnEvent", function(self, event, ...)
291 if event == "QUEST_TURNED_IN" then
292 local questID, xpReward, moneyReward = ...
293 print("Completed quest:", C_QuestLog.GetTitleForQuestID(questID))
294 elseif event == "QUEST_ACCEPTED" then
295 local questID = ...
296 print("Accepted quest:", C_QuestLog.GetTitleForQuestID(questID))
297 elseif event == "QUEST_REMOVED" then
298 local questID, wasReplayQuest = ...
299 print("Quest removed:", questID)
300 end
301end)
302```
303
304---
305
306## Key Events
307
308| Event | Payload | Description |
309|-------|---------|-------------|
310| `QUEST_ACCEPTED` | questID | Quest accepted |
311| `QUEST_TURNED_IN` | questID, xpReward, moneyReward | Quest turned in |
312| `QUEST_REMOVED` | questID, wasReplayQuest | Quest removed from log |
313| `QUEST_LOG_UPDATE` | — | Quest log changed |
314| `QUEST_WATCH_LIST_CHANGED` | questID, added | Tracking changed |
315| `QUEST_AUTOCOMPLETE` | questID | Quest auto-completed |
316| `QUEST_COMPLETE` | — | At NPC to complete quest |
317| `QUEST_DETAIL` | questStartItemID | Quest detail shown |
318| `QUEST_FINISHED` | — | Quest dialog closed |
319| `QUEST_GREETING` | — | NPC greeting with quests |
320| `QUEST_PROGRESS` | — | Quest turn-in progress |
321| `QUEST_SESSION_CREATED` | — | Quest session created |
322| `QUEST_SESSION_DESTROYED` | — | Quest session ended |
323| `QUEST_SESSION_JOINED` | — | Joined quest session |
324| `QUEST_SESSION_LEFT` | — | Left quest session |
325| `QUEST_SESSION_MEMBER_CONFIRM` | — | Member confirmed session |
326| `QUEST_POI_UPDATE` | — | Quest POI data changed |
327| `TASK_PROGRESS_UPDATE` | — | Bonus objective/WQ progress |
328| `WORLD_QUEST_COMPLETED_BY_SPELL` | questID | WQ completed by spell |
329| `QUEST_DATA_LOAD_RESULT` | questID, success | RequestLoadQuestByID result |
330
331---
332
333## Gotchas & Restrictions
334
3351. **Quest data may not be loaded** — Call `C_QuestLog.RequestLoadQuestByID(questID)` and wait for `QUEST_DATA_LOAD_RESULT` before accessing quest info for quests not in the log.
3362. **GetInfo returns headers** — Quest log entries include headers (zones). Check `info.isHeader` to filter.
3373. **Quest watch limit** — There's a maximum number of tracked quests. `AddQuestWatch()` returns false if at limit.
3384. **Auto-accept quests** — Some quests auto-accept. Check `QuestGetAutoAccept()` to handle gracefully.
3395. **World quest vs regular** — World quests use `C_TaskQuest` functions, not `C_QuestLog` for map display.
3406. **Quest gossip flow** — Quest accept flow: `QUEST_GREETING` → `QUEST_DETAIL` → `AcceptQuest()` → `QUEST_ACCEPTED`.
3417. **Campaign quests** — Use `C_CampaignInfo.IsCampaignQuest()` to identify story quests.
3428. **Objective data** — `GetQuestObjectives()` returns a table with `text`, `type`, `finished`, `numFulfilled`, `numRequired` per objective.