Protocol v1 payload reference
Wire examples for connector and gateway debugging
This page is for connector diagnostics and protocol maintenance. A server owner does not need these payloads to connect or configure a server: connector code parses and serializes them before integration code or configured SQL runs.
Common delivery envelope
Every paid game change has a stable command id for replay handling, its parent order id, the normalized target, and one versioned grant object.
{
"commandId": "77e6a4f0-4f6b-4c85-9e37-1d2a55f0a001",
"orderId": "b1c9c6a2-8d33-4f1e-9b70-6c0d64f0a002",
"grantActionId": "5a3f2d10-91ab-4d4f-8c22-7e9b64f0a003",
"target": {
"normalizedAccountName": "hero01",
"characterId": 268480001
},
"grant": {
"type": "l2.grant_item",
"schemaVersion": 1,
"itemId": 57,
"count": 1000
}
}enchantLevel is optional and defaults to 0. A bundle uses one order id and
one command id per grant line. Replay protection is keyed by command id.
Other grant objects
{ "type": "l2.grant_skill", "schemaVersion": 1, "skillId": 1204, "skillLevel": 1 }{ "type": "l2.character_rename", "schemaVersion": 1, "newName": "Ravenblade" }{ "type": "l2.gender_change", "schemaVersion": 1, "newSex": "female" }{ "type": "m2.grant_cash", "schemaVersion": 1, "amount": 5000 }{ "type": "m2.grant_mileage", "schemaVersion": 1, "amount": 250 }The outer envelope remains the same. Account-scoped grants omit the character target when the game operation does not use one.
Character and catalog rows
{
"characterId": 268437506,
"name": "Ravenblade",
"level": 40,
"classId": 88,
"race": "human",
"sex": "male",
"online": true,
"pvpKills": 3,
"pkKills": 0,
"clanName": null
}{ "itemId": 57, "name": "Adena", "type": "EtcItem", "grade": null, "stackable": true }{ "skillId": 1204, "name": "Wind Walk", "maxLevel": 1 }Character skills query
{ "normalizedAccountName": "hero01", "characterId": 268480001 }{
"outcome": "OK",
"skills": [
{ "skillId": 3, "level": 9 },
{ "skillId": 1040, "level": 3 }
]
}Player-online event
{
"protocolVersion": 1,
"messageId": "7ef143bc-5810-4b10-9507-820e72b13ce1",
"gameServerId": "834a9e80-607b-46b4-8952-cb27d2a476c9",
"sentAt": "2026-07-30T12:00:00.000Z",
"type": "event.player_online",
"payload": {
"normalizedAccountName": "admin",
"characterId": 268473216
}
}Protocol v1 retains these shapes for compatibility. Public integration APIs use domain objects or profile rows instead of constructing this JSON.
Marketplace inventory and withdrawal
Inventory results describe whether an item is safe to transfer. objectId is
optional for aggregate stack rows; location, icon, and name may be null.
{
"objectId": 12345,
"itemId": 4037,
"count": 1,
"stackable": false,
"enchantLevel": 0,
"equipped": false,
"location": "INVENTORY",
"fidelity": "TRANSFERABLE",
"icon": null,
"name": "Blessed Scroll"
}Only TRANSFERABLE, unequipped rows in INVENTORY can enter escrow. The
withdrawal carries the item instance selected by the player:
{
"commandId": "77e6a4f0-4f6b-4c85-9e37-1d2a55f0a001",
"escrowId": "b1c9c6a2-8d33-4f1e-9b70-6c0d64f0a002",
"withdrawActionId": "5a3f2d10-91ab-4d4f-8c22-7e9b64f0a003",
"target": { "normalizedAccountName": "hero01", "characterId": 268480001 },
"item": {
"type": "l2.withdraw_item",
"schemaVersion": 1,
"itemId": 4037,
"count": 1,
"objectId": 12345
}
}An APPLIED withdrawal includes withdrawnJson. The Java core creates this
evidence only after its independent inventory reads prove the exact item id,
count, enchant level, instance id when pinned, transfer fidelity, equipment
state, and location. The portal rejects incomplete or mismatched evidence into
reconciliation instead of crediting the vault.