Skip to main content

Housing โ€” Blizzard API Endpoint Mapping

Mapping of all Blizzard REST API endpoints for the Housing & Neighborhoods feature. Housing was introduced in WoW Midnight (11.1.5) with REST API access in 11.2.7 (December 2025).

Status Summaryโ€‹

AreaStatusNotes
Decor catalog (Game Data)Live1,668 decor items, 581 fixtures, 1,808 fixture hooks, 22 rooms
Decor collection (Profile)LivePer-character collected decor with quantities
Character house (Profile)Not liveDocumented but 404 universally (Feb 2026)
Account-wide collection404/profile/user/wow/collections/decor listed but returns 404

Auth note: Game Data endpoints work with client-credentials tokens via Authorization: Bearer header (NOT query param). Profile endpoints require user access tokens.


Game Data API โ€” Housing Decorโ€‹

Namespace: static-us (versioned as static-12.0.1_65617-us) Auth: Client credentials token Base: https://{region}.api.blizzard.com

Decor (Decorative Items)โ€‹

EndpointPurposeItems
GET /data/wow/decor/indexList all decor items1,668
GET /data/wow/decor/{decorId}Single decor item detailโ€”
GET /data/wow/search/decorPaginated search with locale dataโ€”

Index response:

{
"_links": { "self": { "href": "..." } },
"decor_items": [
{
"key": { "href": "...decor/533?namespace=static-..." },
"name": "Sturdy Wooden Interior Pillar",
"id": 533
}
]
}

Detail response:

{
"_links": { "self": { "href": "..." } },
"id": 80,
"name": "Ornate Stonework Fireplace",
"items": {
"key": { "href": "...item/235994?namespace=static-..." },
"name": "Ornate Stonework Fireplace",
"id": 235994
},
"dye_slots": [
{ "slot_index": 1, "dye_color_category": "Metal" },
{ "slot_index": 2, "dye_color_category": "General" }
]
}

Key fields:

  • id โ€” Blizzard decor ID
  • name โ€” Localized decor name
  • items โ€” Link to the underlying WoW item (use items.id for media lookup)
  • dye_slots โ€” Optional; array of dyeable slots with color categories

Media: Decor items don't have their own /media endpoint. Use the linked item ID:

GET /data/wow/media/item/{items.id}
โ†’ assets[0].value = icon URL (e.g. https://render.worldofwarcraft.com/.../inv_12ph_opulent_fireplace01.jpg)

Search response: Paginated, includes all locale translations and item ref:

{
"page": 1,
"pageSize": 3,
"pageCount": 556,
"results": [
{
"key": { "href": "...decor/2230..." },
"data": {
"id": 2230,
"name": {
"en_US": "Blackrock Lamppost",
"de_DE": "Laternenmast des Schwarzfelsklans",
"...": "..."
},
"item": {
"name": { "en_US": "Blackrock Lamppost", "...": "..." },
"id": 246413
}
}
}
]
}

Fixture (Structural Components)โ€‹

EndpointPurposeItems
GET /data/wow/fixture/indexList all fixtures581
GET /data/wow/fixture/{fixtureId}Single fixture detailโ€”
GET /data/wow/search/fixturePaginated search with locale dataโ€”

Index response:

{
"fixtures": [
{ "key": { "href": "..." }, "name": "Woodland Dormer - Forest", "id": 5501 }
]
}

Detail response:

{ "id": 5501, "name": "Woodland Dormer - Forest" }

Fixtures are structural house components (dormers, walls, exterior pieces). Simpler than decor โ€” no item link or dye slots.

Fixture Hook (Attachment Points)โ€‹

EndpointPurposeItems
GET /data/wow/fixture-hook/indexList all fixture hooks1,808
GET /data/wow/fixture-hook/{fixtureHookId}Single hook detailโ€”
GET /data/wow/search/fixture-hookPaginated searchโ€”

Index response:

{
"fixture_hooks": [{ "key": { "href": "..." }, "name": "Window", "id": 21149 }]
}

Detail response:

{
"id": 21149,
"type_name": "Window",
"parent_fixture": {
"key": { "href": "...fixture/577..." },
"name": "Stone",
"id": 577
}
}

Fixture hooks define where things attach to fixtures. Each hook has a type_name (e.g. "Window") and references a parent_fixture.

Roomโ€‹

EndpointPurposeItems
GET /data/wow/room/indexList all room types22
GET /data/wow/room/{roomId}Single room detailโ€”
GET /data/wow/search/roomPaginated search with locale dataโ€”

All rooms:

IDName
1Square Room (Small)
2Hallway
3Closet
6T-Shaped Room
7Square Room (Tiny)
8L-Shaped Room
9Octagon Room (Medium)
10Stairwell (Left)
11Square Room (Medium)
12Square Room (Large)
13Cross-Shaped Room
14Octagon Room (Small)
15Octagon Room (Large)
18Base Plot Medium
46Entry
48Stairwell Room (Empty)
50Stairwell (Right)
223Daylight Circle Room
233Evening Circle Room

Profile API โ€” Character Housingโ€‹

Namespace: profile-us Auth: User access token (OAuth โ€” requires wow.profile scope) Base: https://{region}.api.blizzard.com

Character Decor Collectionโ€‹

EndpointPurposeStatus
GET /profile/wow/character/{realmSlug}/{characterName}/collections/decorCollected decor with quantitiesLive
GET /profile/user/wow/collections/decorAccount-wide collection404 (listed but not working)

Response:

{
"_links": { "self": { "href": "..." } },
"decor_collected": [
{
"decor": {
"key": { "href": "...decor/5527?namespace=static-..." },
"name": "Illidari Glaiverest",
"id": 5527
},
"quantity": 1
},
{
"decor": {
"key": { "href": "...decor/772..." },
"name": "Creeping Corner Ivy",
"id": 772
},
"quantity": 21
}
]
}

Key fields:

  • decor_collected[] โ€” Array of collected decor items
  • decor_collected[].decor โ€” Reference to Game Data decor (id, name, key)
  • decor_collected[].quantity โ€” How many the player owns (stackable items can be >1)

Character Houseโ€‹

EndpointPurposeStatus
GET /profile/wow/character/{realmSlug}/{characterName}/house/house-{houseNumber}Character's house layout/dataLive (response shape TBD)

House numbers come from the character profile response. The standard GET /profile/wow/character/{realm}/{name} endpoint now includes a houses array:

{
"houses": [
{
"href": "https://us.api.blizzard.com/profile/wow/character/illidan/dragopriest/house/house-1?namespace=profile-us"
}
]
}
  • houses โ€” Array of href links (characters can have multiple houses)
  • House number is extracted from the URL path (house-1, house-2, etc.)
  • Characters without a house omit the houses field entirely
  • Requires user access token (client credentials returns 404)

Tested via running app (Feb 2026):

  • collections/decor confirmed working with stored user token โ€” returned 787 collected items
  • house/house-1 returns empty 404 everywhere โ€” our stored token, client creds, and dev portal "Try It" console. Endpoint is documented but not live yet.
  • houses field confirmed present on character profiles for characters with a house (Dragopriest), absent for characters without one

The house/house-{N} endpoint is documented in the dev portal but returns 404 universally (as of Feb 2026). Response shape unknown. Likely includes room layout, placed decor/fixtures, and customization state once it goes live.


Data Relationshipsโ€‹

Decor Item โ”€โ”€itemsโ”€โ”€โ†’ WoW Item โ”€โ”€mediaโ”€โ”€โ†’ Icon URL
โ”‚
โ””โ”€โ”€ dye_slots[] (optional color customization)

Fixture โ†โ”€โ”€ parent_fixture โ”€โ”€ Fixture Hook
(structural) (attachment point)

Room (22 types โ€” house layout building blocks)

Character Profile โ”€โ”€houses[]โ”€โ”€โ†’ href links to house-1, house-2, ...
Character โ”€โ”€collections/decorโ”€โ”€โ†’ decor_collected[] (with quantity)
Character โ”€โ”€house/house-Nโ”€โ”€โ†’ house layout data (user token required)

Housing Domain Model (from Datamining)โ€‹

Datamined PlayerHousingConstants Lua enums provide additional context not in the REST API:

Decor Classificationโ€‹

EnumValues
HousingDecorFlagsExterior (1), Interior (2)
HousingDecorTypeFloor (1), Wall (2), Ceiling (3), Tabletop (4)
HousingDecorThemeFolk (1), Rugged (2), Generic (3), Opulent (4)
HousingDecorModelTypeM2 (1, small objects), Wmo (2, large world objects)
Dye Color CategoriesMetal, General (from REST API)

Room / Fixture Classificationโ€‹

EnumValues
HousingRoomComponentTypeWall (1), Floor (2), Ceiling (3), Stairs (4), Pillar (5)
HousingExteriorComponentSizeAny, Small, Medium, Large
HousingExteriorComponentThemeHuman (only one so far)
HousingRoomComponentDoorTypeNone (0), NarrowDoor (1), LargeDoor (2)

Permissions (Bitmask)โ€‹

PermissionValue
AddDecor1
ChangeDecorParam2
EnterDecorEditMode4
MoveDecor8
RemoveDecor16
SaveHouse32
SelectDecor64
EditLayout128

Implementation Notesโ€‹

Auth Requirementsโ€‹

Endpoint TypeTokenHow We Get It
Game Data (/data/wow/...)Client credentialsBattleNetAdapter.ensureAccessToken() โ€” already implemented
Profile (/profile/wow/...)User access tokenBattleNetTokenService.refresh() โ€” already implemented

Important: Game Data endpoints return 404 when token is passed as ?access_token= query param. Must use Authorization: Bearer header. Our BattleNetAdapter already uses headers, so this is fine.

Sync Strategyโ€‹

Implemented in apps/api/src/game-data/housing-sync.service.ts. Uses incremental chunked upserts โ€” no all-or-nothing transaction.

For each entity type (decor, fixtures, fixture hooks, rooms):

  1. Fetch en_US index โ†’ e.g. GET /data/wow/decor/index?locale=en_US
  2. Upsert base rows โ†’ Batched prisma.$transaction([upsert, upsert, ...]) in chunks of 100
  3. Fetch other locale indexes โ†’ One index call per locale (6 total)
  4. Upsert locale rows โ†’ deleteMany({ where: { locale } }) + createMany per locale
  5. (Decor only) Detail enrichment โ†’ GET /data/wow/decor/{id} for itemId + dyeSlots, 10 concurrent
  6. (Decor only) Icon resolution โ†’ Fetch item media URLs, upload to S3, update DB rows

Each step persists immediately โ€” partial progress is saved if the sync fails partway through. Progress is emitted via WebSocket after each chunk.

The search endpoints are not used for decor/fixtures/rooms (search caps at 1,000 results). Search is only used for fixture hooks to get parentFixtureId (the index doesn't include it).

Volume Estimatesโ€‹

ResourceCountSync Approach
Decor items1,668Index per locale (7 calls) + detail per item (~1,668)
Fixtures581Index per locale (7 calls)
Fixture hooks1,808Index per locale + search for parentFixtureId (~10 pages)
Rooms19Index per locale (7 calls)
Character collectionsper-userOn-demand with user token

Action Itemsโ€‹

  1. Monitor house endpoint โ€” house/house-{N} documented but 404 universally; re-test after patches
  2. Monitor account-wide endpoint โ€” /profile/user/wow/collections/decor also listed but 404; may go live later
  3. Design Prisma models โ€” Done (Sprint 4)
  4. Implement decor catalog sync โ€” Done (Sprint 4, incremental chunked upserts)
  5. Add to character enrichment โ€” Fetch collected decor during character sync

Referencesโ€‹