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.4---5
6# Group & LFG API (Retail — Patch 12.0.0)
7
8Comprehensive reference for party/raid management, dungeon finder, premade groups, and related 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- **C_PartyInfo** — Party management, invites, conversion
19- **C_LFGInfo** — Dungeon Finder queue system
20- **C_LFGList** — Premade Groups (Group Finder)
21- **C_SocialQueue** — Social queue tracking
22- **C_LobbyMatchmakerInfo** — Lobby matchmaker
23- **Raid Markers** — World and target markers
24- **Group utility** — Ready check, countdown, roles
25
26---
27
28## C_PartyInfo — Party Management
29
30### Core Functions
31
32| 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? |
53
54### Group Query Functions (Global)
55
56| 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? |
75
76### Role Functions
77
78| 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 |
84
85### Ready Check Functions
86
87| Function | Returns | Description |
88|----------|---------|-------------|
89| `GetReadyCheckStatus(unit)` | `status` | ready, notready, waiting |
90| `GetReadyCheckTimeLeft()` | `timeLeft` | Seconds remaining |
91| `ConfirmReadyCheck(isReady)` | — | Respond to ready check |
92
93---
94
95## C_LFGInfo — Dungeon Finder
96
97| 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? |
107
108### LFG Global Functions
109
110| 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 |
124
125---
126
127## C_LFGList — Premade Groups (Group Finder)
128
129### Search & Browse
130
131| 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 |
146
147### Create & Manage Listing
148
149| 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? |
156
157### Applications
158
159| 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 |
170
171---
172
173## Raid Markers
174
175| 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 |
184
185### Marker Index Values
186
187| 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 |
198
199---
200
201## Common Patterns
202
203### Check Group Type and Size
204
205```lua
206local function GetGroupInfo()
207 if IsInRaid() then
208 return "raid", GetNumGroupMembers()
209 elseif IsInGroup() then
210 return "party", GetNumGroupMembers()
211 else
212 return "solo", 1
213 end
214end
215```
216
217### Iterate Group Members
218
219```lua
220local function ForEachGroupMember(callback)
221 local prefix = IsInRaid() and "raid" or "party"
222 local numMembers = GetNumGroupMembers()
223
224 if IsInRaid() then
225 for i = 1, numMembers do
226 callback(prefix .. i)
227 end
228 else
229 callback("player")
230 for i = 1, numMembers - 1 do
231 callback(prefix .. i)
232 end
233 end
234end
235
236ForEachGroupMember(function(unit)
237 print(UnitName(unit), UnitGroupRolesAssigned(unit))
238end)
239```
240
241### Search Premade Groups
242
243```lua
244-- Search for M+ groups
245local CATEGORY_DUNGEON = 2
246C_LFGList.Search(CATEGORY_DUNGEON, "")
247
248local 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) do
253 local info = C_LFGList.GetSearchResultInfo(resultID)
254 if info then
255 print(info.name, info.comment, info.numMembers)
256 end
257 end
258end)
259```
260
261---
262
263## Key Events
264
265| 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 |
295
296---
297
298## Gotchas & Restrictions
299
3001. **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.