{
  "openapi": "3.1.0",
  "info": {
    "title": "History of Market — data API",
    "version": "2026-09-03",
    "summary": "Read-only JSON datasets behind every chart on historyofmarket.com.",
    "description": "Every chart on the site is drawn from a static JSON file under /api/. The files are regenerated after each U.S. trading day by a GitHub Actions cron and served from the Cloudflare edge; there is no auth, no rate limit, no parameters and no write surface. Paths carry a mandatory `.json` suffix. A miss under /api/ returns HTTP 404 with a JSON body (`{error: {code, status, message, hint, resolution[]}}`), never HTML. Start with /api/_manifest.json (what exists and when it changed) or /api/profile.json (which dataset answers which question). Licence: CC BY 4.0 — attribution required.",
    "termsOfService": "https://historyofmarket.com/ai.txt",
    "contact": {
      "name": "History of Market",
      "url": "https://historyofmarket.com/"
    },
    "license": {
      "name": "CC BY 4.0",
      "identifier": "CC-BY-4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    },
    "x-generated-from": "dist/api/**/*.json + _manifest.json + tools.json (scripts/build-openapi.mjs)"
  },
  "externalDocs": {
    "description": "llms.txt — human/LLM index of the site and its datasets",
    "url": "https://historyofmarket.com/llms.txt"
  },
  "servers": [
    {
      "url": "https://historyofmarket.com",
      "description": "Production (Cloudflare Pages, global CDN)"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "dow",
      "description": "Dow Jones Industrial Average, 1914→."
    },
    {
      "name": "fin",
      "description": "Financials sector (XLF, S5FINL)."
    },
    {
      "name": "latest",
      "description": "Recent research replications (concentration, drawdown studies)."
    },
    {
      "name": "m7",
      "description": "Magnificent 7 composite."
    },
    {
      "name": "mag7",
      "description": "Magnificent 7 concentration, valuation, drawdowns."
    },
    {
      "name": "meta",
      "description": "Catalogue and agent entry points (manifest, profile, tool list)."
    },
    {
      "name": "misc",
      "description": "Cross-market series (recessions, AIAE, yield curve, volatility)."
    },
    {
      "name": "nasdaq",
      "description": "Nasdaq Composite and Nasdaq 100 panel bundles."
    },
    {
      "name": "ndx",
      "description": "Nasdaq 100 — history, returns, valuation, constituents."
    },
    {
      "name": "qqq",
      "description": "QQQ / Nasdaq 100 return details."
    },
    {
      "name": "sectors",
      "description": "Datasets under /api/sectors/."
    },
    {
      "name": "semi",
      "description": "Philadelphia Semiconductor Index (SOX) and SMH."
    },
    {
      "name": "sp500",
      "description": "S&P 500 — prices since 1928, annual and total returns, valuation, drawdowns, constituents."
    },
    {
      "name": "static",
      "description": "Editions, not time series — refreshed only when the source publication updates."
    },
    {
      "name": "xlk",
      "description": "Information Technology sector (XLK, S5INFT)."
    }
  ],
  "paths": {
    "/api/_manifest.json": {
      "get": {
        "operationId": "get_manifest",
        "summary": "Dataset catalogue",
        "description": "Every dataset with its path, size in bytes and last-modified timestamp, plus `generated_at` for the whole publish. Poll this one file to decide which datasets to revalidate.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/aiae.json": {
      "get": {
        "operationId": "get_aiae",
        "summary": "AIAE — Aggregate Investor Allocation to Equities",
        "description": "Backs the panel: “AIAE — Aggregate Investor Allocation to Equities”. Answers: What's the best long-horizon predictor of S&P 500 returns? Editorial page: https://historyofmarket.com/sp500/aiae/",
        "tags": [
          "misc"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 34260,
        "x-modified": "2026-09-03T07:53:02.038157+00:00",
        "x-panels": [
          "sp500_aiae"
        ]
      }
    },
    "/api/dow/century.json": {
      "get": {
        "operationId": "get_dow_century",
        "summary": "Dataset dow/century",
        "description": "Dataset `dow/century`.",
        "tags": [
          "dow"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 56432,
        "x-modified": "2026-09-03T07:53:02.159414+00:00"
      }
    },
    "/api/fin/annual-returns.json": {
      "get": {
        "operationId": "get_fin_annual_returns",
        "summary": "XLF year-by-year ledger",
        "description": "Backs the panel: “XLF year-by-year ledger”. Answers: What's the annual return record of the XLF ETF? Editorial page: https://historyofmarket.com/fin/fin-annual/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 1919,
        "x-modified": "2026-09-03T07:53:02.339831+00:00",
        "x-panels": [
          "fin_fin_annual"
        ]
      }
    },
    "/api/fin/annual-tr.json": {
      "get": {
        "operationId": "get_fin_annual_tr",
        "summary": "XLF annual return distribution",
        "description": "Backs the panel: “XLF annual return distribution”. Answers: What does the signature shape of a 'crisis sector' look like? Editorial page: https://historyofmarket.com/fin/fin-annual-dist/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2288,
        "x-modified": "2026-09-03T07:53:02.340040+00:00",
        "x-panels": [
          "fin_fin_annual_dist"
        ]
      }
    },
    "/api/fin/crisis-2008.json": {
      "get": {
        "operationId": "get_fin_crisis_2008",
        "summary": "2008 — five financial institutions vanished, five survived",
        "description": "Backs the panel: “2008 — five financial institutions vanished, five survived”. Answers: Which big US financial institutions disappeared in 2008, and which absorbed them? Editorial page: https://historyofmarket.com/fin/fin-crisis/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 6483,
        "x-modified": "2026-09-03T07:53:02.342001+00:00",
        "x-panels": [
          "fin_fin_crisis"
        ]
      }
    },
    "/api/fin/drawdowns.json": {
      "get": {
        "operationId": "get_fin_drawdowns",
        "summary": "Dataset fin/drawdowns",
        "description": "Dataset `fin/drawdowns`.",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 6890,
        "x-modified": "2026-09-03T07:53:02.341530+00:00"
      }
    },
    "/api/fin/holdings.json": {
      "get": {
        "operationId": "get_fin_holdings",
        "summary": "XLF top holdings & cumulative weight",
        "description": "Backs the panel: “XLF top holdings & cumulative weight”. Answers: What does the XLF ETF actually own today? Editorial page: https://historyofmarket.com/fin/fin-holdings/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 3403,
        "x-modified": "2026-09-03T07:53:02.341713+00:00",
        "x-panels": [
          "fin_fin_holdings"
        ]
      }
    },
    "/api/fin/intrayear-dd.json": {
      "get": {
        "operationId": "get_fin_intrayear_dd",
        "summary": "XLF intrayear drawdown vs year-end return",
        "description": "Backs the panel: “XLF intrayear drawdown vs year-end return”. Answers: How does the Financial sector's intrayear amplitude compare to the broad market? Editorial page: https://historyofmarket.com/fin/fin-intrayear-dd/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 5138,
        "x-modified": "2026-09-03T07:53:02.341226+00:00",
        "x-panels": [
          "fin_fin_intrayear_dd"
        ]
      }
    },
    "/api/fin/monthly.json": {
      "get": {
        "operationId": "get_fin_monthly",
        "summary": "Dataset fin/monthly",
        "description": "Dataset `fin/monthly`.",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 6022,
        "x-modified": "2026-09-03T07:53:02.339646+00:00"
      }
    },
    "/api/fin/price.json": {
      "get": {
        "operationId": "get_fin_price",
        "summary": "XLF Financials ETF since 1998",
        "description": "Backs the panel: “XLF Financials ETF since 1998”. Answers: How has the Financials sector ETF (XLF) traded since its December 1998 launch? Editorial page: https://historyofmarket.com/fin/fin-price/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 421405,
        "x-modified": "2026-09-03T07:53:02.319957+00:00",
        "x-panels": [
          "fin_fin_price"
        ]
      }
    },
    "/api/fin/rates.json": {
      "get": {
        "operationId": "get_fin_rates",
        "summary": "Yield curve × XLF — the causal chain",
        "description": "Backs the panel: “Yield curve × XLF — the causal chain”. Answers: How does the 2y-10y yield-curve spread move XLF's trailing 12-month return? Editorial page: https://historyofmarket.com/fin/fin-rates/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 760812,
        "x-modified": "2026-09-03T07:53:02.372663+00:00",
        "x-panels": [
          "fin_fin_rates"
        ]
      }
    },
    "/api/fin/reclass-2023.json": {
      "get": {
        "operationId": "get_fin_reclass_2023",
        "summary": "2023-03-17 GICS payments-into-financials reshuffle",
        "description": "Backs the panel: “2023-03-17 GICS payments-into-financials reshuffle”. Answers: Which companies were moved into Financials by GICS in 2023? Editorial page: https://historyofmarket.com/fin/fin-reclass/",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 1994,
        "x-modified": "2026-09-03T07:53:02.342138+00:00",
        "x-panels": [
          "fin_fin_reclass"
        ]
      }
    },
    "/api/fin/rolling5y.json": {
      "get": {
        "operationId": "get_fin_rolling5y",
        "summary": "Dataset fin/rolling5y",
        "description": "Dataset `fin/rolling5y`.",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 29332,
        "x-modified": "2026-09-03T07:53:02.340978+00:00"
      }
    },
    "/api/fin/volatility.json": {
      "get": {
        "operationId": "get_fin_volatility",
        "summary": "Dataset fin/volatility",
        "description": "Dataset `fin/volatility`.",
        "tags": [
          "fin"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 512127,
        "x-modified": "2026-09-03T07:53:02.339098+00:00"
      }
    },
    "/api/latest/concentration.json": {
      "get": {
        "operationId": "get_latest_concentration",
        "summary": "Top 10 share of US equity market value, 1950 → today",
        "description": "Backs 3 panels: “Top 10 share of US equity market value, 1950 → today”, “The #1 stock vs the index — relative return since 1950”, “Large caps vs small caps since 2000 (Russell 1000 vs 2000)”. Answers: How much of the US stock market do the ten largest companies represent today, and how does that compare with history? Has owning the largest US stock historically beaten the index? How have large caps performed against small caps since 2000? Editorial page: https://historyofmarket.com/latest/cp-conc-top10/",
        "tags": [
          "latest"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 10180,
        "x-modified": "2026-09-03T07:53:02.493062+00:00",
        "x-panels": [
          "latest_cp_conc_top10",
          "latest_cp_conc_top3",
          "latest_cp_conc_size"
        ]
      }
    },
    "/api/latest/dd-cases.json": {
      "get": {
        "operationId": "get_latest_dd_cases",
        "summary": "NVDA vs INTC — two lives after the dot-com bust",
        "description": "Backs the panel: “NVDA vs INTC — two lives after the dot-com bust”. Answers: How long can it take a stock to recover its prior peak after a 90% drawdown? Editorial page: https://historyofmarket.com/latest/cp-dd-cases/",
        "tags": [
          "latest"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 130589,
        "x-modified": "2026-09-03T07:53:02.492462+00:00",
        "x-panels": [
          "latest_cp_dd_cases"
        ]
      }
    },
    "/api/latest/dd-study.json": {
      "get": {
        "operationId": "get_latest_dd_study",
        "summary": "Drawdown base rates by depth (current S&P 500 members, 1985→)",
        "description": "Backs 4 panels: “Drawdown base rates by depth (current S&P 500 members, 1985→)”, “Forward returns after the trough, by drawdown depth”, “When stocks peak and when they bottom”, “Sixty months off the bottom — recovery paths after a ~75% drawdown”. Answers: How deep do individual stock drawdowns get, and what share of stocks ever recover to their prior peak? What returns follow after a stock bottoms from a deep drawdown? Do individual stocks bottom at the same time as the market? What does the recovery path look like after a stock loses 75% of its value? Editorial page: https://historyofmarket.com/latest/cp-dd-base-rates/",
        "tags": [
          "latest"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 47106,
        "x-modified": "2026-09-03T07:53:02.486566+00:00",
        "x-panels": [
          "latest_cp_dd_base_rates",
          "latest_cp_dd_forward_returns",
          "latest_cp_dd_timing",
          "latest_cp_dd_paths"
        ]
      }
    },
    "/api/m7/index.json": {
      "get": {
        "operationId": "get_m7_index",
        "summary": "Magnificent 7 equal-weighted index",
        "description": "Backs 4 panels: “Magnificent 7 equal-weighted index”, “Magnificent 7 equal-weight composite since 2022-01-03”, “Per-member peak-to-date drawdown”, “60-day rolling pairwise correlation + 5-year average”. Answers: How have the Magnificent 7 performed as a basket? What would buying and rebalancing all seven Magnificent 7 names have returned since January 2022? Which Magnificent 7 names have carried the deepest individual drawdowns since 2018? Are the Magnificent 7 still seven distinct names or have they collapsed into a single trade? Editorial page: https://historyofmarket.com/sp500/m7/",
        "tags": [
          "m7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 383135,
        "x-modified": "2026-09-03T07:53:02.178207+00:00",
        "x-panels": [
          "sp500_m7",
          "mag7_mag7_index",
          "mag7_mag7_drawdown",
          "mag7_mag7_correlation"
        ]
      }
    },
    "/api/mag7/ai-capex.json": {
      "get": {
        "operationId": "get_mag7_ai_capex",
        "summary": "Magnificent 7 AI capex and cash allocation",
        "description": "Backs the panel: “Magnificent 7 AI capex and cash allocation”. Answers: How much are the Magnificent 7 spending on AI capital expenditure? Editorial page: https://historyofmarket.com/mag7/mag7-ai-capex/",
        "tags": [
          "mag7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 8287,
        "x-modified": "2026-09-03T07:53:02.484326+00:00",
        "x-panels": [
          "mag7_mag7_ai_capex"
        ]
      }
    },
    "/api/mag7/ai-valuation.json": {
      "get": {
        "operationId": "get_mag7_ai_valuation",
        "summary": "AI leaders' TTM PE vs the 1999 dotcom peak",
        "description": "Backs the panel: “AI leaders' TTM PE vs the 1999 dotcom peak”. Answers: How do NVDA, MSFT, META, and GOOGL valuations today compare to Cisco / Oracle / Sun at the 1999 dotcom peak? Editorial page: https://historyofmarket.com/mag7/mag7-ai-valuation/",
        "tags": [
          "mag7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 51678,
        "x-modified": "2026-09-03T07:53:02.474221+00:00",
        "x-panels": [
          "mag7_mag7_ai_valuation"
        ]
      }
    },
    "/api/mag7/concentration.json": {
      "get": {
        "operationId": "get_mag7_concentration",
        "summary": "Magnificent 7 share of S&P 500 float-adjusted market cap",
        "description": "Backs the panel: “Magnificent 7 share of S&P 500 float-adjusted market cap”. Answers: How much of the S&P 500 do the Magnificent 7 represent over time? Editorial page: https://historyofmarket.com/mag7/mag7-concentration/",
        "tags": [
          "mag7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2969,
        "x-modified": "2026-09-03T07:53:02.428154+00:00",
        "x-panels": [
          "mag7_mag7_concentration"
        ]
      }
    },
    "/api/mag7/correlation.json": {
      "get": {
        "operationId": "get_mag7_correlation",
        "summary": "Dataset mag7/correlation",
        "description": "Dataset `mag7/correlation`.",
        "tags": [
          "mag7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 56919,
        "x-modified": "2026-09-03T07:53:02.471344+00:00"
      }
    },
    "/api/mag7/drawdown.json": {
      "get": {
        "operationId": "get_mag7_drawdown",
        "summary": "Dataset mag7/drawdown",
        "description": "Dataset `mag7/drawdown`.",
        "tags": [
          "mag7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 973024,
        "x-modified": "2026-09-03T07:53:02.468062+00:00"
      }
    },
    "/api/mag7/index.json": {
      "get": {
        "operationId": "get_mag7_index",
        "summary": "Dataset mag7/index",
        "description": "Dataset `mag7/index`.",
        "tags": [
          "mag7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 383135,
        "x-modified": "2026-09-03T07:53:02.427651+00:00"
      }
    },
    "/api/mag7/predecessors.json": {
      "get": {
        "operationId": "get_mag7_predecessors",
        "summary": "Mag 7 lineage — Nifty Fifty → FANG → Magnificent 7",
        "description": "Backs the panel: “Mag 7 lineage — Nifty Fifty → FANG → Magnificent 7”. Answers: How does the Magnificent 7 compare to previous generations of 'unbeatable' US stock baskets? Editorial page: https://historyofmarket.com/mag7/mag7-predecessors/",
        "tags": [
          "mag7"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 7307,
        "x-modified": "2026-09-03T07:53:02.471698+00:00",
        "x-panels": [
          "mag7_mag7_predecessors"
        ]
      }
    },
    "/api/market-pulse.json": {
      "get": {
        "operationId": "get_market_pulse",
        "summary": "Dataset market-pulse",
        "description": "Dataset `market-pulse`.",
        "tags": [
          "misc"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 506,
        "x-modified": "2026-09-03T07:53:02.493172+00:00"
      }
    },
    "/api/nasdaq/100.json": {
      "get": {
        "operationId": "get_nasdaq_100",
        "summary": "Nasdaq 100 constituent return rankings (1W / 1M / YTD / 1Y)",
        "description": "Backs 4 panels: “Nasdaq 100 constituent return rankings (1W / 1M / YTD / 1Y)”, “All 101 Nasdaq 100 constituents on one chart”, “Nasdaq 100 top-25 holdings & cumulative weight”, “Nasdaq 100 constituents & weight distribution”. Answers: Which Nasdaq 100 names are leading or lagging over week, month, year-to-date, and trailing-year windows? What companies are in the Nasdaq 100 and how have they performed? How concentrated is the Nasdaq 100 at the top? Which companies make up the Nasdaq 100 and how is the weight distributed? Editorial page: https://historyofmarket.com/nasdaq/nasdaq100-ytd/",
        "tags": [
          "nasdaq"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 39959,
        "x-modified": "2026-09-03T07:53:02.062845+00:00",
        "x-panels": [
          "nasdaq_nasdaq100_ytd",
          "nasdaq_ndx_scatter",
          "nasdaq_nasdaq100_weights",
          "nasdaq_nasdaq100_companies"
        ]
      }
    },
    "/api/nasdaq/composite.json": {
      "get": {
        "operationId": "get_nasdaq_composite",
        "summary": "Nasdaq Composite since 1971",
        "description": "Backs 2 panels: “Nasdaq Composite since 1971”, “Nasdaq Composite log year-over-year”. Answers: How has the Nasdaq Composite grown since its inception? How frequently does the Nasdaq cross between bull and bear regimes? Editorial page: https://historyofmarket.com/nasdaq/nasdaq-composite/",
        "tags": [
          "nasdaq"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 579968,
        "x-modified": "2026-09-03T07:53:02.061264+00:00",
        "x-panels": [
          "nasdaq_nasdaq_composite",
          "nasdaq_nasdaq_logyoy"
        ]
      }
    },
    "/api/ndx/annual-returns.json": {
      "get": {
        "operationId": "get_ndx_annual_returns",
        "summary": "Nasdaq 100 annual return distribution",
        "description": "Backs the panel: “Nasdaq 100 annual return distribution”. Answers: How wide is the spread of Nasdaq 100 annual returns? Editorial page: https://historyofmarket.com/nasdaq/ndx-annual-dist/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2624,
        "x-modified": "2026-09-03T07:53:02.105857+00:00",
        "x-panels": [
          "nasdaq_ndx_annual_dist"
        ]
      }
    },
    "/api/ndx/annual-tr.json": {
      "get": {
        "operationId": "get_ndx_annual_tr",
        "summary": "QQQ (Nasdaq 100) annual returns since 1999",
        "description": "Backs 2 panels: “QQQ (Nasdaq 100) annual returns since 1999”, “Nasdaq 100 buy-year / sell-year annualized matrix”. Answers: What's the annual return distribution of QQQ? If I had bought QQQ in year X and held until year Y, what's the annualized return? Editorial page: https://historyofmarket.com/nasdaq/nasdaq100-annual/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2779,
        "x-modified": "2026-09-03T07:53:02.106119+00:00",
        "x-panels": [
          "nasdaq_nasdaq100_annual",
          "nasdaq_ndx_matrix"
        ]
      }
    },
    "/api/ndx/breadth.json": {
      "get": {
        "operationId": "get_ndx_breadth",
        "summary": "Nasdaq 100 breadth — % of members above 50/200-day MA",
        "description": "Backs the panel: “Nasdaq 100 breadth — % of members above 50/200-day MA”. Answers: How wide is the current tech rally across Nasdaq 100 members? Editorial page: https://historyofmarket.com/nasdaq/ndx-breadth/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 58514,
        "x-modified": "2026-09-03T07:53:02.156695+00:00",
        "x-panels": [
          "nasdaq_ndx_breadth"
        ]
      }
    },
    "/api/ndx/changes.json": {
      "get": {
        "operationId": "get_ndx_changes",
        "summary": "Nasdaq 100 constituent adds and drops",
        "description": "Backs the panel: “Nasdaq 100 constituent adds and drops”. Answers: Which companies were added to or removed from the Nasdaq 100? Editorial page: https://historyofmarket.com/nasdaq/ndx-changes/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 31903,
        "x-modified": "2026-09-03T07:53:02.107595+00:00",
        "x-panels": [
          "nasdaq_ndx_changes"
        ]
      }
    },
    "/api/ndx/daily-distribution.json": {
      "get": {
        "operationId": "get_ndx_daily_distribution",
        "summary": "Nasdaq 100 daily return distribution vs the normal curve",
        "description": "Backs the panel: “Nasdaq 100 daily return distribution vs the normal curve”. Answers: How volatile are Nasdaq 100 daily returns compared with the S&P 500? Editorial page: https://historyofmarket.com/nasdaq/ndx-daily-distribution/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 8039,
        "x-modified": "2026-09-03T07:53:02.106653+00:00",
        "x-panels": [
          "nasdaq_ndx_daily_distribution"
        ]
      }
    },
    "/api/ndx/daily-extremes.json": {
      "get": {
        "operationId": "get_ndx_daily_extremes",
        "summary": "The handful of Nasdaq 100 days that set the cumulative multiple",
        "description": "Backs the panel: “The handful of Nasdaq 100 days that set the cumulative multiple”. Answers: How much of the Nasdaq 100's return comes from a few dozen days? Editorial page: https://historyofmarket.com/nasdaq/ndx-daily-extremes/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 602,
        "x-modified": "2026-09-03T07:53:02.106769+00:00",
        "x-panels": [
          "nasdaq_ndx_daily_extremes"
        ]
      }
    },
    "/api/ndx/daily.json": {
      "get": {
        "operationId": "get_ndx_daily",
        "summary": "Dataset ndx/daily",
        "description": "Dataset `ndx/daily`.",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 430519,
        "x-modified": "2026-09-03T07:53:02.080491+00:00"
      }
    },
    "/api/ndx/drawdowns.json": {
      "get": {
        "operationId": "get_ndx_drawdowns",
        "summary": "Nasdaq 100 historical drawdowns",
        "description": "Backs the panel: “Nasdaq 100 historical drawdowns”. Answers: How deep was the dot-com drawdown for the Nasdaq 100? Editorial page: https://historyofmarket.com/nasdaq/ndx-drawdown/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 16259,
        "x-modified": "2026-09-03T07:53:02.108254+00:00",
        "x-panels": [
          "nasdaq_ndx_drawdown"
        ]
      }
    },
    "/api/ndx/driver-decomp.json": {
      "get": {
        "operationId": "get_ndx_driver_decomp",
        "summary": "Nasdaq 100 annual rerating × revision decomposition",
        "description": "Backs the panel: “Nasdaq 100 annual rerating × revision decomposition”. Answers: In a given year, was the Nasdaq 100's return driven by forward-PE multiple change or by forward-EPS revision? Editorial page: https://historyofmarket.com/nasdaq/ndx-driver-decomp/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 4438,
        "x-modified": "2026-09-03T07:53:02.476775+00:00",
        "x-panels": [
          "nasdaq_ndx_driver_decomp"
        ]
      }
    },
    "/api/ndx/forward-pe.json": {
      "get": {
        "operationId": "get_ndx_forward_pe",
        "summary": "Nasdaq 100 forward PE",
        "description": "Backs the panel: “Nasdaq 100 forward PE”. Answers: How stretched is the Nasdaq 100 on forward earnings, and how does today compare to the dot-com peak? Editorial page: https://historyofmarket.com/nasdaq/ndx-forward-pe/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 55480,
        "x-modified": "2026-09-03T07:53:02.154338+00:00",
        "x-panels": [
          "nasdaq_ndx_forward_pe"
        ]
      }
    },
    "/api/ndx/intrayear-dd.json": {
      "get": {
        "operationId": "get_ndx_intrayear_dd",
        "summary": "Nasdaq 100 intrayear drawdown vs year-end return",
        "description": "Backs the panel: “Nasdaq 100 intrayear drawdown vs year-end return”. Answers: How big does an intrayear Nasdaq drop usually get before the year ends positive? Editorial page: https://historyofmarket.com/nasdaq/ndx-intrayear-dd/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 7292,
        "x-modified": "2026-09-03T07:53:02.108588+00:00",
        "x-panels": [
          "nasdaq_ndx_intrayear_dd"
        ]
      }
    },
    "/api/ndx/monthly.json": {
      "get": {
        "operationId": "get_ndx_monthly",
        "summary": "Nasdaq 100 monthly return heatmap",
        "description": "Backs the panel: “Nasdaq 100 monthly return heatmap”. Answers: Which calendar months have been kindest to the Nasdaq 100? Editorial page: https://historyofmarket.com/nasdaq/ndx-monthly/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 8731,
        "x-modified": "2026-09-03T07:53:02.138526+00:00",
        "x-panels": [
          "nasdaq_ndx_monthly"
        ]
      }
    },
    "/api/ndx/price.json": {
      "get": {
        "operationId": "get_ndx_price",
        "summary": "Dataset ndx/price",
        "description": "Dataset `ndx/price`.",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 642744,
        "x-modified": "2026-09-03T07:53:02.105357+00:00"
      }
    },
    "/api/ndx/rolling5y.json": {
      "get": {
        "operationId": "get_ndx_rolling5y",
        "summary": "Nasdaq 100 five-year rolling annualized return",
        "description": "Backs the panel: “Nasdaq 100 five-year rolling annualized return”. Answers: How often has a five-year hold of QQQ lost money? Editorial page: https://historyofmarket.com/nasdaq/ndx-rolling/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 47847,
        "x-modified": "2026-09-03T07:53:02.140098+00:00",
        "x-panels": [
          "nasdaq_ndx_rolling"
        ]
      }
    },
    "/api/ndx/volatility.json": {
      "get": {
        "operationId": "get_ndx_volatility",
        "summary": "Nasdaq 100 realized volatility",
        "description": "Backs the panel: “Nasdaq 100 realized volatility”. Answers: How much more volatile is the Nasdaq 100 than the S&P 500? Editorial page: https://historyofmarket.com/nasdaq/ndx-volatility/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 778612,
        "x-modified": "2026-09-03T07:53:02.137729+00:00",
        "x-panels": [
          "nasdaq_ndx_volatility"
        ]
      }
    },
    "/api/ndx/vxn.json": {
      "get": {
        "operationId": "get_ndx_vxn",
        "summary": "VXN — CBOE Nasdaq 100 Volatility Index",
        "description": "Backs the panel: “VXN — CBOE Nasdaq 100 Volatility Index”. Answers: What's the implied-volatility benchmark for the Nasdaq 100? Editorial page: https://historyofmarket.com/nasdaq/ndx-vxn/",
        "tags": [
          "ndx"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 257159,
        "x-modified": "2026-09-03T07:53:02.151579+00:00",
        "x-panels": [
          "nasdaq_ndx_vxn"
        ]
      }
    },
    "/api/profile.json": {
      "get": {
        "operationId": "get_profile",
        "summary": "Site profile — question → dataset bridge",
        "description": "Single-file AI entry point: what the site is best for, which panel answers which question, which dataset backs each panel, freshness and licence. Validates against /api/profile.schema.json.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/profile.schema.json": {
      "get": {
        "operationId": "get_profile_schema",
        "summary": "JSON Schema for profile.json",
        "description": "Draft JSON Schema that /api/profile.json validates against.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/qqq/return-details.json": {
      "get": {
        "operationId": "get_qqq_return_details",
        "summary": "QQQ total return decomposition",
        "description": "Backs the panel: “QQQ total return decomposition”. Answers: What share of QQQ's total return comes from price vs dividend vs buyback? Editorial page: https://historyofmarket.com/nasdaq/ndx-return-details/",
        "tags": [
          "qqq"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 3550,
        "x-modified": "2026-09-03T07:53:02.156978+00:00",
        "x-panels": [
          "nasdaq_ndx_return_details"
        ]
      }
    },
    "/api/recessions.json": {
      "get": {
        "operationId": "get_recessions",
        "summary": "Dataset recessions",
        "description": "Dataset `recessions`.",
        "tags": [
          "misc"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 58955,
        "x-modified": "2026-09-03T07:53:02.181103+00:00"
      }
    },
    "/api/sectors/forward-pe.json": {
      "get": {
        "operationId": "get_sectors_forward_pe",
        "summary": "Philadelphia Semiconductor Index (SOX) forward PE",
        "description": "Backs 3 panels: “Philadelphia Semiconductor Index (SOX) forward PE”, “Information Technology sector forward PE since 1998”, “Financials sector forward PE since 1996”. Answers: What is the forward PE ratio of semiconductor stocks? What is the forward PE ratio of the technology sector? What is the forward PE ratio of the financial sector? Editorial page: https://historyofmarket.com/semi/semi-fwdpe/",
        "tags": [
          "sectors"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 128259,
        "x-modified": "2026-09-03T07:53:02.482863+00:00",
        "x-panels": [
          "semi_semi_fwdpe",
          "xlk_xlk_fwdpe",
          "fin_fin_fwdpe"
        ]
      }
    },
    "/api/semi/annual-returns.json": {
      "get": {
        "operationId": "get_semi_annual_returns",
        "summary": "SOX annual return ledger",
        "description": "Backs the panel: “SOX annual return ledger”. Answers: What's the year-by-year return record of the Philadelphia Semiconductor Index? Editorial page: https://historyofmarket.com/semi/semi-annual/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2145,
        "x-modified": "2026-09-03T07:53:02.224784+00:00",
        "x-panels": [
          "semi_semi_annual"
        ]
      }
    },
    "/api/semi/annual-tr.json": {
      "get": {
        "operationId": "get_semi_annual_tr",
        "summary": "SOX annual return distribution",
        "description": "Backs the panel: “SOX annual return distribution”. Answers: How fat are the tails of semiconductor annual returns? Editorial page: https://historyofmarket.com/semi/semi-annual-dist/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2444,
        "x-modified": "2026-09-03T07:53:02.225086+00:00",
        "x-panels": [
          "semi_semi_annual_dist"
        ]
      }
    },
    "/api/semi/composition.json": {
      "get": {
        "operationId": "get_semi_composition",
        "summary": "SOX 30 constituents by sub-industry",
        "description": "Backs 2 panels: “SOX 30 constituents by sub-industry”, “Memory cohort — DRAM / NAND / HBM split three ways”. Answers: What's actually inside the Philadelphia Semiconductor Index? Why is there only one US-listed pure memory play in SOX? Editorial page: https://historyofmarket.com/semi/semi-composition/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 8806,
        "x-modified": "2026-09-03T07:53:02.227692+00:00",
        "x-panels": [
          "semi_semi_composition",
          "semi_semi_memory"
        ]
      }
    },
    "/api/semi/drawdowns.json": {
      "get": {
        "operationId": "get_semi_drawdowns",
        "summary": "Dataset semi/drawdowns",
        "description": "Dataset `semi/drawdowns`.",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 14607,
        "x-modified": "2026-09-03T07:53:02.227344+00:00"
      }
    },
    "/api/semi/etf-compare.json": {
      "get": {
        "operationId": "get_semi_etf_compare",
        "summary": "SOXX vs SMH — holdings overlap and ten-year returns",
        "description": "Backs the panel: “SOXX vs SMH — holdings overlap and ten-year returns”. Answers: What is the difference between the SOXX and SMH ETFs? Editorial page: https://historyofmarket.com/semi/semi-soxx-compare/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 14686,
        "x-modified": "2026-09-03T07:53:02.483853+00:00",
        "x-panels": [
          "semi_semi_soxx_compare"
        ]
      }
    },
    "/api/semi/intrayear-dd.json": {
      "get": {
        "operationId": "get_semi_intrayear_dd",
        "summary": "SOX intrayear drawdown vs year-end return",
        "description": "Backs the panel: “SOX intrayear drawdown vs year-end return”. Answers: How big is the average intrayear drop in semiconductors, even in up years? Editorial page: https://historyofmarket.com/semi/semi-intrayear-dd/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 5822,
        "x-modified": "2026-09-03T07:53:02.226679+00:00",
        "x-panels": [
          "semi_semi_intrayear_dd"
        ]
      }
    },
    "/api/semi/memory-valuation.json": {
      "get": {
        "operationId": "get_semi_memory_valuation",
        "summary": "Memory & HBM TTM PE vs 1999 dotcom peak",
        "description": "Backs the panel: “Memory & HBM TTM PE vs 1999 dotcom peak”. Answers: Is today's AI semiconductor valuation a Cisco-1999 repeat? Editorial page: https://historyofmarket.com/semi/semi-memory-valuation/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 29566,
        "x-modified": "2026-09-03T07:53:02.475785+00:00",
        "x-panels": [
          "semi_semi_memory_valuation"
        ]
      }
    },
    "/api/semi/monthly.json": {
      "get": {
        "operationId": "get_semi_monthly",
        "summary": "Dataset semi/monthly",
        "description": "Dataset `semi/monthly`.",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 6878,
        "x-modified": "2026-09-03T07:53:02.224555+00:00"
      }
    },
    "/api/semi/price.json": {
      "get": {
        "operationId": "get_semi_price",
        "summary": "Philadelphia Semiconductor Index since 1994",
        "description": "Backs the panel: “Philadelphia Semiconductor Index since 1994”. Answers: How has the PHLX Semiconductor Index (SOX) traded since its 1994 inception? Editorial page: https://historyofmarket.com/semi/semi-price/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 504130,
        "x-modified": "2026-09-03T07:53:02.199656+00:00",
        "x-panels": [
          "semi_semi_price"
        ]
      }
    },
    "/api/semi/ratios.json": {
      "get": {
        "operationId": "get_semi_ratios",
        "summary": "SOX / SPX, SOX / XLK, XLK / SPX rebased to 100 at YE-1999",
        "description": "Backs the panel: “SOX / SPX, SOX / XLK, XLK / SPX rebased to 100 at YE-1999”. Answers: How does semis' relative strength against the broad market and the tech sector look across cycles? Editorial page: https://historyofmarket.com/semi/semi-ratios/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 935078,
        "x-modified": "2026-09-03T07:53:02.263632+00:00",
        "x-panels": [
          "semi_semi_ratios"
        ]
      }
    },
    "/api/semi/rolling5y.json": {
      "get": {
        "operationId": "get_semi_rolling5y",
        "summary": "Dataset semi/rolling5y",
        "description": "Dataset `semi/rolling5y`.",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 36160,
        "x-modified": "2026-09-03T07:53:02.226345+00:00"
      }
    },
    "/api/semi/smh.json": {
      "get": {
        "operationId": "get_semi_smh",
        "summary": "VanEck Semiconductor ETF (SMH) holdings",
        "description": "Backs the panel: “VanEck Semiconductor ETF (SMH) holdings”. Answers: What does SMH actually own and at what weight? Editorial page: https://historyofmarket.com/semi/semi-smh/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 6466,
        "x-modified": "2026-09-03T07:53:02.228043+00:00",
        "x-panels": [
          "semi_semi_smh"
        ]
      }
    },
    "/api/semi/soxx.json": {
      "get": {
        "operationId": "get_semi_soxx",
        "summary": "SOXX — iShares Semiconductor ETF at the wrapper layer",
        "description": "Backs the panel: “SOXX — iShares Semiconductor ETF at the wrapper layer”. Answers: What is in the SOXX semiconductor ETF? Editorial page: https://historyofmarket.com/semi/semi-soxx/",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 1573,
        "x-modified": "2026-09-03T07:53:02.483124+00:00",
        "x-panels": [
          "semi_semi_soxx"
        ]
      }
    },
    "/api/semi/volatility.json": {
      "get": {
        "operationId": "get_semi_volatility",
        "summary": "Dataset semi/volatility",
        "description": "Dataset `semi/volatility`.",
        "tags": [
          "semi"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 610192,
        "x-modified": "2026-09-03T07:53:02.223876+00:00"
      }
    },
    "/api/sp500/annual-returns.json": {
      "get": {
        "operationId": "get_sp500_annual_returns",
        "summary": "S&P 500 annual returns since 1928",
        "description": "Backs 2 panels: “S&P 500 annual returns since 1928”, “S&P 500 annual return distribution”. Answers: How has the S&P 500 performed each year since 1928? How often does the S&P 500 actually return its average? Editorial page: https://historyofmarket.com/sp500/annual/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 5792,
        "x-modified": "2026-09-03T07:53:02.026988+00:00",
        "x-panels": [
          "sp500_annual",
          "sp500_annual_dist"
        ]
      }
    },
    "/api/sp500/annual-tr.json": {
      "get": {
        "operationId": "get_sp500_annual_tr",
        "summary": "Buy-year / sell-year annualized return matrix",
        "description": "Backs 2 panels: “Buy-year / sell-year annualized return matrix”, “Five-year rolling annualized return”. Answers: If I had bought the S&P 500 in year X and sold in year Y, what's the annualized return? How often has a five-year hold of the S&P 500 lost money? Editorial page: https://historyofmarket.com/sp500/annualized-matrix/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 4984,
        "x-modified": "2026-09-03T07:53:02.027371+00:00",
        "x-panels": [
          "sp500_annualized_matrix",
          "sp500_rolling"
        ]
      }
    },
    "/api/sp500/breadth.json": {
      "get": {
        "operationId": "get_sp500_breadth",
        "summary": "Bull-market breadth — % of members above 50/200-day MA",
        "description": "Backs the panel: “Bull-market breadth — % of members above 50/200-day MA”. Answers: How many S&P 500 stocks are participating in the current rally? Editorial page: https://historyofmarket.com/sp500/sp500-breadth/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 57719,
        "x-modified": "2026-09-03T07:53:02.037010+00:00",
        "x-panels": [
          "sp500_sp500_breadth"
        ]
      }
    },
    "/api/sp500/century.json": {
      "get": {
        "operationId": "get_sp500_century",
        "summary": "S&P 500 log year-over-year (bull / bear boundary)",
        "description": "Backs the panel: “S&P 500 log year-over-year (bull / bear boundary)”. Answers: How many bull-bear transitions has the S&P 500 had since 1928? Editorial page: https://historyofmarket.com/sp500/sp500-logyoy/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 48395,
        "x-modified": "2026-09-03T07:53:01.930203+00:00",
        "x-panels": [
          "sp500_sp500_logyoy"
        ]
      }
    },
    "/api/sp500/changes.json": {
      "get": {
        "operationId": "get_sp500_changes",
        "summary": "S&P 500 constituent change log",
        "description": "Backs the panel: “S&P 500 constituent change log”. Answers: Which companies were recently added to or removed from the S&P 500? Editorial page: https://historyofmarket.com/sp500/changes/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 155025,
        "x-modified": "2026-09-03T07:53:02.031252+00:00",
        "x-panels": [
          "sp500_changes"
        ]
      }
    },
    "/api/sp500/constituents.json": {
      "get": {
        "operationId": "get_sp500_constituents",
        "summary": "S&P 500 constituents scatter — market cap × 1y return × index weight",
        "description": "Backs the panel: “S&P 500 constituents scatter — market cap × 1y return × index weight”. Answers: Which S&P 500 names contributed the most to last year's index return? Editorial page: https://historyofmarket.com/sp500/scatter/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 92630,
        "x-modified": "2026-09-03T07:53:02.034739+00:00",
        "x-panels": [
          "sp500_scatter"
        ]
      }
    },
    "/api/sp500/daily-distribution.json": {
      "get": {
        "operationId": "get_sp500_daily_distribution",
        "summary": "S&P 500 daily return distribution vs the normal curve",
        "description": "Backs the panel: “S&P 500 daily return distribution vs the normal curve”. Answers: How often does the S&P 500 move more than 3% in a single day? Editorial page: https://historyofmarket.com/sp500/sp500-daily-distribution/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 5263,
        "x-modified": "2026-09-03T07:53:02.027764+00:00",
        "x-panels": [
          "sp500_sp500_daily_distribution"
        ]
      }
    },
    "/api/sp500/daily-extremes.json": {
      "get": {
        "operationId": "get_sp500_daily_extremes",
        "summary": "What the best and worst days do to compounding",
        "description": "Backs the panel: “What the best and worst days do to compounding”. Answers: What happens to returns if you miss the best days in the market? Editorial page: https://historyofmarket.com/sp500/sp500-daily-extremes/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 601,
        "x-modified": "2026-09-03T07:53:02.027916+00:00",
        "x-panels": [
          "sp500_sp500_daily_extremes"
        ]
      }
    },
    "/api/sp500/drawdowns.json": {
      "get": {
        "operationId": "get_sp500_drawdowns",
        "summary": "S&P 500 historical drawdowns",
        "description": "Backs the panel: “S&P 500 historical drawdowns”. Answers: What were the worst S&P 500 drawdowns and how long did recovery take? Editorial page: https://historyofmarket.com/sp500/drawdown/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 18509,
        "x-modified": "2026-09-03T07:53:01.999601+00:00",
        "x-panels": [
          "sp500_drawdown"
        ]
      }
    },
    "/api/sp500/driver-decomp.json": {
      "get": {
        "operationId": "get_sp500_driver_decomp",
        "summary": "S&P 500 annual valuation × EPS driver decomposition",
        "description": "Backs the panel: “S&P 500 annual valuation × EPS driver decomposition”. Answers: In a given year, was the S&P 500's return driven by multiple expansion or by earnings growth? Editorial page: https://historyofmarket.com/sp500/sp500-driver-decomp/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 15606,
        "x-modified": "2026-09-03T07:53:02.476521+00:00",
        "x-panels": [
          "sp500_sp500_driver_decomp"
        ]
      }
    },
    "/api/sp500/eps.json": {
      "get": {
        "operationId": "get_sp500_eps",
        "summary": "S&P 500 trailing twelve-month EPS",
        "description": "Backs the panel: “S&P 500 trailing twelve-month EPS”. Answers: How have S&P 500 earnings grown over the long run? Editorial page: https://historyofmarket.com/sp500/eps/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 6380,
        "x-modified": "2026-09-03T07:53:02.022319+00:00",
        "x-panels": [
          "sp500_eps"
        ]
      }
    },
    "/api/sp500/forward-pe.json": {
      "get": {
        "operationId": "get_sp500_forward_pe",
        "summary": "S&P 500 trailing PE and forward PE",
        "description": "Backs the panel: “S&P 500 trailing PE and forward PE”. Answers: How does the S&P 500 look on trailing earnings vs. forward consensus today? Editorial page: https://historyofmarket.com/sp500/forward-pe/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 70841,
        "x-modified": "2026-09-03T07:53:02.025586+00:00",
        "x-panels": [
          "sp500_forward_pe"
        ]
      }
    },
    "/api/sp500/intrayear-dd.json": {
      "get": {
        "operationId": "get_sp500_intrayear_dd",
        "summary": "Intrayear drawdown vs year-end return",
        "description": "Backs the panel: “Intrayear drawdown vs year-end return”. Answers: How big is the average intrayear drop, and does the S&P 500 still finish positive? Editorial page: https://historyofmarket.com/sp500/intrayear-dd/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 16246,
        "x-modified": "2026-09-03T07:53:02.026579+00:00",
        "x-panels": [
          "sp500_intrayear_dd"
        ]
      }
    },
    "/api/sp500/monthly.json": {
      "get": {
        "operationId": "get_sp500_monthly",
        "summary": "S&P 500 monthly return heatmap with win probabilities",
        "description": "Backs the panel: “S&P 500 monthly return heatmap with win probabilities”. Answers: Which months are historically friendliest for the S&P 500? Editorial page: https://historyofmarket.com/sp500/monthly/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 5771,
        "x-modified": "2026-09-03T07:53:01.931198+00:00",
        "x-panels": [
          "sp500_monthly"
        ]
      }
    },
    "/api/sp500/pe.json": {
      "get": {
        "operationId": "get_sp500_pe",
        "summary": "Shiller CAPE (PE10) since 1871",
        "description": "Backs the panel: “Shiller CAPE (PE10) since 1871”. Answers: What is the current Shiller CAPE percentile vs. history? Editorial page: https://historyofmarket.com/sp500/pe/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 148811,
        "x-modified": "2026-09-03T07:53:02.021801+00:00",
        "x-panels": [
          "sp500_pe"
        ]
      }
    },
    "/api/sp500/price.json": {
      "get": {
        "operationId": "get_sp500_price",
        "summary": "Dataset sp500/price",
        "description": "Dataset `sp500/price`.",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 1519650,
        "x-modified": "2026-09-03T07:53:01.928156+00:00"
      }
    },
    "/api/sp500/return-details.json": {
      "get": {
        "operationId": "get_sp500_return_details",
        "summary": "Total return decomposition: price + dividend + buyback",
        "description": "Backs the panel: “Total return decomposition: price + dividend + buyback”. Answers: How much of S&P 500 total return now comes from buybacks vs dividends? Editorial page: https://historyofmarket.com/sp500/return-details/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 3561,
        "x-modified": "2026-09-03T07:53:02.025918+00:00",
        "x-panels": [
          "sp500_return_details"
        ]
      }
    },
    "/api/sp500/roe.json": {
      "get": {
        "operationId": "get_sp500_roe",
        "summary": "S&P 500 return on equity",
        "description": "Backs the panel: “S&P 500 return on equity”. Answers: How profitable is the S&P 500 on book equity? Editorial page: https://historyofmarket.com/sp500/roe/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 3171,
        "x-modified": "2026-09-03T07:53:02.022562+00:00",
        "x-panels": [
          "sp500_roe"
        ]
      }
    },
    "/api/sp500/rules.json": {
      "get": {
        "operationId": "get_sp500_rules",
        "summary": "S&P 500 methodology",
        "description": "Backs the panel: “S&P 500 methodology”. Answers: What are the eligibility rules for inclusion in the S&P 500? Editorial page: https://historyofmarket.com/sp500/rules/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 8756,
        "x-modified": "2026-09-03T07:53:02.031583+00:00",
        "x-panels": [
          "sp500_rules"
        ]
      }
    },
    "/api/sp500/sectors.json": {
      "get": {
        "operationId": "get_sp500_sectors",
        "summary": "S&P 500 GICS sector weights",
        "description": "Backs the panel: “S&P 500 GICS sector weights”. Answers: What is the GICS sector composition of the S&P 500 right now? Editorial page: https://historyofmarket.com/sp500/sectors/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 3606,
        "x-modified": "2026-09-03T07:53:02.028154+00:00",
        "x-panels": [
          "sp500_sectors"
        ]
      }
    },
    "/api/sp500/vix.json": {
      "get": {
        "operationId": "get_sp500_vix",
        "summary": "VIX vs S&P 500",
        "description": "Backs the panel: “VIX vs S&P 500”. Answers: What VIX level historically marks crisis pricing? Editorial page: https://historyofmarket.com/sp500/vix/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 369781,
        "x-modified": "2026-09-03T07:53:02.015494+00:00",
        "x-panels": [
          "sp500_vix"
        ]
      }
    },
    "/api/sp500/volatility.json": {
      "get": {
        "operationId": "get_sp500_volatility",
        "summary": "S&P 500 realized volatility (20d / 60d)",
        "description": "Backs the panel: “S&P 500 realized volatility (20d / 60d)”. Answers: What is the long-term realized volatility of the S&P 500? Editorial page: https://historyofmarket.com/sp500/volatility/",
        "tags": [
          "sp500"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 1844546,
        "x-modified": "2026-09-03T07:53:01.998092+00:00",
        "x-panels": [
          "sp500_volatility"
        ]
      }
    },
    "/api/static/bessembinder-2026.json": {
      "get": {
        "operationId": "get_static_bessembinder_2026",
        "summary": "How few firms made the century, 1926–2025",
        "description": "Backs 4 panels: “How few firms made the century, 1926–2025”, “The wealth waterfall · 29,081 firms sorted worst to best”, “The mean is a fortune, the median is a loss”, “Ten decades of the median stock, 1926–2025”. Answers: How many companies account for the entire net wealth creation of the U.S. stock market? What share of U.S. companies actually created shareholder wealth above Treasury bills? What return did the typical U.S. stock actually deliver over its own lifetime? Has the typical stock gotten worse at beating the market over the past century? Editorial page: https://historyofmarket.com/overview/bes-concentration/",
        "tags": [
          "static"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-panels": [
          "overview_bes_concentration",
          "overview_bes_waterfall",
          "latest_bes_skewness",
          "latest_bes_decades"
        ]
      }
    },
    "/api/static/ubs-yearbook.json": {
      "get": {
        "operationId": "get_static_ubs_yearbook",
        "summary": "One dollar across 126 years, by asset class",
        "description": "Backs 5 panels: “One dollar across 126 years, by asset class”, “America's share of world equity, GDP and sovereign debt since 1900”, “Equity factor premia by decade, 1900–2025”, “Gold across eleven US equity drawdowns since 1975”, “What the market was made of in 1900 vs today”. Answers: What would one dollar invested in 1900 be worth today in stocks, bonds and cash? How much of the world's stock market is the United States? Which equity factors actually work over the long run? Does gold go up when stocks crash? Which industries dominated the stock market in 1900? Editorial page: https://historyofmarket.com/overview/ubs-asset-ladder/",
        "tags": [
          "static"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-panels": [
          "overview_ubs_asset_ladder",
          "overview_ubs_us_share",
          "overview_ubs_factor_decades",
          "sp500_ubs_gold_dollar",
          "sp500_sector_shift"
        ]
      }
    },
    "/api/tools.json": {
      "get": {
        "operationId": "get_tools",
        "summary": "Tool-call manifest",
        "description": "Every panel as a tool entry (`name`, `description`, `input_schema`, `url`) ready to bind to MCP servers, OpenAI function-calling or Anthropic tool-use. All tools are GET-only with no parameters.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/xlk/annual-returns.json": {
      "get": {
        "operationId": "get_xlk_annual_returns",
        "summary": "XLK year-by-year ledger",
        "description": "Backs the panel: “XLK year-by-year ledger”. Answers: What's the annual return record of the XLK ETF? Editorial page: https://historyofmarket.com/xlk/xlk-annual/",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 1924,
        "x-modified": "2026-09-03T07:53:02.300963+00:00",
        "x-panels": [
          "xlk_xlk_annual"
        ]
      }
    },
    "/api/xlk/annual-tr.json": {
      "get": {
        "operationId": "get_xlk_annual_tr",
        "summary": "XLK annual return distribution",
        "description": "Backs the panel: “XLK annual return distribution”. Answers: How do XLK's annual returns spread compared to semis? Editorial page: https://historyofmarket.com/xlk/xlk-annual-dist/",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2287,
        "x-modified": "2026-09-03T07:53:02.301186+00:00",
        "x-panels": [
          "xlk_xlk_annual_dist"
        ]
      }
    },
    "/api/xlk/drawdowns.json": {
      "get": {
        "operationId": "get_xlk_drawdowns",
        "summary": "Dataset xlk/drawdowns",
        "description": "Dataset `xlk/drawdowns`.",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 7330,
        "x-modified": "2026-09-03T07:53:02.302969+00:00"
      }
    },
    "/api/xlk/holdings.json": {
      "get": {
        "operationId": "get_xlk_holdings",
        "summary": "XLK top holdings & cumulative weight",
        "description": "Backs the panel: “XLK top holdings & cumulative weight”. Answers: How concentrated is XLK at the top? Editorial page: https://historyofmarket.com/xlk/xlk-holdings/",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 3631,
        "x-modified": "2026-09-03T07:53:02.303196+00:00",
        "x-panels": [
          "xlk_xlk_holdings"
        ]
      }
    },
    "/api/xlk/intrayear-dd.json": {
      "get": {
        "operationId": "get_xlk_intrayear_dd",
        "summary": "XLK intrayear drawdown vs year-end return",
        "description": "Backs the panel: “XLK intrayear drawdown vs year-end return”. Answers: How deep do XLK's intrayear drops typically run? Editorial page: https://historyofmarket.com/xlk/xlk-intrayear-dd/",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 5133,
        "x-modified": "2026-09-03T07:53:02.302538+00:00",
        "x-panels": [
          "xlk_xlk_intrayear_dd"
        ]
      }
    },
    "/api/xlk/monthly.json": {
      "get": {
        "operationId": "get_xlk_monthly",
        "summary": "Dataset xlk/monthly",
        "description": "Dataset `xlk/monthly`.",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 6030,
        "x-modified": "2026-09-03T07:53:02.300723+00:00"
      }
    },
    "/api/xlk/price.json": {
      "get": {
        "operationId": "get_xlk_price",
        "summary": "XLK Information Technology ETF since 1998",
        "description": "Backs the panel: “XLK Information Technology ETF since 1998”. Answers: How has the Information Technology sector ETF (XLK) traded since its December 1998 launch? Editorial page: https://historyofmarket.com/xlk/xlk-price/",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 420239,
        "x-modified": "2026-09-03T07:53:02.279898+00:00",
        "x-panels": [
          "xlk_xlk_price"
        ]
      }
    },
    "/api/xlk/reclass-2018.json": {
      "get": {
        "operationId": "get_xlk_reclass_2018",
        "summary": "2018-09-24 GICS communication-services reshuffle",
        "description": "Backs the panel: “2018-09-24 GICS communication-services reshuffle”. Answers: Which companies were moved out of Information Technology in 2018? Editorial page: https://historyofmarket.com/xlk/xlk-reclass/",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 2515,
        "x-modified": "2026-09-03T07:53:02.303338+00:00",
        "x-panels": [
          "xlk_xlk_reclass"
        ]
      }
    },
    "/api/xlk/rolling5y.json": {
      "get": {
        "operationId": "get_xlk_rolling5y",
        "summary": "Dataset xlk/rolling5y",
        "description": "Dataset `xlk/rolling5y`.",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 29284,
        "x-modified": "2026-09-03T07:53:02.302263+00:00"
      }
    },
    "/api/xlk/volatility.json": {
      "get": {
        "operationId": "get_xlk_volatility",
        "summary": "Dataset xlk/volatility",
        "description": "Dataset `xlk/volatility`.",
        "tags": [
          "xlk"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 511469,
        "x-modified": "2026-09-03T07:53:02.300101+00:00"
      }
    },
    "/api/yield-curve.json": {
      "get": {
        "operationId": "get_yield_curve",
        "summary": "Dataset yield-curve",
        "description": "Dataset `yield-curve`.",
        "tags": [
          "misc"
        ],
        "responses": {
          "200": {
            "description": "The whole dataset. Static file; honours `If-None-Match` (ETag).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Dataset"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "x-bytes": 869970,
        "x-modified": "2026-09-03T07:53:02.408765+00:00"
      }
    }
  },
  "components": {
    "schemas": {
      "Dataset": {
        "type": "object",
        "description": "Panel payload. Shapes differ per dataset; most carry an `updated` ISO date plus a `series` (daily `{date, close, …}`) or `years` (annual `{year, ret, …}`) array and a `source` block naming provenance and method. Treat unknown keys as data, not errors.",
        "properties": {
          "updated": {
            "type": "string",
            "description": "ISO 8601 date of the last successful refresh of this dataset."
          },
          "source": {
            "type": "object",
            "description": "Provenance: `method` (how the number is computed), `constituents` (universe), upstream publisher names."
          }
        },
        "additionalProperties": true
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "status",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "not_found"
                ]
              },
              "status": {
                "type": "integer",
                "enum": [
                  404
                ]
              },
              "message": {
                "type": "string"
              },
              "hint": {
                "type": "string",
                "description": "What was probably wrong with the request (e.g. missing `.json`)."
              },
              "resolution": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uri"
                },
                "description": "Where to look next."
              },
              "docs": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    },
    "responses": {
      "NotFound": {
        "description": "No dataset at this path. Body is JSON with recovery links; the `.json` suffix is the usual omission.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "headers": {
      "ETag": {
        "description": "Strong validator; send it back as `If-None-Match` to get 304.",
        "schema": {
          "type": "string"
        }
      },
      "Cache-Control": {
        "description": "`public, max-age=300, stale-while-revalidate=3600`",
        "schema": {
          "type": "string"
        }
      },
      "Access-Control-Allow-Origin": {
        "description": "`*` — fetchable from any origin.",
        "schema": {
          "type": "string"
        }
      }
    }
  }
}
