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. Use when this capability is needed.4---56# Quest API (Retail — Patch 12.0.0)78Comprehensive reference for all quest-related APIs in WoW Retail.910> **Source:** https://warcraft.wiki.gg/wiki/World_of_Warcraft_API11> **Current as of:** Patch 12.0.0 (Build 65655) — January 28, 202612> **Scope:** Retail only.1314---1516## Scope1718- **C_QuestLog** — Quest log management, tracking, completion, objectives19- **C_QuestInfoSystem** — Quest type/tag info, quest classification20- **C_QuestOffer** — Quest accept/decline/complete flows21- **C_QuestSession** — Party sync quest sessions22- **C_QuestTaskInfo** — Bonus objectives, world quests23- **C_ContentTracking** — Content tracking system24- **C_CampaignInfo** — Campaign (story chapter) tracking25- **C_QuestHubUI** — Quest hub display26- **C_QuestLineUI** — Quest line (chain) info27- **C_QuestItemUse** — Quest item use tracking28- **Quest POI** — POI data for quest objectives29- **Quest Gossip** — NPC gossip quest interaction3031---3233## C_QuestLog — Quest Log3435### Quest State & Info3637| 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 |5354### Quest Completion & Tracking5556| 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? |7374### Quest Tracking7576| 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 |8485### Quest Objectives8687| 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 % |9293### Quest Actions9495| 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 |106107### Quest Rewards (from quest log)108109| 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 |118119---120121## C_QuestInfoSystem122123| 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? |130131---132133## C_QuestOffer — Quest Accept/Decline134135| 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? |154155---156157## C_QuestSession — Party Sync158159| 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 |169170---171172## C_QuestTaskInfo — Bonus Objectives / World Quests173174| 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? |184185---186187## C_CampaignInfo — Campaigns188189| 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? |200201---202203## C_QuestLineUI — Quest Lines204205| 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 |212213---214215## C_ContentTracking216217| 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 |226227---228229## Quest POI Functions230231| 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 |236237---238239## Common Patterns240241### Iterate Quest Log242243```lua244local numEntries, numQuests = C_QuestLog.GetNumQuestLogEntries()245for i = 1, numEntries do246 local info = C_QuestLog.GetInfo(i)247 if info and not info.isHeader then248 local questID = info.questID249 local title = info.title250 local isComplete = C_QuestLog.IsComplete(questID)251 print(title, isComplete and "(Complete)" or "")252 end253end254```255256### Track/Untrack Quest257258```lua259local function ToggleQuestWatch(questID)260 if C_QuestLog.IsQuestWatched(questID) then261 C_QuestLog.RemoveQuestWatch(questID)262 else263 C_QuestLog.AddQuestWatch(questID, Enum.QuestWatchType.Automatic)264 end265end266```267268### World Quests on Map269270```lua271local function GetWorldQuestsOnMap(uiMapID)272 local quests = C_TaskQuest.GetQuestsForPlayerByMapID(uiMapID)273 if quests then274 for _, quest in ipairs(quests) do275 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 end279 end280end281```282283### Quest Completion Event Handling284285```lua286local 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" then292 local questID, xpReward, moneyReward = ...293 print("Completed quest:", C_QuestLog.GetTitleForQuestID(questID))294 elseif event == "QUEST_ACCEPTED" then295 local questID = ...296 print("Accepted quest:", C_QuestLog.GetTitleForQuestID(questID))297 elseif event == "QUEST_REMOVED" then298 local questID, wasReplayQuest = ...299 print("Quest removed:", questID)300 end301end)302```303304---305306## Key Events307308| 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 |330331---332333## Gotchas & Restrictions3343351. **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.343344---345> Converted and distributed by [TomeVault](https://tomevault.io/claim/jburlison) — claim your Tome and manage your conversions.346<!-- tomevault:4.0:skill_md:2026-04-13 -->