{
  "openapi": "3.0.3",
  "info": {
    "title": "Smart Money API",
    "version": "1.0.0",
    "description": "Real-time smart-money intelligence from smartmoneyapi.com: cross-exchange derivatives aggregation (Bybit, Binance, Hyperliquid), 2000+ tracked whale wallets, liquidation streams, options, ETF flows, on-chain metrics and news intelligence. Public endpoints work without a key (reduced rows / per-IP throttle); an X-API-Key unlocks tier quotas and the gated endpoints.\n\nFree tier: 200 calls/day, 4/minute, BTC, ETH, SOL, XAU, XAG only, no data delay.\n\nEvery operation carries x-auth (none|required) and x-tier, both derived from the gateway source and plans.json rather than written by hand. Generated by ops/gen_openapi.py.",
    "contact": {
      "url": "https://smartmoneyapi.com"
    }
  },
  "servers": [
    {
      "url": "https://api.smartmoneyapi.com"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "paths": {
    "/v1/onchain/metrics": {
      "get": {
        "summary": "All on-chain metrics",
        "description": "Aggregated on-chain metrics bundle (DeFiLlama TVL/stablecoins/DEX volumes, Blockchain.com BTC stats, Etherscan gas, CoinGecko global). Public.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "onchain": {
                      "type": "object"
                    },
                    "updated": {
                      "type": "integer"
                    },
                    "public": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "On-chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/onchain/tvl": {
      "get": {
        "summary": "TVL by chain",
        "description": "DeFi total value locked per chain (DeFiLlama). Anonymous callers get the top 10 chains.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "On-chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/onchain/yields": {
      "get": {
        "summary": "DeFi yields",
        "description": "Top DeFi yield pools (DeFiLlama). Anonymous callers get the top 8 pools.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "On-chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/onchain/btc": {
      "get": {
        "summary": "BTC on-chain stats",
        "description": "Bitcoin network stats: hashrate, difficulty, mempool, transaction counts (Blockchain.com).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "On-chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/onchain/stablecoins": {
      "get": {
        "summary": "Stablecoin supply",
        "description": "Stablecoin circulating supply breakdown (DeFiLlama).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "On-chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/onchain/gas": {
      "get": {
        "summary": "Ethereum gas",
        "description": "Current Ethereum gas prices (Etherscan).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "On-chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/onchain/dex": {
      "get": {
        "summary": "DEX volumes",
        "description": "Decentralised exchange volume rankings (DeFiLlama).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "On-chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/derivatives/screener": {
      "get": {
        "summary": "Derivatives screener",
        "description": "Cross-exchange derivatives screener (500+ symbols): funding, open interest, long/short ratio, signals. Anonymous callers get a fixed top-10 by OI (response carries public:true, limited:true); authenticated callers can sort/filter up to 200 rows.\n\nBY-NAME LOOKUP REQUIRES A KEY. `?symbol=` (alias `?asset=`) is answered only for authenticated callers, and only for the symbols the caller's tier grants: the free tier's by-name list is published on every public operation as `x-free-tier-symbols`, and paid tiers cover every symbol. A keyless request that names a symbol gets 403 naming the free key as the fix; a keyed request naming a symbol outside the tier gets 403 with the included list. Keyless callers keep the top-10 preview by simply omitting `?symbol=` -- the preview is a RANKING, so a symbol you are entitled to may still be absent from it on any given day, which is why by-name exists.\n\nAn entitled symbol with no snapshot recorded yet returns an empty `symbols` array plus a `note`: that is absent data, not zero and not an exclusion.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Screener rows plus total_count; anonymous responses include public and limited flags. A by-name response carries requested_symbol and allowed_symbols."
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Look one symbol up by name. Requires an API key; restricted to the tier's symbol list. Alias: asset.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "Sort field (authenticated only).",
            "schema": {
              "type": "string",
              "default": "oi_usd"
            }
          },
          {
            "name": "dir",
            "in": "query",
            "description": "Sort direction (authenticated only).",
            "schema": {
              "type": "string",
              "default": "desc",
              "enum": [
                "asc",
                "desc"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows, capped at 200 (authenticated only).",
            "schema": {
              "type": "integer",
              "default": 50,
              "maximum": 200
            }
          },
          {
            "name": "min_oi",
            "in": "query",
            "description": "Minimum open interest in USD (authenticated only).",
            "schema": {
              "type": "number",
              "default": 0
            }
          },
          {
            "name": "crowding",
            "in": "query",
            "description": "Filter by crowding state (authenticated only). Legacy alias: signal.",
            "schema": {
              "type": "string",
              "enum": [
                "crowded_long",
                "crowded_short",
                "neutral"
              ]
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/derivatives/funding-heatmap": {
      "get": {
        "summary": "Funding heatmap",
        "description": "Funding-rate heatmap across exchanges. Anonymous callers get the first 10 heatmap rows.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "heatmap": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/derivatives/oi-rankings": {
      "get": {
        "summary": "Open-interest rankings",
        "description": "Open-interest change rankings. Anonymous callers get a fixed 24h/top-10 view; authenticated callers can choose timeframe/limit.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "timeframe",
            "in": "query",
            "description": "Ranking window (authenticated only).",
            "schema": {
              "type": "string",
              "default": "24h"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows, capped at 50 (authenticated only).",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 50
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/derivatives/provenance": {
      "get": {
        "summary": "Derivatives data provenance",
        "description": "Which rows in the derivatives table were WATCHED live versus REPLAYED after the fact from a venue's own historical funding/price endpoint. Full scan of the derivatives_backfill table (~11s), served through a 30-minute cache. `backfilled` covers only the handful of symbols that were ever backfilled, NOT the whole tracked universe -- read `backfilled.instruments`/`backfilled.symbols`, never a symbol count multiplied by a venue count. Six of nine venues publish no historical open-interest endpoint, so an empty `rows_with_open_interest` for them is a venue limitation, not a gap in collection. If the shard has no derivatives_backfill table at all, `status` is `no_backfill_table` and every row in `derivatives` for this shard is observed (nothing was replayed).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "provenance_values_present": {
                      "type": "array"
                    },
                    "backfilled": {
                      "type": "object",
                      "properties": {
                        "rows": {
                          "type": "integer"
                        },
                        "instruments": {
                          "type": "integer"
                        },
                        "symbols": {
                          "type": "array"
                        },
                        "venues": {
                          "type": "array"
                        },
                        "meaning": {
                          "type": "string"
                        }
                      }
                    },
                    "observed": {
                      "type": "object",
                      "description": "Per-venue earliest/latest ts and row count for the live (non-backfilled) derivatives table in THIS shard -- the daemon rotates the database, so earliest_ts_in_this_shard is a floor on collection start, not when collection began."
                    },
                    "read_this_view": {
                      "type": "string"
                    },
                    "not_claimed": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/funding/clock": {
      "get": {
        "summary": "Measured funding-settlement clock",
        "description": "Per-venue summary of the MEASURED funding-settlement interval, derived from each venue's own settlement timestamps (never from documentation): the newest gap, extended backwards while consecutive gaps agree. A median over full history is deliberately NOT used -- a venue that changed its clock mid-history (observed: Binance moved COTIUSDT from hourly to 4-hourly settlement) makes the median wrong for however long the new clock has been running. `venues_measured` only lists venues with a usable measurement; `venues_unmeasured` lists the rest, so a venue can never silently vanish from the coverage claim. `refuses_measurements_older_than_days` names the staleness bound past which a per-instrument measurement is refused rather than trusted.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "basis": {
                      "type": "string"
                    },
                    "how_measured": {
                      "type": "string"
                    },
                    "venues_measured": {
                      "type": "array"
                    },
                    "venues_unmeasured": {
                      "type": "array"
                    },
                    "totals": {
                      "type": "object",
                      "properties": {
                        "instruments_measured": {
                          "type": "integer"
                        },
                        "instruments_refused": {
                          "type": "integer"
                        },
                        "settlement_gaps": {
                          "type": "integer"
                        }
                      }
                    },
                    "refuses_measurements_older_than_days": {
                      "type": "integer"
                    },
                    "venues": {
                      "type": "object",
                      "description": "Keyed by venue; each entry is the venue's raw coverage record plus measurement_age_days (derived from the measurement's own timestamp, so a stale sweep is visible in the payload)."
                    },
                    "metadata_disagreements": {
                      "type": "array"
                    },
                    "not_claimed": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/funding/normalised": {
      "get": {
        "summary": "Cross-venue funding on one clock",
        "description": "One underlying's live funding rate on every venue we hold a rate for, put on a single annualised basis using each venue's MEASURED settlement clock (see /v1/funding/clock) instead of assuming every venue settles 8-hourly. Every venue that has a stored rate for this symbol lands in exactly one of three buckets so none can silently disappear from the average: `venues_contributing` (used in the mean), `venues_refused` (had a rate but the clock refused it, with a reason per venue), and `venues_unmapped` (no funding stored, or no single measured linear perpetual resolves for this base in the venue registry). `comparison` recomputes the same contributing rates assuming every venue is 8-hourly, so the size of the correction is checkable from the response alone (measured median across underlyings: 5.47 annualised percentage points). A symbol with no derivatives row in the last 2 hours returns `status: no_rows` rather than an empty average. `?symbol=` other than alphanumeric/`_`/`-` is a 400 `bad_symbol`.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "On status=no_rows only status/symbol/message/venues_* are populated.",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "symbol": {
                      "type": "string"
                    },
                    "base": {
                      "type": "string"
                    },
                    "mean_annualised_pct": {
                      "type": "number"
                    },
                    "mean_rate_8h_equivalent": {
                      "type": "number"
                    },
                    "basis": {
                      "type": "string"
                    },
                    "venues_contributing": {
                      "type": "array"
                    },
                    "venues_refused": {
                      "type": "object"
                    },
                    "venues_unmapped": {
                      "type": "object"
                    },
                    "venues_with_a_stored_rate": {
                      "type": "array"
                    },
                    "per_venue": {
                      "type": "object"
                    },
                    "observed_ts": {
                      "type": "integer"
                    },
                    "comparison": {
                      "type": "object",
                      "properties": {
                        "mean_annualised_pct_if_every_venue_assumed_8h": {
                          "type": "number"
                        },
                        "mean_annualised_pct_on_measured_clocks": {
                          "type": "number"
                        },
                        "difference_pct_points": {
                          "type": "number"
                        },
                        "note": {
                          "type": "string"
                        }
                      }
                    },
                    "not_claimed": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC. Alphanumeric plus '_'/'-', max 24 chars.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/coverage": {
      "get": {
        "summary": "Derivatives field coverage matrix",
        "description": "How completely each tracked field (funding, open interest, long/short ratio, ...) is populated per venue over a lookback window, plus one symbol's per-venue/per-field detail when `?symbol=` is given. `venues_registry_only` names venues the instrument registry knows about but that never actually wrote a row in the window -- a registry entry is not evidence of collection. `listing_source` and `declaration` carry the metadata this matrix reasons from (what we believe is listed, and on what evidence) alongside `declaration_conflicts`, so a coverage gap can be told apart from a symbol that was never listed anywhere. `window_seconds` is clamped to [3600, 604800] (1h-7d); an out-of-range or unparsable value falls back to the clamped/default value rather than erroring. `?symbol=` other than alphanumeric/`_`/`-` is a 400 `bad_symbol`.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "generated_at": {
                      "type": "integer"
                    },
                    "source_table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "symbols_observed": {
                      "type": "integer"
                    },
                    "venues_collected": {
                      "type": "array"
                    },
                    "venues_in_instrument_registry": {
                      "type": "array"
                    },
                    "venues_registry_only": {
                      "type": "array"
                    },
                    "fields": {
                      "type": "array"
                    },
                    "status_labels": {
                      "type": "object"
                    },
                    "status_buckets": {
                      "type": "object"
                    },
                    "listing_source": {
                      "type": "object"
                    },
                    "declaration": {
                      "type": "object"
                    },
                    "declaration_conflicts": {
                      "type": "array"
                    },
                    "per_field": {
                      "type": "object",
                      "description": "Per tracked field: distribution, buckets, per_venue counts, symbols_with_at_least_one_venue. Empty when status != ok."
                    },
                    "symbol": {
                      "type": "string"
                    },
                    "venues": {
                      "type": "object",
                      "description": "Present only with ?symbol=: per-venue, per-field cell detail for that one symbol."
                    },
                    "not_claimed": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "window_seconds",
            "in": "query",
            "description": "Lookback window in seconds, clamped to [3600, 604800].",
            "schema": {
              "type": "integer",
              "default": 86400,
              "minimum": 3600,
              "maximum": 604800
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Restrict to one symbol's per-venue/per-field detail instead of the full matrix. Alphanumeric plus '_'/'-', max 24 chars.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/volume": {
      "get": {
        "summary": "Volume series",
        "description": "Per-venue traded volume series on the same timeframe grid as the liquidation heatmap, over the permanently retained archive. Series values are NULLABLE: null means the venue was not measured for that bar, 0 means it was measured and nothing traded. They are not interchangeable and gaps must not be plotted as zero. The response carries a coverage block naming which venues were absent and why.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "series is keyed by venue; coverage reports which venues were readable for the window.",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "timeframe": {
                      "type": "string"
                    },
                    "series": {
                      "type": "object"
                    },
                    "coverage": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "description": "Bar size. Alias: tf.",
            "schema": {
              "type": "string",
              "default": "1h",
              "enum": [
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ]
            }
          },
          {
            "name": "window_minutes",
            "in": "query",
            "description": "Lookback in minutes, snapped to the timeframe grid. Alias: window. Defaults to 200 bars; a window asking for more than 1500 points is rejected with 400 rather than silently truncated.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "exchanges",
            "in": "query",
            "description": "Comma-separated venues (binance, okx, bybit, bitget, bitmex). Alias: exchange. Omit for all. An unknown venue is a 400, never a silently wider query.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to_ts",
            "in": "query",
            "description": "End of the window as a unix timestamp (default now). Alias: to. Snapped to the timeframe grid.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Volume"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/volume/aggregate": {
      "get": {
        "summary": "Aggregate volume series",
        "description": "Volume summed across the selected venues, on the same grid as /v1/volume. Series values are NULLABLE: null means the venue was not measured for that bar, 0 means it was measured and nothing traded. They are not interchangeable and gaps must not be plotted as zero. The response carries a coverage block naming which venues were absent and why.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "timeframe": {
                      "type": "string"
                    },
                    "series": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "description": "Bar size. Alias: tf.",
            "schema": {
              "type": "string",
              "default": "1h",
              "enum": [
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ]
            }
          },
          {
            "name": "window_minutes",
            "in": "query",
            "description": "Lookback in minutes, snapped to the timeframe grid. Alias: window. Defaults to 200 bars; a window asking for more than 1500 points is rejected with 400 rather than silently truncated.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "exchanges",
            "in": "query",
            "description": "Comma-separated venues (binance, okx, bybit, bitget, bitmex). Alias: exchange. Omit for all. An unknown venue is a 400, never a silently wider query.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to_ts",
            "in": "query",
            "description": "End of the window as a unix timestamp (default now). Alias: to. Snapped to the timeframe grid.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Volume"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/volume/exchange": {
      "get": {
        "summary": "Single-venue volume series",
        "description": "Volume series for exactly one venue. `exchange` is REQUIRED and must name a single venue (binance, okx, bybit, bitget, bitmex); naming none or several is a 400, because quietly widening it would return a different query than the one asked for. Series values are NULLABLE: null means the venue was not measured for that bar, 0 means it was measured and nothing traded. They are not interchangeable and gaps must not be plotted as zero. The response carries a coverage block naming which venues were absent and why.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "exchange": {
                      "type": "string"
                    },
                    "timeframe": {
                      "type": "string"
                    },
                    "series": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "exchange",
            "in": "query",
            "description": "Exactly one venue (binance, okx, bybit, bitget, bitmex).",
            "schema": {
              "type": "string",
              "enum": [
                "binance",
                "okx",
                "bybit",
                "bitget",
                "bitmex"
              ]
            },
            "required": true
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "description": "Bar size. Alias: tf.",
            "schema": {
              "type": "string",
              "default": "1h",
              "enum": [
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ]
            }
          },
          {
            "name": "window_minutes",
            "in": "query",
            "description": "Lookback in minutes, snapped to the timeframe grid. Alias: window. Defaults to 200 bars; a window asking for more than 1500 points is rejected with 400 rather than silently truncated.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to_ts",
            "in": "query",
            "description": "End of the window as a unix timestamp (default now). Alias: to. Snapped to the timeframe grid.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Volume"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/volume/symbols": {
      "get": {
        "summary": "Symbols held in the volume archive",
        "description": "Every symbol the volume archive actually holds bars for. An empty series from /v1/volume plus a symbol listed here means the window is empty; a symbol absent here was never collected. A 503 from this endpoint is a READ FAILURE and must not be read as 'no volume recorded'.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbols": {
                      "type": "array"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Volume"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/volume/health": {
      "get": {
        "summary": "Volume collector health",
        "description": "Collector liveness per venue: last bar written, lag, and whether the archive is currently being appended to. Use this to tell an outage apart from a quiet market before drawing conclusions from a flat series.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "venues": {
                      "type": "object"
                    },
                    "status": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Volume"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/options/chain": {
      "get": {
        "summary": "Options chain summary",
        "description": "BTC/ETH options summary from Deribit: put/call ratio, max pain, open interest by strike, per-expiry breakdown.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "currency": {
                      "type": "string"
                    },
                    "underlying_price": {
                      "type": "number"
                    },
                    "total_call_oi": {
                      "type": "number"
                    },
                    "total_put_oi": {
                      "type": "number"
                    },
                    "total_call_volume": {
                      "type": "number"
                    },
                    "total_put_volume": {
                      "type": "number"
                    },
                    "pcr_oi": {
                      "type": "number"
                    },
                    "pcr_volume": {
                      "type": "number"
                    },
                    "oi_by_strike": {
                      "type": "array"
                    },
                    "expiry_summary": {
                      "type": "object"
                    },
                    "max_pain": {
                      "type": "object"
                    },
                    "updated": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "currency",
            "in": "query",
            "description": "Options currency.",
            "schema": {
              "type": "string",
              "default": "BTC",
              "enum": [
                "BTC",
                "ETH"
              ]
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/options/overview": {
      "get": {
        "summary": "Options overview (BTC + ETH)",
        "description": "Both BTC and ETH options summaries in one response.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "BTC": {
                      "type": "object"
                    },
                    "ETH": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/options/pcr": {
      "get": {
        "summary": "Put/call ratio",
        "description": "BTC options summary (put/call ratio focus). Same payload shape as /v1/options/chain with currency=BTC.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "currency": {
                      "type": "string"
                    },
                    "underlying_price": {
                      "type": "number"
                    },
                    "total_call_oi": {
                      "type": "number"
                    },
                    "total_put_oi": {
                      "type": "number"
                    },
                    "total_call_volume": {
                      "type": "number"
                    },
                    "total_put_volume": {
                      "type": "number"
                    },
                    "pcr_oi": {
                      "type": "number"
                    },
                    "pcr_volume": {
                      "type": "number"
                    },
                    "oi_by_strike": {
                      "type": "array"
                    },
                    "expiry_summary": {
                      "type": "object"
                    },
                    "max_pain": {
                      "type": "object"
                    },
                    "updated": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/options/iv-surface": {
      "get": {
        "summary": "Implied-volatility surface (one book)",
        "description": "Per-instrument implied-volatility surface for one Deribit option book (BTC, ETH, or a USDC-linear book such as BTC_USDC, SOL_USDC, HYPE_USDC). Every `iv_pct` on a node is Deribit's own published mark IV, carried through unchanged; anything this endpoint derives itself (an interpolated ATM point, a fixed-moneyness skew point, the 25-delta risk reversal) is labelled `fitted: true` under its own key and never mixed into a measured field. The surface is SPARSE: `grid.rectangle_cells` (n_strikes x n_expiries) is not the number of quoted cells, and holes are listed per expiry rather than interpolated into the node set. `nodes` (the actual per-strike quotes) is included only with `?nodes=1` -- omitted by default because the full BTC node set is ~440KB against ~92KB without it on a keyless route. An unknown book or an upstream Deribit fetch failure both return 200 with `status` naming the failure (fetch_failed / unknown_book) rather than a 4xx/5xx, so a caller following `status` never has to special-case a non-2xx response; a genuine internal error (module failed to import) is a 503 with `error=capability_unavailable`.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "On a fetch failure or unknown book, only status/book/available/reason are populated -- read status before trusting any other field.",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "available": {
                      "type": "boolean"
                    },
                    "book": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    },
                    "as_of": {
                      "type": "object"
                    },
                    "spot_index": {
                      "type": "number"
                    },
                    "spot_index_source": {
                      "type": "string"
                    },
                    "expiries": {
                      "type": "object",
                      "description": "Per-expiry forward, ATM (measured + interpolated), skew and missing_strikes."
                    },
                    "grid": {
                      "type": "object",
                      "properties": {
                        "n_expiries": {
                          "type": "integer"
                        },
                        "n_strikes": {
                          "type": "integer"
                        },
                        "rectangle_cells": {
                          "type": "integer"
                        },
                        "populated_cells": {
                          "type": "integer"
                        },
                        "holes": {
                          "type": "integer"
                        },
                        "fill_pct": {
                          "type": "number"
                        }
                      }
                    },
                    "quality": {
                      "type": "object",
                      "properties": {
                        "quote_rows": {
                          "type": "integer"
                        },
                        "joined_rows": {
                          "type": "integer"
                        },
                        "unjoinable_rows": {
                          "type": "integer"
                        },
                        "legs": {
                          "type": "integer"
                        },
                        "legs_with_mark_iv": {
                          "type": "integer"
                        },
                        "legs_two_sided_quote": {
                          "type": "integer"
                        }
                      }
                    },
                    "term_structure": {
                      "type": "array"
                    },
                    "skew": {
                      "type": "array"
                    },
                    "measured_vs_fitted": {
                      "type": "object",
                      "properties": {
                        "measured": {
                          "type": "array"
                        },
                        "fitted": {
                          "type": "array"
                        },
                        "refused": {
                          "type": "array"
                        }
                      }
                    },
                    "nodes": {
                      "type": "object",
                      "description": "Present only when ?nodes=1; empty array otherwise."
                    },
                    "source": {
                      "type": "string"
                    },
                    "generated_at_ms": {
                      "type": "integer"
                    },
                    "not_claimed": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "book",
            "in": "query",
            "description": "Deribit option book identifier (the part of an instrument name before the first '-'). BTC and ETH are coin-margined; each also lists a separate USDC-linear book (BTC_USDC, ETH_USDC, ...). See /v1/options/iv-surface/books for the full list.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "nodes",
            "in": "query",
            "description": "Include the full per-strike/expiry node grid (call+put mark IV, quote_state, greeks). Accepts 1/true/yes; anything else is treated as 0. Default 0 (grid + term-structure + skew only, no nodes).",
            "schema": {
              "type": "string",
              "default": "0"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/options/iv-surface/books": {
      "get": {
        "summary": "Implied-volatility surface -- book list",
        "description": "Every Deribit option book currently listed, with headline surface numbers (grid fill, front-expiry ATM IV, leg counts) and no node payload -- the index to page against before calling /v1/options/iv-surface?book=<book>. BTC and ETH each list a coin-margined AND a USDC-linear book; those are two separate surfaces, not one book counted twice.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "available": {
                      "type": "boolean"
                    },
                    "books": {
                      "type": "array"
                    },
                    "n_books": {
                      "type": "integer"
                    },
                    "note": {
                      "type": "string"
                    },
                    "generated_at_ms": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/etf/flows": {
      "get": {
        "summary": "ETF flows",
        "description": "Spot BTC/ETH ETF daily flows with per-fund breakdown (SoSoValue).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "asset",
            "in": "query",
            "description": "ETF asset.",
            "schema": {
              "type": "string",
              "default": "BTC",
              "enum": [
                "BTC",
                "ETH"
              ]
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "ETF"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/market/altseason": {
      "get": {
        "summary": "Altcoin Season Index",
        "description": "Altcoin season index derived from top-coin performance vs BTC. Public.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/market/dominance": {
      "get": {
        "summary": "BTC dominance",
        "description": "Bitcoin market-cap dominance. Public.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/market/indices": {
      "get": {
        "summary": "All market indices",
        "description": "All market indices in one response. Public.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/market/volatility": {
      "get": {
        "summary": "Volatility index",
        "description": "Crypto volatility gauge (Deribit). Public.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/market/basis": {
      "get": {
        "summary": "CME basis",
        "description": "CME futures basis vs spot. Public.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/market/candles": {
      "get": {
        "summary": "Recent OHLC candles",
        "description": "Recent spot OHLC candles for a base symbol. Exists so the embeddable widgets can draw a price line without the reader's browser calling an exchange directly (the /embed/* CSP forbids it, and an embed must not leak the publisher's visitors to a third party). Public.\n\nReturns 400 for a pair that is not listed upstream and 503 when the price cannot be read. It never returns an empty `candles` array: an empty series would be drawn as \"no price here\" rather than \"unknown\".",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "interval",
            "in": "query",
            "description": "Candle interval.",
            "schema": {
              "type": "string",
              "default": "5m",
              "enum": [
                "1m",
                "3m",
                "5m",
                "15m",
                "30m",
                "1h",
                "2h",
                "4h",
                "1d"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Number of candles returned, newest last.",
            "schema": {
              "type": "integer",
              "default": 68,
              "minimum": 5,
              "maximum": 320
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whales/events": {
      "get": {
        "summary": "Whale events",
        "description": "Multi-chain whale transaction events (ETH, BSC, AVAX, Polygon, Arbitrum, Base, Optimism, Solana).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "events": {
                      "type": "array"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "total": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "query",
            "description": "Filter by chain (e.g. ethereum, bsc, solana). Omit for all chains.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "hours",
            "in": "query",
            "description": "Lookback window in hours.",
            "schema": {
              "type": "integer",
              "default": 24
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max events, capped at 100.",
            "schema": {
              "type": "integer",
              "default": 50,
              "maximum": 100
            }
          },
          {
            "name": "event_type",
            "in": "query",
            "description": "Filter by event type (e.g. transfer, dex_swap).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Pagination offset.",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whales/summary": {
      "get": {
        "summary": "Whale activity summary",
        "description": "Per-chain whale activity summary (cached 120s).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "chains": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whale-consensus": {
      "get": {
        "summary": "Whale consensus",
        "description": "Aggregated directional bias per symbol from Hyperliquid whale positions (long/short counts + volume), exchange derivatives (funding rate, long/short ratio) and 24h on-chain whale net flow.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Per-symbol consensus map with hl_long/hl_short counts and volumes, funding_rate, lsr, onchain_net."
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/symbols": {
      "get": {
        "summary": "Tracked symbols",
        "description": "All derivative symbols currently tracked by the aggregation daemon.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbols": {
                      "type": "array"
                    },
                    "count": {
                      "type": "integer"
                    }
                  },
                  "example": {
                    "symbols": [
                      "BTC",
                      "ETH",
                      "SOL"
                    ],
                    "count": 3
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stats": {
      "get": {
        "summary": "Site statistics",
        "description": "Canonical public site stats: venue counts, tracked derivatives symbols, measured signal win-rates with sample sizes (in-sample labelled) and the accruing out-of-sample forward holdout. Cached.\n\nTWO VENUE COUNTS, AND THEY ARE NOT INTERCHANGEABLE. `exchanges` counts the venues behind the DERIVATIVES data (currently 3) and is the number the copy 'derivatives across N exchanges' may use. `venues_total` counts the wider union including liquidation-only venues (currently 6) -- bitget, bitmex and okx stream liquidations but appear nowhere in the derivatives table, so publishing 6 as the derivatives venue count would be a claim we cannot support. `exchange_names` and `venue_names_all` are the corresponding name lists, so a consumer never has to guess which set a count refers to.\n\nEvery headline figure carries an entry in `basis` naming its source, window and what it counts. A field whose source is unavailable is OMITTED, never zeroed -- absence of a key means 'not measured', which is a different claim from a zero.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Also carries high_winrate/overall_accuracy/profit_factor and their *_n sample sizes when the signal tracker has data. exchanges = derivatives venues; venues_total = union incl. liquidation-only venues. Any of these may be absent if its source could not be read.",
                  "properties": {
                    "exchanges": {
                      "type": "integer"
                    },
                    "exchange_names": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "venues_total": {
                      "type": "integer"
                    },
                    "venue_names_all": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "derivatives_symbols": {
                      "type": "integer"
                    },
                    "basis": {
                      "type": "object"
                    },
                    "forward_holdout": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/health": {
      "get": {
        "summary": "Gateway health",
        "description": "Simple gateway liveness check.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "ts": {
                      "type": "number"
                    }
                  },
                  "example": {
                    "status": "ok",
                    "ts": 1751328000.0
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/dex/trending": {
      "get": {
        "summary": "Trending DEX pairs",
        "description": "Trending pairs from DexScreener.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max pairs.",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DEX"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/dex/search": {
      "get": {
        "summary": "Search DEX pairs",
        "description": "Search DexScreener pairs by name/symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Search query.",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max pairs.",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DEX"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/dex/token": {
      "get": {
        "summary": "Token pairs",
        "description": "All DEX pairs for a token address.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "description": "Token contract address.",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max pairs.",
            "schema": {
              "type": "integer",
              "default": 10
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DEX"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/dex/pair": {
      "get": {
        "summary": "Pair details",
        "description": "Details for a single DEX pair.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "query",
            "description": "Chain slug (e.g. ethereum, bsc).",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "name": "address",
            "in": "query",
            "description": "Pair contract address.",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DEX"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/news/trump": {
      "get": {
        "summary": "Trump policy news",
        "description": "Trump/policy-classified news items with impact levels.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max items.",
            "schema": {
              "type": "integer",
              "default": 20
            }
          },
          {
            "name": "hours",
            "in": "query",
            "description": "Lookback window in hours.",
            "schema": {
              "type": "integer",
              "default": 24
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/news/general": {
      "get": {
        "summary": "General news",
        "description": "General crypto/geopolitical news, keyword-classified into six categories (TRUMP_POLICY, WAR_GEOPOLITICAL, CRYPTO_REGULATORY, MARKET_SHOCK, FED_MONETARY, CRYPTO_GENERAL).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max items.",
            "schema": {
              "type": "integer",
              "default": 30
            }
          },
          {
            "name": "hours",
            "in": "query",
            "description": "Lookback window in hours.",
            "schema": {
              "type": "integer",
              "default": 24
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "Filter by category name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_trump",
            "in": "query",
            "description": "Set 1 to stop excluding TRUMP_POLICY. The default (0) omits it; the response always declares what was withheld in `excluded_categories`.",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/news/archive": {
      "get": {
        "summary": "News archive (paginated)",
        "description": "The WHOLE retained news archive, not just the recent window that /v1/news/general serves. Cursor-paginated (keyset on ts+id, stable while new rows arrive at the head), date-rangeable and keyword-searchable. Unlike /v1/news/general this includes TRUMP_POLICY by default. Page size is capped server-side at 200. Every empty response carries a `status` (ok | no_match | before_coverage | after_coverage | no_records_yet) and an `empty_reason`, so a range that predates our records is distinguishable from a filter that matched nothing. The item array is under the key `events`.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Page size, 1-200.",
            "schema": {
              "type": "integer",
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque keyset cursor '<ts>_<id>' from `next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Alternative to cursor for random access.",
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "name": "start",
            "in": "query",
            "description": "Inclusive start, YYYY-MM-DD or unix seconds.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "end",
            "in": "query",
            "description": "Exclusive end, YYYY-MM-DD or unix seconds.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "description": "Sugar for one whole UTC day, YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "One of TRUMP_POLICY, WAR_GEOPOLITICAL, CRYPTO_REGULATORY, MARKET_SHOCK, FED_MONETARY, CRYPTO_GENERAL.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "query",
            "description": "Publisher name, e.g. Reuters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "q",
            "in": "query",
            "description": "Keyword search over headline and summary; multiple terms are ANDed.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_trump",
            "in": "query",
            "description": "Set 0 to exclude TRUMP_POLICY. Default 1.",
            "schema": {
              "type": "integer",
              "default": 1
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/news/coverage": {
      "get": {
        "summary": "News archive coverage",
        "description": "What the archive actually contains: row count, oldest and newest timestamps and dates, span in days, and breakdowns by category and by source. Use it to render an honest coverage statement rather than implying records exist for dates we never retained.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/news/impact": {
      "get": {
        "summary": "News impact",
        "description": "Current aggregated news impact state.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/news/fear-greed": {
      "get": {
        "summary": "Fear & Greed index",
        "description": "Crypto Fear & Greed index (Alternative.me).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/historical/funding": {
      "get": {
        "summary": "Funding-rate history",
        "description": "Historical funding rates (Binance).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "days": {
                      "type": "integer"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Perpetual symbol.",
            "schema": {
              "type": "string",
              "default": "BTCUSDT"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Days of history.",
            "schema": {
              "type": "integer",
              "default": 30
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Historical"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/historical/open-interest": {
      "get": {
        "summary": "Open-interest history",
        "description": "Historical open interest (Binance).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "days": {
                      "type": "integer"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Perpetual symbol.",
            "schema": {
              "type": "string",
              "default": "BTCUSDT"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Days of history.",
            "schema": {
              "type": "integer",
              "default": 30
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Historical"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/historical/long-short": {
      "get": {
        "summary": "Long/short ratio history",
        "description": "Historical long/short account ratio (Binance).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "days": {
                      "type": "integer"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Perpetual symbol.",
            "schema": {
              "type": "string",
              "default": "BTCUSDT"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Days of history.",
            "schema": {
              "type": "integer",
              "default": 30
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Historical"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/historical/market": {
      "get": {
        "summary": "Market OHLCV history",
        "description": "Historical market data by CoinGecko coin id.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "coin": {
                      "type": "string"
                    },
                    "days": {
                      "type": "integer"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "coin",
            "in": "query",
            "description": "CoinGecko coin id.",
            "schema": {
              "type": "string",
              "default": "bitcoin"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Days of history.",
            "schema": {
              "type": "integer",
              "default": 30
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Historical"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/coverage": {
      "get": {
        "summary": "Deep-history coverage",
        "description": "What history exists per table, before you query any of it: the live database range, the consolidated archive range, raw shards not yet consolidated, and which filter keys are index-served. Read this to draw an honest 'data from X to Y' instead of an empty chart. Both index states are reported so a null archive range can be told apart from an unreadable index. Public, keyless; throttled per IP.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Per table: live range/rows and live_state, consolidated archive range, raw (not-yet-consolidated) shard range, and the index-served filter keys. index_available=false means the archive index could not be read — NOT that there is no archive.",
                  "properties": {
                    "tables": {
                      "type": "object"
                    },
                    "manifest_present": {
                      "type": "boolean"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "unindexed_partitions": {
                      "type": "array"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "source_budget_s": {
                      "type": "number"
                    },
                    "query_budget_s": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/whale_positions": {
      "get": {
        "summary": "Deep history: whale_positions",
        "description": "Federated newest-first read of the whale_positions table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: direction, symbol, wallet. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "direction",
            "in": "query",
            "description": "Filter on direction (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter on symbol (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "in": "query",
            "description": "Filter on wallet (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/confirmations": {
      "get": {
        "summary": "Deep history: confirmations",
        "description": "Federated newest-first read of the confirmations table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: confidence, direction, source, symbol. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "confidence",
            "in": "query",
            "description": "Filter on confidence (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "description": "Filter on direction (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "query",
            "description": "Filter on source (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter on symbol (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/signal_log": {
      "get": {
        "summary": "Deep history: signal_log",
        "description": "Federated newest-first read of the signal_log table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: direction, signal_type, source, symbol. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "direction",
            "in": "query",
            "description": "Filter on direction (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "signal_type",
            "in": "query",
            "description": "Filter on signal_type (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "query",
            "description": "Filter on source (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter on symbol (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/derivatives_agg": {
      "get": {
        "summary": "Deep history: derivatives_agg",
        "description": "Federated newest-first read of the derivatives_agg table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: symbol. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter on symbol (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/whale_consensus": {
      "get": {
        "summary": "Deep history: whale_consensus",
        "description": "Federated newest-first read of the whale_consensus table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: symbol. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter on symbol (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/derivatives": {
      "get": {
        "summary": "Deep history: derivatives",
        "description": "Federated newest-first read of the derivatives table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: exchange, symbol. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "exchange",
            "in": "query",
            "description": "Filter on exchange (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter on symbol (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/onchain": {
      "get": {
        "summary": "Deep history: onchain",
        "description": "Federated newest-first read of the onchain table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: asset, metric. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "asset",
            "in": "query",
            "description": "Filter on asset (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "metric",
            "in": "query",
            "description": "Filter on metric (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/signal_outcomes": {
      "get": {
        "summary": "Deep history: signal_outcomes",
        "description": "Federated newest-first read of the signal_outcomes table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: horizon. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "horizon",
            "in": "query",
            "description": "Filter on horizon (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/history/wallet_relationships": {
      "get": {
        "summary": "Deep history: wallet_relationships",
        "description": "Federated newest-first read of the wallet_relationships table across the live database and the consolidated cold archive, in one response. Public, keyless; throttled per IP. Filters accepted: edge_type, wallet_a, wallet_b. A filter that is neither index-served nor small enough to scan within budget is REJECTED with 400 naming the supported keys — it is never silently dropped, because dropping it would return rows that do not match the query the caller sees echoed back. GET /v1/history/coverage reports the index-served set per table.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "rows is newest-first and de-duplicated (live wins on overlap). coverage[] partitions the requested window into sub-ranges with a state: covered / not_recorded / not_examined / deadline_exceeded / error — an unanswered period is never returned as a quiet one. window echoes the SNAPPED window that was actually scanned (requests are snapped to a window_grain_s grid).",
                  "properties": {
                    "table": {
                      "type": "string"
                    },
                    "window": {
                      "type": "object"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "rows": {
                      "type": "array"
                    },
                    "sources": {
                      "type": "array"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "live_starts_at": {
                      "type": "integer"
                    },
                    "live_state": {
                      "type": "string"
                    },
                    "index_available": {
                      "type": "boolean"
                    },
                    "shard_index_available": {
                      "type": "boolean"
                    },
                    "partition_cap": {
                      "type": "integer"
                    },
                    "window_grain_s": {
                      "type": "integer"
                    },
                    "took_ms": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "How far back the window starts, in days, when `from` is omitted (1-3650).",
            "schema": {
              "type": "integer",
              "default": 7,
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Window start, epoch seconds. Overrides `days`.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end, epoch seconds. Defaults to now.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned (1-5000). `truncated` says whether the cap was hit.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "edge_type",
            "in": "query",
            "description": "Filter on edge_type (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet_a",
            "in": "query",
            "description": "Filter on wallet_a (exact match).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet_b",
            "in": "query",
            "description": "Filter on wallet_b (exact match).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "History"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/signals/performance": {
      "get": {
        "summary": "Signal performance",
        "description": "Aggregate outcome statistics for tracked signals (signal_tracker): hit rates per horizon.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Lookback window (1-365).",
            "schema": {
              "type": "integer",
              "default": 30,
              "minimum": 1,
              "maximum": 365
            }
          },
          {
            "name": "type",
            "in": "query",
            "description": "Filter by signal type (e.g. smart_money_confirm, regime_flip).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter by symbol.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Signals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/signals/recent": {
      "get": {
        "summary": "Recent signals feed",
        "description": "Recent published signals with optional resolved outcomes and live unrealized marks. Supports incremental delta polling via since_id and open_only; every response carries max_id as the next cursor.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "signals": {
                      "type": "array"
                    },
                    "max_id": {
                      "type": "integer"
                    },
                    "server_ts": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max signals (1-2000).",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 2000
            }
          },
          {
            "name": "type",
            "in": "query",
            "description": "Filter by signal type.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "outcomes",
            "in": "query",
            "description": "Set to 1/true to include per-horizon outcomes.",
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "true",
                "yes"
              ]
            }
          },
          {
            "name": "unrealized",
            "in": "query",
            "description": "Set to 1/true to include live unrealized marks for open signals.",
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "true",
                "yes"
              ]
            }
          },
          {
            "name": "open_only",
            "in": "query",
            "description": "Set to 1/true to return only unresolved live-window signals.",
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "true",
                "yes"
              ]
            }
          },
          {
            "name": "since_id",
            "in": "query",
            "description": "Only signals newer than this id (delta polling cursor).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Signals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/performance": {
      "get": {
        "summary": "Signal accuracy stats",
        "description": "Signal accuracy statistics across tracked symbols, merged with signal-tracker outcomes (recent_signals + whale_signals).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "recent_signals": {
                      "type": "array"
                    },
                    "whale_signals": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Lookback window (1-3650).",
            "schema": {
              "type": "integer",
              "default": 30,
              "minimum": 1,
              "maximum": 3650
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Performance"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/performance/track-record": {
      "get": {
        "summary": "Forward-test track record",
        "description": "Forward-test equity curve and payoff stats for the smart_money_confirm engine. Live-generated (not a backtest), in-sample-tuned, pre-fee; carries the accruing out-of-sample forward_holdout and a disclaimer.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "horizon": {
                      "type": "string"
                    },
                    "forward_holdout": {
                      "type": "object"
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Lookback window (1-365).",
            "schema": {
              "type": "integer",
              "default": 30,
              "minimum": 1,
              "maximum": 365
            }
          },
          {
            "name": "horizon",
            "in": "query",
            "description": "Single-horizon view; omit for the blended 4-24h window.",
            "schema": {
              "type": "string",
              "enum": [
                "24h",
                "48h",
                "72h"
              ]
            }
          },
          {
            "name": "confidence",
            "in": "query",
            "description": "Confidence-tier filter.",
            "schema": {
              "type": "string",
              "enum": [
                "HIGH",
                "MEDIUM"
              ]
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Performance"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/strategies/trades": {
      "get": {
        "summary": "Strategy trades",
        "description": "Closed trades for a live strategy account (newest first).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Trade rows with id, symbol, direction, entry/exit prices and times, pnl, pnl_percent, exit_reason."
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "account",
            "in": "query",
            "description": "Strategy account id (1-10). Defaults to 1; out-of-range values fall back to 1.",
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max trades, capped at 500.",
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 500
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Pagination offset.",
            "schema": {
              "type": "integer",
              "default": 0
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Strategies"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/strategies/stats": {
      "get": {
        "summary": "Strategy statistics",
        "description": "Aggregate performance for a strategy account: win rate, profit factor, max drawdown (portfolio + per-trade), equity, per-exit-reason and per-direction breakdowns.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "account": {
                      "type": "integer"
                    },
                    "total_trades": {
                      "type": "integer"
                    },
                    "win_rate": {
                      "type": "number"
                    },
                    "profit_factor": {
                      "type": "number"
                    },
                    "max_drawdown_portfolio": {
                      "type": "number"
                    },
                    "current_equity": {
                      "type": "number"
                    },
                    "total_pnl_usdt": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "account",
            "in": "query",
            "description": "Strategy account id (1-10). Defaults to 1; out-of-range values fall back to 1.",
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1,
              "maximum": 10
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Strategies"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/strategies/symbols": {
      "get": {
        "summary": "Per-symbol strategy stats",
        "description": "Per-symbol performance breakdown for a strategy account.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "account",
            "in": "query",
            "description": "Strategy account id (1-10). Defaults to 1; out-of-range values fall back to 1.",
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1,
              "maximum": 10
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Strategies"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/strategies/equity": {
      "get": {
        "summary": "Strategy equity curve",
        "description": "Chronological equity curve for a strategy account. Each point carries equity, pnl, cumulative_pnl and drawdown_pct (chart-ready); deposit/withdrawal adjustments appear as separate points.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "account": {
                      "type": "integer"
                    },
                    "initial_equity": {
                      "type": "number"
                    },
                    "current_equity": {
                      "type": "number"
                    },
                    "total_adjustments": {
                      "type": "number"
                    },
                    "total_pnl_usdt": {
                      "type": "number"
                    },
                    "max_drawdown_percent": {
                      "type": "number"
                    },
                    "curve": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "account",
            "in": "query",
            "description": "Strategy account id (1-10). Defaults to 1; out-of-range values fall back to 1.",
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1,
              "maximum": 10
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Strategies"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/strategies/active": {
      "get": {
        "summary": "Active strategy positions",
        "description": "Currently open positions for a strategy account.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "positions": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "account",
            "in": "query",
            "description": "Strategy account id (1-10). Defaults to 1; out-of-range values fall back to 1.",
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1,
              "maximum": 10
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Strategies"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/strategies/signals": {
      "get": {
        "summary": "Strategy signal-filter stats",
        "description": "Signal-type statistics across strategy accounts: per-reason counts, wins/losses, win rate, average pnl.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "total_signals": {
                      "type": "integer"
                    },
                    "unique_signal_types": {
                      "type": "integer"
                    },
                    "signal_types": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Strategies"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/confirm": {
      "get": {
        "summary": "Smart-money confirmation",
        "description": "Score a trade the caller is about to take. One request reads the aggregated Bybit/Binance/Hyperliquid derivatives, on-chain metrics and tracked whale positioning for the symbol, and returns a verdict with the full arithmetic behind it: per-component scores and weights (`factors`), every signed modifier (`adjustments`), which data families actually had data (`coverage`), and per-source provenance and staleness (`meta`). A component with no data is EXCLUDED and the remaining weights renormalised — it is never counted as a neutral zero. This is an aggregation and transparency endpoint: it does not predict price, and `confidence` is not a probability. Free tier: BTC, ETH, SOL, XAU, XAG; no added delay; these fields are stripped from the body: deriv_score, details, onchain_score, reasons, whale_score.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Confirmation verdict for the requested symbol and direction. Field presence is tier-dependent: plans.json strip_fields removes evidence fields on restricted tiers, and the NO_DATA branch omits the scored-branch fields, so only the verdict fields are required.",
                  "properties": {
                    "action": {
                      "type": "string",
                      "enum": [
                        "CONFIRM_FULL",
                        "CONFIRM_REDUCED",
                        "CONFIRM_MINIMAL",
                        "VETO_SKIP",
                        "NO_DATA_SKIP"
                      ],
                      "description": "The verdict. NO_DATA_SKIP is deliberately distinct from VETO_SKIP: it means nothing was measured, not that the data was negative."
                    },
                    "decision": {
                      "type": "string",
                      "enum": [
                        "CONFIRM",
                        "REDUCE",
                        "SKIP",
                        "ABSTAIN"
                      ],
                      "description": "Canonical coarse enum derived from confidence/action. ABSTAIN covers both LOW confidence and NO_DATA. Prefer this for branching."
                    },
                    "confidence": {
                      "type": "string",
                      "enum": [
                        "HIGH",
                        "MEDIUM",
                        "LOW",
                        "VETO",
                        "NO_DATA"
                      ],
                      "description": "Bucketed composite. NOT a probability and NOT calibrated to any hit rate."
                    },
                    "composite": {
                      "type": "number",
                      "minimum": -1.5,
                      "maximum": 1.5,
                      "description": "Final score for the requested direction after weighting and adjustments. Unitless: not a price target and not an expected return."
                    },
                    "base_composite": {
                      "type": "number",
                      "description": "Weighted factor sum BEFORE the `adjustments` are applied. Absent on the blacklist-VETO and NO_DATA branches."
                    },
                    "size_mult": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1,
                      "description": "Suggested fraction of the caller's normal position size for this confidence bucket, after a liquidation-distance reduction. Not risk management: it knows nothing about the caller's account."
                    },
                    "unsupported": {
                      "type": "boolean",
                      "description": "true only when the symbol is outside the tracked universe (no derivatives AND no whale data). Then action=NO_DATA_SKIP and every *_score is a zero meaning 'not measured'."
                    },
                    "deriv_score": {
                      "type": "number",
                      "minimum": -1,
                      "maximum": 1,
                      "description": "Component score in [-1, +1], oriented to the requested direction: positive supports it."
                    },
                    "onchain_score": {
                      "type": "number",
                      "minimum": -1,
                      "maximum": 1,
                      "description": "Component score in [-1, +1], oriented to the requested direction: positive supports it."
                    },
                    "whale_score": {
                      "type": "number",
                      "minimum": -1,
                      "maximum": 1,
                      "description": "Component score in [-1, +1], oriented to the requested direction: positive supports it."
                    },
                    "x_score": {
                      "type": "number",
                      "enum": [
                        0
                      ],
                      "description": "Always 0. The X/social sentiment input is switched off and its weight is renormalised to 0, so it cannot move the composite. Kept in the payload for client compatibility."
                    },
                    "coverage": {
                      "type": "object",
                      "description": "Which data families actually returned something. false means UNKNOWN — that component was excluded from the composite and the remaining weights renormalised, NOT counted as neutral.",
                      "properties": {
                        "derivatives": {
                          "type": "boolean"
                        },
                        "whale": {
                          "type": "boolean"
                        },
                        "onchain": {
                          "type": "boolean"
                        }
                      }
                    },
                    "factors": {
                      "type": "object",
                      "description": "Per-component line items of the composite. Empty object {} on the NO_DATA branch.",
                      "properties": {
                        "derivatives": {
                          "type": "object",
                          "description": "One line item of the composite.",
                          "properties": {
                            "score": {
                              "type": "number",
                              "minimum": -1,
                              "maximum": 1,
                              "description": "Component score in [-1, +1], oriented to the requested direction: positive supports it."
                            },
                            "weight": {
                              "type": "number",
                              "description": "Nominal weight of this component in the composite."
                            },
                            "weighted": {
                              "type": "number",
                              "description": "score x weight — this component's actual contribution to base_composite."
                            }
                          }
                        },
                        "onchain": {
                          "type": "object",
                          "properties": {
                            "score": {
                              "type": "number",
                              "minimum": -1,
                              "maximum": 1,
                              "description": "Component score in [-1, +1], oriented to the requested direction: positive supports it."
                            },
                            "weight": {
                              "type": "number"
                            },
                            "weighted": {
                              "type": "number"
                            },
                            "source": {
                              "type": "string",
                              "description": "Which on-chain provider produced the score, e.g. coinmetrics_community, glassnode, none."
                            },
                            "available": {
                              "type": "boolean"
                            }
                          }
                        },
                        "whale": {
                          "type": "object",
                          "properties": {
                            "score": {
                              "type": "number",
                              "minimum": -1,
                              "maximum": 1,
                              "description": "Component score in [-1, +1], oriented to the requested direction: positive supports it."
                            },
                            "weight": {
                              "type": "number"
                            },
                            "weight_effective": {
                              "type": "number",
                              "description": "weight x staleness_factor — the weight actually used."
                            },
                            "staleness_factor": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 1,
                              "description": "Decay applied when the whale consensus snapshot is old."
                            },
                            "weighted": {
                              "type": "number"
                            }
                          }
                        },
                        "x_sentiment": {
                          "type": "object",
                          "description": "One line item of the composite.",
                          "properties": {
                            "score": {
                              "type": "number",
                              "minimum": -1,
                              "maximum": 1,
                              "description": "Component score in [-1, +1], oriented to the requested direction: positive supports it."
                            },
                            "weight": {
                              "type": "number",
                              "description": "Nominal weight of this component in the composite."
                            },
                            "weighted": {
                              "type": "number",
                              "description": "score x weight — this component's actual contribution to base_composite."
                            }
                          }
                        }
                      }
                    },
                    "adjustments": {
                      "type": "object",
                      "description": "Every post-scoring modifier, signed. base_composite plus these gives composite, so a verdict is never a black box.",
                      "properties": {
                        "agreement": {
                          "type": "number"
                        },
                        "trend": {
                          "type": "number"
                        },
                        "rsi_1h": {
                          "type": "number"
                        },
                        "news_macro": {
                          "type": "number"
                        },
                        "momentum": {
                          "type": "number"
                        },
                        "time_of_day": {
                          "type": "number"
                        },
                        "streak_decay": {
                          "type": "number"
                        }
                      }
                    },
                    "weights": {
                      "type": "object",
                      "description": "The weight set actually used for this call.",
                      "properties": {
                        "derivatives": {
                          "type": "number"
                        },
                        "onchain": {
                          "type": "number"
                        },
                        "whale_intel": {
                          "type": "number"
                        }
                      }
                    },
                    "weights_mode": {
                      "type": "string",
                      "description": "Which weight set was selected, e.g. free, full, free_x, full_x."
                    },
                    "reasons": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "One human-readable line per contributing observation and per non-zero adjustment. Stripped on tiers whose plans.json strip_fields lists it."
                    },
                    "details": {
                      "type": "object",
                      "description": "Raw inputs behind each component (derivatives, onchain, whale, x_sentiment) so the score can be recomputed. Stripped on tiers whose plans.json strip_fields lists it."
                    },
                    "meta": {
                      "type": "object",
                      "description": "Proof-carrying provenance for the verdict.",
                      "properties": {
                        "source": {
                          "type": "object",
                          "description": "Which table/provider each component came from."
                        },
                        "source_ts": {
                          "type": "object",
                          "description": "Unix second of each component's underlying data, or null when unknown."
                        },
                        "age_s": {
                          "type": "object",
                          "description": "Seconds since each component's source_ts, or null when unknown."
                        },
                        "coverage": {
                          "type": "object",
                          "description": "Copy of the top-level coverage object."
                        },
                        "stale": {
                          "type": "boolean",
                          "description": "true when ANY component is past its freshness budget or has no timestamp."
                        },
                        "stale_by_source": {
                          "type": "object",
                          "description": "Per-component staleness flags."
                        },
                        "model_version": {
                          "type": "string"
                        },
                        "expires_at": {
                          "type": "integer",
                          "description": "Unix second after which this verdict should be recomputed."
                        }
                      }
                    },
                    "multi_timeframe": {
                      "type": "object",
                      "description": "The same component scores re-weighted for short / medium / long horizons, each with composite, confidence, weights_used and timeframe_label. Horizons are tier-gated."
                    },
                    "personalized": {
                      "type": "object",
                      "description": "The caller's saved risk tolerance and base trade size turned into a suggested USD figure. Carries its own disclaimer field. Arithmetic on caller-supplied numbers, not advice."
                    },
                    "ai_analysis": {
                      "type": "object",
                      "description": "LLM summary of the SAME numbers (regime, conflicts, risk factors) plus ai_backend and generation_time_ms. It has no extra information; if it disagrees with `composite`, `composite` is the machine-readable answer."
                    },
                    "symbol": {
                      "type": "string",
                      "description": "Echo of the requested base symbol."
                    },
                    "direction": {
                      "type": "string",
                      "enum": [
                        "long",
                        "short"
                      ],
                      "description": "Echo of the direction that was scored."
                    },
                    "ts": {
                      "type": "integer",
                      "description": "Unix second the verdict was computed."
                    },
                    "source": {
                      "type": "string",
                      "description": "Caller-supplied ?source= tag, echoed back."
                    },
                    "model_version": {
                      "type": "string",
                      "description": "Scoring model version. Scores are not comparable across a change of this value."
                    }
                  },
                  "required": [
                    "ts",
                    "symbol",
                    "direction",
                    "action",
                    "confidence",
                    "composite",
                    "size_mult",
                    "model_version"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "description": "Trade direction to confirm.",
            "schema": {
              "type": "string",
              "default": "long",
              "enum": [
                "long",
                "short"
              ]
            }
          },
          {
            "name": "account_size",
            "in": "query",
            "description": "Account size in USD for Kelly position sizing (Pro only).",
            "schema": {
              "type": "number"
            }
          }
        ],
        "x-tier": "Free (200 calls/day)",
        "tags": [
          "Signals"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/snapshot": {
      "get": {
        "summary": "Market snapshot",
        "description": "Full aggregated derivatives snapshot for a symbol (proxied to the aggregation daemon).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Daemon snapshot body: per-exchange funding, open interest, long/short ratios and prices."
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "x-tier": "Trader (3,000 calls/day)",
        "tags": [
          "Derivatives"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/usage": {
      "get": {
        "summary": "API usage",
        "description": "Current key usage against tier limits.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tier": {
                      "type": "string"
                    },
                    "daily_used": {
                      "type": "integer"
                    },
                    "daily_limit": {
                      "type": "integer"
                    },
                    "daily_remaining": {
                      "type": "integer"
                    },
                    "minute_used": {
                      "type": "integer"
                    },
                    "minute_limit": {
                      "type": "integer"
                    },
                    "minute_remaining": {
                      "type": "integer"
                    },
                    "daily_reset_unix": {
                      "type": "integer"
                    },
                    "daily_reset_utc": {
                      "type": "string"
                    },
                    "allowed_endpoints": {
                      "type": "array"
                    },
                    "allowed_symbols": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "x-tier": "Free (200 calls/day)",
        "tags": [
          "Meta"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/liquidations": {
      "get": {
        "summary": "Liquidation levels (modelled) + realized tape",
        "description": "Two different things in one payload. (1) A MODELLED ladder of where leveraged positions would liquidate, built from measured open interest, an average leverage inferred from funding, and the liquidation prices of tracked Hyperliquid wallets. (2) `realized_heatmap` — what actually liquidated, from the live CEX tapes (Binance, OKX, Bybit, Bitget, BitMEX).\n\nTHE MODELLED LADDER IS NOT A SET OF OBSERVED CLUSTERS. Both band sides are placed at maintenance-margin/leverage from the same entry, so when neither side has a tracked wallet level in front of the bands the two nearest distances are EQUAL BY CONSTRUCTION. `nearest_symmetric: true` says so; `nearest_basis` names the source. Two equal percentages are one number restated, not two independent readings that agree.\n\nNO PER-SIDE DOLLAR OPEN-INTEREST SPLIT IS INVENTED. `total_long_oi` and `total_short_oi` are null unless a venue actually reported a breakdown, and `oi_split_source` says which case you are in. For a perpetual, long and short notional are equal by identity, so a 50/50 bar is not an unmeasured quantity — it is a quantity that cannot differ. Directional skew is carried by `positioning`, which names the population behind every reading.\n\nREAD THE STATUS FIELDS. `bands_status`, `nearest_status`, `oi_split_source`, `positioning.status` and `whale_book.status` each separate \"we measured this\" from \"we could not\". A null distance, a null funding rate and a 'unknown' cascade_risk are absences, not zeros and not calm.\n\nTIERS. Trader receives 24 of the 28 fields, listed per field below; the ladders are truncated to 5 levels per side (Pro: up to 10) and Pro additionally receives `nearest_status`, `nearest_excluded_modelled`, `nearest_exclusion_reason`, `realized_heatmap`. Anything a plan removed is named in `withheld` (`withheld_reason: \"trader_plan\"`), computed per response — so a short ladder does not report a boundary that removed nothing, and a missing key never has to stand in for both \"not in your plan\" and \"the server had nothing\".\n\nNOTE: `nearest_status`, `nearest_excluded_modelled`, `nearest_exclusion_reason` qualify `nearest_long_liq_pct` / `nearest_short_liq_pct`, which Trader DOES receive, and are currently Pro-only. A Trader can still separate the two empty states — both distances null with a non-empty ladder means levels exist but none was eligible to set a headline; empty ladders mean nothing was on that side — but the count and the stated reason for refused levels are not on that plan.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Every property is tagged with the tiers that receive it. Tags, ladder depths and the `withheld` vocabulary are read from api_gateway._handle_liquidations and liquidation_estimator at generation time, not hand-written.",
                  "properties": {
                    "symbol": {
                      "type": "string",
                      "description": "[Trader and Pro] Base symbol this payload describes."
                    },
                    "current_price": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] Mark price every distance below is measured from. null when no usable price was readable — never 0."
                    },
                    "longs": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "[Trader and Pro] Modelled long-liquidation ladder, nearest first. Each level carries liq_price, entry_px, leverage, dist_pct, source (whale_position | oi_band) and size_measured. Trader receives the first 5 per side; Pro receives up to 10. The cut is taken from the FAR end, so the nearest level always matches the headline distance."
                    },
                    "shorts": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "[Trader and Pro] Modelled short-liquidation ladder, same shape and same truncation rule as `longs`."
                    },
                    "cascade_risk": {
                      "type": "string",
                      "enum": [
                        "extreme",
                        "high",
                        "low",
                        "moderate",
                        "unknown"
                      ],
                      "description": "[Trader and Pro] Bucket of the nearest reportable distance. 'unknown' means no distance was reportable at all — read it as absent, not as calm."
                    },
                    "nearest_long_liq_pct": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] Absolute percentage distance from `current_price` to the nearest long level eligible to set a headline. null when none was."
                    },
                    "nearest_short_liq_pct": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] Same on the short side. See `nearest_symmetric` before comparing the two."
                    },
                    "nearest_symmetric": {
                      "type": "boolean",
                      "description": "[Trader and Pro] true when BOTH nearest distances came from the open-interest band ladder. The bands place each side at maintenance-margin/leverage from the same entry, so the two percentages are then ONE number restated, not two located clusters. Do not read equality as agreement."
                    },
                    "nearest_basis": {
                      "type": "string",
                      "enum": [
                        "none",
                        "oi_band",
                        "whale"
                      ],
                      "description": "[Trader and Pro] Where the headline distances came from: 'oi_band' (modelled ladder), 'whale' (a tracked position), or 'none'."
                    },
                    "bands_status": {
                      "type": "string",
                      "enum": [
                        "no_funding_measurement",
                        "no_levels",
                        "ok"
                      ],
                      "description": "[Trader and Pro] Did the band model run? 'no_funding_measurement' means funding was never read, so nothing was modelled — a different question from `nearest_status`, and both are needed to write one honest sentence."
                    },
                    "funding_rate": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] The only input to the inferred crowd leverage the bands are built from. null means never read, not zero."
                    },
                    "total_oi": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] Measured aggregate open interest in USD. The only open-interest number here that anything observed."
                    },
                    "oi_scope": {
                      "type": "string",
                      "enum": [
                        "sum_of_binance_bybit_hyperliquid"
                      ],
                      "nullable": true,
                      "description": "[Trader and Pro] What `total_oi` is a sum over. null whenever `total_oi` is null."
                    },
                    "total_long_oi": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] Long-side open interest in USD, and null unless a venue actually reported a per-side breakdown. The aggregate is NEVER halved into a 50/50 split — for a perpetual, long and short notional are equal by identity, so a dollar split is not a measurement."
                    },
                    "total_short_oi": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] Short-side open interest in USD, under the same rule as `total_long_oi`."
                    },
                    "oi_split_source": {
                      "type": "string",
                      "enum": [
                        "aggregate_only",
                        "measured",
                        "unavailable"
                      ],
                      "description": "[Trader and Pro] Why the per-side split is or is not present: 'measured' (a venue reported it), 'aggregate_only' (only the total was readable), 'unavailable' (nothing was)."
                    },
                    "positioning": {
                      "type": "object",
                      "description": "[Trader and Pro] Directional skew, which unlike a dollar split IS measurable. Carries top_trader_long_share / top_trader_lsr with top_trader_scope, the account-headcount pair with its own scope, and `status` (ok | unavailable | unmeasured_default). 'unmeasured_default' means the upstream ratio was a default rather than a reading, and both shares are then null."
                    },
                    "whale_book": {
                      "type": "object",
                      "description": "[Trader and Pro] Summary of the tracked Hyperliquid book: status, scope, long_share, wallet counts, liq_price_source, as_of/age_s. No wallet identity. Trader's copy omits long_notional_usd, short_notional_usd."
                    },
                    "realized_totals": {
                      "type": "object",
                      "nullable": true,
                      "description": "[TRADER ONLY] Trader's view of `realized_heatmap.totals` — notional and count of what actually liquidated. null when the tape had nothing."
                    },
                    "realized_by_side": {
                      "type": "object",
                      "nullable": true,
                      "description": "[TRADER ONLY] Trader's view of `realized_heatmap.by_side`."
                    },
                    "withheld": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "[TRADER ONLY] Machine-readable list of what THIS response had removed by plan. Vocabulary: `level_detail_beyond_5`, `realized_heatmap.matrices`, `whale_book.long_notional_usd`, `whale_book.short_notional_usd`. Computed per response, so a symbol whose ladder was already short reports no boundary that removed nothing."
                    },
                    "withheld_reason": {
                      "type": "string",
                      "enum": [
                        "trader_plan"
                      ],
                      "description": "[TRADER ONLY] Why those entries were removed. 'trader_plan' means the plan removed them; an absent field means nothing was removed. This is how a consumer tells 'your plan does not include this' apart from 'the server had nothing', which a missing key cannot express."
                    },
                    "level_depth": {
                      "type": "integer",
                      "enum": [
                        5
                      ],
                      "description": "[TRADER ONLY] Levels per side in this response (5)."
                    },
                    "ts": {
                      "type": "integer",
                      "description": "[Trader and Pro] Unix timestamp the payload was built."
                    },
                    "nearest_status": {
                      "type": "string",
                      "enum": [
                        "no_exchange_reported_levels",
                        "no_levels",
                        "ok"
                      ],
                      "description": "[PRO/ENTERPRISE ONLY] Whether a distance was reportable. 'no_exchange_reported_levels' means levels exist and are drawn, but every candidate was modelled rather than exchange-reported and so was refused as a headline; 'no_levels' means there was nothing on that side at all."
                    },
                    "nearest_excluded_modelled": {
                      "type": "integer",
                      "description": "[PRO/ENTERPRISE ONLY] How many drawn levels were refused as headline candidates because their liquidation price is modelled. Non-zero alongside nearest_status 'ok' is ordinary."
                    },
                    "nearest_exclusion_reason": {
                      "type": "string",
                      "nullable": true,
                      "description": "[PRO/ENTERPRISE ONLY] The caveat those refused levels carried. null when none were refused."
                    },
                    "realized_heatmap": {
                      "type": "object",
                      "description": "[PRO/ENTERPRISE ONLY] The full realized tape for the last window: price x time matrices, per-price clusters, per-venue counts, totals and by_side. Present only when the stream has data for the symbol."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "x-tier": "Trader (3,000 calls/day)",
        "tags": [
          "Liquidations"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/liquidations/onchain": {
      "get": {
        "summary": "On-chain DeFi liquidations",
        "description": "Executed DeFi lending-protocol liquidations (AAVE, Venus, Benqi, etc.) watched directly from local BSC and Avalanche nodes, with per-chain/protocol summary. Pro additionally gets at-risk positions.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "chain": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "liquidations": {
                      "type": "array"
                    },
                    "summary": {
                      "type": "object"
                    },
                    "at_risk": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "query",
            "description": "Chain filter; omit for all.",
            "schema": {
              "type": "string",
              "enum": [
                "avax",
                "bsc"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max liquidations, capped at 500.",
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 500
            }
          }
        ],
        "x-tier": "Trader (3,000 calls/day)",
        "tags": [
          "Liquidations"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/liquidations/heatmap": {
      "get": {
        "summary": "Liquidation heatmap (realized)",
        "description": "Price x time matrix of REAL executed forced liquidations, aggregated live from five public exchange WebSocket tapes (Binance, OKX, Bybit, Bitget, BitMEX) and persisted to a local archive. Nothing here is modelled or estimated: every cell is notional that actually liquidated at that price in that minute. Public, no key.\n\nWindows up to 240 minutes are served from the in-process buffer (source='memory'); longer windows are read from the archive (source='archive') and additionally carry a `coverage` block.\n\nREAD `source` AND `coverage` BEFORE DRAWING A CONCLUSION. A flat, empty band in the matrix has two completely different meanings:\n* the market was quiet (we were recording and nothing liquidated), or\n* we were not recording at all (box down, feed down) — an absence of data, not an observation of zero.\n\n`coverage.gaps` names the second case explicitly, and `coverage_note` summarises it in prose. `source='unavailable'` means the read itself failed, and the accompanying `note` says so — an empty payload with source='unavailable' must never be reported as 'no liquidations'.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "window_minutes": {
                      "type": "integer"
                    },
                    "price_buckets": {
                      "type": "integer"
                    },
                    "time_bucket_minutes": {
                      "type": "integer",
                      "description": "Width of one matrix column, derived from the window."
                    },
                    "price_min": {
                      "type": "number"
                    },
                    "price_max": {
                      "type": "number"
                    },
                    "price_bucket_size": {
                      "type": "number"
                    },
                    "price_levels": {
                      "type": "array",
                      "items": {
                        "type": "number"
                      },
                      "description": "Row (price) axis, low to high."
                    },
                    "time_buckets": {
                      "type": "array",
                      "items": {
                        "type": "integer"
                      },
                      "description": "Column (time) axis, epoch ms."
                    },
                    "matrix": {
                      "type": "array",
                      "description": "price_buckets x time_buckets of liquidated notional (USD). Long + short combined.",
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "number"
                        }
                      }
                    },
                    "long_matrix": {
                      "type": "array",
                      "description": "Same grid, long liquidations only (longs force-sold).",
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "number"
                        }
                      }
                    },
                    "short_matrix": {
                      "type": "array",
                      "description": "Same grid, short liquidations only (shorts force-bought).",
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "number"
                        }
                      }
                    },
                    "clusters": {
                      "type": "array",
                      "description": "Price buckets ranked by liquidated notional — the practical output.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "price": {
                            "type": "number"
                          },
                          "notional": {
                            "type": "number"
                          },
                          "long_notional": {
                            "type": "number"
                          },
                          "short_notional": {
                            "type": "number"
                          },
                          "count": {
                            "type": "integer"
                          },
                          "dominant_side": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "by_side": {
                      "type": "object",
                      "properties": {
                        "long": {
                          "type": "number"
                        },
                        "short": {
                          "type": "number"
                        }
                      }
                    },
                    "totals": {
                      "type": "object",
                      "properties": {
                        "long_liq_notional": {
                          "type": "number"
                        },
                        "short_liq_notional": {
                          "type": "number"
                        },
                        "total_notional": {
                          "type": "number"
                        },
                        "count": {
                          "type": "integer"
                        }
                      }
                    },
                    "exchanges": {
                      "type": "object",
                      "description": "Event count per venue BACKING THIS RESPONSE. Read it instead of assuming all five tapes contributed — a venue missing here contributed nothing to this window."
                    },
                    "generated_at": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "string",
                      "enum": [
                        "memory",
                        "archive",
                        "unavailable"
                      ],
                      "description": "'memory' = served from the live 4h buffer. 'archive' = read from the persisted liquidation history. 'unavailable' = the read FAILED (archive absent in this process, or the query errored); the payload is a well-formed empty structure and an `error` field explains the failure. Empty and broken are not the same state."
                    },
                    "coverage": {
                      "type": "object",
                      "description": "Recording coverage for the requested window. Only present when source == 'archive'.",
                      "properties": {
                        "first_event_ts": {
                          "type": "integer",
                          "nullable": true,
                          "description": "Epoch ms of the oldest liquidation ever recorded, or null when the archive is empty."
                        },
                        "last_event_ts": {
                          "type": "integer",
                          "nullable": true,
                          "description": "Epoch ms of the newest recorded liquidation."
                        },
                        "gaps": {
                          "type": "array",
                          "description": "Contiguous hour-runs inside the requested window with ZERO recorded liquidations across every symbol and venue. That is the signature of ingest being down, not of a calm market.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "from_ts": {
                                "type": "integer"
                              },
                              "to_ts": {
                                "type": "integer"
                              }
                            }
                          }
                        },
                        "error": {
                          "type": "string",
                          "description": "Present only when the coverage probe itself failed. Coverage is then UNKNOWN — do not read its absence as full coverage."
                        }
                      }
                    },
                    "coverage_note": {
                      "type": "string",
                      "description": "Present only when coverage.gaps is non-empty: prose count and total hours of NOT-RECORDING inside this window."
                    },
                    "note": {
                      "type": "string",
                      "description": "Present only when totals.count == 0, and it says WHICH zero this is: a genuinely quiet window, or a failed read."
                    },
                    "error": {
                      "type": "string",
                      "description": "Present when source == 'unavailable'."
                    },
                    "public": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "window_minutes",
            "in": "query",
            "description": "Look-back window in minutes. Default 240 (4h). Clamped to 5-129600 (90 days); out-of-range and unparseable values fall back to the default rather than erroring. Windows <= the live buffer (240m) are served from memory; anything longer is read from the liquidation archive.",
            "schema": {
              "type": "integer",
              "default": 240,
              "minimum": 5,
              "maximum": 129600
            }
          },
          {
            "name": "price_buckets",
            "in": "query",
            "description": "Number of price rows in the matrix. Default 50, clamped to 5-100.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 5,
              "maximum": 100
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-tier": "public",
        "tags": [
          "Liquidations"
        ],
        "x-auth": "none",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/liquidations/symbols": {
      "get": {
        "summary": "Liquidation tape inventory",
        "description": "Which symbols the liquidation archive actually holds, with per-symbol event count, first/last timestamp and total liquidated notional, plus the venue list.\n\nThis exists because /v1/liquidations/heatmap answers for ANY symbol string: a symbol that was never recorded returns the same well-formed empty grid as a symbol that was merely quiet. Check here first, and 'no rows for FOO' becomes a checkable fact instead of a guess.\n\nsource='unavailable' means the archive could not be read — an empty `symbols` list then means 'we could not look', not 'we hold nothing'.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbols": {
                      "type": "array",
                      "description": "Ordered by event count, descending.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "symbol": {
                            "type": "string"
                          },
                          "count": {
                            "type": "integer"
                          },
                          "first_event_ts": {
                            "type": "integer"
                          },
                          "last_event_ts": {
                            "type": "integer"
                          },
                          "total_notional": {
                            "type": "number"
                          }
                        }
                      }
                    },
                    "returned": {
                      "type": "integer"
                    },
                    "total_symbols": {
                      "type": "integer",
                      "description": "Symbols on the tape before the limit was applied."
                    },
                    "venues": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Distinct exchanges present in the archive."
                    },
                    "generated_at": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "string",
                      "enum": [
                        "archive",
                        "unavailable"
                      ]
                    },
                    "error": {
                      "type": "string",
                      "description": "Present only when source == 'unavailable'."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max symbols returned, newest-busiest first. Default 500 (the gateway requests 2000), clamped to 1-2000.",
            "schema": {
              "type": "integer",
              "default": 500,
              "minimum": 1,
              "maximum": 2000
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-tier": "public",
        "tags": [
          "Liquidations"
        ],
        "x-auth": "none",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/liquidations/simulate": {
      "get": {
        "summary": "Liquidation cascade simulator",
        "description": "Models what would be forced out if price moved by `move_pct` from here: triggered notional, per-exchange breakdown, cascade depth as a fraction of open interest, and the nearest long/short liquidation walls. MODELLED, not observed — `estimated: true` is in every response. It is built from tracked whale positions plus aggregate OI/leverage bands; no public data source exposes individual traders' real liquidation prices. For what actually liquidated, use /v1/liquidations/heatmap.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "move_pct": {
                      "type": "number"
                    },
                    "estimated": {
                      "type": "boolean",
                      "description": "Always true. This endpoint is a model."
                    },
                    "ok": {
                      "type": "boolean"
                    },
                    "empty": {
                      "type": "boolean",
                      "description": "True when there was nothing to simulate (no positions/OI for this symbol). Distinct from ok=false, which is a failure."
                    },
                    "current_price": {
                      "type": "number"
                    },
                    "target_price": {
                      "type": "number"
                    },
                    "total_oi_usd": {
                      "type": "number"
                    },
                    "whale_positions_used": {
                      "type": "integer"
                    },
                    "triggered_notional_usd": {
                      "type": "number"
                    },
                    "triggered_whale_usd": {
                      "type": "number"
                    },
                    "triggered_count": {
                      "type": "integer"
                    },
                    "cascade_depth": {
                      "type": "number"
                    },
                    "cascade_risk": {
                      "type": "string"
                    },
                    "by_exchange": {
                      "type": "object",
                      "description": "Per-venue triggered notional: {venue: {long_usd, short_usd, total_usd}}."
                    },
                    "exchanges": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Venue names contributing to this simulation."
                    },
                    "nearest_long_wall": {
                      "type": "object",
                      "description": "Nearest modelled long liquidation wall, or null when none is derivable.",
                      "properties": {
                        "liq_price": {
                          "type": "number"
                        },
                        "dist_pct": {
                          "type": "number"
                        },
                        "source": {
                          "type": "string"
                        }
                      }
                    },
                    "nearest_short_wall": {
                      "type": "object",
                      "properties": {
                        "liq_price": {
                          "type": "number"
                        },
                        "dist_pct": {
                          "type": "number"
                        },
                        "source": {
                          "type": "string"
                        }
                      }
                    },
                    "clusters": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "price": {
                            "type": "number"
                          },
                          "side": {
                            "type": "string"
                          },
                          "notional_usd": {
                            "type": "number"
                          },
                          "whale_usd": {
                            "type": "number"
                          },
                          "oi_usd": {
                            "type": "number"
                          }
                        }
                      }
                    },
                    "realized_context": {
                      "type": "object",
                      "description": "REAL executed liquidations shown alongside the model for scale. Context only — it never makes the projection realized, and its own coverage span is stated so a short sample is not mistaken for a long one.",
                      "properties": {
                        "available": {
                          "type": "boolean"
                        },
                        "coverage_start_ts": {
                          "type": "integer"
                        },
                        "coverage_end_ts": {
                          "type": "integer"
                        },
                        "coverage_hours": {
                          "type": "number"
                        },
                        "coverage_days": {
                          "type": "number"
                        },
                        "venues": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "total_events": {
                          "type": "integer"
                        },
                        "last_24h_by_side": {
                          "type": "object"
                        },
                        "note": {
                          "type": "string"
                        }
                      }
                    },
                    "methodology": {
                      "type": "object",
                      "description": "Every model assumption, surfaced in the payload.",
                      "properties": {
                        "estimated": {
                          "type": "boolean"
                        },
                        "disclaimer": {
                          "type": "string"
                        },
                        "avg_leverage_source": {
                          "type": "string"
                        },
                        "cascade_depth_def": {
                          "type": "string"
                        },
                        "maint_margin_factor": {
                          "type": "number"
                        },
                        "oi_leverage_bands": {
                          "type": "object"
                        },
                        "oi_source": {
                          "type": "string"
                        },
                        "whale_source": {
                          "type": "string"
                        }
                      }
                    },
                    "ts": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "move_pct",
            "in": "query",
            "description": "Hypothetical price move in percent, signed (negative = down). Default -5. Clamped to -90..90.",
            "schema": {
              "type": "number",
              "default": -5,
              "minimum": -90,
              "maximum": 90
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-tier": "public",
        "tags": [
          "Liquidations"
        ],
        "x-auth": "none",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/liquidations/aftermath": {
      "get": {
        "summary": "Liquidation aftermath (live study)",
        "description": "Conditional forward-return statistics after large liquidation minutes, computed over the RETAINED live tape. Descriptive statistics, explicitly not a directional signal: every horizon reports n, mean, median, positive fraction, a 95% CI, a permutation p-value and a plain-language verdict, so a result that is indistinguishable from baseline says so rather than being dressed up as an edge. `coverage` states the exact span and hours the statistics were computed over.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "generated_at": {
                      "type": "integer"
                    },
                    "data_posture": {
                      "type": "string",
                      "description": "Fixed disclaimer: descriptive conditional statistics, not a signal."
                    },
                    "coverage": {
                      "type": "object",
                      "properties": {
                        "start_utc": {
                          "type": "string"
                        },
                        "end_utc": {
                          "type": "string"
                        },
                        "hours": {
                          "type": "number"
                        }
                      }
                    },
                    "price_source": {
                      "type": "string"
                    },
                    "event_definition": {
                      "type": "string"
                    },
                    "n_events": {
                      "type": "integer"
                    },
                    "n_long_liq_events": {
                      "type": "integer"
                    },
                    "n_short_liq_events": {
                      "type": "integer"
                    },
                    "horizons": {
                      "type": "object",
                      "description": "Keyed by horizon ('+5m', '+15m', '+1h', ...), each holding long_liq / short_liq / all blocks with n, mean_pct, median_pct, pos_frac, std_pct, ci95_low_pct, ci95_high_pct, perm_p and verdict."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-tier": "public",
        "tags": [
          "Liquidations"
        ],
        "x-auth": "none",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/liquidations/aftermath/historical": {
      "get": {
        "summary": "Liquidation aftermath (2-year OI-cascade proxy)",
        "description": "The same aftermath question asked over two years of 4h open-interest and price history, because the live tape is only weeks deep. Takes no parameters: it serves one precomputed study for all symbols in the dataset. IMPORTANT — the events here are INFERRED from sharp OI drops coincident with price moves, not realized liquidations; `posture` says so in the payload and the two studies must not be pooled.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "generated_at": {
                      "type": "integer"
                    },
                    "kind": {
                      "type": "string",
                      "example": "liq_aftermath_historical"
                    },
                    "posture": {
                      "type": "string",
                      "description": "States that events are an OI-cascade PROXY, not realized liquidations."
                    },
                    "dataset": {
                      "type": "object",
                      "properties": {
                        "db": {
                          "type": "string"
                        },
                        "symbols": {
                          "type": "integer"
                        },
                        "oi_source": {
                          "type": "string"
                        },
                        "grid": {
                          "type": "string"
                        },
                        "span": {
                          "type": "string"
                        }
                      }
                    },
                    "span": {
                      "type": "string"
                    },
                    "event_definition": {
                      "type": "string"
                    },
                    "horizons": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "n_events": {
                      "type": "object",
                      "properties": {
                        "long": {
                          "type": "integer"
                        },
                        "short": {
                          "type": "integer"
                        },
                        "total": {
                          "type": "integer"
                        }
                      }
                    },
                    "per_symbol": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-tier": "public",
        "tags": [
          "Liquidations"
        ],
        "x-auth": "none",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/hl/liquidations": {
      "get": {
        "summary": "Hyperliquid whale liquidations",
        "description": "Recent liquidations of tracked Hyperliquid whale wallets, with summary.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "liquidations": {
                      "type": "array"
                    },
                    "summary": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows, capped at 500.",
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 500
            }
          }
        ],
        "x-tier": "Trader (3,000 calls/day)",
        "tags": [
          "Liquidations"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/hl/frequently-liquidated": {
      "get": {
        "summary": "Frequently-liquidated HL wallets",
        "description": "Hyperliquid wallets ranked by liquidation frequency.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "frequently_liquidated": {
                      "type": "array"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows, capped at 500.",
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 500
            }
          }
        ],
        "x-tier": "Trader (3,000 calls/day)",
        "tags": [
          "Liquidations"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/hl/liquidations/summary": {
      "get": {
        "summary": "HL liquidation summary",
        "description": "Summary statistics for tracked Hyperliquid whale liquidations.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows, capped at 500.",
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 500
            }
          }
        ],
        "x-tier": "Trader (3,000 calls/day)",
        "tags": [
          "Liquidations"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/copy-trading/overview": {
      "get": {
        "summary": "Copy-trading overview",
        "description": "Aggregate stats for the latest whale-position snapshot: active wallets, total positions, realized PnL, win rate.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "active_wallets": {
                      "type": "integer"
                    },
                    "total_positions": {
                      "type": "integer"
                    },
                    "snapshot_ts": {
                      "type": "integer"
                    },
                    "performance": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "x-tier": "Pro (15,000 calls/day)",
        "tags": [
          "Copy-trading"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/copy-trading/performance": {
      "get": {
        "summary": "Copy-trading per-symbol performance",
        "description": "Per-symbol aggregate PnL across all tracked whale wallets in the latest snapshot.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "x-tier": "Pro (15,000 calls/day)",
        "tags": [
          "Copy-trading"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/copy-trading/positions": {
      "get": {
        "summary": "Whale positions",
        "description": "All whale positions in the latest snapshot, ordered by USD value.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "positions": {
                      "type": "array"
                    },
                    "snapshot_ts": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max positions, capped at 1000.",
            "schema": {
              "type": "integer",
              "default": 200,
              "maximum": 1000
            }
          }
        ],
        "x-tier": "Pro (15,000 calls/day)",
        "tags": [
          "Copy-trading"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/copy-trading/wallets": {
      "get": {
        "summary": "Tracked whale wallets",
        "description": "Distinct whale wallets in the latest snapshot with position counts, total value and PnL.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "wallets": {
                      "type": "array"
                    },
                    "snapshot_ts": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "x-tier": "Pro (15,000 calls/day)",
        "tags": [
          "Copy-trading"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/smart-stop": {
      "get": {
        "summary": "Smart stop levels",
        "description": "A stop price WITH the basis it was derived from. `stop_basis` records whether the recommendation came from a modelled liquidation cluster or from nothing but the caller's own `risk_pct` with no cluster read at all — two stops that look identical on the wire and mean completely different things. Read it before sizing anything.\n\nThe cluster it may be aware of is the MODELLED ladder from /v1/liquidations, not an observed order book, and it carries that endpoint's caveats.\n\nTIERS. Trader receives 16 of the 22 fields, tagged per field below. Pro additionally receives `stops`, `stop_detail`, `avoid_zones`, `take_profit_suggestions`, `take_profit_basis`, `error`. Trader alone receives `recommended_stop`, `recommended_stop_detail`, `withheld`, `withheld_reason` — `recommended_stop` is the single stop lifted out of the Pro `stops` dict, and `recommended_stop_detail` is its slice of `stop_detail`. Whatever a plan removed is named per response in `withheld` (`withheld_reason: \"trader_plan\"`), and the qualifier fields for the stop that IS returned are never removed.\n\nEvery type below was resolved from the expression that fills the field; where none could be, the property carries no `type` and says so, rather than a plausible guess a generated client would enforce.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Field list, tier tags, the `withheld` vocabulary and every property type are read from api_gateway._handle_smart_stop and api_service/smart_stop.py at generation time, not hand-written.",
                  "properties": {
                    "symbol": {
                      "type": "string",
                      "description": "[Trader and Pro] Base symbol this stop was computed for."
                    },
                    "direction": {
                      "type": "string",
                      "description": "[Trader and Pro] Position direction the stop was placed for: long or short."
                    },
                    "entry_price": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] The entry the stop distance is measured from. null when none was supplied and no daemon price was readable — read `entry_price_source` before treating it as the caller's own number."
                    },
                    "entry_price_source": {
                      "type": "string",
                      "description": "[Trader and Pro] Where `entry_price` came from: 'caller' (you supplied it), 'daemon_snapshot' (inferred from the mark), or 'none'."
                    },
                    "current_price": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] The daemon mark at computation time, or null when it could not be read. It is never the entry price wearing the mark's name."
                    },
                    "price_reference": {
                      "type": "number",
                      "nullable": true,
                      "description": "[Trader and Pro] The price the liquidation model was actually run against."
                    },
                    "price_reference_source": {
                      "type": "string",
                      "description": "[Trader and Pro] 'daemon_snapshot' when the mark was readable, 'caller_entry_price' when it was not and your entry stood in for it. The second case is a stop measured against your own input, not against the market."
                    },
                    "recommended_stop": {
                      "type": "number",
                      "nullable": true,
                      "description": "[TRADER ONLY] The one stop price on this plan. null when no stop could be placed. Read `stop_basis.status` before sizing: an identical number means completely different things depending on it."
                    },
                    "recommended_stop_detail": {
                      "type": "object",
                      "nullable": true,
                      "description": "[TRADER ONLY] Provenance of THIS stop only: which cluster informed it, how far away it is, or the note saying no cluster did. The other labels' detail is in `stop_detail`."
                    },
                    "stop_basis": {
                      "type": "object",
                      "description": "[Trader and Pro] Whether the stop came from a measured liquidation cluster, from the caller's own risk_pct with no cluster read, or from nothing at all. Carries status, explanation, unavailable_reason, liquidation_data ('read' vs 'unavailable'), liquidation_error, bands_status and the level/cluster counts. This is the field to branch on."
                    },
                    "risk_pct_reference": {
                      "type": "object",
                      "nullable": true,
                      "description": "[Trader and Pro] The risk_pct arithmetic, LABELLED as arithmetic, offered only when no cluster informed the stops. null otherwise. It is not a recommendation."
                    },
                    "risk_pct_requested": {
                      "type": "number",
                      "description": "[Trader and Pro] The risk_pct the request asked for, echoed back."
                    },
                    "liq_cascade_risk": {
                      "description": "[Trader and Pro] The estimator's cascade bucket for this symbol, or its word for an absence. It is not smoothed into a reassuring value when unknown. NO JSON TYPE IS PUBLISHED for this field: no type could be derived from the source expression that fills it, and a guessed type in a schema that clients generate against is worse than a missing one. Unstated is not permissive — treat the shape as unverified."
                    },
                    "withheld": {
                      "type": "array",
                      "description": "[TRADER ONLY] Machine-readable list of what THIS response had removed by plan. Vocabulary: `avoid_zones`, `stops.tight_and_wide`, `take_profit_suggestions`. Computed per response, so a response the model left empty anyway reports no boundary."
                    },
                    "withheld_reason": {
                      "type": "string",
                      "enum": [
                        "trader_plan"
                      ],
                      "description": "[TRADER ONLY] Why those entries were removed. 'trader_plan' means the plan removed them; an absent field means nothing was. This is how a consumer separates 'not in your plan' from 'the server had nothing', which a missing key cannot express."
                    },
                    "ts": {
                      "type": "integer",
                      "description": "[Trader and Pro] Unix timestamp the stop was computed."
                    },
                    "stops": {
                      "type": "object",
                      "description": "[PRO/ENTERPRISE ONLY] The full tight / recommended / wide dict. All three are null when `stop_basis.status` reports the analysis could not be performed."
                    },
                    "stop_detail": {
                      "type": "object",
                      "description": "[PRO/ENTERPRISE ONLY] Per-label provenance for all three stops, same shape as `recommended_stop_detail`."
                    },
                    "avoid_zones": {
                      "type": "array",
                      "description": "[PRO/ENTERPRISE ONLY] The liquidation clusters the stops were placed around."
                    },
                    "take_profit_suggestions": {
                      "type": "object",
                      "description": "[PRO/ENTERPRISE ONLY] Reward/risk ladder keyed by label. Every value is null unless the recommended stop came from a measured cluster — there is no measured risk to build a ladder on otherwise, and the ratios would only re-express your own risk_pct."
                    },
                    "take_profit_basis": {
                      "type": "string",
                      "nullable": true,
                      "description": "[PRO/ENTERPRISE ONLY] What the take-profit ladder was measured against, or null when there was nothing to measure. An all-null ladder with no basis would leave you guessing between 'no stop' and 'no TP model'."
                    },
                    "error": {
                      "type": "string",
                      "nullable": true,
                      "description": "[PRO/ENTERPRISE ONLY] Set only on the degraded response where no entry price could be determined at all. NOTE: the Trader reshape does not forward it, so on that plan the same condition is readable from `stop_basis.unavailable_reason` instead."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "description": "Position direction.",
            "schema": {
              "type": "string",
              "default": "long",
              "enum": [
                "long",
                "short"
              ]
            }
          },
          {
            "name": "entry_price",
            "in": "query",
            "description": "Entry price; omit to use current price.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "risk_pct",
            "in": "query",
            "description": "Risk percentage of account.",
            "schema": {
              "type": "number",
              "default": 2.0
            }
          }
        ],
        "tags": [
          "Trading tools"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/funding-arb": {
      "get": {
        "summary": "Funding arbitrage scanner",
        "description": "Cross-exchange funding-rate arbitrage opportunities. Trader tier: top-1 opportunity without spread history; Pro tier: full list.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opportunities": {
                      "type": "array"
                    },
                    "scanned_symbols": {
                      "type": "integer"
                    },
                    "min_spread_filter": {
                      "type": "number"
                    },
                    "ts": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Filter opportunities by symbol.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "min_spread",
            "in": "query",
            "description": "Minimum funding spread.",
            "schema": {
              "type": "number",
              "default": 0.01
            }
          }
        ],
        "x-tier": "Trader (3,000 calls/day)",
        "tags": [
          "Trading tools"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-auth": "required"
      }
    },
    "/v1/exchange-health": {
      "get": {
        "summary": "Exchange health",
        "description": "Per-exchange latency/error status from live probes (falls back to daemon health + recent data recency).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "exchanges": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "x-tier": "public",
        "tags": [
          "Meta"
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-auth": "none",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/l2/trades": {
      "get": {
        "summary": "L2 trade tape",
        "description": "Raw trade prints for one venue over a bounded UTC hour window, read directly from the collector's store (never written to). Only `venue=hyperliquid` returns rows today: every other venue's API terms forbid redistribution, and the request is refused with **HTTP 403** naming the venue and the exact licence reason (sourced from `SOURCE_TERMS[venue].note` -- see GET /v1/l2/venues for the full table). The refusal fires even when the store holds zero matching rows for that venue/window, so an empty result and a licence refusal can never be confused for one another. `start`/`end` are ISO-8601 UTC timestamps rounded down to the hour; the window is capped at 6 hours per request. `limit` caps the rows returned (default 5,000, capped at 20,000) -- `truncated`, `row_count` and `rows_available` in the response report a cut explicitly rather than silently. The response also carries the dataset's own coverage fields (`complete`, `hours_refused`, `window_covered_ms`, `dataset_version`, `source_terms`) so the limits of the extract travel with the data. An unreadable or unavailable store is **HTTP 503**, never 502/504.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "venue": {
                      "type": "string"
                    },
                    "symbol": {
                      "type": "string"
                    },
                    "rows": {
                      "type": "object",
                      "description": "Trade rows: exchange_ts, local_recv_ts, venue, symbol, side, price, size, tape (live/replay), source."
                    },
                    "row_count": {
                      "type": "integer"
                    },
                    "rows_available": {
                      "type": "integer"
                    },
                    "truncated": {
                      "type": "boolean"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "dataset_version": {
                      "type": "string"
                    },
                    "complete": {
                      "type": "boolean"
                    },
                    "coverage": {
                      "type": "array"
                    },
                    "hours_refused": {
                      "type": "array"
                    },
                    "window_requested_utc": {
                      "type": "array"
                    },
                    "window_covered_ms": {
                      "type": "array"
                    },
                    "source_terms": {
                      "type": "object",
                      "description": "Keyed by venue served; each entry is that venue's SourceTerms (origin, licence, may_reach_subscriber, note)."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "venue",
            "in": "query",
            "description": "Venue id, e.g. hyperliquid. See GET /v1/l2/venues for the full list. Required.",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Restrict to one symbol (e.g. BTC). Omit to include every symbol the store collected in the window.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "start",
            "in": "query",
            "description": "Window start, ISO-8601 UTC (e.g. 2026-09-01T15:00:00Z). Defaults to one hour before `end`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "end",
            "in": "query",
            "description": "Window end, ISO-8601 UTC, exclusive. Defaults to the current UTC hour.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned. Default 5,000, capped at 20,000.",
            "schema": {
              "type": "integer",
              "default": 5000,
              "minimum": 1,
              "maximum": 20000
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "L2 trade tape"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/l2/venues": {
      "get": {
        "summary": "L2 venue licence table",
        "description": "Every venue this collector knows, whether it is cleared to reach a paying subscriber, and the reason for the rest -- read directly from ops/l2_collector/dataset.py's SOURCE_TERMS, the single place that answer is recorded (never a literal in the gateway).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "dataset_version": {
                      "type": "string"
                    },
                    "redistributable_venues": {
                      "type": "array"
                    },
                    "venues": {
                      "type": "object",
                      "description": "One entry per venue: venue, may_reach_subscriber, licence, origin, note."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "L2 trade tape"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/openapi.json": {
      "get": {
        "summary": "This OpenAPI document",
        "description": "The machine-readable OpenAPI 3 description of this API. Served by the gateway and regenerated by ops/gen_openapi.py.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/plans": {
      "get": {
        "summary": "Plan catalogue",
        "description": "Public tier catalogue generated from plans.json: prices, daily call quotas, per-minute limits, allowed symbols and feature flags.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/incidents": {
      "get": {
        "summary": "Incident log",
        "description": "Recent operational incidents and degradations, as published on the public status page.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/track": {
      "post": {
        "summary": "First-party analytics event",
        "description": "Records a first-party page/interaction event from the website. Not a data endpoint — no market data is returned.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/contact": {
      "post": {
        "summary": "Contact form",
        "description": "Submits the website contact form. Per-IP throttled.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/ws/ticket": {
      "post": {
        "summary": "WebSocket ticket",
        "description": "Mints a short-lived, single-use ticket for the WebSocket firehose. Replaces passing an API key in the query string.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/node/health": {
      "get": {
        "summary": "Node health",
        "description": "Health of the self-hosted BSC and Avalanche full nodes backing the node-intelligence and JSON-RPC products.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/analysis": {
      "get": {
        "summary": "AI market analysis",
        "description": "Latest AI-written market commentary over the aggregated data. Commentary only — it is not a prediction and carries no measured edge.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/analysis/status": {
      "get": {
        "summary": "AI analysis status",
        "description": "Freshness and availability of the AI analysis loop.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/sentiment": {
      "get": {
        "summary": "Sentiment snapshot",
        "description": "Aggregate sentiment across news, funding and positioning inputs.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/flows": {
      "get": {
        "summary": "Aggregate flow",
        "description": "Aggregated smart-money flow across the tracked venues.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/smart-money/flow": {
      "get": {
        "summary": "Smart-money flow",
        "description": "Directional whale flow per symbol with venue breakdown.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/ws/channels": {
      "get": {
        "summary": "WebSocket channel catalogue",
        "description": "Public catalogue of the streaming channels, what each plan may open, and the live state of each channel. A channel reported `no_producer` is one this process publishes nothing on — that is NOT a claim that nothing is happening on it. Connect at /v1/ws/stream after exchanging your key for a single-use ticket at POST /v1/ws/ticket; a key is never accepted in a WebSocket URL.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Meta"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/symbols/universe": {
      "get": {
        "summary": "Symbol universe",
        "description": "Every symbol currently listed across the tracked venues, resolved to a canonical asset from the base the VENUE declares in its own instrument metadata — the ticker string is never parsed. Delisted symbols are kept in history and never returned here. Free plans receive a sample.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "venue",
            "in": "query",
            "description": "Restrict to one venue key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Reference"
        ],
        "x-auth": "required",
        "x-tier": "Free (200 calls/day)",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/symbols/universe/asset": {
      "get": {
        "summary": "One asset everywhere",
        "description": "One canonical asset across every venue that lists it, with its scale variants (1000PEPE, KPEPE) LINKED but never merged — no venue publishes the multiplier as a field, so the link is derived and labelled as such.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "asset",
            "in": "query",
            "description": "Canonical asset id, e.g. BTC.",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Reference"
        ],
        "x-auth": "required",
        "x-tier": "Free (200 calls/day)",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/symbols/universe/coverage": {
      "get": {
        "summary": "Universe coverage",
        "description": "Per venue: what was requested, what was not, and whether absence is CONCLUSIVE. `absence_is_conclusive: false` means we never asked for that product line — our fetch gap, not a statement that the venue does not list the symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Reference"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/symbols/universe/venue": {
      "get": {
        "summary": "One venue's listings",
        "description": "One venue's live symbols, or — with `symbol` — the specific reason a symbol is absent from it (not listed / not requested / unknown because the last read failed).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "venue",
            "in": "query",
            "description": "Venue key.",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Ask why this symbol is absent instead of listing all.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Reference"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/research/coverage": {
      "get": {
        "summary": "Research capture coverage",
        "description": "Per-table coverage of the Hyperliquid research capture: time span, shards and status. A table with `status: empty` exists in the schema with no rows; that is different from a table we cannot read. Every response carries provenance including is_live_production_feed: false.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "counts",
            "in": "query",
            "description": "Include row counts (slower).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Research"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/research/symbols": {
      "get": {
        "summary": "Research symbols",
        "description": "Distinct coins actually collected for a table. Free plans receive a sample.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "table",
            "in": "query",
            "description": "Table name.",
            "schema": {
              "type": "string",
              "default": "price_snapshots"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Research"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/research/query": {
      "get": {
        "summary": "Query the research capture",
        "description": "Read-only, bounded query over the research shards. Timestamps are epoch MILLISECONDS. Some tables have no timestamp-only index and therefore REFUSE an unfiltered range with 503 rather than running a multi-GB scan; truncation is always declared in the envelope.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "table",
            "in": "query",
            "description": "Table name.",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "name": "coin",
            "in": "query",
            "description": "Filter by coin.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wallet",
            "in": "query",
            "description": "Filter by wallet.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "interval",
            "in": "query",
            "description": "Kline interval.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "start_ms",
            "in": "query",
            "description": "Start, epoch ms.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "end_ms",
            "in": "query",
            "description": "End, epoch ms.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "order",
            "in": "query",
            "description": "asc or desc.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Research"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/research/disk": {
      "get": {
        "summary": "Research storage report",
        "description": "Shard sizes, filesystem usage, retention policy and the (unexecuted) relocation plan. Paid plans only.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Research"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/kelly": {
      "get": {
        "summary": "Kelly position sizing",
        "description": "Kelly-criterion position sizing from the published (in-sample) hit rate and payoff. Sizing arithmetic, not a forecast.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Trading tools"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/regimes/history": {
      "get": {
        "summary": "Regime history",
        "description": "Historical positioning-regime classification per symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/shadow-gate/decisions": {
      "get": {
        "summary": "Shadow-gate decisions",
        "description": "Decision log of the shadow gate — every signal the gate saw and whether it passed. Published as a transparency artifact.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "required",
        "x-tier": "Free (200 calls/day)",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/shadow-gate/decisions/{decision_id}": {
      "get": {
        "summary": "Shadow-gate decision detail",
        "description": "One shadow-gate decision with its inputs and outcome.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "parameters": [
          {
            "name": "decision_id",
            "in": "path",
            "required": true,
            "description": "Numeric shadow-gate decision id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Free (200 calls/day)",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/performance/export": {
      "get": {
        "summary": "Performance export",
        "description": "CSV export of the tracked-signal performance log.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Performance"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/signals/capitulation": {
      "get": {
        "summary": "Capitulation state",
        "description": "Current capitulation reading per symbol from the liquidation and funding panel.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Signals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/signals/capitulation/backtest": {
      "get": {
        "summary": "Capitulation backtest",
        "description": "In-sample backtest of the capitulation reading. Published with its own disclaimer: in-sample results are not evidence of forward edge.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Signals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/signals/capitulation/walkforward": {
      "get": {
        "summary": "Capitulation walk-forward",
        "description": "Walk-forward (out-of-sample) evaluation of the capitulation reading.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Signals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/mood": {
      "get": {
        "summary": "Market mood",
        "description": "Composite market-mood reading built from funding, positioning and volatility inputs.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/mood/overview": {
      "get": {
        "summary": "Mood overview",
        "description": "Mood reading across the tracked symbol universe. Served from cache; returns a warming-up marker rather than recomputing inline.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/mood/history": {
      "get": {
        "summary": "Mood history",
        "description": "Historical mood series for one symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/projection": {
      "get": {
        "summary": "Range projection",
        "description": "Statistical range projection from realised volatility. A range, not a directional call.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/projection/screener": {
      "get": {
        "summary": "Projection screener",
        "description": "Range projections across the symbol universe.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Market"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/screener": {
      "get": {
        "summary": "Multi-factor screener",
        "description": "Cross-symbol screener over derivatives, whale and technical factors.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Screener"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/screener/rankings": {
      "get": {
        "summary": "Screener rankings",
        "description": "Ranked screener output.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Screener"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/screener/symbol": {
      "get": {
        "summary": "Screener detail",
        "description": "Full screener factor breakdown for one symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Screener"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/rankings": {
      "get": {
        "summary": "Symbol rankings",
        "description": "Composite symbol rankings with the methodology used to build them.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Screener"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/scanner/obs": {
      "get": {
        "summary": "Order-block scanner",
        "description": "Order-block / imbalance scanner across the symbol universe.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Screener"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/scanner/obs/extremes": {
      "get": {
        "summary": "Order-block extremes",
        "description": "Most extreme order-block readings in the current scan.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Screener"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/scanner/obs/symbol": {
      "get": {
        "summary": "Order-block detail",
        "description": "Order-block scan detail for one symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Screener"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/ta/screener": {
      "get": {
        "summary": "Technical screener",
        "description": "Technical-indicator screener across the symbol universe.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Technicals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/ta/technicals": {
      "get": {
        "summary": "Technical indicators",
        "description": "Indicator set (moving averages, RSI, MACD, ATR) for one symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Technicals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/ta/history": {
      "get": {
        "summary": "Technical history",
        "description": "Historical indicator series for one symbol/interval.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "interval",
            "in": "query",
            "description": "Candle interval.",
            "schema": {
              "type": "string",
              "default": "1h"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Technicals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/seasonality": {
      "get": {
        "summary": "Seasonality summary",
        "description": "Calendar-seasonality statistics for one symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Seasonality"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/seasonality/heatmap": {
      "get": {
        "summary": "Seasonality heatmap",
        "description": "Month-by-year return heatmap.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Seasonality"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/seasonality/dow": {
      "get": {
        "summary": "Day-of-week seasonality",
        "description": "Day-of-week return distribution.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Seasonality"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/seasonality/overlay": {
      "get": {
        "summary": "Seasonality overlay",
        "description": "Current year overlaid on the historical seasonal path.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Seasonality"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/seasonality/quarters": {
      "get": {
        "summary": "Quarterly seasonality",
        "description": "Quarter-by-quarter return statistics.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Seasonality"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/seasonality/rankings": {
      "get": {
        "summary": "Seasonality rankings",
        "description": "Symbols ranked by the current seasonal window.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Seasonality"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/cot/summary": {
      "get": {
        "summary": "COT summary",
        "description": "CFTC Commitments of Traders positioning summary.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "COT"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/cot/history": {
      "get": {
        "summary": "COT history",
        "description": "Historical COT positioning series.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "weeks",
            "in": "query",
            "description": "Weeks of history.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "COT"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/cot/trend": {
      "get": {
        "summary": "COT trend",
        "description": "Trend in COT net positioning.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "COT"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/cot/comparison": {
      "get": {
        "summary": "COT comparison",
        "description": "COT positioning compared across the tracked contracts.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "COT"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/derivatives/detail": {
      "get": {
        "summary": "Derivatives detail",
        "description": "Full per-exchange derivatives detail for one symbol.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/derivatives/heatmap": {
      "get": {
        "summary": "Derivatives heatmap",
        "description": "Funding heatmap (authenticated alias of /v1/derivatives/funding-heatmap).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/derivatives/funding-arb": {
      "get": {
        "summary": "Funding arbitrage table",
        "description": "Cross-exchange funding spreads ranked by annualised carry.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Derivatives"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/options": {
      "get": {
        "summary": "Options index",
        "description": "Index of the available options endpoints.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/options/history": {
      "get": {
        "summary": "Options history",
        "description": "Historical options aggregates (put/call ratio, open interest).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "currency",
            "in": "query",
            "description": "Options currency.",
            "schema": {
              "type": "string",
              "default": "BTC",
              "enum": [
                "BTC",
                "ETH"
              ]
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/options/gex": {
      "get": {
        "summary": "Gamma exposure",
        "description": "Dealer gamma-exposure profile by strike for BTC/ETH.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "currency",
            "in": "query",
            "description": "Options currency.",
            "schema": {
              "type": "string",
              "default": "BTC",
              "enum": [
                "BTC",
                "ETH"
              ]
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Options"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/etf/history": {
      "get": {
        "summary": "ETF flow history",
        "description": "Historical spot-ETF flow series.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "asset",
            "in": "query",
            "description": "ETF asset.",
            "schema": {
              "type": "string",
              "default": "BTC",
              "enum": [
                "BTC",
                "ETH"
              ]
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "ETF"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-events": {
      "get": {
        "summary": "Whale events (authenticated)",
        "description": "Full whale-event feed with per-event PnL, leverage and margin detail.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/whale-health": {
      "get": {
        "summary": "Whale portfolio health",
        "description": "Margin/health readings for the tracked whale wallets.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "wallets",
            "in": "query",
            "description": "Comma-separated wallet addresses.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whales/addresses": {
      "get": {
        "summary": "Tracked whale addresses",
        "description": "The auto-discovered whale wallet universe with discovery metadata.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/whales/universe": {
      "get": {
        "summary": "Whale universe stats",
        "description": "Size and composition of the tracked whale universe.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whales/market-makers": {
      "get": {
        "summary": "Market-maker wallets",
        "description": "Wallets classified as market makers rather than directional traders.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whales/dex-positions": {
      "get": {
        "summary": "On-chain perp positions",
        "description": "Open perpetual positions on GMX v2 (Arbitrum/Avalanche) and Jupiter (Solana).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "venue",
            "in": "query",
            "description": "Filter by venue.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "description": "Base symbol, e.g. BTC.",
            "schema": {
              "type": "string",
              "default": "BTC"
            }
          },
          {
            "name": "min_notional",
            "in": "query",
            "description": "Minimum position notional in USD.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/wallets/{address}/scorecard": {
      "get": {
        "summary": "Wallet scorecard",
        "description": "Historical scorecard for one whale wallet.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/wallets/relationships/stats": {
      "get": {
        "summary": "Wallet-graph statistics",
        "description": "Size and density of the wallet co-positioning graph.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whale-alerts/options": {
      "get": {
        "summary": "Alert rule options",
        "description": "Available fields, operators and channels for whale-alert rules.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-alerts/preview": {
      "post": {
        "summary": "Preview a rule",
        "description": "Runs a candidate rule against recent history and returns what it would have matched, without saving it.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-alerts/rules": {
      "get": {
        "summary": "Alert rules",
        "description": "List the caller's whale-alert rules, or create a new one. The number of rules and the delivery channels available are tier-limited (whale_alert_rules / whale_alert_channels in plans.json).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      },
      "post": {
        "summary": "Alert rules",
        "description": "List the caller's whale-alert rules, or create a new one. The number of rules and the delivery channels available are tier-limited (whale_alert_rules / whale_alert_channels in plans.json).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-alerts/rules/{rule_id}": {
      "get": {
        "summary": "One alert rule",
        "description": "Fetch or delete a single whale-alert rule.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "parameters": [
          {
            "name": "rule_id",
            "in": "path",
            "required": true,
            "description": "Numeric whale-alert rule id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      },
      "delete": {
        "summary": "One alert rule",
        "description": "Fetch or delete a single whale-alert rule.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "parameters": [
          {
            "name": "rule_id",
            "in": "path",
            "required": true,
            "description": "Numeric whale-alert rule id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-alerts/rules/{rule_id}/test": {
      "post": {
        "summary": "Test-fire a rule",
        "description": "Sends a test notification for the rule through its configured channels.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "parameters": [
          {
            "name": "rule_id",
            "in": "path",
            "required": true,
            "description": "Numeric whale-alert rule id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-alerts/matches": {
      "get": {
        "summary": "Rule matches",
        "description": "Events that matched the caller's rules.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-alerts/history": {
      "get": {
        "summary": "Alert history",
        "description": "Delivery history for the caller's whale alerts.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/whale-alerts/feed": {
      "get": {
        "summary": "Alert feed",
        "description": "Live feed of whale events eligible for alerting.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Whale alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/alerts/conditions": {
      "get": {
        "summary": "Alert conditions",
        "description": "List or create price/metric alert conditions.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      },
      "post": {
        "summary": "Alert conditions",
        "description": "List or create price/metric alert conditions.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/alerts/conditions/{condition_id}": {
      "patch": {
        "summary": "Update or delete an alert condition",
        "description": "PATCH toggles or edits a condition; DELETE removes it.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "parameters": [
          {
            "name": "condition_id",
            "in": "path",
            "required": true,
            "description": "Numeric alert-condition id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      },
      "delete": {
        "summary": "Update or delete an alert condition",
        "description": "PATCH toggles or edits a condition; DELETE removes it.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "parameters": [
          {
            "name": "condition_id",
            "in": "path",
            "required": true,
            "description": "Numeric alert-condition id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/alerts/test": {
      "post": {
        "summary": "Test alert delivery",
        "description": "Sends a test alert through the caller's configured channels.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/alerts/history": {
      "get": {
        "summary": "Alert history",
        "description": "Delivery history for the caller's alerts.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/alerts/regime-flips": {
      "get": {
        "summary": "Regime flips",
        "description": "Recent positioning-regime flips. Published with the measured result that this signal type has no durable forward edge.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "hours",
            "in": "query",
            "description": "Look-back window in hours.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/telegram/status": {
      "get": {
        "summary": "Telegram link status",
        "description": "Whether the caller's Telegram account is linked for alert delivery.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Alerts"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/preferences": {
      "get": {
        "summary": "User preferences",
        "description": "Read or update the caller's stored preferences.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      },
      "post": {
        "summary": "User preferences",
        "description": "Read or update the caller's stored preferences.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/watchlist": {
      "get": {
        "summary": "Watchlist",
        "description": "Read or update the caller's symbol watchlist.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      },
      "post": {
        "summary": "Watchlist",
        "description": "Read or update the caller's symbol watchlist.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/webhooks": {
      "get": {
        "summary": "Registered webhooks",
        "description": "Manage outbound webhooks. Payloads are HMAC-signed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      },
      "post": {
        "summary": "Registered webhooks",
        "description": "Manage outbound webhooks. Payloads are HMAC-signed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/symbols/available": {
      "get": {
        "summary": "Symbols available to you",
        "description": "The symbols the caller's tier may query (free tier is BTC/ETH/SOL).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/symbols/request": {
      "post": {
        "summary": "Request a symbol",
        "description": "Requests coverage for a symbol that is not yet tracked.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Account"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/portfolio": {
      "get": {
        "summary": "Portfolio summary",
        "description": "Aggregate value, PnL and exposure of the caller's tracked holdings.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Portfolio"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/portfolio/holdings": {
      "get": {
        "summary": "Holdings",
        "description": "List holdings or add one.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Portfolio"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      },
      "post": {
        "summary": "Holdings",
        "description": "List holdings or add one.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Portfolio"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/portfolio/holdings/{holding_id}": {
      "put": {
        "summary": "Update or delete a holding",
        "description": "PUT replaces a holding; DELETE removes it.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Portfolio"
        ],
        "parameters": [
          {
            "name": "holding_id",
            "in": "path",
            "required": true,
            "description": "Numeric portfolio-holding id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      },
      "delete": {
        "summary": "Update or delete a holding",
        "description": "PUT replaces a holding; DELETE removes it.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Portfolio"
        ],
        "parameters": [
          {
            "name": "holding_id",
            "in": "path",
            "required": true,
            "description": "Numeric portfolio-holding id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/tradingview/setup": {
      "get": {
        "summary": "TradingView setup",
        "description": "The webhook URL and payload template to wire TradingView alerts into this account.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Integrations"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/tradingview/webhook": {
      "post": {
        "summary": "TradingView webhook",
        "description": "Inbound receiver for TradingView alert webhooks. Authenticated by the per-user token embedded in the URL issued by /v1/tradingview/setup.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Integrations"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/data/history": {
      "get": {
        "summary": "Historical dataset catalogue",
        "description": "Datasets available for bulk download, with coverage windows.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Data"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/data/download": {
      "get": {
        "summary": "Download a dataset",
        "description": "Returns a download for a purchased dataset.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "dataset",
            "in": "query",
            "description": "Dataset identifier.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Data"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/data/purchases": {
      "get": {
        "summary": "Your dataset purchases",
        "description": "Datasets this account has purchased.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Data"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/copy-trading/shadow": {
      "get": {
        "summary": "Shadow book",
        "description": "The shadow (paper) copy-trading book. Published together with the measured verdict that the v3 overlay showed no durable out-of-sample edge and is not shipped as a product.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Copy-trading"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/copytrade/shadow/pnl": {
      "get": {
        "summary": "Shadow PnL",
        "description": "Paper PnL of the shadow copy-trade overlay. Transparency artifact — the payload carries the do-not-ship verdict and disclaimer.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Copy-trading"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/copytrade/shadow/track": {
      "get": {
        "summary": "Shadow track record",
        "description": "Per-trade shadow track record behind the PnL series.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Copy-trading"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/top-traders/leaderboard": {
      "get": {
        "summary": "Top-trader leaderboard",
        "description": "Hyperliquid leaderboard traders ranked over the selected window.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Copy-trading"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/top-traders/summary": {
      "get": {
        "summary": "Top-trader summary",
        "description": "Aggregate statistics for the tracked top traders.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Copy-trading"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/top-traders/performance": {
      "get": {
        "summary": "Top-trader performance",
        "description": "Realised performance of the tracked top traders.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Copy-trading"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/top-traders/history": {
      "get": {
        "summary": "Top-trader history",
        "description": "Historical position and PnL series for the tracked top traders.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Copy-trading"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/stocks": {
      "get": {
        "summary": "Stock universe",
        "description": "The tracked equity and tokenized-equity universe.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/universe": {
      "get": {
        "summary": "Stock universe",
        "description": "Alias of /v1/stocks.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/tokenized": {
      "get": {
        "summary": "Tokenized stocks",
        "description": "Tokenized equities listed on the tracked venues.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "venue",
            "in": "query",
            "description": "Filter by venue.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/new-listings": {
      "get": {
        "summary": "New listings",
        "description": "Recently listed tokenized equities.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/stats": {
      "get": {
        "summary": "Stock tracker stats",
        "description": "Coverage and freshness of the equity tracker.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/{ticker}": {
      "get": {
        "summary": "Stock detail",
        "description": "Detail for one ticker.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "parameters": [
          {
            "name": "ticker",
            "in": "path",
            "required": true,
            "description": "Equity ticker symbol.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/whales/{ticker}": {
      "get": {
        "summary": "Equity whales",
        "description": "Large 13F/ownership positions in one ticker.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "parameters": [
          {
            "name": "ticker",
            "in": "path",
            "required": true,
            "description": "Equity ticker symbol.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/insiders/{ticker}": {
      "get": {
        "summary": "Insider trades",
        "description": "SEC Form 4 insider transactions for one ticker.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "path",
            "required": true,
            "description": "Equity ticker symbol.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "code",
            "in": "query",
            "description": "Form 4 transaction code filter.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/institutions/{ticker}": {
      "get": {
        "summary": "Institutional holders",
        "description": "Institutional holders and position changes for one ticker.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "parameters": [
          {
            "name": "ticker",
            "in": "path",
            "required": true,
            "description": "Equity ticker symbol.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/congress/{ticker}": {
      "get": {
        "summary": "Congressional trades",
        "description": "Disclosed congressional trades in one ticker, with the disclosure (PTR) link. Published as disclosure data, not as a signal — the long-horizon study found no tradable edge.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "path",
            "required": true,
            "description": "Equity ticker symbol.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/short-interest/{ticker}": {
      "get": {
        "summary": "Short interest",
        "description": "Reported short interest for one ticker.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "parameters": [
          {
            "name": "ticker",
            "in": "path",
            "required": true,
            "description": "Equity ticker symbol.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/whale-signals": {
      "get": {
        "summary": "Equity whale signals",
        "description": "Cross-ticker aggregation of institutional and insider activity.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/rankings": {
      "get": {
        "summary": "Equity rankings",
        "description": "Tickers ranked by the tracked ownership and insider factors.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/insider-clusters": {
      "get": {
        "summary": "Insider clusters",
        "description": "Tickers with clustered insider buying or selling.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/stocks/activist-alerts": {
      "get": {
        "summary": "Activist alerts",
        "description": "Recent activist (13D) filings.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/equity-flow": {
      "get": {
        "summary": "Equity flow stats",
        "description": "Coverage and freshness of the free equity options-flow dataset.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/equity-flow/stats": {
      "get": {
        "summary": "Equity flow stats",
        "description": "Alias of /v1/equity-flow.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/equity-flow/unusual-activity": {
      "get": {
        "summary": "Unusual options activity",
        "description": "Unusual equity options prints ranked by a size/open-interest score.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "description": "Filter by ticker.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "contract_type",
            "in": "query",
            "description": "Contract type.",
            "schema": {
              "type": "string",
              "enum": [
                "call",
                "put"
              ]
            }
          },
          {
            "name": "min_score",
            "in": "query",
            "description": "Minimum unusualness score.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/equity-flow/gex": {
      "get": {
        "summary": "Equity gamma exposure",
        "description": "Dealer gamma exposure by strike for one ticker.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "description": "Ticker symbol.",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/equity-flow/dark-pool": {
      "get": {
        "summary": "Dark-pool prints",
        "description": "Off-exchange (dark-pool) prints for the tracked tickers.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "description": "Filter by ticker.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/flow/status": {
      "get": {
        "summary": "Paid flow status",
        "description": "Availability of the paid Unusual Whales flow feed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/flow/unusual": {
      "get": {
        "summary": "Unusual flow (paid feed)",
        "description": "Unusual options flow from the paid Unusual Whales feed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "description": "Filter by ticker.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/flow/dark-pool": {
      "get": {
        "summary": "Dark-pool flow (paid feed)",
        "description": "Dark-pool prints from the paid Unusual Whales feed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "description": "Filter by ticker.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/flow/gex": {
      "get": {
        "summary": "GEX (paid feed)",
        "description": "Gamma exposure from the paid Unusual Whales feed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "description": "Ticker symbol.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Equities"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/live-swaps/recent": {
      "get": {
        "summary": "Recent DEX swaps",
        "description": "First-paint snapshot of recent large DEX swaps. Website widgets call this once, then subscribe to the stream.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Live chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/live-swaps/status": {
      "get": {
        "summary": "Live-swap stream status",
        "description": "Health and coverage of the live swap stream.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Live chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/live-swaps/export": {
      "get": {
        "summary": "Export live swaps",
        "description": "CSV export of the live swap history. Authenticates with its own key check (X-API-Key header or ?key=) and is limited to 10 exports per account per rolling 24 hours.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window in days.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Live chain"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/mempool/pending": {
      "get": {
        "summary": "Pending mempool swaps",
        "description": "Pending large swaps observed in the local node mempool.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Live chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/mempool/stats": {
      "get": {
        "summary": "Mempool statistics",
        "description": "Mempool depth and gas statistics from the local nodes.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Live chain"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/serenity/watchlist": {
      "get": {
        "summary": "Serenity watchlist",
        "description": "A read-only archived idea list served from a static file. Candidate names only — explicitly not a trading signal and not an execution path.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Intelligence"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/assistant/chat": {
      "post": {
        "summary": "Assistant chat",
        "description": "Sends a message to the site assistant and returns the reply. Daily quota per account.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Assistant"
        ],
        "x-auth": "required",
        "x-tier": "Free (200 calls/day)",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/assistant/contact": {
      "post": {
        "summary": "Assistant contact",
        "description": "Raises a support contact through the assistant.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Assistant"
        ],
        "x-auth": "required",
        "x-tier": "Free (200 calls/day)",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/assistant/quota": {
      "get": {
        "summary": "Assistant quota",
        "description": "Remaining assistant messages for the day.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Assistant"
        ],
        "x-auth": "required",
        "x-tier": "Free (200 calls/day)",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/booking/slots": {
      "get": {
        "summary": "Available call slots",
        "description": "Open slots for a booked call.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Booking"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/booking/create": {
      "post": {
        "summary": "Book a call",
        "description": "Books a call slot. Per-IP throttled.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Booking"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/booking/lookup": {
      "get": {
        "summary": "Look up a booking",
        "description": "Looks up an existing booking by reference.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Booking"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/booking/cancel": {
      "post": {
        "summary": "Cancel a booking",
        "description": "Cancels an existing booking. Per-IP throttled.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Booking"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/booking/ics": {
      "get": {
        "summary": "Booking calendar file",
        "description": "Returns the booking as an iCalendar (.ics) file.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Booking"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/referrals/apply": {
      "post": {
        "summary": "Apply to the programme",
        "description": "Applies for an affiliate referral code.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/dashboard": {
      "get": {
        "summary": "Referral dashboard",
        "description": "Clicks, conversions and earned commission for the caller's code.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/stats": {
      "get": {
        "summary": "Referral stats",
        "description": "Aggregate statistics for the caller's referral code.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/terms": {
      "get": {
        "summary": "Programme terms",
        "description": "Commission ladder, cookie window, hold period and payout minimum. Public — no key required. The ladder is derived server-side from the same table that locks each conversion's rate and term, so a page rendering from this endpoint cannot advertise terms the ledger disagrees with.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/referrals/click": {
      "post": {
        "summary": "Record a click",
        "description": "Records a referral click. Public — called from the landing page.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/referrals/impression": {
      "post": {
        "summary": "Record a widget view",
        "description": "Records one embed-widget view. Public - called from inside the widget iframe. Aggregated per (code, widget, publisher origin, day); only the publisher's ORIGIN is stored, never the page URL. A view is NOT a payable event and can never be attributed to a sale - an embed runs in a third-party context, so only a click through to smartmoneyapi.com is credited. This exists so a partner can see installs and a click-through rate.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/referrals/conversion": {
      "get": {
        "summary": "Check a conversion",
        "description": "Checks whether a referred visitor converted.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/referrals/commissions": {
      "get": {
        "summary": "Commission ledger",
        "description": "Commission rows earned by the caller.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/request-payout": {
      "post": {
        "summary": "Request a payout (removed — always 410)",
        "description": "REMOVED. Always returns 410 Gone and creates nothing. Commissions are paid automatically by Stripe Connect once the matured balance reaches the minimum; see GET /v1/referrals/connect/status for payout-account state and GET /v1/referrals/dashboard for the balance.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/friend/code": {
      "get": {
        "summary": "Friend code",
        "description": "The caller's friend-referral code.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/friend/status": {
      "get": {
        "summary": "Friend status",
        "description": "Status of the caller's friend referrals and credits.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/friend/claim": {
      "post": {
        "summary": "Claim a friend credit",
        "description": "Claims a friend-referral credit.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/connect/status": {
      "get": {
        "summary": "Payout account status",
        "description": "Stripe Connect onboarding status for affiliate payouts.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/referrals/connect/onboard": {
      "post": {
        "summary": "Start payout onboarding",
        "description": "Starts Stripe Connect onboarding for affiliate payouts.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Referrals"
        ],
        "x-auth": "required",
        "x-tier": "Pro (15,000 calls/day)"
      }
    },
    "/v1/node/{chain}/large-swaps": {
      "get": {
        "summary": "Large swaps",
        "description": "Large DEX swaps observed by the self-hosted node for the chain (bsc or avax). Entitlement and quota are enforced per chain and per feature by node_entitlements, independently of the API tier allowlist.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/smart-money": {
      "get": {
        "summary": "Node smart money",
        "description": "Smart-money wallet activity from the node's own trace data.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/wallet/{address}": {
      "get": {
        "summary": "Wallet profile",
        "description": "Node-derived profile for one wallet.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/token/{address}": {
      "get": {
        "summary": "Token profile",
        "description": "Node-derived profile for one token.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/token-risk/{address}": {
      "get": {
        "summary": "Token risk",
        "description": "Contract-level risk checks for one token.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/honeypot/{address}": {
      "get": {
        "summary": "Honeypot check",
        "description": "Simulated buy/sell honeypot check for one token.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/deployer/{address}": {
      "get": {
        "summary": "Deployer history",
        "description": "Deployment history for a contract deployer.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/top-holders/{address}": {
      "get": {
        "summary": "Top holders",
        "description": "Largest holders of one token.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/new-pairs": {
      "get": {
        "summary": "New pairs",
        "description": "Newly created DEX pairs. Served by the on-chain indexer; returns 503 while the indexer is disabled on this deployment.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/liquidity-events": {
      "get": {
        "summary": "Liquidity events",
        "description": "Liquidity add/remove events. Indexer-backed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "token",
            "in": "query",
            "description": "Filter by token address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/pending-swaps": {
      "get": {
        "summary": "Pending swaps",
        "description": "Pending swaps in the node mempool. Indexer-backed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/v1/node/{chain}/snipers": {
      "get": {
        "summary": "Snipers",
        "description": "Wallets that sniped a launch. Indexer-backed.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Node"
        ],
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "description": "Node chain: bsc or avax.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "required",
        "x-tier": "per-feature node entitlement"
      }
    },
    "/rpc/v1/health": {
      "get": {
        "summary": "RPC health",
        "description": "Health of the resold BSC/Avalanche JSON-RPC endpoints. Public.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "JSON-RPC"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/rpc/v1/bsc": {
      "post": {
        "summary": "BSC JSON-RPC",
        "description": "JSON-RPC proxy to the self-hosted BSC full node. Authenticated with a dedicated rpc_ key, NOT the main API key, and metered separately from the plans.json call quotas.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "JSON-RPC"
        ],
        "x-auth": "required",
        "x-tier": "rpc key (metered separately)"
      }
    },
    "/rpc/v1/avax-c": {
      "post": {
        "summary": "Avalanche C-Chain JSON-RPC",
        "description": "JSON-RPC proxy to the Avalanche C-Chain. rpc_ key required.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "JSON-RPC"
        ],
        "x-auth": "required",
        "x-tier": "rpc key (metered separately)"
      }
    },
    "/rpc/v1/avax-x": {
      "post": {
        "summary": "Avalanche X-Chain JSON-RPC",
        "description": "JSON-RPC proxy to the Avalanche X-Chain. rpc_ key required.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "JSON-RPC"
        ],
        "x-auth": "required",
        "x-tier": "rpc key (metered separately)"
      }
    },
    "/rpc/v1/avax-p": {
      "post": {
        "summary": "Avalanche P-Chain JSON-RPC",
        "description": "JSON-RPC proxy to the Avalanche P-Chain. rpc_ key required.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "JSON-RPC"
        ],
        "x-auth": "required",
        "x-tier": "rpc key (metered separately)"
      }
    },
    "/rpc/v1/avax-info": {
      "post": {
        "summary": "Avalanche info JSON-RPC",
        "description": "JSON-RPC proxy to the Avalanche info API. rpc_ key required.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "JSON-RPC"
        ],
        "x-auth": "required",
        "x-tier": "rpc key (metered separately)"
      }
    },
    "/v1/defillama/all": {
      "get": {
        "summary": "All DeFiLlama data",
        "description": "Every DeFiLlama dataset in one payload. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/momentum": {
      "get": {
        "summary": "Price momentum",
        "description": "Cross-token price momentum. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/unlocks": {
      "get": {
        "summary": "Token unlocks",
        "description": "Upcoming token unlock schedule. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/derivatives": {
      "get": {
        "summary": "Perp DEX volumes",
        "description": "Perpetual DEX volume rankings. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/fees": {
      "get": {
        "summary": "Protocol fees",
        "description": "Protocol fee and revenue rankings. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/bridges": {
      "get": {
        "summary": "Bridge volumes",
        "description": "Cross-chain bridge volume. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/hacks": {
      "get": {
        "summary": "Hacks",
        "description": "Logged protocol exploits and amounts lost. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/raises": {
      "get": {
        "summary": "Fundraises",
        "description": "Recent protocol fundraises. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/stablecoin-chains": {
      "get": {
        "summary": "Stablecoins by chain",
        "description": "Stablecoin supply broken down by chain. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/defillama/treasuries": {
      "get": {
        "summary": "Protocol treasuries",
        "description": "Protocol treasury holdings. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/defillama/borrow-rates": {
      "get": {
        "summary": "Borrow rates",
        "description": "Lending-market borrow rates. Sourced from DeFiLlama.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "401": {
            "description": "Missing or invalid API key"
          },
          "402": {
            "description": "Endpoint not included in your plan (response carries an upgrade CTA)"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "DeFiLlama"
        ],
        "x-auth": "required",
        "x-tier": "Trader (3,000 calls/day)"
      }
    },
    "/v1/news/treasury-yield": {
      "get": {
        "summary": "Treasury yields",
        "description": "US Treasury yield levels used by the macro classifier.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/news/accuracy": {
      "get": {
        "summary": "News classifier accuracy",
        "description": "Measured accuracy of the news impact classifier, published with its sample size.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "News"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/signals/{signal_id}/outcome": {
      "get": {
        "summary": "Signal outcome",
        "description": "The resolved 4h/12h/24h/72h outcome of one logged signal.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Signals"
        ],
        "parameters": [
          {
            "name": "signal_id",
            "in": "path",
            "required": true,
            "description": "Numeric signal id from /v1/signals/recent.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/signals/analytics/{view}": {
      "get": {
        "summary": "Signal analytics view",
        "description": "Read-only aggregate views over the same signal log the published win-rate uses: edge, calibration, rolling, distribution, components, gates, confluence, leaderboard. All in-sample unless the view says otherwise.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Signals"
        ],
        "parameters": [
          {
            "name": "view",
            "in": "path",
            "required": true,
            "description": "Analytics view name (edge, calibration, rolling, distribution, components, gates, confluence, leaderboard).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/wallet/{address}/positions": {
      "get": {
        "summary": "Wallet positions",
        "description": "Open positions for one wallet. Public even for authenticated callers — there is no separate gated handler for this path.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/wallets/{address}/relationships": {
      "get": {
        "summary": "Wallet relationships",
        "description": "Edges in the wallet co-positioning graph for one address (Jaccard similarity over 14 days of positions, rebuilt every 6h).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "description": "Wallet or contract address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Max rows returned.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "min_jaccard",
            "in": "query",
            "description": "Minimum Jaccard similarity.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "tags": [
          "Whales"
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/whales/crowding": {
      "get": {
        "summary": "Whale crowding & positioning context",
        "description": "Combined whale positioning across Hyperliquid + GMX v2 + Jupiter Perps per symbol: gross/net notional, directional skew, wallet & venue counts, concentration (top-3 share + HHI), weighted-average leverage, and liquidation-proximity buckets ($ notional within 5% and 10% of estimated liq price, split long/short). Context, not a directional signal. Non-derivable fields are null (rendered '—'); liq distances are isolated-margin estimates, not exchange-reported. Anonymous callers get the top 10 symbols by gross; Trader+ get the full list.",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "ts": {
                      "type": "integer"
                    },
                    "min_notional": {
                      "type": "number"
                    },
                    "n_symbols": {
                      "type": "integer"
                    },
                    "symbols": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "symbol": {
                            "type": "string"
                          },
                          "gross_usd": {
                            "type": "number"
                          },
                          "net_usd": {
                            "type": "number"
                          },
                          "skew": {
                            "type": "number",
                            "description": "net/gross in [-1,1]"
                          },
                          "n_whales": {
                            "type": "integer"
                          },
                          "n_venues": {
                            "type": "integer"
                          },
                          "venues": {
                            "type": "object",
                            "description": "Per-venue {gross,net,n_whales}; only venues present."
                          },
                          "conc_top3": {
                            "type": "number"
                          },
                          "hhi": {
                            "type": "number"
                          },
                          "lev_wavg": {
                            "type": "number",
                            "nullable": true,
                            "description": "null if no position carries leverage."
                          },
                          "liq_within_5pct": {
                            "type": "object",
                            "properties": {
                              "long": {
                                "type": "number"
                              },
                              "short": {
                                "type": "number"
                              }
                            }
                          },
                          "liq_within_10pct": {
                            "type": "object",
                            "properties": {
                              "long": {
                                "type": "number"
                              },
                              "short": {
                                "type": "number"
                              }
                            }
                          },
                          "crowding_index": {
                            "type": "number",
                            "nullable": true,
                            "description": "|skew|*conc_top3*min(lev/20,1); null if no leverage."
                          }
                        }
                      }
                    },
                    "gated": {
                      "type": "boolean",
                      "description": "true for anonymous (top-10 only); full list at Trader+."
                    },
                    "caveats": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          }
        },
        "parameters": [
          {
            "name": "min_notional",
            "in": "query",
            "description": "Minimum combined gross notional (USD) for a symbol to be included.",
            "schema": {
              "type": "number",
              "default": 1000000
            }
          }
        ],
        "tags": [
          "Whales"
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    },
    "/v1/wallet/{addr}/profile": {
      "get": {
        "summary": "Whale wallet profile",
        "description": "Cross-venue profile for a tracked Hyperliquid whale, built from live position snapshots: current open positions, unrealized-PnL / exposure / position-count time series, an OPEN/CLOSE/FLIP activity timeline (diffed from consecutive snapshots), decoded HL-leaderboard label, and an open-book summary. pnl is HL's own unrealized mark-to-market; value_usd is open notional. Realized P&L per round-trip is unavailable (only open snapshots are seen) and is returned as null. Valid-but-untracked address returns tracked=false; invalid address returns ok=false, error=invalid_address (HTTP 400).",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "wallet": {
                      "type": "string"
                    },
                    "tracked": {
                      "type": "boolean"
                    },
                    "first_seen_ts": {
                      "type": "integer",
                      "nullable": true
                    },
                    "latest_snapshot_ts": {
                      "type": "integer",
                      "nullable": true
                    },
                    "as_of": {
                      "type": "integer",
                      "nullable": true
                    },
                    "note": {
                      "type": "string",
                      "description": "Present when tracked=false."
                    },
                    "error": {
                      "type": "string",
                      "description": "Present when ok=false (e.g. invalid_address)."
                    },
                    "hyperliquid": {
                      "type": "object",
                      "properties": {
                        "label": {
                          "type": "object",
                          "description": "Decoded HL-leaderboard standing at discovery (HL's own, not computed here): name/score/window_pnl_usd/win_rate_pct/trades."
                        },
                        "positions": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "venue": {
                                "type": "string"
                              },
                              "symbol": {
                                "type": "string"
                              },
                              "direction": {
                                "type": "string"
                              },
                              "size": {
                                "type": "number"
                              },
                              "entry_px": {
                                "type": "number"
                              },
                              "unrealized_pnl": {
                                "type": "number"
                              },
                              "leverage": {
                                "type": "number"
                              },
                              "value_usd": {
                                "type": "number"
                              }
                            }
                          }
                        },
                        "series": {
                          "type": "array",
                          "description": "<=360 decimated points.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "ts": {
                                "type": "integer"
                              },
                              "unrealized_pnl": {
                                "type": "number"
                              },
                              "exposure_usd": {
                                "type": "number"
                              },
                              "positions": {
                                "type": "integer"
                              }
                            }
                          }
                        },
                        "timeline": {
                          "type": "array",
                          "description": "<=120 events, newest-first. CLOSE events carry no P&L claim.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "ts": {
                                "type": "integer"
                              },
                              "event": {
                                "type": "string",
                                "enum": [
                                  "open",
                                  "close",
                                  "flip"
                                ]
                              },
                              "symbol": {
                                "type": "string"
                              },
                              "direction": {
                                "type": "string"
                              },
                              "from_direction": {
                                "type": "string"
                              },
                              "value_usd": {
                                "type": "number"
                              }
                            }
                          }
                        },
                        "summary": {
                          "type": "object",
                          "properties": {
                            "open_positions": {
                              "type": "integer"
                            },
                            "in_profit": {
                              "type": "integer"
                            },
                            "in_loss": {
                              "type": "integer"
                            },
                            "longs": {
                              "type": "integer"
                            },
                            "shorts": {
                              "type": "integer"
                            },
                            "total_unrealized_pnl": {
                              "type": "number"
                            },
                            "total_exposure_usd": {
                              "type": "number"
                            },
                            "blended_leverage": {
                              "type": "number"
                            },
                            "window_days": {
                              "type": "integer"
                            },
                            "snapshots_in_window": {
                              "type": "integer"
                            },
                            "realized_pnl": {
                              "type": "number",
                              "nullable": true,
                              "description": "Always null -- not derivable from open-only snapshots."
                            },
                            "realized_pnl_note": {
                              "type": "string"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "400": {
            "description": "Invalid address"
          }
        },
        "parameters": [
          {
            "name": "addr",
            "in": "path",
            "required": true,
            "description": "Wallet address.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Look-back window for series & timeline.",
            "schema": {
              "type": "integer",
              "default": 30
            }
          }
        ],
        "tags": [
          "Whales"
        ],
        "security": [
          {},
          {
            "ApiKeyAuth": []
          }
        ],
        "x-auth": "none",
        "x-tier": "public",
        "x-free-tier-symbols": [
          "BTC",
          "ETH",
          "SOL",
          "XAU",
          "XAG"
        ]
      }
    }
  }
}
