--- frontmattername: wow-api-quests
description: "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."
Quest API (Retail — Patch 12.0.0)
Comprehensive reference for all quest-related APIs in WoW Retail.
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
- •C_QuestLog — Quest log management, tracking, completion, objectives
- •C_QuestInfoSystem — Quest type/tag info, quest classification
- •C_QuestOffer — Quest accept/decline/complete flows
- •C_QuestSession — Party sync quest sessions
- •C_QuestTaskInfo — Bonus objectives, world quests
- •C_ContentTracking — Content tracking system
- •C_CampaignInfo — Campaign (story chapter) tracking
- •C_QuestHubUI — Quest hub display
- •C_QuestLineUI — Quest line (chain) info
- •C_QuestItemUse — Quest item use tracking
- •Quest POI — POI data for quest objectives
- •Quest Gossip — NPC gossip quest interaction
C_QuestLog — Quest Log
Quest State & Info
| Function | Returns | Description |
|---|
C_QuestLog.GetNumQuestLogEntries() | numEntries, numQuests | Number of quest log entries |
C_QuestLog.GetInfo(questLogIndex) | info | Quest info at log index |
C_QuestLog.GetQuestIDForLogIndex(questLogIndex) | questID | Quest ID at index |
C_QuestLog.GetLogIndexForQuestID(questID) | questLogIndex | Log index for quest |
C_QuestLog.GetTitleForQuestID(questID) | title | Quest title |
C_QuestLog.GetQuestTagInfo(questID) | tagInfo | Quality, frequency, tag |
C_QuestLog.GetQuestType(questID) | questType | Quest type enum |
C_QuestLog.GetQuestDifficultyLevel(questID) | level | Suggested level |
C_QuestLog.GetRequiredMoney(questID) | money | Money required |
C_QuestLog.GetSuggestedGroupSize(questID) | groupSize | Suggested group size |
C_QuestLog.GetTimeAllowed(questID) | totalTime, elapsedTime | Timed quest info |
C_QuestLog.GetZoneStoryInfo(uiMapID) | storyInfo | Zone story progress |
C_QuestLog.GetMapForQuestPOIs() | uiMapID | Map with quest POIs |
C_QuestLog.GetQuestAdditionalHighlights(questID) | highlights | Additional highlight info |
Quest Completion & Tracking
| Function | Returns | Description |
|---|
C_QuestLog.IsComplete(questID) | isComplete | Is quest complete? |
C_QuestLog.IsFailed(questID) | isFailed | Has quest failed? |
C_QuestLog.IsOnQuest(questID) | isOnQuest | Is quest in log? |
C_QuestLog.IsQuestCalling(questID) | isCalling | Is it a calling? |
C_QuestLog.IsQuestDisabledForSession(questID) | isDisabled | Disabled for session? |
C_QuestLog.IsQuestFlaggedCompleted(questID) | isCompleted | Flagged completed (ever)? |
C_QuestLog.IsQuestReplayable(questID) | isReplayable | Can be replayed? |
C_QuestLog.IsQuestReplayedRecently(questID) | isRecent | Replayed recently? |
C_QuestLog.IsQuestTrivial(questID) | isTrivial | Below player level? |
C_QuestLog.IsRepeatableQuest(questID) | isRepeatable | Is repeatable? |
C_QuestLog.IsWorldQuest(questID) | isWorldQuest | Is a world quest? |
C_QuestLog.IsQuestBounty(questID) | isBounty | Is an emissary/bounty? |
C_QuestLog.IsImportantQuest(questID) | isImportant | Is important (landmark)? |
C_QuestLog.IsLegendaryQuest(questID) | isLegendary | Is legendary? |
C_QuestLog.ReadyForTurnIn(questID) | ready | Ready to turn in? |
Quest Tracking
| Function | Returns | Description |
|---|
C_QuestLog.GetNumQuestWatches() | numWatches | Number of tracked quests |
C_QuestLog.GetQuestWatchType(questID) | watchType | How quest is tracked |
C_QuestLog.AddQuestWatch(questID [, watchType]) | wasWatched | Track a quest |
C_QuestLog.RemoveQuestWatch(questID) | wasRemoved | Untrack a quest |
C_QuestLog.IsQuestWatched(questID) | isWatched | Is quest tracked? |
C_QuestLog.GetQuestIDForQuestWatchIndex(watchIndex) | questID | Quest at watch index |
Quest Objectives
| Function | Returns | Description |
|---|
C_QuestLog.GetNumQuestObjectives(questID) | numObjectives | Number of objectives |
C_QuestLog.GetQuestObjectives(questID) | objectives | All objectives data |
C_QuestLog.GetQuestProgressBarPercent(questID) | percent | Progress bar % |
Quest Actions
| Function | Returns | Description |
|---|
C_QuestLog.AbandonQuest() | — | Abandon selected quest |
C_QuestLog.SetSelectedQuest(questID) | — | Select quest in log |
C_QuestLog.GetSelectedQuest() | questID | Currently selected quest |
C_QuestLog.SetAbandonQuest(questID) | — | Prepare to abandon |
C_QuestLog.RequestLoadQuestByID(questID) | — | Request quest data load |
C_QuestLog.ShouldShowQuestRewards(questID) | shouldShow | Show rewards? |
C_QuestLog.GetNextWaypoint(questID) | mapID, x, y | Next waypoint |
C_QuestLog.GetNextWaypointForMap(questID, uiMapID) | x, y | Waypoint on map |
C_QuestLog.GetNextWaypointText(questID) | waypointText | Waypoint text |
Quest Rewards (from quest log)
| Function | Returns | Description |
|---|
GetNumQuestLogRewards(questID) | numRewards | Number of item rewards |
GetQuestLogRewardInfo(rewardIndex, questID) | name, texture, count, quality, isUsable, itemID, itemLevel | Reward item info |
GetQuestLogRewardMoney(questID) | money | Money reward |
GetQuestLogRewardXP(questID) | xp | XP reward |
GetQuestLogRewardCurrencies(questID) | currencies | Currency rewards |
GetQuestLogRewardSpell(rewardIndex, questID) | texture, name, isTradeskillSpell, isSpellLearned, hideSpellLearnText, isBoostSpell, garrFollowerID, genericUnlock, spellID | Spell reward |
GetNumQuestLogRewardSpells(questID) | numSpells | Number of spell rewards |
C_QuestInfoSystem
| Function | Returns | Description |
|---|
C_QuestInfoSystem.GetQuestRewardCurrencies(questID) | currencies | Quest reward currencies |
C_QuestInfoSystem.GetQuestRewardSpells(questID) | spellRewards | Quest reward spells |
C_QuestInfoSystem.GetQuestShouldToastCompletion(questID) | shouldToast | Show completion toast? |
C_QuestInfoSystem.HasQuestRewardCurrencies(questID) | hasCurrencies | Has currency rewards? |
C_QuestInfoSystem.HasQuestRewardSpells(questID) | hasSpells | Has spell rewards? |
C_QuestOffer — Quest Accept/Decline
| Function | Returns | Description |
|---|
AcceptQuest() | — | Accept the offered quest |
DeclineQuest() | — | Decline the offered quest |
CompleteQuest() | — | Complete quest at NPC |
GetQuestReward(rewardIndex) | — | Choose reward item |
GetGreetingText() | text | NPC greeting text |
GetObjectiveText() | text | Quest objective text |
GetQuestText() | text | Quest description text |
GetRewardText() | text | Reward text |
GetProgressText() | text | Turn-in progress text |
GetTitleText() | title | Quest title |
GetNumQuestChoices() | numChoices | Reward choices count |
GetNumQuestRewards() | numRewards | Fixed rewards count |
GetQuestItemInfo(itemType, index) | name, texture, count, quality, isUsable, itemID | Quest item info |
GetQuestItemLink(itemType, index) | link | Item link |
GetNumQuestItems() | numItems | Required items count |
IsQuestCompletable() | isCompletable | Can turn in? |
QuestGetAutoAccept() | isAutoAccept | Auto-accepted quest? |
C_QuestSession — Party Sync
| Function | Returns | Description |
|---|
C_QuestSession.Exists() | exists | In a quest session? |
C_QuestSession.GetAvailableSessionCommand() | command | Available session command |
C_QuestSession.GetSessionBeginDetails() | details | Session begin details |
C_QuestSession.GetSuperTrackedQuest() | questID | Super tracked quest |
C_QuestSession.HasJoined() | hasJoined | Has joined session? |
C_QuestSession.RequestSessionStart() | — | Start quest session |
C_QuestSession.RequestSessionStop() | — | Stop quest session |
C_QuestSession.SendSessionBeginResponse(accept) | — | Respond to session invite |
C_QuestTaskInfo — Bonus Objectives / World Quests
| Function | Returns | Description |
|---|
C_TaskQuest.GetQuestsForPlayerByMapID(uiMapID) | quests | World quests on map |
C_TaskQuest.GetQuestInfoByQuestID(questID) | title, factionID, capped, displayAsObjective | Task quest info |
C_TaskQuest.GetQuestProgressBarInfo(questID) | progress | Progress bar data |
C_TaskQuest.GetQuestTimeLeftMinutes(questID) | minutesLeft | Time remaining |
C_TaskQuest.GetQuestTimeLeftSeconds(questID) | secondsLeft | Time remaining (seconds) |
C_TaskQuest.GetQuestZoneID(questID) | zoneID | Zone for task quest |
C_TaskQuest.IsActive(questID) | isActive | Is task quest active? |
C_TaskQuest.DoesMapShowTaskQuestObjectives(uiMapID) | showsObjectives | Does map show objectives? |
C_CampaignInfo — Campaigns
| Function | Returns | Description |
|---|
C_CampaignInfo.GetAvailableCampaigns() | campaignIDs | Available campaigns |
C_CampaignInfo.GetCampaignID(questID) | campaignID | Campaign for quest |
C_CampaignInfo.GetCampaignInfo(campaignID) | info | Campaign info |
C_CampaignInfo.GetChapterIDs(campaignID) | chapterIDs | Campaign chapters |
C_CampaignInfo.GetChapterInfo(chapterID) | info | Chapter info |
C_CampaignInfo.GetCurrentChapterID(campaignID) | chapterID | Current chapter |
C_CampaignInfo.GetState(campaignID) | state | Campaign state |
C_CampaignInfo.IsCampaignQuest(questID) | isCampaign | Is quest a campaign quest? |
C_CampaignInfo.UsesNormalQuestIcons(campaignID) | usesNormal | Uses normal icons? |
C_QuestLineUI — Quest Lines
| Function | Returns | Description |
|---|
C_QuestLineUI.GetAvailableQuestLineQuests(textFilter, uiMapID) | quests | Available quest line quests |
C_QuestLineUI.GetQuestLineInfo(questID, uiMapID) | questLineInfo | Quest line info |
C_QuestLineUI.GetQuestLineQuests(questLineID) | questIDs | All quests in line |
C_QuestLineUI.IsComplete(questLineID) | isComplete | Is quest line done? |
C_QuestLineUI.RequestQuestLinesForMap(uiMapID) | — | Request quest line data |
C_ContentTracking
| Function | Returns | Description |
|---|
C_ContentTracking.GetCurrentTrackingTarget(trackableType) | targetType, targetID | Current tracked target |
C_ContentTracking.GetObjectiveText(trackableType, trackableID) | text | Objective text |
C_ContentTracking.GetTitle(trackableType, trackableID) | title | Tracking title |
C_ContentTracking.GetTrackedIDs(trackableType) | trackableIDs | All tracked IDs |
C_ContentTracking.IsTracking(trackableType, trackableID) | isTracking | Is it tracked? |
C_ContentTracking.SetTracked(trackableType, trackableID, tracked) | — | Set tracking |
C_ContentTracking.StopTracking(trackableType, trackableID) | — | Stop tracking |
Quest POI Functions
| Function | Returns | Description |
|---|
C_QuestLog.GetQuestPOIs() | — | Request quest POI data |
QuestPOIGetIconInfo(questID) | completed, posX, posY, objective | POI icon position |
QuestPOI_FindButton(parent, questID) | button | Find POI button |
Common Patterns
Iterate Quest Log
local numEntries, numQuests = C_QuestLog.GetNumQuestLogEntries()
for i = 1, numEntries do
local info = C_QuestLog.GetInfo(i)
if info and not info.isHeader then
local questID = info.questID
local title = info.title
local isComplete = C_QuestLog.IsComplete(questID)
print(title, isComplete and "(Complete)" or "")
end
end
Track/Untrack Quest
local function ToggleQuestWatch(questID)
if C_QuestLog.IsQuestWatched(questID) then
C_QuestLog.RemoveQuestWatch(questID)
else
C_QuestLog.AddQuestWatch(questID, Enum.QuestWatchType.Automatic)
end
end
World Quests on Map
local function GetWorldQuestsOnMap(uiMapID)
local quests = C_TaskQuest.GetQuestsForPlayerByMapID(uiMapID)
if quests then
for _, quest in ipairs(quests) do
local title = C_TaskQuest.GetQuestInfoByQuestID(quest.questId)
local timeLeft = C_TaskQuest.GetQuestTimeLeftMinutes(quest.questId)
print(title, timeLeft and (timeLeft .. " min left") or "")
end
end
end
Quest Completion Event Handling
local frame = CreateFrame("Frame")
frame:RegisterEvent("QUEST_TURNED_IN")
frame:RegisterEvent("QUEST_ACCEPTED")
frame:RegisterEvent("QUEST_REMOVED")
frame:SetScript("OnEvent", function(self, event, ...)
if event == "QUEST_TURNED_IN" then
local questID, xpReward, moneyReward = ...
print("Completed quest:", C_QuestLog.GetTitleForQuestID(questID))
elseif event == "QUEST_ACCEPTED" then
local questID = ...
print("Accepted quest:", C_QuestLog.GetTitleForQuestID(questID))
elseif event == "QUEST_REMOVED" then
local questID, wasReplayQuest = ...
print("Quest removed:", questID)
end
end)
Key Events
| Event | Payload | Description |
|---|
QUEST_ACCEPTED | questID | Quest accepted |
QUEST_TURNED_IN | questID, xpReward, moneyReward | Quest turned in |
QUEST_REMOVED | questID, wasReplayQuest | Quest removed from log |
QUEST_LOG_UPDATE | — | Quest log changed |
QUEST_WATCH_LIST_CHANGED | questID, added | Tracking changed |
QUEST_AUTOCOMPLETE | questID | Quest auto-completed |
QUEST_COMPLETE | — | At NPC to complete quest |
QUEST_DETAIL | questStartItemID | Quest detail shown |
QUEST_FINISHED | — | Quest dialog closed |
QUEST_GREETING | — | NPC greeting with quests |
QUEST_PROGRESS | — | Quest turn-in progress |
QUEST_SESSION_CREATED | — | Quest session created |
QUEST_SESSION_DESTROYED | — | Quest session ended |
QUEST_SESSION_JOINED | — | Joined quest session |
QUEST_SESSION_LEFT | — | Left quest session |
QUEST_SESSION_MEMBER_CONFIRM | — | Member confirmed session |
QUEST_POI_UPDATE | — | Quest POI data changed |
TASK_PROGRESS_UPDATE | — | Bonus objective/WQ progress |
WORLD_QUEST_COMPLETED_BY_SPELL | questID | WQ completed by spell |
QUEST_DATA_LOAD_RESULT | questID, success | RequestLoadQuestByID result |
Gotchas & Restrictions
- •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.
- •GetInfo returns headers — Quest log entries include headers (zones). Check
info.isHeader to filter.
- •Quest watch limit — There's a maximum number of tracked quests.
AddQuestWatch() returns false if at limit.
- •Auto-accept quests — Some quests auto-accept. Check
QuestGetAutoAccept() to handle gracefully.
- •World quest vs regular — World quests use
C_TaskQuest functions, not C_QuestLog for map display.
- •Quest gossip flow — Quest accept flow:
QUEST_GREETING → QUEST_DETAIL → AcceptQuest() → QUEST_ACCEPTED.
- •Campaign quests — Use
C_CampaignInfo.IsCampaignQuest() to identify story quests.
- •Objective data —
GetQuestObjectives() returns a table with text, type, finished, numFulfilled, numRequired per objective.