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. Use when this capability is needed.4---56# Professions API (Retail — Patch 12.0.0)78Comprehensive reference for professions, crafting, and crafting order 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_TradeSkillUI** — Recipe browsing, crafting, reagents, skill info19- **C_CraftingOrders** — Crafting order system (customer & crafter)20- **C_ProfessionSpecUI** — Profession specialization trees21- **Global TradeSKill** — Legacy/global tradeskill functions2223---2425## C_TradeSkillUI — Tradeskill System2627### Opening & State2829| 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 |3940### Profession Info4142| 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 |5051### Recipe List & Info5253| 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 |6667### Reagents6869| 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 |7576### Crafting7778| 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? |8586### Categories & Filters8788| 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? |99100---101102## C_CraftingOrders — Crafting Orders103104### Customer (Placing Orders)105106| 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? |118119### Crafter (Fulfilling Orders)120121| 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 |134135### Order Types136137| 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 |143144---145146## C_ProfessionSpecUI — Profession Specialization147148| 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 |163164---165166## Global Tradeskill Functions167168| 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 |173174---175176## Common Patterns177178### List Player's Professions179180```lua181local prof1, prof2, archaeology, fishing, cooking = GetProfessions()182local function PrintProf(index)183 if index then184 local name, icon, skillLevel, maxSkillLevel = GetProfessionInfo(index)185 print(name, skillLevel .. "/" .. maxSkillLevel)186 end187end188PrintProf(prof1)189PrintProf(prof2)190PrintProf(cooking)191```192193### Search Recipes by Name194195```lua196C_TradeSkillUI.SetRecipeItemNameFilter("Enchant")197local recipeIDs = C_TradeSkillUI.GetFilteredRecipeIDs()198for _, recipeID in ipairs(recipeIDs) do199 local info = C_TradeSkillUI.GetRecipeInfo(recipeID)200 if info then201 print(info.name, "Skill:", info.relativeDifficulty)202 end203end204```205206### Craft an Item207208```lua209-- Craft 5 of a recipe210local recipeID = 12345211C_TradeSkillUI.CraftRecipe(recipeID, 5)212```213214---215216## Key Events217218| 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 |242243---244245## Gotchas & Restrictions2462471. **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.255256---257> Converted and distributed by [TomeVault](https://tomevault.io/claim/jburlison) — claim your Tome and manage your conversions.258<!-- tomevault:4.0:skill_md:2026-04-13 -->