1---2name: wow-api-group-lfg3description: Complete reference for WoW Retail Party, Raid, Dungeon Finder, Premade Groups (LFG List), Social Queue, Lobby Matchmaker, and Raid Marker APIs. Covers C_PartyInfo (party management, invites, conversion, ready check, countdown), C_LFGInfo (dungeon finder queue, role selection), C_LFGList (premade groups listing, search, application, creation), C_SocialQueue (friend queue tracking), C_LobbyMatchmakerInfo, raid markers, and group-related events. Use when working with party/raid management, group finder, premade group listing, dungeon queue, role selection, ready checks, or raid markers. Use when this capability is needed.4---56# Group & LFG API (Retail — Patch 12.0.0)78Comprehensive reference for party/raid management, dungeon finder, premade groups, and related APIs.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_PartyInfo** — Party management, invites, conversion19- **C_LFGInfo** — Dungeon Finder queue system20- **C_LFGList** — Premade Groups (Group Finder)21- **C_SocialQueue** — Social queue tracking22- **C_LobbyMatchmakerInfo** — Lobby matchmaker23- **Raid Markers** — World and target markers24- **Group utility** — Ready check, countdown, roles2526---2728## C_PartyInfo — Party Management2930### Core Functions3132| Function | Returns | Description |33|----------|---------|-------------|34| `C_PartyInfo.InviteUnit(name)` | — | Invite player to group |35| `C_PartyInfo.UninviteUnit(name [, reason])` | — | Kick player from group |36| `C_PartyInfo.LeaveParty([category])` | — | Leave group |37| `C_PartyInfo.ConvertToParty()` | — | Convert raid to party |38| `C_PartyInfo.ConvertToRaid()` | — | Convert party to raid |39| `C_PartyInfo.CanInvite()` | `canInvite` | Can invite to group? |40| `C_PartyInfo.IsPartyFull([category])` | `isFull` | Is group full? |41| `C_PartyInfo.IsPartyInJailersTower()` | `isInTorghast` | In Torghast? |42| `C_PartyInfo.GetActiveCategories()` | `categories` | Active party categories |43| `C_PartyInfo.GetMinLevel([category])` | `minLevel` | Minimum level requirement |44| `C_PartyInfo.GetInviteReferralInfo(inviteGUID)` | `referredByGUID, referredByName, ...` | Invite referral info |45| `C_PartyInfo.GetInviteConfirmationInvalidQueues(inviteGUID)` | `queues` | Invalid queues for invite |46| `C_PartyInfo.ConfirmInviteUnit(name)` | — | Confirm pending invite |47| `C_PartyInfo.DoCountdown(seconds)` | — | Start raid countdown |48| `C_PartyInfo.DoReadyCheck()` | — | Initiate ready check |49| `C_PartyInfo.GetRestrictPingsTo()` | `restrictTo` | Ping restriction setting |50| `C_PartyInfo.SetRestrictPingsTo(restrictTo)` | — | Set ping restriction |51| `C_PartyInfo.AllowIncomingDelves(allow)` | — | Allow incoming Delve invites |52| `C_PartyInfo.IsCrossFactionParty([category])` | `isCrossFaction` | Is cross-faction group? |5354### Group Query Functions (Global)5556| Function | Returns | Description |57|----------|---------|-------------|58| `IsInGroup([category])` | `inGroup` | In any group? |59| `IsInRaid([category])` | `inRaid` | In a raid? |60| `GetNumGroupMembers([category])` | `numMembers` | Group member count |61| `GetNumSubgroupMembers([category])` | `numSubMembers` | Party-size count |62| `UnitInParty(unit)` | `inParty` | Is unit in party? |63| `UnitInRaid(unit)` | `inRaid` | Is unit in raid? |64| `GetRaidRosterInfo(raidIndex)` | `name, rank, subgroup, level, class, fileName, zone, online, isDead, role, isML, combatRole` | Raid roster info |65| `IsPartyLFG()` | `isLFG` | In LFG group? |66| `IsInInstance()` | `inInstance, instanceType` | In instance? |67| `GetInstanceInfo()` | `name, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceID, instanceGroupSize, LfgDungeonID` | Instance info |68| `SetRaidSubgroup(memberIndex, subgroup)` | — | Move member to subgroup |69| `SwapRaidSubgroup(index1, index2)` | — | Swap two members |70| `PromoteToLeader(unit)` | — | Promote to leader |71| `DemoteAssistant(unit)` | — | Demote assistant |72| `PromoteToAssistant(unit)` | — | Promote to assistant |73| `UnitIsGroupLeader(unit [, category])` | `isLeader` | Is unit the leader? |74| `UnitIsGroupAssistant(unit)` | `isAssistant` | Is unit assistant? |7576### Role Functions7778| Function | Returns | Description |79|----------|---------|-------------|80| `UnitGroupRolesAssigned(unit)` | `role` | TANK, HEALER, DAMAGER, NONE |81| `UnitSetRole(unit, role)` | — | Set unit's role |82| `GetSpecializationRole(specIndex)` | `role` | Spec's default role |83| `UnitGetAvailableRoles(unit)` | `canTank, canHeal, canDPS` | Available roles |8485### Ready Check Functions8687| Function | Returns | Description |88|----------|---------|-------------|89| `GetReadyCheckStatus(unit)` | `status` | ready, notready, waiting |90| `GetReadyCheckTimeLeft()` | `timeLeft` | Seconds remaining |91| `ConfirmReadyCheck(isReady)` | — | Respond to ready check |9293---9495## C_LFGInfo — Dungeon Finder9697| Function | Returns | Description |98|----------|---------|-------------|99| `C_LFGInfo.GetAllEntriesForCategory(category)` | `entries` | All LFG entries |100| `C_LFGInfo.GetLFGDungeonInfo(dungeonID)` | `info` | Dungeon info |101| `C_LFGInfo.GetRoleCheckDifficultyDetails()` | `difficultyID, isBlocked` | Role check details |102| `C_LFGInfo.CanPlayerUseLFD()` | `canUse` | Can use dungeon finder? |103| `C_LFGInfo.CanPlayerUseScenarioFinder()` | `canUse` | Can use scenario finder? |104| `C_LFGInfo.CanPlayerUsePremadeGroup()` | `canUse` | Can use premade groups? |105| `C_LFGInfo.GetQueuedDungeons(category)` | `dungeons` | Currently queued dungeons |106| `C_LFGInfo.HideNameFromUI(dungeonID)` | `hidden` | Is name hidden? |107108### LFG Global Functions109110| Function | Returns | Description |111|----------|---------|-------------|112| `GetLFGMode(category)` | `mode, subMode` | Current LFG mode |113| `GetLFGRoles()` | `isLeader, isTank, isHealer, isDPS` | Selected roles |114| `SetLFGRoles(isLeader, isTank, isHealer, isDPS)` | — | Set roles |115| `GetLFGProposal()` | `leaderName, category, dungeonID, ...` | Current proposal |116| `AcceptProposal()` | — | Accept dungeon proposal |117| `RejectProposal()` | — | Reject dungeon proposal |118| `GetLFGQueueStats(category)` | `hasData, leaderNeeds, tankNeeds, healerNeeds, dpsNeeds, instanceType, instanceSubType, instanceName, averageWait, tankWait, healerWait, damageWait, myWait, queuedTime` | Queue statistics |119| `JoinLFG(category)` | — | Join LFG queue |120| `LeaveLFG(category)` | — | Leave LFG queue |121| `CompleteLFGReadyCheck(isReady)` | — | Complete LFG ready check |122| `GetLFGDeserterExpiration()` | `expiration` | Deserter debuff time |123| `CompleteLFGRoleCheck(isAccepted)` | — | Complete role check |124125---126127## C_LFGList — Premade Groups (Group Finder)128129### Search & Browse130131| Function | Returns | Description |132|----------|---------|-------------|133| `C_LFGList.Search(categoryID, filter [, preferredFilters [, languages [, ...] ] ])` | — | Search for groups |134| `C_LFGList.GetSearchResults()` | `totalResultsFound, results` | Get search results |135| `C_LFGList.GetSearchResultInfo(searchResultID)` | `resultInfo` | Single result info |136| `C_LFGList.GetSearchResultMemberInfo(searchResultID, memberIndex)` | `memberInfo` | Result member info |137| `C_LFGList.GetSearchResultMemberCounts(searchResultID)` | `numMembers, numTanks, numHealers, numDPS` | Member count per role |138| `C_LFGList.HasSearchResultInfo(searchResultID)` | `hasInfo` | Has result info? |139| `C_LFGList.GetFilteredSearchResults()` | `totalResults, filteredResults` | Filtered results |140| `C_LFGList.GetAvailableCategories()` | `categoryIDs` | Available categories |141| `C_LFGList.GetCategoryInfo(categoryID)` | `name, ...` | Category info |142| `C_LFGList.GetAvailableActivities(categoryID [, groupID [, filter]])` | `activityIDs` | Available activities |143| `C_LFGList.GetActivityInfoTable(activityID)` | `info` | Activity info |144| `C_LFGList.GetActivityFullName(activityID [, questID [, isWarModeDesired]])` | `fullName` | Full activity name |145| `C_LFGList.GetAvailableLanguageSearchFilter()` | `languages` | Available languages |146147### Create & Manage Listing148149| Function | Returns | Description |150|----------|---------|-------------|151| `C_LFGList.CreateListing(activityID, itemLevel, autoAccept, privateGroup, questID, ...)` | — | Create group listing |152| `C_LFGList.UpdateListing(activityID, itemLevel, autoAccept, privateGroup, questID, ...)` | — | Update listing |153| `C_LFGList.RemoveListing()` | — | Remove your listing |154| `C_LFGList.GetActiveEntryInfo()` | `entryInfo` | Your listing info |155| `C_LFGList.HasActiveEntryInfo()` | `hasInfo` | Have active listing? |156157### Applications158159| Function | Returns | Description |160|----------|---------|-------------|161| `C_LFGList.ApplyToGroup(searchResultID, comment, tankRole, healerRole, dpsRole)` | — | Apply to group |162| `C_LFGList.CancelApplication(searchResultID)` | — | Cancel application |163| `C_LFGList.GetApplications()` | `applications` | Your applications |164| `C_LFGList.GetApplicationInfo(searchResultID)` | `appStatus, pendingStatus, appDuration, ...` | Application status |165| `C_LFGList.GetApplicants()` | `applicantIDs` | Applicants to your group |166| `C_LFGList.GetApplicantInfo(applicantID)` | `info` | Applicant info |167| `C_LFGList.GetApplicantMemberInfo(applicantID, memberIndex)` | `memberInfo` | Applicant member info |168| `C_LFGList.InviteApplicant(applicantID)` | — | Invite applicant |169| `C_LFGList.DeclineApplicant(applicantID)` | — | Decline applicant |170171---172173## Raid Markers174175| Function | Returns | Description |176|----------|---------|-------------|177| `SetRaidTarget(unit, markerIndex)` | — | Set raid target marker |178| `GetRaidTargetIndex(unit)` | `markerIndex` | Get target marker |179| `SetRaidTargetIcon(unit, icon)` | — | Set raid icon (same as above) |180| `IsRaidMarkerActive(markerIndex)` | `isActive` | Is world marker active? |181| `PlaceRaidMarker(markerIndex)` | — | Place world marker at cursor |182| `ClearRaidMarker(markerIndex)` | — | Clear world marker |183| `UnitPopupSetRaidTargetButton_OnClick(frame, unit, icon)` | — | Set from unit popup |184185### Marker Index Values186187| Index | Marker |188|-------|--------|189| 1 | Star (Yellow) |190| 2 | Circle (Orange) |191| 3 | Diamond (Purple) |192| 4 | Triangle (Green) |193| 5 | Moon (Silver) |194| 6 | Square (Blue) |195| 7 | Cross/X (Red) |196| 8 | Skull (White) |197| 0 | Clear |198199---200201## Common Patterns202203### Check Group Type and Size204205```lua206local function GetGroupInfo()207 if IsInRaid() then208 return "raid", GetNumGroupMembers()209 elseif IsInGroup() then210 return "party", GetNumGroupMembers()211 else212 return "solo", 1213 end214end215```216217### Iterate Group Members218219```lua220local function ForEachGroupMember(callback)221 local prefix = IsInRaid() and "raid" or "party"222 local numMembers = GetNumGroupMembers()223 224 if IsInRaid() then225 for i = 1, numMembers do226 callback(prefix .. i)227 end228 else229 callback("player")230 for i = 1, numMembers - 1 do231 callback(prefix .. i)232 end233 end234end235236ForEachGroupMember(function(unit)237 print(UnitName(unit), UnitGroupRolesAssigned(unit))238end)239```240241### Search Premade Groups242243```lua244-- Search for M+ groups245local CATEGORY_DUNGEON = 2246C_LFGList.Search(CATEGORY_DUNGEON, "")247248local frame = CreateFrame("Frame")249frame:RegisterEvent("LFG_LIST_SEARCH_RESULTS_RECEIVED")250frame:SetScript("OnEvent", function()251 local totalResults, results = C_LFGList.GetSearchResults()252 for _, resultID in ipairs(results) do253 local info = C_LFGList.GetSearchResultInfo(resultID)254 if info then255 print(info.name, info.comment, info.numMembers)256 end257 end258end)259```260261---262263## Key Events264265| Event | Payload | Description |266|-------|---------|-------------|267| `GROUP_ROSTER_UPDATE` | — | Group composition changed |268| `GROUP_FORMED` | category | Group formed |269| `GROUP_LEFT` | category | Left group |270| `GROUP_JOINED` | category | Joined group |271| `PARTY_INVITE_REQUEST` | name, ... | Received party invite |272| `PARTY_INVITE_CANCEL` | — | Invite cancelled |273| `PARTY_LEADER_CHANGED` | — | Leader changed |274| `PARTY_MEMBER_ENABLE` | unitToken | Member came online |275| `PARTY_MEMBER_DISABLE` | unitToken | Member went offline |276| `ROLE_CHANGED_INFORM` | changedName, sourceName, oldRole, newRole | Role changed |277| `READY_CHECK` | initiatorName, readyCheckTimeLeft | Ready check started |278| `READY_CHECK_CONFIRM` | unit, isReady | Member responded |279| `READY_CHECK_FINISHED` | preempted | Ready check done |280| `START_TIMER` | timerType, timeRemaining, totalTime | Countdown timer |281| `LFG_LIST_SEARCH_RESULTS_RECEIVED` | — | Premade search done |282| `LFG_LIST_SEARCH_RESULT_UPDATED` | searchResultID | Result updated |283| `LFG_LIST_ACTIVE_ENTRY_UPDATE` | — | Your listing updated |284| `LFG_LIST_APPLICANT_UPDATED` | applicantID | Applicant updated |285| `LFG_LIST_APPLICANT_LIST_UPDATED` | — | Applicant list changed |286| `LFG_LIST_ENTRY_CREATION_FAILED` | — | Listing creation failed |287| `LFG_PROPOSAL_SHOW` | — | Dungeon proposal shown |288| `LFG_PROPOSAL_SUCCEEDED` | — | Proposal accepted |289| `LFG_PROPOSAL_FAILED` | — | Proposal failed |290| `LFG_QUEUE_STATUS_UPDATE` | — | Queue status changed |291| `LFG_UPDATE` | — | LFG system updated |292| `LFG_ROLE_CHECK_SHOW` | isRequeue | Role check shown |293| `RAID_TARGET_UPDATE` | — | Raid marker changed |294| `INSTANCE_GROUP_SIZE_CHANGED` | — | Instance group size changed |295296---297298## Gotchas & Restrictions2993001. **InviteUnit requires hardware event** — Must be called from a user click/key handler.3012. **Party vs raid iteration** — Use different unit tokens: `"party1"-"party4"` vs `"raid1"-"raid40"`. Player is NOT in party tokens.3023. **Category matters** — `IsInGroup()` defaults to `LE_PARTY_CATEGORY_HOME`. Use `LE_PARTY_CATEGORY_INSTANCE` for LFG groups.3034. **GROUP_ROSTER_UPDATE fires often** — Debounce processing. Fires for role changes, joins, leaves, subgroup changes.3045. **LFG search is async** — `C_LFGList.Search()` is async. Wait for `LFG_LIST_SEARCH_RESULTS_RECEIVED`.3056. **SendAddonMessage in instances** — Blocked in 12.0.0. Group addons cannot communicate via addon messages in instances.3067. **Cross-faction groups** — Check `C_PartyInfo.IsCrossFactionParty()` to handle cross-faction UI properly.3078. **Raid markers require assist** — `SetRaidTarget()` requires leader or assistant in raids.308309---310> Converted and distributed by [TomeVault](https://tomevault.io/claim/jburlison) — claim your Tome and manage your conversions.311<!-- tomevault:4.0:skill_md:2026-04-13 -->