{
  "openapi": "3.1.0",
  "info": {
    "title": "NetNet Intel read API",
    "version": "1.7.0",
    "description": "Read-only JSON for NetNet ($NET) on Robinhood Chain (chain 4663), from public chain reads. Fan-made, not affiliated with NetNet Capital; not financial advice. No key needed; any origin; 120 requests a minute per address (20 for /api/v1/verify; MCP: 240 tool calls a minute per client), 429 with Retry-After beyond. Amounts are plain numbers in USD, NET or USDG; times are ISO 8601 UTC; each response carries the block it was read at. Bodies are compact JSON; add ?pretty=1 for indented output. Every on-chain figure is verifiable: /api/v1/sources gives each one's exact eth_call and /api/v1/verify re-reads it from the chain's public RPC. Guide: https://netnetintel.com/llms.txt A slow or failing source is answered from its last good body (header x-fallback: last_good, a lastGood field, stale: true). Uptime: https://netnetintel.com/status. Usage, limits, common multi-step patterns, answer sizes and the error table: https://netnetintel.com/llms.txt. Ready-made clients that handle 429s and freshness: https://netnetintel.com/examples/netnet_client.py and https://netnetintel.com/examples/netnet-client.ts."
  },
  "servers": [
    {
      "url": "https://netnetintel.com"
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "listEndpoints",
        "summary": "The list of endpoints",
        "responses": {
          "200": {
            "description": "Endpoint index",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/net": {
      "get": {
        "operationId": "getNet",
        "summary": "Live $NET figures: price, NAV, premium, reserves, supply, staked, DEX market (about 15 s fresh)",
        "responses": {
          "200": {
            "description": "Live figures",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Net"
                }
              }
            }
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/predict": {
      "get": {
        "operationId": "getPredict",
        "summary": "The weekly Treasury prediction market: open series, live number vs line, model odds, past series (about 15 s fresh)",
        "responses": {
          "200": {
            "description": "Market state",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Predict"
                }
              }
            }
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/history": {
      "get": {
        "operationId": "getHistory",
        "summary": "The number's history (every 30 minutes up to 7 days, every 4 hours up to 30, daily beyond; detail=full for the whole grid): Core RFV, the sleeve mark, memo holdings and True RFV, backing, TWAP, supply and staked; True RFV by asset class at each day's close",
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Days back from now",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 90,
              "default": 7
            }
          },
          {
            "name": "interval",
            "in": "query",
            "description": "Spacing of the rows; each coarser point is the last 30-minute row at or before its mark, and the latest row is always last. Default: 30m up to 7 days, 4h up to 30, 1d beyond",
            "schema": {
              "type": "string",
              "enum": ["30m", "1h", "4h", "1d"]
            }
          },
          {
            "name": "detail",
            "in": "query",
            "description": "full: every 30-minute row (90 days is about 1.2 MB)",
            "schema": {
              "type": "string",
              "enum": ["full"]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "History rows, oldest first",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/History"
                }
              }
            }
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/presser/{id}": {
      "get": {
        "operationId": "getPresser",
        "summary": "One Button Presser card: owner, faction, character, plate, gear, and its OpenSea ask if listed",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4999
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The card",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Presser"
                }
              }
            }
          },
          "400": {
            "description": "id out of range",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/nav": {
      "get": {
        "operationId": "getNav",
        "summary": "NAV per NET: core (Treasury.backingPerToken()) and incl. the RWA sleeve, with recipes",
        "responses": {
          "200": {
            "description": "NAV per NET: core (Treasury.backingPerToken()) and incl. the RWA sleeve, with recipes",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Nav"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/treasury": {
      "get": {
        "operationId": "getTreasury",
        "summary": "Reserves: RFV and its parts, holdings, pools, the sleeve's direct holdings",
        "responses": {
          "200": {
            "description": "Reserves: RFV and its parts, holdings, pools, the sleeve's direct holdings",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Treasury"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/supply": {
      "get": {
        "operationId": "getSupply",
        "summary": "Supply and staking",
        "responses": {
          "200": {
            "description": "Supply and staking",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Supply"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/holders": {
      "get": {
        "operationId": "getHolders",
        "summary": "The top 50 wallets (balance, stance, flows, entry and P&L) and their latest decoded moves, filterable by kind, days, size and stance",
        "responses": {
          "200": {
            "description": "The top 50 wallets and their latest decoded moves",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Holders"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        },
        "parameters": [
          {
            "name": "moves",
            "in": "query",
            "description": "How many of the latest moves",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "address",
            "in": "query",
            "description": "Only this wallet's moves",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "description": "Only these move kinds, comma-separated: buy, sell, bond, stake, unstake, lp-add, lp-remove, deposit, withdraw, transfer-in, transfer-out",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Only moves in the last N days",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "minUsd",
            "in": "query",
            "description": "Only moves worth at least this many USD",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "stance",
            "in": "query",
            "description": "Only whales with these stances, comma-separated: holding, accumulating, staking, unstaking, trading, moving-out",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/whale/{address}": {
      "get": {
        "operationId": "getWhale",
        "summary": "One top-50 wallet",
        "responses": {
          "200": {
            "description": "One top-50 wallet",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Whale"
                }
              }
            }
          },
          "400": {
            "description": "Bad input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Not a wallet NetNet Intel indexes",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        },
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          }
        ]
      }
    },
    "/api/v1/bonds": {
      "get": {
        "operationId": "getBonds",
        "summary": "The bond desk by epoch (fill at 1, 2 and 4 hours, sell-out, price paid vs the pool and after the vest), the live epoch, and demand by NET's price trend",
        "responses": {
          "200": {
            "description": "The bond desk by epoch",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bonds"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        },
        "parameters": [
          {
            "name": "epochs",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 90,
              "default": 21
            },
            "description": "How many recent epochs"
          },
          {
            "name": "trend",
            "in": "query",
            "description": "The price-trend window for demandByTrend",
            "schema": {
              "type": "string",
              "enum": [
                "8h",
                "24h",
                "3d"
              ],
              "default": "24h"
            }
          }
        ]
      }
    },
    "/api/v1/credit": {
      "get": {
        "operationId": "getCredit",
        "summary": "NetNet Credit and Loopback",
        "responses": {
          "200": {
            "description": "NetNet Credit and Loopback",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Credit"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/buybacks": {
      "get": {
        "operationId": "getBuybacks",
        "summary": "The team's NET buybacks: windows and share of supply, any window vs the one before, daily levels, by Safe and venue, recent buys, the OTC desk, funding and the inverse bond",
        "responses": {
          "200": {
            "description": "The team's NET buybacks: windows, daily levels, venues, recent buys, funding and the inverse bond",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Buybacks"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "The window to total and compare with the window before it",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 90,
              "default": 7
            }
          }
        ]
      }
    },
    "/api/v1/sources": {
      "get": {
        "operationId": "getSources",
        "summary": "How every figure is read: contracts, eth_calls, decimals, formulas",
        "responses": {
          "200": {
            "description": "How every figure is read: contracts, eth_calls, decimals, formulas",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Sources"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/alerts": {
      "get": {
        "operationId": "getAlerts",
        "summary": "What needs attention now: Advance open, Loop risk, buybacks after a quiet stretch, whale sells",
        "parameters": [
          {
            "name": "minUsd",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "default": 10000
            }
          }
        ],
        "responses": {
          "200": {
            "description": "alerts[] {id, level, text, figures, source, page}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/peer": {
      "get": {
        "operationId": "getPeerCheck",
        "summary": "NetNet Intel's core figures beside an independent reader's (Netstack), row by row",
        "responses": {
          "200": {
            "description": "peer, ours/theirs blocks, verdict, rows[] {figure, unit, ours, peer, diff, tolerance, verdict}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "503": {
            "description": "The peer did not answer"
          }
        }
      }
    },
    "/api/v1/desk": {
      "get": {
        "operationId": "getDesk",
        "summary": "The community desk in one call: every tile with each figure's value, block, asOf, source and recipe",
        "responses": {
          "200": {
            "description": "panels[]: {id, title, page, figures[]: {label, value, unit, block, asOf, source {endpoint, field}, recipe {id, url, rebuiltByDesk}}}; complete; verify",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/recipes": {
      "get": {
        "operationId": "getRecipes",
        "summary": "How to rebuild every figure from Robinhood Chain alone: the recipe catalog",
        "description": "73 recipes by area. Each lists contract calls (address, calldata, decimals), event filters (address, topic0, fromBlock), the formula, steps, caveats and what it needs (eth_call, eth_getLogs, archive, off-chain input). The code: https://netnetintel.com/kit/netnet-recipes.mjs (MIT, no dependencies).",
        "responses": {
          "200": {
            "description": "The recipe catalog",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "chain": {
                      "type": "object"
                    },
                    "areas": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "recipes": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "area": {
                            "type": "string"
                          },
                          "label": {
                            "type": "string"
                          },
                          "unit": {
                            "type": "string"
                          },
                          "needs": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "what": {
                            "type": "string"
                          },
                          "url": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          }
        }
      }
    },
    "/api/v1/recipes/{id}": {
      "get": {
        "operationId": "getRecipe",
        "summary": "One recipe, the figure NetNet Intel serves for it, and optionally a worked example pinned to a block",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Recipe id, e.g. nav_core, buybacks_window, advance_capacity, loop_book"
          },
          {
            "name": "run",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Run the recipe now against the public RPC at the chain head and return the worked example: value, block, every request with its raw result, and the comparison with the served figure. Contract-read recipes only."
          }
        ],
        "responses": {
          "200": {
            "description": "The recipe (sources, formula, steps, caveats), served {endpoint, field, value} and, with run=1, example {block, value, requests[], vsServed}",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Unknown recipe"
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          }
        }
      }
    },
    "/api/v1/verify": {
      "get": {
        "operationId": "verifyFigures",
        "summary": "Re-read figures from the public RPC and compare",
        "responses": {
          "200": {
            "description": "Re-read figures from the public RPC and compare",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Verify"
                }
              }
            }
          },
          "400": {
            "description": "Bad input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        },
        "parameters": [
          {
            "name": "figures",
            "in": "query",
            "description": "Comma-separated figure ids; all when omitted. Ids: nav_core, nav_core_check, rfv, rfv_liquid_usdg, rfv_morpho_counted, rfv_pol, supply, price_twap, premium_core, staked, staked_share, dividend_index, sleeve_wallet",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/v1/status": {
      "get": {
        "operationId": "getStatus",
        "summary": "Liveness of the read API, and the MCP heartbeat (every 10 minutes, every tool in turn: status, uptime, tools failing)",
        "responses": {
          "200": {
            "description": "The API is up",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/pressers": {
      "get": {
        "operationId": "searchPressers",
        "summary": "Search Button Presser cards (Brass and Steel) by plate, side, character, race and OpenSea ask, cheapest first with OpenSea links",
        "parameters": [
          {
            "name": "plate",
            "in": "query",
            "description": "Brass = No. 1-999, Steel = No. 1,000-4,999",
            "schema": {
              "type": "string",
              "enum": [
                "brass",
                "steel",
                "any"
              ]
            }
          },
          {
            "name": "faction",
            "in": "query",
            "description": "Side: none = no side chosen yet",
            "schema": {
              "type": "string",
              "enum": [
                "none",
                "chosen",
                "bluechips",
                "frontier",
                "any"
              ]
            }
          },
          {
            "name": "character",
            "in": "query",
            "description": "none = no character created yet (a card without a side never has one)",
            "schema": {
              "type": "string",
              "enum": [
                "none",
                "created",
                "any"
              ]
            }
          },
          {
            "name": "race",
            "in": "query",
            "description": "A character race or its ticker: macintosh/AAPL, bluescreen/MSFT, crawler/GOOGL, starman/SPCX, vaultkin/COIN, fabricant/NVDA",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "listed",
            "in": "query",
            "description": "true: only listed (the default when sorting by price); false: only unlisted",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "minPrice",
            "in": "query",
            "description": "Lowest ask, in the ask currency (usually USDG)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxPrice",
            "in": "query",
            "description": "Highest ask",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "combine",
            "in": "query",
            "description": "How the faction and character filters join",
            "schema": {
              "type": "string",
              "enum": [
                "and",
                "or"
              ],
              "default": "and"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "price",
                "-price",
                "id",
                "-id"
              ],
              "default": "price"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "How many rows to return",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search Button Presser cards (Brass and Steel) by plate, side, character, race and OpenSea ask, cheapest first with OpenSea links",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresserSearch"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          },
          "503": {
            "description": "The Presser roster is not readable right now",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/presser": {
      "get": {
        "operationId": "getPresserMarket",
        "summary": "The Button Presser census (minted, sides, races, plates) and the OpenSea market: floor, how many are listed, the 20 cheapest asks",
        "responses": {
          "200": {
            "description": "The Button Presser census (minted, sides, races, plates) and the OpenSea market: floor, how many are listed, the 20 cheapest asks",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresserMarket"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/gear": {
      "get": {
        "operationId": "searchGear",
        "summary": "Search NetNet Gear by its on-chain traits and OpenSea ask, cheapest first with links; plus per item supply, minted, listed and floor ask",
        "parameters": [
          {
            "name": "item",
            "in": "query",
            "description": "Part of the item name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tier",
            "in": "query",
            "description": "COMMON, PREFERRED, RESTRICTED, CONVERTIBLE, FOUNDER'S or ARTIFACT (case-insensitive; a prefix works)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slot",
            "in": "query",
            "description": "Part of the slot name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "table",
            "in": "query",
            "description": "The game table that drops it",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wearable",
            "in": "query",
            "description": "Who can wear it (a race or side)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "plate",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "earnedBy",
            "in": "query",
            "description": "Only pieces earned by this Presser card number",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4999
            }
          },
          {
            "name": "listed",
            "in": "query",
            "description": "true: only listed (the default when sorting by price); false: only unlisted",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "minPrice",
            "in": "query",
            "description": "Lowest ask, in the ask currency (usually USDG)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxPrice",
            "in": "query",
            "description": "Highest ask",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "scarcity: smallest item supply first, then cheapest",
            "schema": {
              "type": "string",
              "enum": [
                "price",
                "-price",
                "id",
                "scarcity"
              ],
              "default": "price"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "How many rows to return",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search NetNet Gear by its on-chain traits and OpenSea ask, cheapest first with links; plus per item supply, minted, listed and floor ask",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GearSearch"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          },
          "503": {
            "description": "The NetNet Gear index is not readable right now",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/predict/intel": {
      "get": {
        "operationId": "getPredictIntel",
        "summary": "Ask NetNet Intel's Predict model: its odds at any numbers, its 68% and 90% ranges, the gap per day, drivers (incl. the NET TWAP the line implies), each side's value against its break-even, and its graded record",
        "parameters": [
          {
            "name": "above",
            "in": "query",
            "description": "Comma-separated numbers in USD (up to 20) to get P(print above) for; defaults to the line and the line ± 1-2 sd",
            "schema": {
              "type": "string",
              "pattern": "^[0-9.,\\s-]*$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ask NetNet Intel's Predict model: its odds at any numbers, its 68% and 90% ranges, the gap per day, drivers (incl. the NET TWAP the line implies), each side's value against its break-even, and its graded record",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PredictIntel"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          },
          "503": {
            "description": "The model has no projection right now",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/grows": {
      "get": {
        "operationId": "getGrowth",
        "summary": "What grows NET: the treasury's change over a window split into money in by source, money out and value changes, the sleeve by asset class, and the per-NET effect",
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "1-90 days, or all (since launch)",
            "schema": {
              "oneOf": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 90
                },
                {
                  "type": "string",
                  "enum": [
                    "all"
                  ]
                }
              ],
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "What grows NET: the treasury's change over a window split into money in by source, money out and value changes, the sleeve by asset class, and the per-NET effect",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Growth"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          },
          "503": {
            "description": "The history is not ready",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/lp": {
      "get": {
        "operationId": "getLp",
        "summary": "The NET/USDG v2 pool: reserves, spot price, TVL, the week's volume, swaps and fees by day, and who holds the LP with each holder's fees; allPools: every NET pool against USDG, WETH or ETH with TVL, 24h volume and ±2% depth",
        "responses": {
          "200": {
            "description": "The NET/USDG v2 pool: reserves, spot price, TVL, the week's volume, swaps and fees by day, and who holds the LP with each holder's fees; allPools: every NET pool against USDG, WETH or ETH with TVL, 24h volume and ±2% depth",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lp"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/sleeve": {
      "get": {
        "operationId": "getSleeveMemo",
        "summary": "The RWA sleeve's memo holdings line by line (NET held, the Loopback position, NET Advance receivables, THE BOOK's pot, the asset desk, v4 LP): what the official Reports add to RFV",
        "responses": {
          "200": {
            "description": "The RWA sleeve's memo holdings line by line (NET held, the Loopback position, NET Advance receivables, THE BOOK's pot, the asset desk, v4 LP): what the official Reports add to RFV",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SleeveMemo"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/sleeve/loan": {
      "get": {
        "operationId": "getSleeveLoan",
        "summary": "The RWA sleeve's Loopback loan: wsNET posted, USDG owed, LTV, the NET mark at which it could be liquidated, and what the borrowed USDG bought",
        "responses": {
          "200": {
            "description": "The RWA sleeve's Loopback loan: wsNET posted, USDG owed, LTV, the NET mark at which it could be liquidated, and what the borrowed USDG bought",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SleeveLoan"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/pendle": {
      "get": {
        "operationId": "getPendle",
        "summary": "Pendle's sNET market: the implied APY against what sNET's rebase pays now, liquidity, PT discount, and the implied APY by day",
        "responses": {
          "200": {
            "description": "Pendle's sNET market: the implied APY against what sNET's rebase pays now, liquidity, PT discount, and the implied APY by day",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Pendle"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/advance": {
      "get": {
        "operationId": "getAdvance",
        "summary": "NET Advance: terms, the desk, the book (outstanding, coverage, shortfall, break-even mark), maturities, and the positions most at risk, largest and due soonest",
        "responses": {
          "200": {
            "description": "NET Advance: terms, the desk, the book (outstanding, coverage, shortfall, break-even mark), maturities, and the positions most at risk, largest and due soonest",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Advance"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/vault": {
      "get": {
        "operationId": "getHouseVault",
        "summary": "The House Vault behind Predict: share price, capital, queued exits, each settle and the depositors",
        "responses": {
          "200": {
            "description": "The House Vault behind Predict: share price, capital, queued exits, each settle and the depositors",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HouseVault"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/book": {
      "get": {
        "operationId": "getBook",
        "summary": "THE BOOK (sportsbook): the house pot, open markets with their exposure, games awaiting a grade, results and weekly totals",
        "responses": {
          "200": {
            "description": "THE BOOK (sportsbook): the house pot, open markets with their exposure, games awaiting a grade, results and weekly totals",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Book"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/shiftrun": {
      "get": {
        "operationId": "getShiftRun",
        "summary": "The Shift Run leaderboard (points only): drivers, totals, plays",
        "parameters": [
          {
            "name": "scope",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "today"
              ],
              "default": "all"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The Shift Run leaderboard (points only): drivers, totals, plays",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShiftRun"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooMany"
          },
          "502": {
            "$ref": "#/components/responses/Upstream"
          }
        }
      }
    },
    "/api/v1/loop": {
      "get": {
        "operationId": "getLoop",
        "summary": "Loopback loans by risk",
        "description": "Every Loopback loan (wsNET/USDG on Morpho Blue) with its status (AT RISK, WIND DOWN, WATCH, SAFE: the closer of health < 1.05 / 1.10 / 1.20 and a 5 / 15 / 30% TWAP fall; sort=risk is lowest health first), the TWAP fall to liquidation, the repay or wsNET to add to get back to health 1.20 or survive a 15% or 30% fall, and for a liquidatable loan the full-liquidation repay, seize and profit. Read-only: no transaction data.",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Comma list: at-risk, wind-down, watch, safe, no-loan"
          },
          {
            "name": "account",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "One borrower"
          },
          {
            "name": "minDebt",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Minimum USDG owed"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "risk",
                "debt",
                "-debt",
                "health",
                "collateral"
              ],
              "default": "risk"
            },
            "description": "Sort order"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 25
            },
            "description": "Rows"
          }
        ],
        "responses": {
          "200": {
            "description": "summary, mark, lltv, liquidationIncentive, loans[]",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "503": {
            "description": "The Loopback book is not readable right now"
          }
        }
      }
    },
    "/api/v1/games": {
      "get": {
        "summary": "NetNet's arcade: per game and window, plays, players, wagered, payouts, the house's result, fees and their split, NET bought (indexed every 5 minutes)",
        "operationId": "games",
        "parameters": [
          {
            "name": "game",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "dialup",
                "coinflip",
                "invaders",
                "flight",
                "winnet"
              ]
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 30
            },
            "description": "Limit the daily series to the last N days."
          }
        ],
        "responses": {
          "200": {
            "description": "games, totals (d1, d7, d30, all), daily, definitions, freshness"
          },
          "503": {
            "description": "the games index did not answer"
          }
        }
      }
    },
    "/api/v1/turbo": {
      "get": {
        "summary": "Turbo, NetNet Capital's knock-out card desk: per window cards bought, buyers, USDG paid, fees, payouts and the desk's result; the series board and the house's stock pots (indexed every 5 minutes)",
        "operationId": "turbo",
        "parameters": [
          {
            "name": "series",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "One series only."
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 30
            },
            "description": "Limit the daily series to the last N days."
          }
        ],
        "responses": {
          "200": {
            "description": "The desk's figures",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "No such series"
          },
          "503": {
            "description": "The index did not answer; retry after retryAfter seconds"
          }
        }
      }
    },
    "/api/v1/docs": {
      "get": {
        "summary": "NetNet Capital's official docs (docs.netnet.capital), searched by keyword: the best sections with their page url; without q, the page list",
        "operationId": "docs",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching sections or the page list",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/docs/{page}": {
      "get": {
        "summary": "One page of the official docs in full (Markdown)",
        "operationId": "docPage",
        "parameters": [
          {
            "name": "page",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Page id, e.g. turbo, lending, treasury"
          }
        ],
        "responses": {
          "200": {
            "description": "The page",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "No such page"
          }
        }
      }
    },
    "/api/v1/value": {
      "get": {
        "summary": "Where the money goes: Core Treasury in/out by source and the RWA sleeve by source (games, Turbo, THE BOOK, stocks, buybacks)",
        "operationId": "valueCapture",
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                1,
                7,
                30
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The ledger",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "503": {
            "description": "The treasury flows did not answer"
          }
        }
      }
    },
    "/api/v1/loop/liquidations": {
      "get": {
        "summary": "Loop liquidations: windows, trend, who liquidates",
        "description": "Loop (Loopback) liquidations from NetNet Intel's own index, the newest merged from the live feed: for 30m, 12h, 24h, 7d and 30d the count, USDG repaid, wsNET seized and its value at the oracle and at the market, the liquidators' profit and bad debt; a time series for one window, who liquidates, and the latest 20.",
        "operationId": "getLoopLiquidations",
        "parameters": [
          {
            "name": "window",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "30m",
                "12h",
                "24h",
                "7d",
                "30d"
              ],
              "default": "24h"
            },
            "description": "The window for the time series."
          },
          {
            "name": "leaders",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "30m",
                "12h",
                "24h",
                "7d",
                "30d"
              ],
              "default": "7d"
            },
            "description": "The window for who liquidates."
          }
        ],
        "responses": {
          "200": {
            "description": "Windows, series, leaders, recent, definitions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "503": {
            "description": "The index did not answer; retry"
          }
        }
      }
    },
    "/api/v1/liquidator": {
      "get": {
        "operationId": "getLiquidatorRelease",
        "summary": "The self-run Loop liquidator's latest release: version, urgent, what's new, and the update command",
        "responses": {
          "200": {
            "description": "latest (x.y.z), date, urgent, note, update { macLinux, windows, how }, image, repo",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "Upstream": {
        "description": "unavailable: the source is down and no last good answer is saved. Retry once after retryAfter, then follow fallback (a recipe that rebuilds the figure from the chain). A slow or failing source with a saved answer returns 200 with x-fallback: last_good and a lastGood field instead.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "TooMany": {
        "description": "rate_limited: wait retryAfter seconds (the Retry-After header), then retry once; never in a loop",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "enum": [
              "bad_request",
              "not_found",
              "rate_limited",
              "unavailable"
            ],
            "description": "bad_request: fix the arguments. not_found: it doesn't exist. rate_limited: wait retryAfter seconds, retry once. unavailable: retry once after retryAfter, then follow fallback."
          },
          "message": {
            "type": "string"
          },
          "retryAfter": {
            "type": "integer",
            "description": "Seconds to wait before the one retry (also the Retry-After header)"
          },
          "fallback": {
            "type": "string",
            "format": "uri",
            "description": "unavailable only: the open recipe that rebuilds the figure from Robinhood Chain"
          },
          "status": {
            "type": "string",
            "format": "uri",
            "description": "The status page"
          }
        }
      },
      "Net": {
        "type": "object",
        "properties": {
          "block": {
            "type": "integer",
            "description": "Robinhood Chain block the figures were read at"
          },
          "asOf": {
            "type": "string",
            "format": "date-time"
          },
          "price": {
            "type": [
              "number",
              "null"
            ],
            "description": "PairOracle.twapNetUsdg(), USD"
          },
          "nav": {
            "type": [
              "number",
              "null"
            ],
            "description": "Treasury.backingPerToken(), USD per NET"
          },
          "premium": {
            "type": [
              "number",
              "null"
            ],
            "description": "price ÷ nav"
          },
          "reserves": {
            "type": [
              "number",
              "null"
            ],
            "description": "nav × supply, USD"
          },
          "supply": {
            "type": [
              "number",
              "null"
            ],
            "description": "NET.totalSupply()"
          },
          "staked": {
            "type": [
              "number",
              "null"
            ],
            "description": "NET held by the staking contract"
          },
          "market": {
            "type": "object",
            "description": "DEX pair data: priceUsd, priceChangePct (m5, h1, h6, h24), volume24hUsd, liquidityUsd, marketCapUsd, fdvUsd, dex, pair, chain"
          },
          "contracts": {
            "type": "object",
            "properties": {
              "net": {
                "type": "string"
              }
            }
          }
        }
      },
      "Series": {
        "type": "object",
        "properties": {
          "seriesId": {
            "type": "integer"
          },
          "phase": {
            "type": [
              "string",
              "null"
            ],
            "description": "Desk phase, e.g. OPEN, REVEAL"
          },
          "line": {
            "type": "number",
            "description": "The line the number is graded against, USD"
          },
          "openNumber": {
            "type": "number"
          },
          "printNumber": {
            "type": [
              "number",
              "null"
            ],
            "description": "The graded number, once printed"
          },
          "openTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "lastCallTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "closeTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "printTime": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "gradedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "priceHigher": {
            "type": "number",
            "description": "HIGHER token price in USDG (pays 1 if right)"
          },
          "priceLower": {
            "type": "number"
          },
          "bookUsdg": {
            "type": "number"
          },
          "volumeUsdg": {
            "type": "number"
          },
          "guessCount": {
            "type": "integer"
          }
        }
      },
      "Predict": {
        "type": "object",
        "properties": {
          "block": {
            "type": "integer"
          },
          "asOf": {
            "type": "string",
            "format": "date-time"
          },
          "current": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Series"
              },
              {
                "type": "null"
              }
            ]
          },
          "number": {
            "type": "object",
            "description": "The live number: value (= rfv + sleeve), rfv, sleeve, formula, note, complete, block, asOf"
          },
          "model": {
            "type": "object",
            "description": "NetNet Intel's estimate: version, pHigher, pLower, projectedMean, projectedSd, daysLeft, requiredPerDay, expectedPerDay, observedPerDay"
          },
          "contracts": {
            "type": [
              "object",
              "null"
            ],
            "description": "desk, vault, higherToken, lowerToken addresses"
          },
          "history": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Series"
            }
          }
        }
      },
      "History": {
        "type": "object",
        "properties": {
          "days": {
            "type": "integer"
          },
          "points": {
            "type": "integer"
          },
          "interval": {
            "type": "string"
          },
          "fields": {
            "type": "object",
            "description": "What each row field means"
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "t": {
                  "type": "string",
                  "format": "date-time"
                },
                "number": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "rfv": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "sleeve": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "backing": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "twap": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "supply": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "staked": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "NET.balanceOf(staking): includes the NET queued for the next rebase (/api/v1/supply has Staking.totalStaked())"
                },
                "dividendIndex": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "trueRfv": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "rfv + sleeve + memoHoldings: the official Reports' True RFV; null where the memo holdings were not recorded"
                },
                "memoHoldings": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The sleeve's holdings the official memo adds (outside the Safe), USD; recorded from 19 Sep 2026"
                }
              }
            }
          },
          "trueRfvByClass": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "At each UTC day's close: core, cash & claims, stocks, ownToken, otherTokens, debt (negative), total = True RFV"
          }
        }
      },
      "Presser": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "status": {
            "type": "string",
            "description": "unminted (past totalMinted), open (no side chosen), side (side chosen, no character yet) or created (character created)"
          },
          "owner": {
            "type": "string"
          },
          "faction": {
            "type": [
              "string",
              "null"
            ]
          },
          "factionName": {
            "type": [
              "string",
              "null"
            ]
          },
          "character": {
            "type": [
              "object",
              "null"
            ],
            "description": "race, raceName, ticker, role, name, colorway, mood"
          },
          "card": {
            "type": "object",
            "description": "plate, stamping"
          },
          "gear": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "market": {
            "type": [
              "object",
              "null"
            ],
            "description": "The OpenSea ask as NetNet Intel reads it (every ~10 minutes): listed, ask, currency, collectionFloor, floorCurrency, readAt. An ask is not a sale price."
          },
          "opensea": {
            "type": "string",
            "format": "uri",
            "description": "The card's OpenSea page"
          },
          "page": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Nav": {
        "type": "object",
        "additionalProperties": true,
        "description": "NAV per NET core and incl. the RWA sleeve, the RFV parts, the sleeve breakdown, both premiums and recipes"
      },
      "Treasury": {
        "type": "object",
        "additionalProperties": true,
        "description": "RFV, its parts, holdings, pools and the sleeve's direct holdings, with recipes"
      },
      "Supply": {
        "type": "object",
        "additionalProperties": true,
        "description": "Supply, staked, circulating and its exclusions, NET per protocol contract, index, epoch, rate"
      },
      "Holders": {
        "type": "object",
        "additionalProperties": true,
        "description": "The top 50 wallets (balance, stance, flows, history with avgEntry and pnl) and their decoded moves with tx hashes; movesByKind, movesMatched and movesFilter for the filtered moves; priceSource and priceAsOf for the board's price; flowTotals; clusters"
      },
      "Whale": {
        "type": "object",
        "additionalProperties": true,
        "description": "One top-50 wallet: balances, history, loan, moves and its balance calls"
      },
      "Bonds": {
        "type": "object",
        "additionalProperties": true,
        "description": "The bond desk by 8-hour epoch (netSold, capNet, fill, soldAfter1h/2h/4h, selloutSec, buyers, avgPrice, paidVsMarket, afterVest), the live epoch, and demandByTrend (buckets of the last 90 epochs by the price trend going in; descriptive, not a rule)"
      },
      "Credit": {
        "type": "object",
        "additionalProperties": true,
        "description": "The USDG vault, the Loopback market and its mark, stock markets and liquidations"
      },
      "Sources": {
        "type": "object",
        "additionalProperties": true,
        "description": "The contract registry and every verifiable figure's exact eth_call, formula and curl"
      },
      "Verify": {
        "type": "object",
        "additionalProperties": true,
        "description": "A re-check of figures against the public RPC: verdict, mode (same-block or latest), per-figure served vs recomputed, raw results and recipes"
      },
      "Buybacks": {
        "type": "object",
        "additionalProperties": true,
        "description": "What the RWA sleeve's Safes buy back on the market: 24h/7d/30d/all-time windows and shareOfSupply, a window of days= against the one before it, buys per UTC day (count, NET, USD, average/low/high price), bySafe, venues, the latest buys with transactions, the OTC desk, the loan that funds them and the Treasury's inverse bond (NAV × 0.985, burned)"
      },
      "Status": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ok"
            ]
          },
          "service": {
            "type": "string"
          },
          "time": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "status"
        ]
      },
      "PresserSearch": {
        "type": "object",
        "additionalProperties": true,
        "description": "matched, shown, sort, listedOnly; cards[] (id, plate, faction, character, hasCharacter, ask, currency, opensea, page); market (floor, listed, asksAsOf, stale); roster (per plate: cards, noFaction, noCharacter, listed; asOf, stale); notes"
      },
      "PresserMarket": {
        "type": "object",
        "additionalProperties": true,
        "description": "census (minted, sides, created, factions, races, plates); market (floor, floorCurrency, listed, cheapest[]: id, ask, currency; readAt); source"
      },
      "GearSearch": {
        "type": "object",
        "additionalProperties": true,
        "description": "matched, shown, sort, listedOnly; pieces[] (id, item, tier, slot, table, wearableBy, plate, supply, edition, earnedBy, ask, currency, opensea, page); items[] (supply, minted, mintedShare, listed, floorAsk, floorId, floorOpensea); tiers, minted, indexed; market; notes"
      },
      "PredictIntel": {
        "type": "object",
        "additionalProperties": true,
        "description": "series; number; model (pHigher, pLower, projectedMean, projectedSd, range68, range90); odds[] (number, pAbove, pBelow); gap (toLineUsd, requiredPerDay, expectedPerDay, observedPerDay); drivers (coreRfvPerDay, sleevePerDay, memoHoldingsPerDay, bondCapacityLeft, netPriceSensitivity incl. netTwapForTheLine); sides (price, breakEven, modelProbability, edgeVsBreakEven, expectedPayoutPerUsdg); record[] and recordSummary (graded calls, Brier). NetNet Intel's inference, not the desk's price"
      },
      "Growth": {
        "type": "object",
        "additionalProperties": true,
        "description": "window; answer (one sentence); core and coreAndSleeve (change, pct); moneyIn (total, bySource[]); moneyOut (buybacks); valueChange; perNet and perNetWithSleeve (navGrowthPct, reserveEffectPp, supplyEffectPp); supply; sleeveByClass; daily; trueRfvByClass; inflowsByDay; notes"
      },
      "Lp": {
        "type": "object",
        "additionalProperties": true,
        "description": "pool (usdg, net, price, tvlUsd); week (fees, volume, swaps, days); byClass; holders[] (account, class, share, valueUsd, fees7d, feesToday); allPools (tvlUsd, volume24hUsd, depth2pct, flaggedVolumeUsd, excluded, pools[] with id, pair, dex, kind, tvlUsd, volume24hUsd, turnover, flag, depth2pct)"
      },
      "SleeveMemo": {
        "type": "object",
        "additionalProperties": true,
        "description": "totalUsd, netPricedUsd, hohmPricedUsd; lines (netHeld, loopback, advance, book, assetDesk, v4Lp). Team-custodied, outside RFV"
      },
      "SleeveLoan": {
        "type": "object",
        "additionalProperties": true,
        "description": "position (collateralWs, collateralNet, collateralUsd, debtUsdg, ltv, lltv, liqPerNet, borrowApy, interestPerDay); events[]; usesOfBorrowedUsdg[]"
      },
      "Pendle": {
        "type": "object",
        "additionalProperties": true,
        "description": "sNet[] (impliedApy, underlyingApy, ptDiscount, liquidityUsd, expiry, daysLeft, checkedOnChain); series[] with dailyImpliedApy; otherMarkets"
      },
      "Advance": {
        "type": "object",
        "additionalProperties": true,
        "description": "terms, desk, summary (outstanding, coverage, shortfall, bookBreakEven, overdue), maturities[], atRisk[], largest[], dueSoon[]"
      },
      "HouseVault": {
        "type": "object",
        "additionalProperties": true,
        "description": "totals (incl. sharePrice), holders, queued, settles[], funded[], depositors[] (shares, valueUsdg, pnlUsdg)"
      },
      "Book": {
        "type": "object",
        "additionalProperties": true,
        "description": "desk (housePot, free, wsUsd), totals, live, weeks[], open[], awaitingGrade[], results[]; amounts in wsNET unless named"
      },
      "ShiftRun": {
        "type": "object",
        "additionalProperties": true,
        "description": "scope, drivers, plays, rows[] (rank, name, total points, plays). Points only"
      }
    }
  }
}
