{
  "openapi": "3.1.0",
  "info": {
    "title": "Animica Explorer API",
    "version": "10.1.0",
    "summary": "Free, no-auth REST API for the Animica L1 chain and its ANM-native L2 rollup",
    "description": "REST API behind https://explorer.animica.org \u2014 blocks, transactions, addresses, mempool, rich list, supply, ANM-20 token index, contracts + source verification, AICF compute, data availability, ENA, quantum status, and the L2 rollup.\n\nConventions:\n- **No authentication.** All endpoints are free to call; CORS is enabled.\n- **Amounts are base units** unless stated: 1 ANM = 10^9 base units (nano-ANM). L1 balance fields are hex quantity strings (e.g. `\"0x8eb47f0599e9be\"`); L2 amounts are decimal strings. `/circulating-supply` is whole ANM.\n- **Addresses** are bech32m `anim1\u2026` (signatures: ML-DSA-65, FIPS 204, scheme id 0x1003). Several endpoints also accept/return the 0x-prefixed 32-byte account-digest hex form.\n- **Graceful degradation:** subsystem endpoints (aicf/da/ena/quantum/l2) return HTTP 200 with `available: false` or `enabled: false` instead of erroring when the backing node lacks that subsystem.\n- Errors use `{\"error\": \"<code>\", \"message\": \"\u2026\"}`.\n\nThe explorer proxies a full Animica node; for anything not covered here, use the node JSON-RPC directly: `POST https://rpc.animica.org/rpc` (methods discoverable via `GET /rpc/discover`).",
    "contact": {
      "email": "ai@3vdc.com",
      "url": "https://animica.org/developers"
    },
    "license": {
      "name": "Apache-2.0",
      "identifier": "Apache-2.0"
    }
  },
  "servers": [
    {
      "url": "https://explorer.animica.org/api"
    }
  ],
  "tags": [
    {
      "name": "Core",
      "description": "Chain head, blocks, transactions, addresses, mempool, search, rich list, supply"
    },
    {
      "name": "Contracts",
      "description": "Contract deployments, profiles, code, and source verification"
    },
    {
      "name": "Tokens",
      "description": "ANM-20 token index (AnimicaTokenStandard)"
    },
    {
      "name": "Network",
      "description": "Service health, mining status, node RPC discovery"
    },
    {
      "name": "AICF",
      "description": "AI Compute Fabric: credits, workers, jobs"
    },
    {
      "name": "DA",
      "description": "Data-availability blobs, commitments, proofs"
    },
    {
      "name": "ENA",
      "description": "ENA train/infer layer"
    },
    {
      "name": "Quantum",
      "description": "Attested HW-QRNG / quantum useful-work status"
    },
    {
      "name": "L2",
      "description": "ANM-native validity rollup (batches, txs, accounts, bridge)"
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Liveness/readiness check",
        "description": "Returns 200 whenever the explorer API process is up; `ready` is false while the backing node RPC is unreachable.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthStatus"
                }
              }
            }
          }
        },
        "operationId": "getHealth"
      }
    },
    "/meta": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Explorer + network metadata",
        "description": "Explorer name/version/mode and the chain id / node RPC URL it indexes.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExplorerMeta"
                }
              }
            }
          }
        },
        "operationId": "getMeta"
      }
    },
    "/head": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Chain head + live network stats",
        "description": "Current canonical head, peer/mempool/TPS stats, and a ~20-point per-block difficulty (thetaMicro) history.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HeadResponse"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getHead"
      }
    },
    "/blocks": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "List recent blocks",
        "description": "Newest-first page of block summaries. Paginate with `cursor` = previous `nextCursor` (a block height).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockList"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listBlocks",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum items to return"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor from a previous response's `nextCursor`"
          }
        ]
      }
    },
    "/block/{hashOrHeight}": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Block detail",
        "description": "Fetch one block by decimal height or 0x block hash. `raw` carries the untouched node block view (header roots, mixSeed, nonce). Note: when fetched by hash, `height` may be 0 if the node view omits the number.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockDetail"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getBlock",
        "parameters": [
          {
            "name": "hashOrHeight",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Decimal block height or 0x-prefixed block hash",
            "examples": {
              "height": {
                "value": "73188"
              },
              "hash": {
                "value": "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
              }
            }
          }
        ]
      }
    },
    "/tx/{hash}": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Transaction detail",
        "description": "Transaction lifecycle view: status (pending/confirmed/failed), inclusion block, confirmations, value/fee in base units, raw node view, receipt, and a decoded classification (transfer / deployment / contract interaction).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TxDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getTransaction",
        "parameters": [
          {
            "name": "hash",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Transaction hash (32-byte hex, with or without 0x prefix)"
          }
        ]
      }
    },
    "/address/{bech32}": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Address detail + transaction history",
        "description": "Balances (hex quantity strings, base units) and a scan of recent blocks for this address's transactions. History scanning is windowed: `partial:true` + `nextCursor` mean more history exists \u2014 pass `cursor` to continue scanning older blocks.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressSummary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getAddress",
        "parameters": [
          {
            "name": "bech32",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Address: bech32m `anim1\u2026` or 0x-prefixed 32-byte account-digest hex"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum transactions to return"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor from a previous response's `nextCursor`"
          }
        ]
      }
    },
    "/mempool": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Mempool contents",
        "description": "Pending transactions with byte sizes and arrival times, plus aggregate stats.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MempoolView"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getMempool",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50
            },
            "description": "Maximum items to return"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor from a previous response's `nextCursor`"
          }
        ]
      }
    },
    "/search": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Universal search",
        "description": "Detects the query type: `anim1\u2026` \u2192 address, decimal \u2192 block height, `0x\u2026` hex \u2192 transaction hash then block hash. Returns `{\"type\":\"none\"}` (still HTTP 200) when nothing matches.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResult"
                }
              }
            }
          }
        },
        "operationId": "search",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Address, block height, block hash, or tx hash"
          }
        ]
      }
    },
    "/richlist": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Richest addresses",
        "description": "Addresses ranked by balance (hex quantity strings, base units) with percent-of-supply. Paginate with `offset` = previous `nextOffset`. Addresses are returned as 0x account-digest hex.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RichListResponse"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getRichList",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100
            },
            "description": "Maximum items to return"
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ]
      }
    },
    "/richlist/summary": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Supply concentration summary",
        "description": "Total supply (hex quantity, base units), tracked address count, and top-10/top-100 concentration percentages.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RichListSummary"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getRichListSummary"
      }
    },
    "/circulating-supply": {
      "get": {
        "tags": [
          "Core"
        ],
        "summary": "Circulating supply (bare number)",
        "description": "Returns a bare JSON number \u2014 circulating supply in whole ANM (e.g. `108383932.60801587`). This exchange/aggregator-friendly format (CMC/CoinGecko) is intentional: no object wrapper.",
        "responses": {
          "200": {
            "description": "Circulating supply in whole ANM",
            "content": {
              "application/json": {
                "schema": {
                  "type": "number",
                  "examples": [
                    108383932.60801587
                  ]
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getCirculatingSupply"
      }
    },
    "/contracts/deployments": {
      "get": {
        "tags": [
          "Contracts"
        ],
        "summary": "Recent contract deployments feed",
        "description": "Scans the last `scanBlocks` blocks for contract deployments and returns items plus aggregate stats and a spotlight pick.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractDeploymentFeed"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listContractDeployments",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 24
            },
            "description": "Maximum items to return"
          },
          {
            "name": "scanBlocks",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 240
            },
            "description": "How many recent blocks to scan"
          }
        ]
      }
    },
    "/contracts/address/{address}": {
      "get": {
        "tags": [
          "Contracts"
        ],
        "summary": "Contract profile + transactions",
        "description": "Contract profile (code hashes, creation info, verification state) and recent transactions touching it. 404 when the address is not a contract.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractDetailResponse"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getContract",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Contract address (bech32m `anim1\u2026` or 0x hex)"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum items to return"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Opaque pagination cursor from a previous response's `nextCursor`"
          }
        ]
      }
    },
    "/contracts/address/{address}/code": {
      "get": {
        "tags": [
          "Contracts"
        ],
        "summary": "Contract code",
        "description": "Stored contract code and code hash; both null when the node cannot provide them (returned with HTTP 200).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractCode"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getContractCode",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Contract address"
          }
        ]
      }
    },
    "/contracts/address/{address}/verification": {
      "get": {
        "tags": [
          "Contracts"
        ],
        "summary": "Contract verification record",
        "description": "Source-verification record for a contract. Unverified contracts get `{\"status\":\"unverified\",\"verifierStatus\":\"unverified\",\"submittedAt\":null,\"completedAt\":null}` with HTTP 200.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractVerificationRecord"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getContractVerification",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Contract address"
          }
        ]
      }
    },
    "/contracts/created-by/{txHash}": {
      "get": {
        "tags": [
          "Contracts"
        ],
        "summary": "Contract created by a transaction",
        "description": "Resolve the contract deployed by a given transaction hash.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractProfile"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getContractByCreationTx",
        "parameters": [
          {
            "name": "txHash",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Deployment transaction hash (32-byte hex, with or without 0x prefix)"
          }
        ]
      }
    },
    "/contracts/verify": {
      "post": {
        "tags": [
          "Contracts"
        ],
        "summary": "Submit contract source for verification",
        "operationId": "submitContractVerification",
        "description": "Submits source code (single `sourceCode` or multi-file `sources`, max 64 files) for compile-and-compare verification against on-chain bytecode. Returns 202 with an async job; poll `GET /contracts/verify/{jobId}`.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContractVerificationSubmitRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Verification job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractVerificationJob"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/contracts/verify/{jobId}": {
      "get": {
        "tags": [
          "Contracts"
        ],
        "summary": "Verification job status",
        "description": "Poll an async verification job. Terminal states: `verified` or `failed`.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContractVerificationJob"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "operationId": "getContractVerificationJob",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ]
      }
    },
    "/tokens": {
      "get": {
        "tags": [
          "Tokens"
        ],
        "summary": "List indexed ANM-20 tokens",
        "description": "ANM-20 (AnimicaTokenStandard) token index, also consumed by the mobile wallet. Market fields (totalSupply, priceAnm, liquidityAnm, change24h, pairAddress, feeBps) are null whenever on-chain contract execution cannot provide them \u2014 values are never fabricated.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenList"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listTokens",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100
            },
            "description": "Maximum items to return"
          }
        ]
      }
    },
    "/tokens/featured": {
      "get": {
        "tags": [
          "Tokens"
        ],
        "summary": "Featured (promoted) tokens",
        "description": "Tokens promoted via ANMPROMO1 treasury transfers.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenList"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listFeaturedTokens",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50
            },
            "description": "Maximum items to return"
          }
        ]
      }
    },
    "/tokens/search": {
      "get": {
        "tags": [
          "Tokens"
        ],
        "summary": "Search tokens",
        "description": "Search indexed tokens by name/symbol/address.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenList"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "searchTokens",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Search query"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50
            },
            "description": "Maximum items to return"
          }
        ]
      }
    },
    "/tokens/{address}": {
      "get": {
        "tags": [
          "Tokens"
        ],
        "summary": "Token detail",
        "description": "Single indexed token by contract address.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenInfo"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "operationId": "getToken",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token contract address"
          }
        ]
      }
    },
    "/tokens/{address}/history": {
      "get": {
        "tags": [
          "Tokens"
        ],
        "summary": "Token price history",
        "description": "Price observations (ANM per whole token) for charting. Returns `[]` for unknown tokens or when no observations exist.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TokenPricePoint"
                  }
                }
              }
            }
          }
        },
        "operationId": "getTokenHistory",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token contract address"
          },
          {
            "name": "range",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "7d"
            },
            "description": "Look-back window: `<n>h`, `<n>d`, or `all` (e.g. 24h, 7d, 30d)"
          }
        ]
      }
    },
    "/network/status": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "Per-subsystem service health",
        "description": "Health of node subsystems (chain, mempool, aicf, da, \u2026) with status `ok`/`not_supported`/error plus remediation hints and raw detail.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkStatus"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getNetworkStatus"
      }
    },
    "/mining/info": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "Mining status",
        "description": "Node mining subsystem status (sync phase, head, mempool size); `template`/`metrics` are null unless the node exposes them.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MiningInfo"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getMiningInfo"
      }
    },
    "/rpc/discover": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "Discover node JSON-RPC methods",
        "description": "Lists JSON-RPC method names available on the backing node (chain.*, state.*, tx.*, aicf.*, da.*, ena.*, l2_*, \u2026). Useful for capability discovery before calling https://rpc.animica.org/rpc directly.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RpcDiscover"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "rpcDiscover"
      }
    },
    "/aicf/info": {
      "get": {
        "tags": [
          "AICF"
        ],
        "summary": "AICF aggregate info",
        "description": "Aggregated AI Compute Fabric view: status, credits (optionally for `address`), open jobs and registered workers. Sub-objects are null when the node lacks the corresponding RPC.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AICFInfo"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getAicfInfo",
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional address to include credit info for"
          }
        ]
      }
    },
    "/aicf/summary": {
      "get": {
        "tags": [
          "AICF"
        ],
        "summary": "AICF credit totals",
        "description": "Lifetime minted/spent/balance totals for AICF credits. Degrades to `ok:false` + zeroed totals (HTTP 200) when the node's AICF state is unavailable.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AICFSummary"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getAicfSummary"
      }
    },
    "/aicf/events": {
      "get": {
        "tags": [
          "AICF"
        ],
        "summary": "Recent AICF events",
        "description": "Recent AICF credit events. Degrades to `ok:false, events: []` when unavailable.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AICFEvents"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getAicfEvents",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum items to return"
          }
        ]
      }
    },
    "/aicf/address/{addr}": {
      "get": {
        "tags": [
          "AICF"
        ],
        "summary": "AICF credits for an address",
        "description": "Credit balance, lifetime minted/spent, and events for one address. Falls back across node RPC parameter conventions; degrades to zeroed values with `available:false` when the node cannot serve credits.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AICFAddressCredits"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getAicfAddress",
        "parameters": [
          {
            "name": "addr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Address (bech32m `anim1\u2026`)"
          }
        ]
      }
    },
    "/aicf/workers": {
      "get": {
        "tags": [
          "AICF"
        ],
        "summary": "Registered compute workers",
        "description": "AICF compute workers with capabilities, device type (grouped in `by_tier`), job counts, and earnings. `available:false` with empty arrays when the node has no worker registry.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AICFWorkers"
                }
              }
            }
          }
        },
        "operationId": "listAicfWorkers"
      }
    },
    "/aicf/job-stats": {
      "get": {
        "tags": [
          "AICF"
        ],
        "summary": "AICF job statistics",
        "description": "Aggregate job stats over a rolling window. When the node lacks a dedicated stats RPC, totals are derived from the live work layer (`source: \"work-layer-derived\"`); latency percentiles are then null.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AICFJobStats"
                }
              }
            }
          }
        },
        "operationId": "getAicfJobStats",
        "parameters": [
          {
            "name": "window",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 60
            },
            "description": "Window size in minutes"
          }
        ]
      }
    },
    "/da/info": {
      "get": {
        "tags": [
          "DA"
        ],
        "summary": "Data-availability layer info",
        "description": "DA status (capacity, usage, blob count, policy) plus quotas when available.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DAInfo"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getDaInfo"
      }
    },
    "/da/status": {
      "get": {
        "tags": [
          "DA"
        ],
        "summary": "Raw DA status",
        "description": "The node's raw `da.status` view (same object as `/da/info`'s `status` field).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DAStatus"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getDaStatus"
      }
    },
    "/da/recent": {
      "get": {
        "tags": [
          "DA"
        ],
        "summary": "Recently stored blobs",
        "description": "Recent blob metadata (id, size, timestamps) with an opaque `nextCursor`.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DARecent"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listDaRecent",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum items to return"
          }
        ]
      }
    },
    "/da/history": {
      "get": {
        "tags": [
          "DA"
        ],
        "summary": "Blob commitment history",
        "description": "Erasure-coding commitments for stored blobs: shard layout, share bytes, original size. Returns a bare JSON array.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DAHistoryEntry"
                  }
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listDaHistory",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum entries (capped at 100)"
          }
        ]
      }
    },
    "/da/blob/{commitment}": {
      "get": {
        "tags": [
          "DA"
        ],
        "summary": "Fetch a blob",
        "description": "Fetch blob content by commitment. 404 when the blob is unknown or DA retrieval is not available on the backing node.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Blob payload as returned by the node (may include base64 data and metadata)"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getDaBlob",
        "parameters": [
          {
            "name": "commitment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Hex blob commitment"
          }
        ]
      }
    },
    "/da/proof/{commitment}": {
      "get": {
        "tags": [
          "DA"
        ],
        "summary": "Fetch a DA proof",
        "description": "Fetch the availability proof for a commitment. 404 when unknown or proofs are not served by the backing node.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Proof object as returned by the node"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getDaProof",
        "parameters": [
          {
            "name": "commitment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Hex blob commitment"
          }
        ]
      }
    },
    "/da/put": {
      "post": {
        "tags": [
          "DA"
        ],
        "summary": "Store a blob",
        "operationId": "putDaBlob",
        "description": "Store a base64-encoded blob under a namespace via the node's `da.putBlob`. 503 when the node does not accept remote puts.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DAPutRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Stored blob result (commitment / blob id as returned by the node)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "description": "DA put not available on the backing node",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                }
              }
            }
          }
        }
      }
    },
    "/ena/jobs": {
      "get": {
        "tags": [
          "ENA"
        ],
        "summary": "ENA activity (models proxy)",
        "description": "ENA (train/infer layer) activity. The node exposes `ena.listModels`; this endpoint returns those models alongside an (currently always empty) jobs array.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnaJobs"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listEnaJobs",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum items to return"
          }
        ]
      }
    },
    "/ena/artifacts": {
      "get": {
        "tags": [
          "ENA"
        ],
        "summary": "ENA artifacts",
        "description": "Artifacts produced by ENA jobs (model checkpoints etc.).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnaArtifacts"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "listEnaArtifacts",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20
            },
            "description": "Maximum items to return"
          }
        ]
      }
    },
    "/ena/job/{id}": {
      "get": {
        "tags": [
          "ENA"
        ],
        "summary": "ENA job detail",
        "description": "Single ENA request/job by id, via the node's `ena.getRequest`.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "ENA request object as returned by the node"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getEnaJob",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/quantum/info": {
      "get": {
        "tags": [
          "Quantum"
        ],
        "summary": "Quantum subsystem status",
        "description": "Attested HW-QRNG / quantum-useful-work subsystem status: enabled flag, accepted job types, cpu/gpu/qpu capabilities, last heartbeat.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuantumInfo"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "operationId": "getQuantumInfo"
      }
    },
    "/l2/overview": {
      "get": {
        "tags": [
          "L2"
        ],
        "summary": "L2 rollup overview",
        "description": "Aggregated L2 landing view: settlement mode, head batch + latest batch header, proof status, TPS counters, bridge totals (`anmLocked`, `l2Supply` in base units) and pipeline counts. Returns `{\"enabled\": false}` (HTTP 200) when L2 is not enabled on the backing node.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/L2Overview"
                    },
                    {
                      "$ref": "#/components/schemas/L2Disabled"
                    }
                  ]
                }
              }
            }
          }
        },
        "operationId": "getL2Overview"
      }
    },
    "/l2/status": {
      "get": {
        "tags": [
          "L2"
        ],
        "summary": "L2 sequencer + bridge status",
        "description": "Sequencer status: l2ChainId, settlement mode, head batch, state root, pending count, signature backend, and bridge accounting. Returns `{\"enabled\": false}` (HTTP 200) when L2 is not enabled on the backing node.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/L2Status"
                    },
                    {
                      "$ref": "#/components/schemas/L2Disabled"
                    }
                  ]
                }
              }
            }
          }
        },
        "operationId": "getL2Status"
      }
    },
    "/l2/tps": {
      "get": {
        "tags": [
          "L2"
        ],
        "summary": "L2 throughput counters",
        "description": "Ingress/executed/soft-confirmed/settled totals and per-second rates. Returns `{\"enabled\": false}` (HTTP 200) when L2 is not enabled on the backing node.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/L2Tps"
                    },
                    {
                      "$ref": "#/components/schemas/L2Disabled"
                    }
                  ]
                }
              }
            }
          }
        },
        "operationId": "getL2Tps"
      }
    },
    "/l2/stateRoot": {
      "get": {
        "tags": [
          "L2"
        ],
        "summary": "Latest L2 state root",
        "description": "Latest batch number and its post-state root. Returns `{\"enabled\": false}` (HTTP 200) when L2 is not enabled on the backing node.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/L2StateRoot"
                    },
                    {
                      "$ref": "#/components/schemas/L2Disabled"
                    }
                  ]
                }
              }
            }
          }
        },
        "operationId": "getL2StateRoot"
      }
    },
    "/l2/batch/{number}": {
      "get": {
        "tags": [
          "L2"
        ],
        "summary": "L2 batch header + proof",
        "description": "Batch header (state roots, tx count, deposited/withdrawn in base units) merged with its validity-proof status.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/L2Batch"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "operationId": "getL2Batch",
        "parameters": [
          {
            "name": "number",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 0
            },
            "description": "Batch number (0-based)"
          }
        ]
      }
    },
    "/l2/tx/{hash}": {
      "get": {
        "tags": [
          "L2"
        ],
        "summary": "L2 transaction detail",
        "description": "L2 transaction lifecycle (status, containing batch, received time) merged with its execution receipt and batch proof status. 404 (`l2_tx_not_found`) for unknown txids.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/L2Tx"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "operationId": "getL2Transaction",
        "parameters": [
          {
            "name": "hash",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "L2 transaction id (0x-prefixed 32-byte hex)"
          }
        ]
      }
    },
    "/l2/account/{address}": {
      "get": {
        "tags": [
          "L2"
        ],
        "summary": "L2 account balance",
        "description": "Instant L2 balance (decimal string, base units/nanos) and nonces for an address. 404 (`l2_account_not_found_or_disabled`) when the account is unknown or L2 is disabled.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/L2Account"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "operationId": "getL2Account",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Address (bech32m `anim1\u2026` or 0x account-digest hex)"
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "ApiError": {
        "type": "object",
        "description": "Standard error envelope. `message`/`detail` may be absent on terse errors (e.g. `{\"error\":\"l2_tx_not_found\"}`).",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Machine-readable error code",
            "examples": [
              "request_failed",
              "not_found",
              "bad_request"
            ]
          },
          "message": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "HealthStatus": {
        "type": "object",
        "required": [
          "ok",
          "ready",
          "mode",
          "timestamp"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "ready": {
            "type": "boolean",
            "description": "False while the backing node RPC is unreachable"
          },
          "mode": {
            "type": "string",
            "description": "Explorer data-source mode",
            "examples": [
              "RPC"
            ]
          },
          "timestamp": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ExplorerMeta": {
        "type": "object",
        "properties": {
          "explorer": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "examples": [
                  "Animica Explorer"
                ]
              },
              "version": {
                "type": "string",
                "examples": [
                  "0.1.0"
                ]
              },
              "mode": {
                "type": "string",
                "examples": [
                  "RPC"
                ]
              }
            }
          },
          "network": {
            "type": "object",
            "properties": {
              "chainId": {
                "type": [
                  "integer",
                  "null"
                ],
                "examples": [
                  1
                ]
              },
              "rpcUrl": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "timestamp": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "HeadView": {
        "type": "object",
        "required": [
          "height",
          "hash",
          "time"
        ],
        "properties": {
          "height": {
            "type": "integer",
            "examples": [
              73188
            ]
          },
          "canonicalHeight": {
            "type": "integer"
          },
          "hash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "time": {
            "type": "integer",
            "description": "Unix seconds (may be 0 when the node omits it)"
          },
          "chainId": {
            "type": "integer",
            "examples": [
              1
            ]
          },
          "thetaMicro": {
            "type": "integer",
            "description": "PoIES difficulty parameter theta, in micro units"
          }
        }
      },
      "ThetaPoint": {
        "type": "object",
        "properties": {
          "height": {
            "type": "integer"
          },
          "time": {
            "type": "integer",
            "description": "Unix seconds"
          },
          "thetaMicro": {
            "type": "integer"
          }
        }
      },
      "HeadResponse": {
        "type": "object",
        "required": [
          "head"
        ],
        "properties": {
          "head": {
            "$ref": "#/components/schemas/HeadView"
          },
          "stats": {
            "type": "object",
            "properties": {
              "peerCount": {
                "type": "integer"
              },
              "inboundPeers": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "outboundPeers": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "mempoolSize": {
                "type": "integer"
              },
              "tps": {
                "type": "number"
              },
              "avgBlockTime": {
                "type": "number",
                "description": "Average seconds between recent blocks"
              }
            }
          },
          "thetaHistory": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ThetaPoint"
            },
            "description": "Recent per-block theta history (about 20 points)"
          }
        }
      },
      "BlockSummary": {
        "type": "object",
        "required": [
          "height",
          "hash",
          "time",
          "txCount"
        ],
        "properties": {
          "height": {
            "type": "integer"
          },
          "canonicalHeight": {
            "type": "integer"
          },
          "hash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "time": {
            "type": "integer",
            "description": "Unix seconds"
          },
          "txCount": {
            "type": "integer"
          },
          "miner": {
            "type": [
              "string",
              "null"
            ],
            "description": "Miner address when known"
          },
          "thetaMicro": {
            "type": "integer"
          }
        }
      },
      "BlockList": {
        "type": "object",
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BlockSummary"
            }
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass as `cursor` to fetch the next (older) page; null when exhausted",
            "examples": [
              "73186"
            ]
          }
        }
      },
      "BlockDetail": {
        "type": "object",
        "required": [
          "height",
          "hash",
          "time",
          "txs",
          "raw"
        ],
        "properties": {
          "height": {
            "type": "integer",
            "description": "0 when the block was fetched by hash and the node view omitted the number"
          },
          "canonicalHeight": {
            "type": "integer"
          },
          "hash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "parentHash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "time": {
            "type": "integer",
            "description": "Unix seconds"
          },
          "chainId": {
            "type": "integer"
          },
          "difficulty": {
            "type": [
              "number",
              "string",
              "null"
            ],
            "description": "thetaMicro difficulty"
          },
          "nonce": {
            "type": "integer"
          },
          "miner": {
            "type": [
              "string",
              "null"
            ]
          },
          "txs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TxSummary"
            }
          },
          "raw": {
            "type": "object",
            "description": "Node block view: number, hash, parentHash, timestamp, chainId, thetaMicro, mixSeed, nonce, roots {stateRoot, txsRoot, receiptsRoot, proofsRoot, daRoot}, transactions, header",
            "additionalProperties": true
          }
        }
      },
      "TxClassification": {
        "type": "object",
        "required": [
          "type",
          "failed",
          "isReverted"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "native_transfer",
              "contract_deployment",
              "contract_interaction",
              "unknown"
            ]
          },
          "failed": {
            "type": "boolean"
          },
          "isReverted": {
            "type": "boolean"
          },
          "reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "targetIsContract": {
            "type": "boolean"
          },
          "createdContractAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "methodSelector": {
            "type": [
              "string",
              "null"
            ]
          },
          "rawInput": {
            "type": [
              "string",
              "null"
            ]
          },
          "rawOutput": {
            "type": [
              "string",
              "null"
            ]
          },
          "decodedCall": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "selector": {
                "type": "string"
              },
              "signature": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "args": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": true
                }
              },
              "rawData": {
                "type": "string"
              }
            }
          },
          "decodedEvents": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        }
      },
      "TxSummary": {
        "type": "object",
        "required": [
          "hash"
        ],
        "properties": {
          "hash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "from": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "to": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "nonce": {
            "type": [
              "integer",
              "string"
            ]
          },
          "value": {
            "type": "string",
            "description": "Base units (1 ANM = 10^9)"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "confirmed",
              "failed"
            ]
          },
          "classification": {
            "$ref": "#/components/schemas/TxClassification"
          },
          "blockNumber": {
            "type": "integer"
          },
          "timestamp": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Block time, Unix seconds"
          },
          "gasPrice": {
            "type": [
              "integer",
              "string",
              "null"
            ]
          },
          "gasLimit": {
            "type": [
              "integer",
              "string",
              "null"
            ]
          }
        }
      },
      "TxDetail": {
        "type": "object",
        "required": [
          "hash",
          "status",
          "raw"
        ],
        "properties": {
          "hash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "tx_hash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "confirmed",
              "failed"
            ]
          },
          "blockHash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "blockHeight": {
            "type": "integer"
          },
          "included_height": {
            "type": [
              "integer",
              "null"
            ]
          },
          "included_block_hash": {
            "type": [
              "string",
              "null"
            ]
          },
          "confirmations": {
            "type": "integer"
          },
          "explorer_head_height": {
            "type": "integer"
          },
          "timestamp": {
            "type": [
              "integer",
              "null"
            ]
          },
          "from": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "to": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "value": {
            "type": "string",
            "description": "Base units"
          },
          "gasUsed": {
            "type": "string"
          },
          "feePaid": {
            "type": "string",
            "description": "Base units"
          },
          "fee": {
            "type": "string",
            "description": "Base units"
          },
          "raw": {
            "type": "object",
            "description": "Node transaction view (wire shape)",
            "additionalProperties": true
          },
          "receipt": {
            "type": [
              "object",
              "null"
            ]
          },
          "classification": {
            "$ref": "#/components/schemas/TxClassification"
          }
        }
      },
      "AddressSummary": {
        "type": "object",
        "required": [
          "address",
          "txs"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "accountType": {
            "type": "string",
            "enum": [
              "eoa",
              "contract",
              "unknown"
            ]
          },
          "confirmedBalance": {
            "type": [
              "string",
              "null"
            ],
            "description": "Hex quantity string in base units (1 ANM = 10^9 base units)",
            "examples": [
              "0x8eb47f0599e9be"
            ]
          },
          "pendingBalance": {
            "type": [
              "string",
              "null"
            ],
            "description": "Hex quantity string in base units (1 ANM = 10^9 base units)",
            "examples": [
              "0x8eb47f0599e9be"
            ]
          },
          "txs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TxSummary"
            },
            "description": "Transactions found in the scanned block window (newest first)"
          },
          "contract": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContractProfile"
              },
              {
                "type": "null"
              }
            ]
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Block-height cursor to continue the history scan",
            "examples": [
              "73103"
            ]
          },
          "scannedBlocks": {
            "type": "integer",
            "description": "How many recent blocks were scanned for this page"
          },
          "partial": {
            "type": "boolean",
            "description": "True when only part of the chain history was scanned \u2014 use `cursor` to continue"
          }
        }
      },
      "MempoolEntry": {
        "type": "object",
        "required": [
          "hash"
        ],
        "properties": {
          "hash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "sizeBytes": {
            "type": "integer"
          },
          "receivedAt": {
            "type": [
              "integer",
              "null"
            ]
          }
        }
      },
      "MempoolView": {
        "type": "object",
        "required": [
          "total",
          "entries"
        ],
        "properties": {
          "total": {
            "type": "integer"
          },
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MempoolEntry"
            }
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ]
          },
          "stats": {
            "type": "object",
            "properties": {
              "count": {
                "type": "integer"
              },
              "totalBytes": {
                "type": "integer"
              },
              "oldestAgeSec": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "description": "Discriminated by `type`. `anim1\u2026` \u2192 address lookup, decimal \u2192 block height, `0x\u2026` hex \u2192 tx hash then block hash. `result` is a BlockDetail, TxDetail or AddressSummary; absent when type=none.",
        "required": [
          "type"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "block",
              "tx",
              "address",
              "none"
            ]
          },
          "result": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/BlockDetail"
              },
              {
                "$ref": "#/components/schemas/TxDetail"
              },
              {
                "$ref": "#/components/schemas/AddressSummary"
              }
            ]
          }
        }
      },
      "RichListEntry": {
        "type": "object",
        "required": [
          "rank",
          "address",
          "balance"
        ],
        "properties": {
          "rank": {
            "type": "integer"
          },
          "address": {
            "type": "string",
            "description": "0x-prefixed 32-byte account-digest hex",
            "examples": [
              "0xa4951bae612901371baef3148cd6f729f65107ea5649b6c4e1ae1cd691cc1723"
            ]
          },
          "balance": {
            "type": "string",
            "description": "Hex quantity string in base units (1 ANM = 10^9 base units)",
            "examples": [
              "0x8eb47f0599e9be"
            ]
          },
          "pctSupply": {
            "type": "number",
            "description": "Percent of total supply",
            "examples": [
              37.06
            ]
          }
        }
      },
      "RichListResponse": {
        "type": "object",
        "required": [
          "height",
          "items",
          "totalAddresses"
        ],
        "properties": {
          "height": {
            "type": "integer"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RichListEntry"
            }
          },
          "totalAddresses": {
            "type": "integer"
          },
          "nextOffset": {
            "type": "integer",
            "description": "Pass as `offset` for the next page"
          }
        }
      },
      "RichListSummary": {
        "type": "object",
        "required": [
          "height",
          "totalSupply",
          "addressCount"
        ],
        "properties": {
          "height": {
            "type": "integer"
          },
          "totalSupply": {
            "type": "string",
            "description": "Hex quantity string in base units (1 ANM = 10^9 base units)",
            "examples": [
              "0x8eb47f0599e9be"
            ]
          },
          "addressCount": {
            "type": "integer"
          },
          "top10Pct": {
            "type": "number"
          },
          "top100Pct": {
            "type": "number"
          },
          "top1000Pct": {
            "type": "number"
          }
        }
      },
      "ContractDeployment": {
        "type": "object",
        "required": [
          "txHash",
          "blockHeight",
          "blockHash",
          "status",
          "kind"
        ],
        "properties": {
          "txHash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "blockHeight": {
            "type": "integer"
          },
          "blockHash": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "blockTime": {
            "type": [
              "integer",
              "null"
            ]
          },
          "deployer": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "contractAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "confirmed",
              "failed"
            ]
          },
          "kind": {
            "type": "string",
            "enum": [
              "contract_create",
              "package_publish",
              "manifest_deploy",
              "unknown"
            ]
          },
          "feePaid": {
            "type": "string"
          },
          "gasUsed": {
            "type": "string"
          },
          "codeSizeBytes": {
            "type": [
              "integer",
              "null"
            ]
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ContractDeploymentFeed": {
        "type": "object",
        "required": [
          "headHeight",
          "scannedBlocks",
          "stats",
          "items"
        ],
        "properties": {
          "headHeight": {
            "type": "integer"
          },
          "scannedBlocks": {
            "type": "integer"
          },
          "stats": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              },
              "successful": {
                "type": "integer"
              },
              "failed": {
                "type": "integer"
              },
              "uniqueDeployers": {
                "type": "integer"
              },
              "uniqueContracts": {
                "type": "integer"
              }
            }
          },
          "spotlight": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContractDeployment"
              },
              {
                "type": "null"
              }
            ]
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ContractDeployment"
            }
          }
        }
      },
      "ContractProfile": {
        "type": "object",
        "required": [
          "address",
          "accountType"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "accountType": {
            "type": "string",
            "enum": [
              "eoa",
              "contract",
              "unknown"
            ]
          },
          "codeHash": {
            "type": [
              "string",
              "null"
            ]
          },
          "runtimeCodeHash": {
            "type": [
              "string",
              "null"
            ]
          },
          "codeSizeBytes": {
            "type": [
              "integer",
              "null"
            ]
          },
          "abi": {},
          "metadataJson": {},
          "isVerified": {
            "type": "boolean"
          },
          "verification": {
            "$ref": "#/components/schemas/ContractVerificationRecord"
          },
          "creatorAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "creatorTxHash": {
            "type": [
              "string",
              "null"
            ]
          },
          "creationBlockHeight": {
            "type": [
              "integer",
              "null"
            ]
          },
          "creationBlockHash": {
            "type": [
              "string",
              "null"
            ]
          },
          "creationTimestamp": {
            "type": [
              "integer",
              "null"
            ]
          }
        }
      },
      "ContractDetailResponse": {
        "type": "object",
        "required": [
          "address",
          "profile",
          "txs"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "profile": {
            "$ref": "#/components/schemas/ContractProfile"
          },
          "txs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TxSummary"
            }
          }
        }
      },
      "ContractCode": {
        "type": "object",
        "required": [
          "address",
          "code",
          "codeHash"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Contract code (hex/base64 as stored), or null when unavailable"
          },
          "codeHash": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ContractVerificationRecord": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "jobId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "running",
              "verified",
              "failed",
              "unverified"
            ]
          },
          "verifierStatus": {
            "type": "string"
          },
          "contractName": {
            "type": [
              "string",
              "null"
            ]
          },
          "language": {
            "type": [
              "string",
              "null"
            ]
          },
          "compiler": {
            "type": [
              "string",
              "null"
            ]
          },
          "compilerVersion": {
            "type": [
              "string",
              "null"
            ]
          },
          "optimizationEnabled": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "optimizationRuns": {
            "type": [
              "integer",
              "null"
            ]
          },
          "vmTarget": {
            "type": [
              "string",
              "null"
            ]
          },
          "constructorArgs": {
            "type": [
              "string",
              "null"
            ]
          },
          "metadataJson": {},
          "sourceFiles": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {
              "type": "string"
            }
          },
          "abi": {},
          "creationBytecodeHash": {
            "type": [
              "string",
              "null"
            ]
          },
          "runtimeBytecodeHash": {
            "type": [
              "string",
              "null"
            ]
          },
          "verifiedAt": {
            "type": [
              "integer",
              "null"
            ]
          },
          "submittedAt": {
            "type": [
              "integer",
              "null"
            ]
          },
          "completedAt": {
            "type": [
              "integer",
              "null"
            ]
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ContractVerificationSubmitRequest": {
        "type": "object",
        "required": [
          "address",
          "language"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "contractName": {
            "type": "string"
          },
          "language": {
            "type": "string",
            "description": "Source language",
            "examples": [
              "python"
            ]
          },
          "compiler": {
            "type": "string"
          },
          "compilerVersion": {
            "type": "string"
          },
          "optimizationEnabled": {
            "type": "boolean"
          },
          "optimizationRuns": {
            "type": "integer"
          },
          "vmTarget": {
            "type": "string"
          },
          "constructorArgs": {
            "type": "string"
          },
          "sourceCode": {
            "type": "string",
            "description": "Single-file source; stored as contract.py"
          },
          "sources": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Multi-file sources, path \u2192 code (max 64 files)"
          },
          "abi": {},
          "metadataJson": {},
          "standardJsonInput": {},
          "buildArtifact": {}
        }
      },
      "ContractVerificationJob": {
        "type": "object",
        "required": [
          "jobId",
          "address",
          "status",
          "submittedAt"
        ],
        "properties": {
          "jobId": {
            "type": "string",
            "format": "uuid"
          },
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "running",
              "verified",
              "failed"
            ]
          },
          "submittedAt": {
            "type": "integer",
            "description": "Unix ms"
          },
          "completedAt": {
            "type": [
              "integer",
              "null"
            ]
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "result": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContractVerificationRecord"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "TokenInfo": {
        "type": "object",
        "description": "Indexed ANM-20 token (AnimicaTokenStandard). Market fields are null whenever the chain cannot provide them \u2014 the explorer never fabricates prices or supplies. Consumed verbatim by the mobile wallet.",
        "required": [
          "address",
          "name",
          "symbol",
          "decimals",
          "links",
          "promoted"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "name": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "decimals": {
            "type": "integer"
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "links": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "label \u2192 url, e.g. {\"website\": \"https://\u2026\"}"
          },
          "totalSupply": {
            "type": [
              "string",
              "null"
            ],
            "description": "Base units as decimal string (BigInt-safe)"
          },
          "priceAnm": {
            "type": [
              "number",
              "null"
            ],
            "description": "ANM per 1 whole token (pool mid-price)"
          },
          "liquidityAnm": {
            "type": [
              "number",
              "null"
            ]
          },
          "change24h": {
            "type": [
              "number",
              "null"
            ],
            "description": "Signed 24h price change percent"
          },
          "pairAddress": {
            "type": [
              "string",
              "null"
            ],
            "description": "ANM/token DEX pair contract, if a pool exists"
          },
          "feeBps": {
            "type": [
              "integer",
              "null"
            ]
          },
          "promoted": {
            "type": "boolean"
          },
          "promoDaysLeft": {
            "type": [
              "integer",
              "null"
            ]
          },
          "metadataUri": {
            "type": [
              "string",
              "null"
            ]
          },
          "initialSupply": {
            "type": [
              "string",
              "null"
            ]
          },
          "maxSupply": {
            "type": [
              "string",
              "null"
            ]
          },
          "mintable": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "creator": {
            "type": [
              "string",
              "null"
            ]
          },
          "creationHeight": {
            "type": [
              "integer",
              "null"
            ]
          },
          "creationTx": {
            "type": [
              "string",
              "null"
            ]
          },
          "creationTime": {
            "type": [
              "integer",
              "null"
            ]
          },
          "holders": {
            "type": [
              "integer",
              "null"
            ]
          },
          "updatedAt": {
            "type": [
              "integer",
              "null"
            ]
          }
        }
      },
      "TokenList": {
        "type": "object",
        "required": [
          "tokens"
        ],
        "properties": {
          "tokens": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TokenInfo"
            }
          }
        }
      },
      "TokenPricePoint": {
        "type": "object",
        "required": [
          "t",
          "priceAnm"
        ],
        "properties": {
          "t": {
            "type": "integer",
            "description": "Unix seconds"
          },
          "priceAnm": {
            "type": "number"
          }
        }
      },
      "ServiceStatus": {
        "type": "object",
        "required": [
          "name",
          "status"
        ],
        "properties": {
          "name": {
            "type": "string",
            "examples": [
              "chain",
              "mempool",
              "aicf",
              "da"
            ]
          },
          "status": {
            "type": "string",
            "examples": [
              "ok",
              "not_supported",
              "degraded"
            ]
          },
          "hint": {
            "type": "string"
          },
          "remediation": {
            "type": "string"
          },
          "detail": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "NetworkStatus": {
        "type": "object",
        "required": [
          "timestamp",
          "services"
        ],
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceStatus"
            }
          },
          "note": {
            "type": "string"
          }
        }
      },
      "MiningInfo": {
        "type": "object",
        "required": [
          "available"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "status": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "ok": {
                "type": "boolean"
              },
              "reason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "details": {
                "type": "object",
                "additionalProperties": true
              }
            }
          },
          "template": {
            "type": [
              "object",
              "null"
            ]
          },
          "metrics": {
            "type": [
              "object",
              "null"
            ]
          }
        }
      },
      "RpcDiscover": {
        "type": "object",
        "required": [
          "available",
          "methods"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "methods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "JSON-RPC method names served by the backing node (chain.*, state.*, tx.*, aicf.*, da.*, l2_*, \u2026)"
          },
          "note": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "AICFInfo": {
        "type": "object",
        "required": [
          "available"
        ],
        "description": "Aggregated AICF (AI Compute Fabric) view. Sub-objects are null when the corresponding node RPC is unavailable.",
        "properties": {
          "available": {
            "type": "boolean"
          },
          "status": {
            "type": [
              "object",
              "null"
            ]
          },
          "credits": {
            "type": [
              "object",
              "null"
            ]
          },
          "jobs": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "jobs": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "AICF work-layer job: id, title, prompt, job_type, status, reward_amount_anm, required_capabilities, verification_mode, created_at/updated_at/expires_at (Unix ms), \u2026"
                }
              }
            }
          },
          "plans": {
            "type": [
              "object",
              "null"
            ]
          },
          "workers": {
            "type": [
              "object",
              "null"
            ]
          }
        },
        "additionalProperties": true
      },
      "AICFSummary": {
        "type": "object",
        "description": "Lifetime AICF credit totals. When the node's aicf state is unavailable the endpoint still returns 200 with ok:false and zeroed totals.",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "available": {
            "type": "boolean"
          },
          "reason": {
            "type": "string",
            "examples": [
              "aicf_unavailable"
            ]
          },
          "total_minted": {
            "type": "string"
          },
          "total_spent": {
            "type": "string"
          },
          "balance": {
            "type": "string"
          },
          "event_count": {
            "type": "integer"
          },
          "recent_events": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "AICFEvents": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "available": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "AICFAddressCredits": {
        "type": "object",
        "required": [
          "available"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "balance": {
            "type": "string",
            "description": "AICF credit balance"
          },
          "spent": {
            "type": "string"
          },
          "minted": {
            "type": "string"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "reason": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "AICFWorker": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "display_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "tiers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Advertised capabilities, e.g. llm_inference, code_generation"
          },
          "device_type": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "cpu",
              "cuda"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "idle",
              "busy"
            ]
          },
          "hardware": {
            "type": "object",
            "properties": {
              "accelerator_preferred": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "ram_gb": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "summary": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "jobs_completed": {
            "type": "integer"
          },
          "jobs_failed": {
            "type": "integer"
          },
          "reputation_score": {
            "type": [
              "number",
              "null"
            ]
          },
          "total_earned_anm": {
            "type": [
              "string",
              "number",
              "null"
            ],
            "description": "Whole-ANM decimal string"
          },
          "last_seen": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Unix ms"
          }
        }
      },
      "AICFWorkers": {
        "type": "object",
        "required": [
          "available",
          "workers",
          "by_tier"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "workers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AICFWorker"
            }
          },
          "by_tier": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "device_type \u2192 worker count"
          },
          "by_capability": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "total": {
            "type": "integer"
          },
          "active": {
            "type": "integer"
          },
          "reason": {
            "type": "string"
          }
        }
      },
      "AICFJobStats": {
        "type": "object",
        "required": [
          "available"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "window_minutes": {
            "type": "integer"
          },
          "source": {
            "type": "string",
            "examples": [
              "work-layer-derived"
            ]
          },
          "jobs_completed": {
            "type": "integer"
          },
          "jobs_failed": {
            "type": "integer"
          },
          "jobs_open": {
            "type": "integer"
          },
          "workers": {
            "type": "integer"
          },
          "latency_p50_ms": {
            "type": [
              "number",
              "null"
            ]
          },
          "latency_p95_ms": {
            "type": [
              "number",
              "null"
            ]
          },
          "by_tier": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "reason": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "DAStatus": {
        "type": "object",
        "description": "Data-availability layer status as reported by the node.",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "enabled": {
            "type": "boolean"
          },
          "writable": {
            "type": "boolean"
          },
          "dir": {
            "type": "string"
          },
          "effective_dir": {
            "type": "string"
          },
          "max_bytes": {
            "type": "integer"
          },
          "used_bytes_da": {
            "type": "integer"
          },
          "used_bytes": {
            "type": "integer"
          },
          "free_bytes_fs": {
            "type": "integer"
          },
          "blob_count": {
            "type": "integer"
          },
          "last_error": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_error_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "peer_serving": {
            "type": "boolean"
          },
          "allow_remote_get": {
            "type": "boolean"
          },
          "allow_remote_put": {
            "type": "boolean"
          },
          "policy_blocked_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "eviction_policy": {
            "type": "string",
            "examples": [
              "lru"
            ]
          },
          "on_full": {
            "type": "string",
            "examples": [
              "evict"
            ]
          },
          "version": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "DAInfo": {
        "type": "object",
        "required": [
          "available"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "status": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DAStatus"
              },
              {
                "type": "null"
              }
            ]
          },
          "quotas": {
            "type": [
              "object",
              "null"
            ]
          }
        }
      },
      "DABlobMeta": {
        "type": "object",
        "properties": {
          "blob_id": {
            "type": "string",
            "description": "Hex blob id (no 0x prefix)"
          },
          "size_bytes": {
            "type": "integer"
          },
          "created_at": {
            "type": "integer",
            "description": "Unix seconds"
          },
          "last_accessed_at": {
            "type": "integer",
            "description": "Unix seconds"
          }
        },
        "additionalProperties": true
      },
      "DARecent": {
        "type": "object",
        "required": [
          "available",
          "blobs"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "blobs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DABlobMeta"
            }
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "DAHistoryEntry": {
        "type": "object",
        "properties": {
          "commitment": {
            "type": "string",
            "description": "Hex commitment (no 0x prefix)"
          },
          "blob_id": {
            "type": "string"
          },
          "namespace": {
            "type": "integer"
          },
          "data_shards": {
            "type": "integer"
          },
          "total_shards": {
            "type": "integer"
          },
          "share_bytes": {
            "type": "integer"
          },
          "leaf_count": {
            "type": "integer"
          },
          "original_size": {
            "type": "integer"
          },
          "created_at": {
            "type": "integer",
            "description": "Unix seconds"
          }
        },
        "additionalProperties": true
      },
      "DAPutRequest": {
        "type": "object",
        "required": [
          "namespace",
          "data"
        ],
        "properties": {
          "namespace": {
            "type": "string",
            "description": "DA namespace"
          },
          "data": {
            "type": "string",
            "description": "Base64-encoded blob bytes"
          }
        }
      },
      "EnaJobs": {
        "type": "object",
        "properties": {
          "available": {
            "type": "boolean"
          },
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "models": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "ENA models (from ena.listModels) as a proxy for job activity"
          },
          "limit": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      },
      "EnaArtifacts": {
        "type": "object",
        "properties": {
          "available": {
            "type": "boolean"
          },
          "artifacts": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "QuantumInfo": {
        "type": "object",
        "required": [
          "available"
        ],
        "properties": {
          "available": {
            "type": "boolean"
          },
          "status": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "ok": {
                "type": "boolean"
              },
              "reason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "details": {
                "type": "object",
                "additionalProperties": true,
                "description": "worker_enabled, accepted_job_types, capabilities {cpu,gpu,qpu}, last_heartbeat"
              }
            }
          },
          "workers": {
            "type": [
              "object",
              "null"
            ]
          },
          "jobs": {
            "type": [
              "object",
              "null"
            ]
          },
          "policy": {
            "type": [
              "object",
              "null"
            ]
          }
        }
      },
      "L2Disabled": {
        "type": "object",
        "required": [
          "enabled"
        ],
        "properties": {
          "enabled": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "L2 is not enabled on the backing node"
          }
        }
      },
      "L2Bridge": {
        "type": "object",
        "properties": {
          "lockedOnL1": {
            "type": [
              "integer",
              "string"
            ],
            "description": "Base units (nanos)"
          },
          "creditedTotal": {
            "type": [
              "integer",
              "string"
            ]
          },
          "burnedTotal": {
            "type": [
              "integer",
              "string"
            ]
          },
          "claimedOnL1Total": {
            "type": [
              "integer",
              "string"
            ]
          },
          "deposits": {
            "type": "integer"
          },
          "claimableDeposits": {
            "type": "integer"
          },
          "withdrawals": {
            "type": "integer"
          },
          "forcedPending": {
            "type": "integer"
          },
          "depositAddress": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "bridgeAddress": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          }
        },
        "additionalProperties": true
      },
      "L2Status": {
        "type": "object",
        "required": [
          "enabled"
        ],
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "mode": {
            "type": "string",
            "examples": [
              "all"
            ]
          },
          "l2ChainId": {
            "type": "integer",
            "examples": [
              1001
            ]
          },
          "settlementMode": {
            "type": "string",
            "examples": [
              "VALIDITY"
            ]
          },
          "headBatch": {
            "type": "integer"
          },
          "stateRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "pending": {
            "type": "integer",
            "description": "Pending (unbatched) L2 transactions"
          },
          "sigBackend": {
            "type": "string",
            "examples": [
              "pure"
            ]
          },
          "bridgeAddress": {
            "type": "string",
            "description": "Animica address: bech32m `anim1\u2026` (canonical) or 0x-prefixed 32-byte account-digest hex",
            "examples": [
              "anim1zqp6f9gm4esjjqfhrwh0x9yv6mmjnaj3ql49vjdkcns6u8xkj8xpwgcm6zscx"
            ]
          },
          "bridgeAddressHex": {
            "type": "string"
          },
          "depositsEnabled": {
            "type": "boolean"
          },
          "bridge": {
            "$ref": "#/components/schemas/L2Bridge"
          }
        },
        "additionalProperties": true
      },
      "L2Tps": {
        "type": "object",
        "properties": {
          "ingressTotal": {
            "type": "integer"
          },
          "executedTotal": {
            "type": "integer"
          },
          "softConfirmedTotal": {
            "type": "integer"
          },
          "settledTotal": {
            "type": "integer"
          },
          "batchesTotal": {
            "type": "integer"
          },
          "sigVerificationsTotal": {
            "type": "integer"
          },
          "ingressTps": {
            "type": "number"
          },
          "executedTps": {
            "type": "number"
          },
          "softConfirmedTps": {
            "type": "number"
          },
          "settledTps": {
            "type": "number"
          }
        }
      },
      "L2StateRoot": {
        "type": "object",
        "properties": {
          "batch": {
            "type": "integer"
          },
          "stateRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          }
        }
      },
      "L2ProofStatus": {
        "type": "object",
        "properties": {
          "batch": {
            "type": "integer"
          },
          "hasProof": {
            "type": "boolean"
          },
          "backend": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "reexec-validity-v1"
            ]
          },
          "publicInputsDigest": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "L2BatchHeader": {
        "type": "object",
        "properties": {
          "number": {
            "type": "integer"
          },
          "l2ChainId": {
            "type": "integer"
          },
          "prevStateRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "newStateRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "transactionsRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "receiptsRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "escrowRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "dataRoot": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "txCount": {
            "type": "integer"
          },
          "timestampMs": {
            "type": "integer",
            "description": "Unix ms"
          },
          "feesCollected": {
            "type": "string",
            "description": "Base units (nanos), decimal string"
          },
          "deposited": {
            "type": "string",
            "description": "Base units"
          },
          "withdrawn": {
            "type": "string",
            "description": "Base units"
          },
          "batchId": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          }
        },
        "additionalProperties": true
      },
      "L2Batch": {
        "allOf": [
          {
            "$ref": "#/components/schemas/L2BatchHeader"
          },
          {
            "type": "object",
            "properties": {
              "proof": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/L2ProofStatus"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          }
        ]
      },
      "L2Tx": {
        "type": "object",
        "description": "L2 transaction lifecycle view (l2_getTransaction merged with its receipt and batch proof status).",
        "properties": {
          "txid": {
            "type": "string",
            "description": "0x-prefixed 32-byte hex hash",
            "examples": [
              "0x00000000011b657a3d2408823d5fb183a7eb6c6f31b3c09195f8afe39e6fe3c4"
            ]
          },
          "status": {
            "type": "string",
            "description": "Lifecycle status",
            "examples": [
              "RECEIVED",
              "EXECUTED",
              "SOFT_CONFIRMED",
              "SETTLED",
              "PROVEN"
            ]
          },
          "batch": {
            "type": "integer",
            "description": "Containing batch number; -1 while unbatched"
          },
          "reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "receivedMs": {
            "type": "integer",
            "description": "Unix ms the sequencer received the tx"
          },
          "receipt": {
            "type": [
              "object",
              "null"
            ],
            "description": "Execution receipt (txid, batch, status)",
            "additionalProperties": true
          },
          "proof": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/L2ProofStatus"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": true
      },
      "L2Account": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "description": "0x-prefixed 32-byte account-digest hex"
          },
          "balance": {
            "type": "string",
            "description": "Decimal string, base units (nanos)"
          },
          "nonce": {
            "type": "integer"
          },
          "pendingNonce": {
            "type": "integer"
          },
          "unit": {
            "type": "string",
            "enum": [
              "nanos"
            ]
          }
        }
      },
      "L2Overview": {
        "type": "object",
        "required": [
          "enabled"
        ],
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "settlementMode": {
            "type": "string",
            "examples": [
              "VALIDITY"
            ]
          },
          "headBatch": {
            "type": "integer"
          },
          "latestStateRoot": {
            "type": [
              "string",
              "null"
            ]
          },
          "latestBatch": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/L2BatchHeader"
              },
              {
                "type": "null"
              }
            ]
          },
          "proofStatus": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/L2ProofStatus"
              },
              {
                "type": "null"
              }
            ]
          },
          "tps": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/L2Tps"
              },
              {
                "type": "null"
              }
            ]
          },
          "sigBackend": {
            "type": [
              "string",
              "null"
            ]
          },
          "pending": {
            "type": "integer"
          },
          "anmLocked": {
            "type": "string",
            "description": "ANM locked in the L1 bridge, base units"
          },
          "l2Supply": {
            "type": "string",
            "description": "Total L2 supply, base units"
          },
          "totalL2Transactions": {
            "type": "integer"
          },
          "softConfirmedTotal": {
            "type": "integer"
          },
          "settledTotal": {
            "type": "integer"
          },
          "batchTransactions": {
            "type": "integer"
          },
          "compressionRatio": {
            "type": [
              "number",
              "null"
            ]
          },
          "pendingProofs": {
            "type": "integer"
          },
          "deposits": {
            "type": "integer"
          },
          "withdrawals": {
            "type": "integer"
          }
        }
      }
    },
    "responses": {
      "NotFound": {
        "description": "Resource not found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "BadRequest": {
        "description": "Invalid request parameters",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "ServerError": {
        "description": "Internal error (also returned when the backing node RPC fails)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      }
    }
  }
}
