1---2name: wow-api-professions3description: Complete reference for WoW Retail Professions, Tradeskill, Crafting Orders, Recipe, and Profession Specialization APIs. Covers C_TradeSkillUI (recipe list, crafting, reagents, skill lines, categories, recrafting, salvage, enchanting), C_CraftingOrders (customer/crafter order system, public/private/guild orders, order creation, fulfillment, listing), C_ProfessionSpecUI (profession knowledge, specialization trees), global tradeskill functions, and profession-specific patterns. Use when working with professions, recipes, crafting, work orders, crafting orders, profession specialization, or tradeskill UI.4---5
6# Professions API (Retail — Patch 12.0.0)
7
8Comprehensive reference for professions, crafting, and crafting order 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_TradeSkillUI** — Recipe browsing, crafting, reagents, skill info
19- **C_CraftingOrders** — Crafting order system (customer & crafter)
20- **C_ProfessionSpecUI** — Profession specialization trees
21- **Global TradeSKill** — Legacy/global tradeskill functions
22
23---
24
25## C_TradeSkillUI — Tradeskill System
26
27### Opening & State
28
29| Function | Returns | Description |
30|----------|---------|-------------|
31| `C_TradeSkillUI.OpenTradeSkill(tradeSkillID)` | `success` | Open tradeskill UI |
32| `C_TradeSkillUI.CloseTradeSkill()` | — | Close tradeskill UI |
33| `C_TradeSkillUI.IsTradeSkillReady()` | `isReady` | Is tradeskill data ready? |
34| `C_TradeSkillUI.IsTradeSkillGuild()` | `isGuild` | Viewing guild crafters? |
35| `C_TradeSkillUI.IsTradeSkillLinked()` | `isLinked` | Viewing linked tradeskill? |
36| `C_TradeSkillUI.IsNPCCrafting()` | `isNPC` | Crafting at NPC? |
37| `C_TradeSkillUI.IsRecraftReady()` | `isReady` | Recraft system ready? |
38| `C_TradeSkillUI.GetTradeSkillDisplayName(tradeSkillID)` | `name` | Profession name |
39
40### Profession Info
41
42| Function | Returns | Description |
43|----------|---------|-------------|
44| `C_TradeSkillUI.GetProfessionInfoBySkillLineID(skillLineID)` | `professionInfo` | Profession info |
45| `C_TradeSkillUI.GetChildProfessionInfos()` | `infos` | Child profession tiers |
46| `C_TradeSkillUI.GetProfessionInfoByRecipeID(recipeID)` | `professionInfo` | Profession for recipe |
47| `C_TradeSkillUI.GetBaseProfessionInfo()` | `professionInfo` | Base profession info |
48| `C_TradeSkillUI.GetProfessionSlots(profession)` | `slots` | Profession slots |
49| `C_TradeSkillUI.GetProfessionChararacterSlotInfo(slot)` | `info` | Character slot info |
50
51### Recipe List & Info
52
53| Function | Returns | Description |
54|----------|---------|-------------|
55| `C_TradeSkillUI.GetAllRecipeIDs()` | `recipeIDs` | All available recipes |
56| `C_TradeSkillUI.GetFilteredRecipeIDs()` | `recipeIDs` | Filtered recipe list |
57| `C_TradeSkillUI.GetRecipeInfo(recipeID)` | `recipeInfo` | Recipe details |
58| `C_TradeSkillUI.GetRecipeSchematic(recipeID, isRecraft [, recraftItemGUID])` | `schematic` | Recipe schematic |
59| `C_TradeSkillUI.GetRecipeDescription(recipeID)` | `description` | Recipe description text |
60| `C_TradeSkillUI.GetRecipeNumItemsProduced(recipeID)` | `min, max` | Items produced |
61| `C_TradeSkillUI.GetRecipeOutputItemData(recipeID [, reagents [, allocationItemGUID]])` | `outputInfo` | Output item data |
62| `C_TradeSkillUI.GetRecipeQualityItemIDs(recipeID)` | `itemIDs` | Quality-tier item IDs |
63| `C_TradeSkillUI.GetRecipeQualityReagentItemLink(recipeSpellID, reagentIndex, qualityIndex)` | `itemLink` | Quality reagent link |
64| `C_TradeSkillUI.GetRecipeRepeatCount()` | `repeatCount` | Queue repeat count |
65| `C_TradeSkillUI.SetRecipeRepeatCount(count)` | — | Set repeat count |
66
67### Reagents
68
69| Function | Returns | Description |
70|----------|---------|-------------|
71| `C_TradeSkillUI.GetRecipeReagentSlotInfo(recipeID, reagentIndex)` | `slotInfo` | Reagent slot info |
72| `C_TradeSkillUI.GetRecipeRequirements(recipeID)` | `requirements` | Recipe requirements |
73| `C_TradeSkillUI.GetOptionalReagentInfo(recipeID)` | `optionalReagents` | Optional reagent slots |
74| `C_TradeSkillUI.GetRecipeFixedReagentItemLink(recipeID, dataSlotIndex)` | `itemLink` | Fixed reagent link |
75
76### Crafting
77
78| Function | Returns | Description |
79|----------|---------|-------------|
80| `C_TradeSkillUI.CraftRecipe(recipeID [, count [, craftingReagents [, recipeLevel [, orderID]]]])` | — | Craft items |
81| `C_TradeSkillUI.RecraftRecipe(itemGUID, craftingReagents)` | — | Recraft an item |
82| `C_TradeSkillUI.CraftSalvage(recipeID, count, itemTarget)` | — | Salvage crafting |
83| `C_TradeSkillUI.CraftEnchant(recipeID [, count [, craftingReagents]])` | — | Craft enchant |
84| `C_TradeSkillUI.IsRecipeInBaseSkillLine(recipeID)` | `inBase` | Is recipe in base skill? |
85
86### Categories & Filters
87
88| Function | Returns | Description |
89|----------|---------|-------------|
90| `C_TradeSkillUI.GetCategories()` | `categoryIDs` | All categories |
91| `C_TradeSkillUI.GetCategoryInfo(categoryID)` | `categoryInfo` | Category details |
92| `C_TradeSkillUI.GetSubCategories(categoryID)` | `subCategoryIDs` | Sub-categories |
93| `C_TradeSkillUI.SetRecipeItemNameFilter(text)` | — | Filter by name |
94| `C_TradeSkillUI.GetRecipeItemNameFilter()` | `text` | Current name filter |
95| `C_TradeSkillUI.SetOnlyShowMakeableRecipes(onlyMakeable)` | — | Filter to makeable |
96| `C_TradeSkillUI.GetOnlyShowMakeableRecipes()` | `onlyMakeable` | Showing only makeable? |
97| `C_TradeSkillUI.SetOnlyShowSkillUpRecipes(onlySkillUp)` | — | Filter to skill-up |
98| `C_TradeSkillUI.GetOnlyShowSkillUpRecipes()` | `onlySkillUp` | Only skill-up? |
99
100---
101
102## C_CraftingOrders — Crafting Orders
103
104### Customer (Placing Orders)
105
106| Function | Returns | Description |
107|----------|---------|-------------|
108| `C_CraftingOrders.PlaceNewOrder(orderInfo)` | — | Place a crafting order |
109| `C_CraftingOrders.GetMyOrders(orderType)` | `orders` | Your placed orders |
110| `C_CraftingOrders.GetOrderClaimInfo(orderType, orderID)` | `claimInfo` | Order claim info |
111| `C_CraftingOrders.CancelOrder(orderID)` | — | Cancel your order |
112| `C_CraftingOrders.GetCustomerOptions(skillLineAbilityID, orderType)` | `options` | Customer options |
113| `C_CraftingOrders.GetCraftingOrderCost(recipeID, reagents, orderType)` | `cost` | Order commission cost |
114| `C_CraftingOrders.GetDefaultOrdersSkillLine()` | `skillLineID` | Default skill line |
115| `C_CraftingOrders.GetPersonalOrdersInfo()` | `info` | Personal orders info |
116| `C_CraftingOrders.HasFavoriteCustomerOptions(skillLineAbilityID)` | `hasFavorite` | Has favorited crafter? |
117| `C_CraftingOrders.ShouldShowCraftingOrderTab()` | `shouldShow` | Show orders tab? |
118
119### Crafter (Fulfilling Orders)
120
121| Function | Returns | Description |
122|----------|---------|-------------|
123| `C_CraftingOrders.GetCrafterOrders(request)` | — | Query available orders |
124| `C_CraftingOrders.GetCrafterBucketTable(request)` | — | Get order grouped view |
125| `C_CraftingOrders.GetClaimedOrder()` | `order` | Currently claimed order |
126| `C_CraftingOrders.ClaimOrder(orderID, professionID)` | — | Claim an order |
127| `C_CraftingOrders.ReleaseOrder(orderID, professionID)` | — | Release claimed order |
128| `C_CraftingOrders.FulfillOrder(orderID, crafterNote, professionID)` | — | Complete the order |
129| `C_CraftingOrders.RejectOrder(orderID, rejectionNote, professionID)` | — | Reject the order |
130| `C_CraftingOrders.GetNumFavoriteCustomerOptions()` | `numFavorites` | Favorite customers count |
131| `C_CraftingOrders.GetCrafterOrderRemainingTime(orderID)` | `timeRemaining` | Time left to fulfill |
132| `C_CraftingOrders.OpenCrafterCraftingOrders()` | — | Open crafter orders UI |
133| `C_CraftingOrders.CloseCrafterCraftingOrders()` | — | Close crafter orders UI |
134
135### Order Types
136
137| Enum | Description |
138|------|-------------|
139| `Enum.CraftingOrderType.Public` | Anyone can fulfill |
140| `Enum.CraftingOrderType.Guild` | Guild members only |
141| `Enum.CraftingOrderType.Personal` | Specific crafter |
142| `Enum.CraftingOrderType.Npc` | NPC order |
143
144---
145
146## C_ProfessionSpecUI — Profession Specialization
147
148| Function | Returns | Description |
149|----------|---------|-------------|
150| `C_ProfessionSpecUI.GetSpecTabInfo()` | `tabInfo` | Spec tab info |
151| `C_ProfessionSpecUI.GetSpecTabIDsForSkillLineID(skillLineID)` | `specTabIDs` | Spec tabs for profession |
152| `C_ProfessionSpecUI.ShouldShowSpecTab()` | `shouldShow` | Show spec tab? |
153| `C_ProfessionSpecUI.GetRootPathForTab(specTabID)` | `rootPath` | Root path for spec tab |
154| `C_ProfessionSpecUI.GetStateForPath(specTabID, pathID)` | `state` | Path state (locked, etc.) |
155| `C_ProfessionSpecUI.GetStateForPerk(specTabID, perkID)` | `state` | Perk state |
156| `C_ProfessionSpecUI.GetDescriptionForPath(pathID)` | `description` | Path description |
157| `C_ProfessionSpecUI.GetDescriptionForPerk(perkID)` | `description` | Perk description |
158| `C_ProfessionSpecUI.GetPerksForPath(pathID)` | `perkIDs` | Perks in path |
159| `C_ProfessionSpecUI.GetChildrenForPath(pathID)` | `childPathIDs` | Child paths |
160| `C_ProfessionSpecUI.GetSpendCurrencyForPath(pathID)` | `currencyID, amount` | Currency to spend |
161| `C_ProfessionSpecUI.GetUnlockInfoForPath(pathID)` | `unlockInfo` | Unlock requirements |
162| `C_ProfessionSpecUI.PurchaseSpecTabPerk(specTabID, perkID)` | — | Purchase a perk |
163
164---
165
166## Global Tradeskill Functions
167
168| Function | Returns | Description |
169|----------|---------|-------------|
170| `GetProfessions()` | `prof1, prof2, arch, fish, cook` | Character professions (indices) |
171| `GetProfessionInfo(profIndex)` | `name, icon, skillLevel, maxSkillLevel, numAbilities, spellOffset, skillLineID, skillModifier, specIndex, specOffset` | Profession details |
172| `CastSpell(spellID)` | — | Open profession via spell |
173
174---
175
176## Common Patterns
177
178### List Player's Professions
179
180```lua
181local prof1, prof2, archaeology, fishing, cooking = GetProfessions()
182local function PrintProf(index)
183 if index then
184 local name, icon, skillLevel, maxSkillLevel = GetProfessionInfo(index)
185 print(name, skillLevel .. "/" .. maxSkillLevel)
186 end
187end
188PrintProf(prof1)
189PrintProf(prof2)
190PrintProf(cooking)
191```
192
193### Search Recipes by Name
194
195```lua
196C_TradeSkillUI.SetRecipeItemNameFilter("Enchant")
197local recipeIDs = C_TradeSkillUI.GetFilteredRecipeIDs()
198for _, recipeID in ipairs(recipeIDs) do
199 local info = C_TradeSkillUI.GetRecipeInfo(recipeID)
200 if info then
201 print(info.name, "Skill:", info.relativeDifficulty)
202 end
203end
204```
205
206### Craft an Item
207
208```lua
209-- Craft 5 of a recipe
210local recipeID = 12345
211C_TradeSkillUI.CraftRecipe(recipeID, 5)
212```
213
214---
215
216## Key Events
217
218| Event | Payload | Description |
219|-------|---------|-------------|
220| `TRADE_SKILL_SHOW` | — | Tradeskill UI opened |
221| `TRADE_SKILL_CLOSE` | — | Tradeskill UI closed |
222| `TRADE_SKILL_UPDATE` | — | Tradeskill data updated |
223| `TRADE_SKILL_LIST_UPDATE` | — | Recipe list changed |
224| `TRADE_SKILL_DATA_SOURCE_CHANGED` | — | Data source changed |
225| `TRADE_SKILL_DATA_SOURCE_CHANGING` | — | Data source changing |
226| `TRADE_SKILL_CRAFT_BEGIN` | — | Started crafting |
227| `UPDATE_TRADESKILL_CAST_COMPLETE` | — | Craft cast completed |
228| `UPDATE_TRADESKILL_CAST_STOPPED` | — | Craft cast stopped |
229| `TRADE_SKILL_ITEM_CRAFTED_RESULT` | resultData | Crafted item result |
230| `CRAFTINGORDERS_ORDER_PLACEMENT_RESPONSE` | result | Order placement result |
231| `CRAFTINGORDERS_CLAIMED_ORDER_ADDED` | — | Order claimed |
232| `CRAFTINGORDERS_CLAIMED_ORDER_REMOVED` | — | Order released |
233| `CRAFTINGORDERS_CLAIMED_ORDER_UPDATED` | — | Claimed order updated |
234| `CRAFTINGORDERS_FULFILL_ORDER_RESPONSE` | result, orderID | Order fulfilled result |
235| `CRAFTINGORDERS_REJECT_ORDER_RESPONSE` | result, orderID | Order rejected result |
236| `CRAFTINGORDERS_ORDER_CANCEL_RESPONSE` | result, orderID | Order cancelled result |
237| `CRAFTINGORDERS_CUSTOMER_OPTIONS_PARSED` | — | Customer options loaded |
238| `CRAFTINGORDERS_CRAFTER_ORDER_LIST_UPDATED` | — | Crafter order list refreshed |
239| `CRAFTINGORDERS_CAN_REQUEST` | — | Can request crafter orders |
240| `SKILL_LINES_CHANGED` | — | Skill lines changed |
241| `LEARNED_SPELL_IN_SKILL_LINE` | spellID, skillLineID, isTrackedAsTradeskill | New recipe learned |
242
243---
244
245## Gotchas & Restrictions
246
2471. **Tradeskill must be open** — Most `C_TradeSkillUI` functions only work when the tradeskill window is open.
2482. **CraftRecipe requires hardware event** — Crafting requires a user-initiated action (click/key).
2493. **Recipe schematic vs recipe info** — `GetRecipeSchematic()` provides reagent slots and quality data; `GetRecipeInfo()` provides name/icon/difficulty.
2504. **Crafting orders are async** — `GetCrafterOrders()` is async. Wait for `CRAFTINGORDERS_CRAFTER_ORDER_LIST_UPDATED`.
2515. **Quality tiers** — Dragonflight+ recipes have quality tiers (1-5). Use `GetRecipeQualityItemIDs()` to get items per tier.
2526. **Recraft** — Recrafting uses `RecraftRecipe()` with the item's GUID, not `CraftRecipe()`.
2537. **Profession specs use C_Traits** — Under the hood, profession specializations use the same `C_Traits` system as class talents with a different config type.
2548. **GetProfessions returns indices** — Pass the index to `GetProfessionInfo()`, not a profession ID.