List batches

Browse the batches that turn individual actions into permanent network history. Each batch contains an ordered group of actions, a proof of their state changes, and the commitment anchored on chain. Results are newest first unless you change `sortBy` or `order`. `status` tells you how far along a batch is: ``` building → requesting → proving → storing → anchoring → nfts → settling → finalized ``` `finalized` means the challenge window has closed and the batch is settled. `failed` is terminal; every other value means processing is still under way, which is normal for a recent batch. To find the batch behind one of your actions, look the action up in `GET /public/action-logs` and follow the batch it names, or filter here with `action_id`. Open to everyone. No sign-in needed.

GET
/public/batches

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.

autocomplete?string

Look up one batch by id or by hash. A 24-character hexadecimal value is treated as an id, anything else as a batch hash.

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.

sequence?integer

Return the batch with this sequence number. Sequence numbers are contiguous and increasing.

Formatuint64
hash?string

Return the batch with this hash.

status?string

Return only batches in this pipeline stage.

Value in"building" | "requesting" | "proving" | "storing" | "anchoring" | "nfts" | "settling" | "finalized" | "failed"
action_id?string

Return the batch containing this action identifier.

when_created[$gt]?string

Built strictly after this instant.

Formatdate-time
when_created[$lt]?string

Built strictly before this instant.

Formatdate-time
when_created[$gte]?string

Built at or after this instant.

Formatdate-time
when_created[$lte]?string

Built at or before this instant.

Formatdate-time
when_modified[$gt]?string

Last advanced strictly after this instant.

Formatdate-time
when_modified[$lt]?string

Last advanced strictly before this instant.

Formatdate-time
when_modified[$gte]?string

Last advanced at or after this instant.

Formatdate-time
when_modified[$lte]?string

Last advanced at or before this instant.

Formatdate-time
challenge_window_end[$gt]?string

Challenge window ends strictly after this instant.

Formatdate-time
challenge_window_end[$lt]?string

Challenge window ends strictly before this instant.

Formatdate-time
challenge_window_end[$gte]?string

Challenge window ends at or after this instant.

Formatdate-time
challenge_window_end[$lte]?string

Challenge window ends at or before this instant.

Formatdate-time

Response Body

application/json

application/json

application/json

curl -X GET "https://api.dual.network/public/batches"
{
  "batches": [
    {
      "id": "665f1c2d4b1a2c3d4e5f6a20",
      "sequence": 794,
      "hash": "0x7f1a9c3e5d2b4806a1c9d8e7f6a5b4c3d2e1f00918273645546372819a0b1c2d",
      "prev_hash": "0x6e0b8d2f4c1a3795b0d8c7e6f5a4b3c2d1e0f00817263544536271809f0a1b2c",
      "integrity_root": "0x91a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f80",
      "prev_integrity_root": "0x80f7e6d5c4b3a2918f7e6d5c4b3a2918f7e6d5c4b3a2918f7e6d5c4b3a2918f7",
      "sender": "0x9999999999999999999999999999999999999999",
      "commitment": "0x1122334455667788990011223344556677889900112233445566778899001122",
      "actions_hash": "0x2233445566778899001122334455667788990011223344556677889900112233",
      "actions_count": 128,
      "affected_actions": [
        {
          "id": "665f1c2d4b1a2c3d4e5f6e01",
          "hash": "0xaa11bb22cc33dd44ee55ff6677889900aabbccddeeff00112233445566778899",
          "name": "transfer"
        }
      ],
      "total_fee": "1.284000",
      "total_fee_wei": "31165048543689320388",
      "version": 2,
      "status": "finalized",
      "ipfs_url": "https://ipfs.example.com/ipfs/bafybeiexamplecontentidentifier",
      "l2_tx_hash": "0xcafe0011223344556677889900aabbccddeeff00112233445566778899aabbcc",
      "l2_finalization_tx_hash": "0xbeef0011223344556677889900aabbccddeeff00112233445566778899aabbcc",
      "challenge_window_end": "2026-03-02T18:00:00Z",
      "when_created": "2026-03-02T14:00:00Z",
      "when_completed": "2026-03-02T18:04:11Z",
      "when_modified": "2026-03-02T18:04:11Z"
    }
  ],
  "next": "7b226964223a22363635663163326434623161326333643465356636613230227d"
}
{
  "code": 3,
  "message": "Key: 'limit' Error:Field validation for 'limit' failed on the 'lte' tag"
}
{
  "code": 13,
  "message": "internal error"
}