{"openapi":"3.1.0","info":{"title":"Sitowise API","version":"1.0.0","description":"Read-only access to node sales on Robinhood Chain. Every money figure is a decimal string of wei, because a balance that passes through a float stops adding up. Nothing here needs a key."},"servers":[{"url":"https://sitowise.tech"}],"paths":{"/api/stats":{"get":{"summary":"Protocol totals","responses":{"200":{"description":"Counters behind the landing page.","content":{"application/json":{"schema":{"type":"object","properties":{"totalNodes":{"type":"integer"},"operators":{"type":"integer","description":"Distinct wallets holding a node."},"totalDistributedWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"distributions24hWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."}}}}}}}}},"/api/cover":{"get":{"summary":"Whether node balances are backed","description":"Read from the chain rather than from our database, and both figures come from the same block. Answers 503 rather than serving a stale 'covered' when the chain cannot be read.","responses":{"200":{"description":"What the contract owes and what it holds.","content":{"application/json":{"schema":{"type":"object","properties":{"contract":{"type":"string"},"balanceWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"outstandingWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"covered":{"type":"boolean"},"paused":{"type":"boolean","description":"Minting only. Pausing cannot block a withdrawal."}}}}}},"503":{"description":"The chain could not be read."}}}},"/api/tiers":{"get":{"summary":"Node tiers","description":"Prices, allowances and holding thresholds. `enforcedBy` says which rules the contract applies and which we do; only the total per wallet is on chain.","responses":{"200":{"description":"Every tier, whether on sale or not.","content":{"application/json":{"schema":{"type":"object","properties":{"tiers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"priceWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"maxPerWallet":{"type":"integer"},"holdingWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"holdingToken":{"type":["string","null"]},"payoutBps":{"type":"integer","description":"Accrual against the base range. 10000 is base."},"onSale":{"type":"boolean"},"enforcedBy":{"type":"object"}}}}}}}}}}}},"/api/nodes/{address}":{"get":{"summary":"Every node a wallet holds","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"}}],"responses":{"200":{"description":"Nodes, oldest first.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Use as :id on /api/node/:id."},"chainNodeId":{"type":"string"},"tier":{"type":"string"},"balanceWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"cumulativeWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"withdrawnWei":{"type":"string","pattern":"^\\d+$","description":"A whole number of wei as a decimal string. Never a float."},"mintTx":{"type":"string"},"status":{"type":"string"},"createdAt":{"type":["string","null"],"format":"date-time"}}}}}}},"400":{"description":"Not an address."}}}},"/api/node/{id}":{"get":{"summary":"One node, with its credits and withdrawals","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The node in full."},"404":{"description":"No such node."}}}},"/api/distributions":{"get":{"summary":"Recent distribution rounds","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"Rounds, newest first."}}}},"/api/price":{"get":{"summary":"ETH price in USD","description":"null when no quote was available, never a made-up number.","responses":{"200":{"description":"{ usd: number | null }"}}}}},"components":{"responses":{"Error":{"description":"Every failure is the same shape: { error: string }. The message is meant to be shown to a person.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}}