Sitowise
API

GET /api/node/:id

Everything the ledger holds about one node, including the individual credits it has received and every withdrawal made against it.

Request

Request
GET /api/node/12
GET /api/node/12?limit=200
ParameterInRules
idPathEither the chain node id or the ledger row id. Both are echoed back, so the answer always says which node you got.
limitQueryHow many credits and withdrawals to return. Default 50, maximum 200. Applies to each list separately.
Accepting either id is safe here because this is a read with no side effects. Anything that writes takes the chain node id only, never the ledger row id: that is true of POST /api/nodes/sync, and it is true of the contract, which has never heard of a row id. Passing a row id to withdraw would name a different node. See Node numbering.

Response

200 application/json
{
  "id": 12,
  "chainNodeId": "12",
  "owner": "0x1234567890abcdef1234567890abcdef12345678",
  "createdAt": "2026-08-19T09:14:02.114Z",
  "priceWei": "20000000000000000",
  "balanceWei":    "418000000000000",
  "cumulativeWei": "902000000000000",
  "withdrawnWei":  "484000000000000",
  "mintTx": "0xab…",
  "status": "active",

  "credits": [
    {
      "id": 8814,
      "distributionId": 613,
      "amountWei": "6120000000",
      "createdAt": "2026-08-24T11:02:41.008Z"
    }
  ],

  "withdrawals": [
    {
      "id": 41,
      "amountWei": "484000000000000",
      "cumulativeSignedWei": "484000000000000",
      "toAddress": "0x1234567890abcdef1234567890abcdef12345678",
      "deadline": 1756041600,
      "txHash": "0xcd…",
      "status": "sent",
      "createdAt": "2026-08-22T18:31:09.552Z",
      "confirmedAt": "2026-08-22T18:31:41.310Z"
    }
  ]
}

Node fields

The same fields as GET /api/nodes/:address, plus two:

FieldTypeMeaning
ownerstring or nullOwner as recorded in the ledger, lower case. The contract is authoritative through the first value nodeInfo(id) returns.
priceWeistringWhat was actually paid for this node, in wei, at the time it was minted

Credit fields

FieldTypeMeaning
idnumberCredit row id
distributionIdnumberThe round this credit belongs to. Cross-reference with GET /api/distributions to see the round total and its funding mode.
amountWeistringCredited to this node in that round
createdAtstring or nullISO 8601 UTC

Withdrawal fields

This list is the ledger’s record of withdrawals against the node. It is history, not permission: the server plays no part in a withdrawal, which is a call the owner’s own wallet makes to the factory. Two of the columns below are leftovers from an older design and no longer carry a meaning; they are documented so nobody reads one as something it is not.

FieldTypeMeaning
idnumberWithdrawal row id in the ledger. It has no meaning on chain.
amountWeistringPaid out by this withdrawal
cumulativeSignedWeistringA leftover column. No server signs anything that permits a withdrawal, so this carries no current meaning. Do not build against it.
toAddressstring or nullWhere the ETH was sent, which is the to argument the owner passed to withdraw. Not necessarily the owner’s own address.
deadlinenumberA leftover column. Withdrawals have no expiry and no time limit of any kind. Ignore it.
txHashstring or nullThe transaction the withdrawal happened in, once one is known
statusstring or nullOne of signed, sent or failed, the three the column allows. sent is a withdrawal that went through and failed one that reverted.
createdAtstring or nullISO 8601 UTC, when the row was written
confirmedAtstring or nullWhen the receipt was seen. Null until then.

A failed row is a transaction that reverted. It costs the sender gas and leaves the node’s balance exactly where it was, because a revert undoes everything in the call. What the contract can revert with is on Factory interface.

The authoritative withdrawal history is on chain, in the Withdrawn event and in the totalWithdrawnByNode figure nodeInfo(id) returns. This list can lag it, and it can be missing rows for a withdrawal the ledger has not observed yet. Where the two disagree, the chain is right. See Events.

Ordering and paging

Both lists are newest first, ordered by creation time then id. There is no cursor; use limit to widen the window, up to 200 rows per list. For a full history of a long-lived node, read the chain logs instead; see Events.

Caching and limits

PropertyValue
Cache-Controlpublic, max-age=0, s-maxage=5, stale-while-revalidate=15
Rate limit60 requests per minute per IP

Errors

StatusBodyWhen
400{ "error": "…" }The id is not a positive whole number, or the limit is out of range
404{ "error": "No node with that id." }No node matches under either id space
429{ "error": "Too many requests…" }Over the per-IP limit

Example

curl and jq
# what this node has been credited, round by round
curl -s https://sitowise.xyz/api/node/12 \
  | jq -r '.credits[] | "\(.createdAt)  \(.amountWei)"'

# every destination this node has ever paid out to
curl -s https://sitowise.xyz/api/node/12 \
  | jq -r '.withdrawals[] | select(.status == "sent") | .toAddress' \
  | sort -u