WebSocket

Client messages, channels, and server event payloads.

Client → server

Connect to /ws, then send a subscribe or unsubscribe JSON text frame.

Subscribe
{
  "action": "subscribe",
  "channels": [
    "player:576460752303423488:state",
    "craft:576460752955699184:craft_progress"
  ]
}
Acknowledgement
{
  "action": "subscribed",
  "channels": [
    "craft:576460752955699184:craft_progress",
    "player:576460752303423488:state"
  ]
}
Unsubscribe
{
  "action": "unsubscribe",
  "channels": [
    "craft:576460752955699184:craft_progress"
  ]
}
Error envelope
{
  "event": "error",
  "error": {
    "code": "invalid_channel",
    "message": "unknown channel event: bad_event"
  }
}

Channels

player:<playerId>:stateplayer:<playerId>:statsplayer:<playerId>:xpplayer:<playerId>:inventory_changeplayer:<playerId>:passive_craft_createdplayer:<playerId>:passive_craft_finishedplayer:<playerId>:craft_createdplayer:<playerId>:craft_finishedplayer:<playerId>:craft_startplayer:<playerId>:craft_endcraft:<craftId>:craft_progresscraft:<craftId>:craft_finished

Shared output objects

ObjectExact fieldsNotes
PlayerIdentityid: string, name: stringIds are canonical positive numeric strings.
RecipeIdentityid: number, name: stringStatic recipe identity.
CraftItemname: string, quantity: integer, recipe: RecipeIdentityquantity is the recipe output per execution; the enclosing craft carries craftCount.
CraftProgresscompleted: integer, required: integerCurrent completed effort and total required effort.
ContributoractionsContributed: integer, player: PlayerIdentityContribution count for one correlated player.
ClaimIdentityid: string, name: stringOwning claim identity.
BuildingIdentityid: string, name: string, claim: ClaimIdentityCraft lifecycle events require a claimed building.
ActivityBuildingIdentityid: string, name: string, claim: ClaimIdentity | nullPlayer activity may occur at an unclaimed building.
craftCount and item.quantity are separate

A craft producing 90 Sturdy Cloth carries craftCount: 90 and quantity: 1. Multiply them only when the total output amount is needed.

Server → client events

craft_created

A progressive craft first appeared at a claimed building.

Channelplayer:<playerId>:craft_created

Required
Payload
{
  "event": "craft_created",
  "startedAt": "2026-07-30T18:00:00Z",
  "regionId": 8,
  "player": {
    "id": "576460752303423488",
    "name": "Ada"
  },
  "craft": {
    "id": "576460752955699184",
    "craftCount": 90,
    "item": {
      "name": "Sturdy Cloth",
      "quantity": 1,
      "recipe": {
        "id": 409001,
        "name": "Weave Sturdy Cloth"
      }
    },
    "progress": {
      "completed": 0,
      "required": 13676
    },
    "contributors": [],
    "building": {
      "id": "576460752303423500",
      "name": "Fine Tailoring Station",
      "claim": {
        "id": "576460752303423510",
        "name": "Workshop"
      }
    }
  }
}

Payload fields

FieldTypeRequiredDescription
event"craft_created"YesExact event discriminator.
startedAtstringYesUTC ISO 8601 timestamp for the start of the craft.
regionIdintegerYesNumeric BitCraft region id.
playerPlayerIdentityYesPlayer identity with a numeric string id and display name.
craftProgressiveCraftWithBuildingYesProgressive craft with its building and owning claim.