List an object's history

Everything that has ever happened to one object, newest first: what was done, by whom, when, and which batch made it permanent. Each entry records the owner before and after, the fingerprints of the object before and after, and the batch that settled it — enough to follow a ticket from the moment it was issued to the moment it was used, and to prove every step along the way. This is the object's public audit history. No sign-in is needed.

GET
/public/objects/{objectId}/state-changes

Path Parameters

objectId*string

Identifier of the smart object.

Query Parameters

id?string

Return only the resource with this identifier. Equivalent to fetching it by path, but usable together with the other list filters.

limit?integer

How many items to return in one page. The default and the maximum are both 25; a larger value is rejected with 400.

Default25
Formatint64
Range1 <= value <= 25
next?string

Cursor for the next page, taken verbatim from the next field of the previous response. Keep every other query parameter the same between pages: sortBy and order are part of what the cursor means. An absent or empty next in a response means there are no more pages.

The value is opaque. Do not parse it or build one yourself.

order?string

Sort direction. Defaults to desc, newest first.

Default"desc"
Value in"asc" | "desc"
sortBy?string

Field used to sort the result. Supported fields depend on the endpoint; use when_created for chronological ordering where it is available. The default is the resource identifier, and identifiers break ties so cursor paging stays stable.

action_id?string

Return only the change made by this action.

batch_id?string

Return only changes settled in this batch.

change_type?string

Return only changes of this kind: create when the object came into being, update when it changed, delete when it was destroyed.

action_type?string

Return only changes made by this action, such as transfer or redeem.

nonce[$gt]?integer

Return only changes after this point in the object's life. Each change raises the object's count by one, so this walks its history in order.

nonce[$lt]?integer

Return only changes before this point in the object's life.

prev_state_root?string

Return the change that started from this fingerprint.

next_state_root?string

Return the change that produced this fingerprint.

when_created[$gt]?string

Happened strictly after this moment.

Formatdate-time
when_created[$lt]?string

Happened strictly before this moment.

Formatdate-time
when_created[$gte]?string

Happened at or after this moment.

Formatdate-time
when_created[$lte]?string

Happened at or before this moment.

Formatdate-time

Response Body

application/json

application/json

application/json

application/json

curl -X GET "https://api.dual.network/public/objects/665f1c2d4b1a2c3d4e5f6a90/state-changes"
{
  "state_changes": [
    {
      "id": "665f1c2d4b1a2c3d4e5f6c90",
      "object_id": "665f1c2d4b1a2c3d4e5f6a90",
      "wallet_id": "665f1c2d4b1a2c3d4e5f6a01",
      "action_id": "665f1c2d4b1a2c3d4e5f6e02",
      "action_name": "transfer",
      "change_type": "update",
      "prev_owner": "0x1234567890abcdef1234567890abcdef12345678",
      "current_owner": "0xfedcba9876543210fedcba9876543210fedcba98",
      "prev_nonce": 2,
      "next_nonce": 3,
      "prev_state_hash": "0x9f8e7d6c5b4a39281706f5e4d3c2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a0",
      "next_state_hash": "0xa1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90",
      "prev_content_hash": "0x8e7d6c5b4a39281706f5e4d3c2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a09f",
      "next_content_hash": "0xb2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90a1",
      "prev_integrity_hash": "0xd4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3",
      "next_integrity_hash": "0xc3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2",
      "merkle_proof": [],
      "batch_id": "665f1c2d4b1a2c3d4e5f6a20",
      "when_created": "2026-05-11T18:24:00Z"
    }
  ]
}
{
  "code": 3,
  "message": "Key: 'limit' Error:Field validation for 'limit' failed on the 'lte' tag"
}
{
  "code": 5,
  "message": "object not found"
}
{
  "code": 13,
  "message": "internal error"
}