{
  "openapi": "3.1.0",
  "info": {
    "title": "Vanda Analytics Flow API",
    "description": "High-performance Flow API with Auth0",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://api.vanda-analytics.com",
      "description": "Production server"
    }
  ],
  "paths": {
    "/flow/timeseries": {
      "get": {
        "tags": [
          "Timeseries"
        ],
        "summary": "Get flow timeseries",
        "description": "Observations for one or more series over a date range.\n\n**Units vary by series.** A multi-series response can mix USDmn, shares, contracts and index points, so `metric`, `frequency` and `unit` are on every point rather than on the response. Check the unit before combining values across series.",
        "operationId": "get_timeseries_flow_timeseries_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "series_ids",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned.",
              "title": "Series Ids"
            },
            "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned."
          },
          {
            "name": "metrics",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows.",
              "examples": [
                "buy",
                "buy_raw",
                "buy_value",
                "buy_volume"
              ],
              "title": "Metrics"
            },
            "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows."
          },
          {
            "name": "frequency",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted.",
              "title": "Frequency"
            },
            "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted."
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Start date (ISO). Intraday series cover at most 31 days per request; omit it for the latest 31 days.",
              "title": "Start Date"
            },
            "description": "Start date (ISO). Intraday series cover at most 31 days per request; omit it for the latest 31 days."
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "End date (ISO). Intraday series default to their newest bar.",
              "title": "End Date"
            },
            "description": "End date (ISO). Intraday series default to their newest bar."
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/SortDirectionEnum",
              "description": "Sort order by timestamp",
              "default": "desc"
            },
            "description": "Sort order by timestamp"
          },
          {
            "name": "records_per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 10000,
              "minimum": 1,
              "description": "Records per page",
              "default": 2000,
              "title": "Records Per Page"
            },
            "description": "Records per page"
          },
          {
            "name": "page_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Page number, 1-indexed",
              "default": 1,
              "title": "Page Number"
            },
            "description": "Page number, 1-indexed"
          },
          {
            "name": "transformation",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/TransformationEnum"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Trailing-window transformation; one series per request.",
              "title": "Transformation"
            },
            "description": "Trailing-window transformation; one series per request."
          },
          {
            "name": "window",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/WindowEnum"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window in observations; required with transformation",
              "title": "Window"
            },
            "description": "Window in observations; required with transformation"
          },
          {
            "name": "normalisation",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/NormalisationEnum"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Distribution normalisation",
              "title": "Normalisation"
            },
            "description": "Distribution normalisation"
          },
          {
            "name": "normalisation_period",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/NormalisationPeriodEnum"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Lookback for normalisation; required with normalisation",
              "title": "Normalisation Period"
            },
            "description": "Lookback for normalisation; required with normalisation"
          },
          {
            "name": "dimensions",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Timeseries are history only; a forecast series' history is its neutral cell, so `{\"projection\": 0, \"zscore\": \"All\"}` (or `\"ret\": 0` for gamma) is accepted and changes nothing. Any other cell answers 400: read the cube from /flow/forecast. JSON, because the types matter.",
              "examples": [
                "{\"projection\": 10, \"ret\": -2}"
              ],
              "title": "Dimensions"
            },
            "description": "Timeseries are history only; a forecast series' history is its neutral cell, so `{\"projection\": 0, \"zscore\": \"All\"}` (or `\"ret\": 0` for gamma) is accepted and changes nothing. Any other cell answers 400: read the cube from /flow/forecast. JSON, because the types matter."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeseriesResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/latest": {
      "get": {
        "tags": [
          "Timeseries"
        ],
        "summary": "Get latest flow observation",
        "description": "The newest observation for each series.\n\nRead `staleness_days` alongside the value: coverage is uneven and many series stopped publishing years ago.",
        "operationId": "get_latest_flow_latest_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "series_ids",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned.",
              "title": "Series Ids"
            },
            "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned."
          },
          {
            "name": "metrics",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows.",
              "title": "Metrics"
            },
            "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows."
          },
          {
            "name": "frequency",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted.",
              "title": "Frequency"
            },
            "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Newest observation on or before this date",
              "title": "As Of"
            },
            "description": "Newest observation on or before this date"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LatestResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/availability": {
      "get": {
        "tags": [
          "Timeseries"
        ],
        "summary": "Get flow coverage",
        "description": "First and last observation per series. `row_count` is distinct observations, not stored rows.",
        "operationId": "get_availability_flow_availability_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "series_ids",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned.",
              "title": "Series Ids"
            },
            "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned."
          },
          {
            "name": "metrics",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows.",
              "title": "Metrics"
            },
            "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows."
          },
          {
            "name": "frequency",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted.",
              "title": "Frequency"
            },
            "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AvailabilityResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/timeseries/export": {
      "get": {
        "tags": [
          "Timeseries"
        ],
        "summary": "Export flow timeseries",
        "description": "Full history as CSV or JSON, unpaginated. Each row carries slug, metric and unit.",
        "operationId": "export_timeseries_flow_timeseries_export_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "series_ids",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned.",
              "title": "Series Ids"
            },
            "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned."
          },
          {
            "name": "metrics",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows.",
              "title": "Metrics"
            },
            "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows."
          },
          {
            "name": "frequency",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted.",
              "title": "Frequency"
            },
            "description": "Comma-separated cadences; omit for all. Selects series, not rows. The older dod/wow/mom/qoq names are still accepted."
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Start date (ISO). Intraday series cover at most 31 days per request; omit it for the latest 31 days.",
              "title": "Start Date"
            },
            "description": "Start date (ISO). Intraday series cover at most 31 days per request; omit it for the latest 31 days."
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "End date (ISO). Intraday series default to their newest bar.",
              "title": "End Date"
            },
            "description": "End date (ISO). Intraday series default to their newest bar."
          },
          {
            "name": "export_format",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ExportFormat",
              "description": "Output format",
              "default": "csv"
            },
            "description": "Output format"
          },
          {
            "name": "compression",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/CompressionFormat",
              "description": "Compression",
              "default": "none"
            },
            "description": "Compression"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/forecast/runs": {
      "get": {
        "tags": [
          "Timeseries"
        ],
        "summary": "List forecast runs, horizons and scenarios",
        "description": "What a forecast series can be asked for.\n\nA forecast dataset publishes a **cube**: every combination of a horizon and a z-score scenario for each run date. This returns the axes of that cube — the run dates, the horizons, and the scenario tokens — so a client knows what `/flow/forecast` will accept.\n\nScenario tokens are **strings**: the domain mixes values like `-1.9` with `All` (the unconditional path), `<0` and `>0`.\n\nSeries that publish no cube are refused; use `/flow/timeseries`.",
        "operationId": "get_forecast_axes_flow_forecast_runs_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "series_ids",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned.",
              "title": "Series Ids"
            },
            "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned."
          },
          {
            "name": "records_per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 10000,
              "minimum": 1,
              "description": "Records per page",
              "default": 2000,
              "title": "Records Per Page"
            },
            "description": "Records per page"
          },
          {
            "name": "page_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Page number, 1-indexed",
              "default": 1,
              "title": "Page Number"
            },
            "description": "Page number, 1-indexed"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForecastAxesResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/forecast": {
      "get": {
        "tags": [
          "Timeseries"
        ],
        "summary": "Get one or more scenarios of the forecast cube",
        "description": "One z-score scenario across the requested horizons, for the most recent run unless `run_date` says otherwise.\n\nRows are grouped **one object per horizon**, with every metric nested inside it — a forecast is read as a point on a path, not as a dozen separate rows.\n\n`component` is the systematic strategy (cta, vt, rp, gamma) and is part of the grain — each publishes its own metrics, so one group never mixes them.\n\n`scenario` names a branch of whichever axis the component uses — `zscore` or `ret`. `horizon` is the dataset's own projection: market days ahead of the run date, which is 0.\n\nThere is **no `forecast_date`** — resolving one needs a market calendar we do not hold, so pair `run_date` with `horizon`.\n\nNo transformation or normalisation: a projection is not a series to roll up or re-standardise.",
        "operationId": "get_forecast_flow_forecast_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "series_ids",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned.",
              "title": "Series Ids"
            },
            "description": "Comma-separated identifiers. Accepts slug (preferred), slug without its label, series_label, entity or series_id. All but the first can match several series, and every match is returned."
          },
          {
            "name": "metrics",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows.",
              "examples": [
                "buy",
                "buy_raw",
                "buy_value",
                "buy_volume"
              ],
              "title": "Metrics"
            },
            "description": "Comma-separated metrics; omit for all. A series has one metric, so this selects series rather than filtering rows."
          },
          {
            "name": "run_date",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Which run to return (ISO date); omit for the most recent. Use /flow/forecast/runs to see what is published.",
              "title": "Run Date"
            },
            "description": "Which run to return (ISO date); omit for the most recent. Use /flow/forecast/runs to see what is published."
          },
          {
            "name": "horizons",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated horizons; omit for every one the series publishes. Market days ahead of the run date, which is 0, read from the dataset's own projection — the cube currently spans 0-15. A horizon the series does not publish is refused with the list of those it does; `/flow/forecast/runs` reports them up front.\n\nOmitting this on a multi-series request is the largest response this endpoint produces: one group per (series, component, horizon), so 40 series is ~640 groups. Name the horizons you need, or page with `records_per_page`.",
              "title": "Horizons"
            },
            "description": "Comma-separated horizons; omit for every one the series publishes. Market days ahead of the run date, which is 0, read from the dataset's own projection — the cube currently spans 0-15. A horizon the series does not publish is refused with the list of those it does; `/flow/forecast/runs` reports them up front.\n\nOmitting this on a multi-series request is the largest response this endpoint produces: one group per (series, component, horizon), so 40 series is ~640 groups. Name the horizons you need, or page with `records_per_page`."
          },
          {
            "name": "scenario",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Which branch of the cube to return. **The axis is named per component** — `zscore` for `cta`, `rp` and `vt`, `ret` for `gamma` — and `/flow/forecast/runs` reports which one a series uses, with its values.\n\nOn the z-score axis it is a string: `All` (the default and the unconditional path), `<0` and `>0` sit in the same domain as `-1.9`. On `ret` it is a number. Either way `0` and `0.0` find the same cell.\n\nHorizon 0 is the run date, which has already happened, so on the z-score axis it publishes only `All` and `0.0`; asking for another scenario returns the later horizons and no group for 0.",
              "examples": [
                "All",
                "-1.9",
                "25"
              ],
              "title": "Scenario"
            },
            "description": "Which branch of the cube to return. **The axis is named per component** — `zscore` for `cta`, `rp` and `vt`, `ret` for `gamma` — and `/flow/forecast/runs` reports which one a series uses, with its values.\n\nOn the z-score axis it is a string: `All` (the default and the unconditional path), `<0` and `>0` sit in the same domain as `-1.9`. On `ret` it is a number. Either way `0` and `0.0` find the same cell.\n\nHorizon 0 is the run date, which has already happened, so on the z-score axis it publishes only `All` and `0.0`; asking for another scenario returns the later horizons and no group for 0."
          },
          {
            "name": "scenarios",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Several branches at once, comma-separated, or `*` for every one published — a whole run in one call. Each group then carries its own `scenario`. Not with `scenario`. A CTA run is 64 scenarios x 16 horizons, 1,024 groups, inside one default page; narrow with `metrics`.",
              "examples": [
                "*",
                "All,-1.0,1.0"
              ],
              "title": "Scenarios"
            },
            "description": "Several branches at once, comma-separated, or `*` for every one published — a whole run in one call. Each group then carries its own `scenario`. Not with `scenario`. A CTA run is 64 scenarios x 16 horizons, 1,024 groups, inside one default page; narrow with `metrics`."
          },
          {
            "name": "components",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated systematic strategies, e.g. cta,vt; omit for all that the series publishes. Each component publishes its own metrics, so a group never mixes them — use /flow/forecast/runs to see which exist.",
              "examples": [
                "vt",
                "cta,vt"
              ],
              "title": "Components"
            },
            "description": "Comma-separated systematic strategies, e.g. cta,vt; omit for all that the series publishes. Each component publishes its own metrics, so a group never mixes them — use /flow/forecast/runs to see which exist."
          },
          {
            "name": "records_per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 10000,
              "minimum": 1,
              "description": "Records per page",
              "default": 2000,
              "title": "Records Per Page"
            },
            "description": "Records per page"
          },
          {
            "name": "page_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Page number, 1-indexed",
              "default": 1,
              "title": "Page Number"
            },
            "description": "Page number, 1-indexed"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForecastResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/catalog": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "summary": "Browse the flow catalog",
        "description": "Every published series, with its identifiers, classification, measure and coverage. Filter by any dimension from `/flow/catalog/facets`, or search with `q`.\n\nStore `identity.slug`: `series_id` changes when the pipeline reloads.",
        "operationId": "list_catalog_flow_catalog_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Free-text search over names, descriptions and identifiers",
              "title": "Q"
            },
            "description": "Free-text search over names, descriptions and identifiers"
          },
          {
            "name": "records_per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 1000,
              "minimum": 1,
              "description": "Rows per page",
              "default": 100,
              "title": "Records Per Page"
            },
            "description": "Rows per page"
          },
          {
            "name": "page_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "1-indexed",
              "default": 1,
              "title": "Page Number"
            },
            "description": "1-indexed"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/catalog/facets": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "summary": "Distinct values per catalog dimension",
        "description": "Distinct values per filterable dimension. Read these rather than hard-coding a list; `metric` grows as the pipeline publishes more.",
        "operationId": "get_facets_flow_catalog_facets_get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "dimensions",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated dimensions to return, e.g. `metric,frequency`. Omit for all.",
              "title": "Dimensions"
            },
            "description": "Comma-separated dimensions to return, e.g. `metric,frequency`. Omit for all."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FacetsResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/catalog/{identifier}": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "summary": "One catalog entry, with coverage",
        "description": "Accepts the same identifiers as `series_ids`. Where one matches several series the first is returned.",
        "operationId": "get_catalog_entry_flow_catalog__identifier__get",
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "identifier",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Slug, series_label, entity or series_id",
              "title": "Identifier"
            },
            "description": "Slug, series_label, entity or series_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogEntryDetail"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/flow/users/me": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Current user's tier and request limits",
        "description": "The caller's tier and the request limits that follow from it.",
        "operationId": "get_me_flow_users_me_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "HTTPBearer": []
          },
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/flow/health": {
      "get": {
        "tags": [
          "Utility"
        ],
        "summary": "Health check endpoint",
        "operationId": "health_check_flow_health_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": []
      }
    },
    "/": {
      "get": {
        "summary": "Root",
        "description": "Root endpoint providing service metadata.",
        "operationId": "root__get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": []
      }
    }
  },
  "components": {
    "schemas": {
      "AvailabilityResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/SeriesAvailability"
            },
            "type": "array",
            "title": "Data"
          },
          "series_ids": {
            "items": {
              "type": "integer"
            },
            "type": "array",
            "title": "Series Ids"
          },
          "unresolved": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Unresolved"
          },
          "count": {
            "type": "integer",
            "title": "Count",
            "default": 0
          }
        },
        "type": "object",
        "title": "AvailabilityResponse",
        "description": "Coverage per series."
      },
      "CatalogEntryDetail": {
        "properties": {
          "identity": {
            "$ref": "#/components/schemas/SeriesIdentity"
          },
          "classification": {
            "$ref": "#/components/schemas/SeriesClassification"
          },
          "asset": {
            "$ref": "#/components/schemas/SeriesAssetDimensions"
          },
          "geographic": {
            "$ref": "#/components/schemas/SeriesGeographicDimensions"
          },
          "investor": {
            "$ref": "#/components/schemas/SeriesInvestorDimensions"
          },
          "measure": {
            "$ref": "#/components/schemas/SeriesMeasure"
          },
          "sector": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sector"
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit",
            "description": "Mirrors `measure.unit`"
          },
          "metric": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Metric",
            "description": "Mirrors `measure.metric`"
          },
          "is_active": {
            "type": "boolean",
            "title": "Is Active",
            "description": "Has an observation within the last 90 days",
            "default": true
          },
          "staleness_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Staleness Days",
            "description": "Days since the last observation"
          },
          "availability": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SeriesAvailability"
              },
              {
                "type": "null"
              }
            ],
            "description": "Coverage; null if the series has no data yet"
          }
        },
        "type": "object",
        "required": [
          "identity",
          "classification",
          "asset",
          "geographic",
          "investor",
          "measure"
        ],
        "title": "CatalogEntryDetail",
        "description": "A catalog entry with its coverage in the fact table attached."
      },
      "CatalogLabelEntry": {
        "properties": {
          "identity": {
            "$ref": "#/components/schemas/LabelIdentity"
          },
          "classification": {
            "$ref": "#/components/schemas/SeriesClassification"
          },
          "asset": {
            "$ref": "#/components/schemas/SeriesAssetDimensions"
          },
          "geographic": {
            "$ref": "#/components/schemas/SeriesGeographicDimensions"
          },
          "investor": {
            "$ref": "#/components/schemas/SeriesInvestorDimensions"
          },
          "measure": {
            "$ref": "#/components/schemas/LabelMeasure"
          },
          "sector": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sector"
          },
          "series": {
            "items": {
              "$ref": "#/components/schemas/LabelSeriesVariant"
            },
            "type": "array",
            "title": "Series",
            "description": "Every series under the label"
          },
          "series_count": {
            "type": "integer",
            "title": "Series Count",
            "description": "Series grouped under the label",
            "default": 0
          },
          "is_active": {
            "type": "boolean",
            "title": "Is Active",
            "description": "Any series observed within the last 90 days",
            "default": true
          },
          "staleness_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Staleness Days",
            "description": "Days since the most recent observation"
          }
        },
        "type": "object",
        "required": [
          "identity",
          "classification",
          "asset",
          "geographic",
          "investor",
          "measure"
        ],
        "title": "CatalogLabelEntry",
        "description": "One `series_label` and every series published under it.\n\nThe listing is keyed by label rather than by series. Use\n`GET /flow/catalog/{identifier}` for a single series' detail."
      },
      "CatalogResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/CatalogLabelEntry"
            },
            "type": "array",
            "title": "Data",
            "description": "Catalog entries, keyed by series_label"
          },
          "count": {
            "type": "integer",
            "title": "Count",
            "description": "Entries on this page",
            "default": 0
          },
          "pagination": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PaginationMeta"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "type": "object",
        "title": "CatalogResponse",
        "description": "Paged catalog listing, one entry per series_label."
      },
      "CompressionFormat": {
        "type": "string",
        "enum": [
          "none",
          "gzip",
          "zip"
        ],
        "title": "CompressionFormat",
        "description": "Compression format options for exports"
      },
      "ExportFormat": {
        "type": "string",
        "enum": [
          "json",
          "csv"
        ],
        "title": "ExportFormat",
        "description": "Export format options for API responses"
      },
      "FacetsResponse": {
        "properties": {
          "facets": {
            "additionalProperties": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": "object",
            "title": "Facets",
            "description": "Dimension -> sorted distinct values"
          },
          "total_series": {
            "type": "integer",
            "title": "Total Series",
            "description": "Series the facets summarise",
            "default": 0
          }
        },
        "type": "object",
        "title": "FacetsResponse",
        "description": "Distinct values per filterable dimension."
      },
      "FlowLatestPoint": {
        "properties": {
          "ts": {
            "type": "string",
            "format": "date-time",
            "title": "Ts",
            "description": "Observation timestamp (UTC)"
          },
          "series_id": {
            "type": "integer",
            "title": "Series Id",
            "description": "Pipeline series ID; changes on reload"
          },
          "series_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Series Label",
            "description": "Source label, not unique on its own"
          },
          "metric": {
            "type": "string",
            "title": "Metric",
            "description": "Measure, e.g. net, buy_value"
          },
          "frequency": {
            "type": "string",
            "title": "Frequency",
            "description": "Publication cadence"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value",
            "description": "Observed value"
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit",
            "description": "Unit of the value, e.g. USDmn, shares"
          },
          "slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slug",
            "description": "The preferred handle"
          },
          "measure_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Measure Class",
            "description": "`flow` (per period, summable), `level` (a position at a point in time) or `unknown`. Chart a flow as bars and a level as a line. A migrated dataset classifies on the row instead, in the pipeline's own vocabulary — `ratio`, `return`, `signal`, `volatility`, `notional`, `price`."
          },
          "dimensions": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dimensions",
            "description": "The dimension values this observation sits at, for datasets that publish them — e.g. `{\"component\": \"cta\", \"projection\": 10, \"zscore\": \"-1.9\"}`. Absent for datasets that do not. Filter with `dimensions=`."
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name",
            "description": "Display name"
          },
          "dataset_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dataset Id"
          },
          "entity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Entity"
          },
          "entity_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Entity Type"
          },
          "staleness_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Staleness Days",
            "description": "Days since this observation"
          }
        },
        "type": "object",
        "required": [
          "ts",
          "series_id",
          "metric",
          "frequency"
        ],
        "title": "FlowLatestPoint",
        "description": "Most recent observation per series, with catalog context."
      },
      "FlowPoint": {
        "properties": {
          "ts": {
            "type": "string",
            "format": "date-time",
            "title": "Ts",
            "description": "Observation timestamp (UTC)"
          },
          "series_id": {
            "type": "integer",
            "title": "Series Id",
            "description": "Pipeline series ID; changes on reload"
          },
          "series_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Series Label",
            "description": "Source label, not unique on its own"
          },
          "metric": {
            "type": "string",
            "title": "Metric",
            "description": "Measure, e.g. net, buy_value"
          },
          "frequency": {
            "type": "string",
            "title": "Frequency",
            "description": "Publication cadence"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value",
            "description": "Observed value"
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit",
            "description": "Unit of the value, e.g. USDmn, shares"
          },
          "slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slug",
            "description": "The preferred handle for this series"
          },
          "measure_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Measure Class",
            "description": "`flow` (per period, summable), `level` (a position at a point in time) or `unknown`. Chart a flow as bars and a level as a line. A migrated dataset classifies on the row instead, in the pipeline's own vocabulary — `ratio`, `return`, `signal`, `volatility`, `notional`, `price`."
          },
          "dimensions": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dimensions",
            "description": "The dimension values this observation sits at, for datasets that publish them — e.g. `{\"component\": \"cta\", \"projection\": 10, \"zscore\": \"-1.9\"}`. Absent for datasets that do not. Filter with `dimensions=`."
          }
        },
        "type": "object",
        "required": [
          "ts",
          "series_id",
          "metric",
          "frequency"
        ],
        "title": "FlowPoint",
        "description": "One observation, deduplicated to its most recent load."
      },
      "ForecastAxes": {
        "properties": {
          "series_label": {
            "type": "string",
            "title": "Series Label",
            "description": "The label these axes belong to"
          },
          "dataset_id": {
            "type": "string",
            "title": "Dataset Id",
            "description": "Dataset publishing the sweep"
          },
          "components": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Components",
            "description": "Systematic strategies published, e.g. cta, vt, rp, gamma. Each publishes its own metrics, so they are not interchangeable."
          },
          "run_dates": {
            "items": {
              "type": "string",
              "format": "date-time"
            },
            "type": "array",
            "title": "Run Dates",
            "description": "Run dates published for this label"
          },
          "horizons": {
            "items": {
              "type": "integer"
            },
            "type": "array",
            "title": "Horizons",
            "description": "Projections published, 0 being the run date itself"
          },
          "scenario_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Scenario Key",
            "description": "Which axis this series varies over besides the horizon: `zscore` for cta/rp/vt, `ret` for gamma."
          },
          "scenario_type": {
            "type": "string",
            "title": "Scenario Type",
            "description": "The axis's JSON type, `string` or `number`.",
            "default": "string"
          },
          "scenarios": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Scenarios",
            "description": "Tokens published on that axis, as strings. The z-score domain mixes values like '-1.9' with 'All', '<0' and '>0'; `ret` is numeric."
          },
          "metrics": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Metrics",
            "description": "Metrics published"
          }
        },
        "type": "object",
        "required": [
          "series_label",
          "dataset_id"
        ],
        "title": "ForecastAxes",
        "description": "What one forecast series can be asked for."
      },
      "ForecastAxesResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/ForecastAxes"
            },
            "type": "array",
            "title": "Data"
          },
          "unresolved": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Unresolved",
            "description": "Identifiers that matched no series"
          },
          "count": {
            "type": "integer",
            "title": "Count",
            "description": "Series in this page",
            "default": 0
          },
          "pagination": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PaginationMeta"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "type": "object",
        "title": "ForecastAxesResponse",
        "description": "The axes available for the requested series."
      },
      "ForecastGroup": {
        "properties": {
          "series_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Series Label"
          },
          "component": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Component",
            "description": "The systematic strategy this point belongs to. Part of the grain: components publish different metrics, so one group never mixes them."
          },
          "horizon": {
            "type": "integer",
            "title": "Horizon",
            "description": "Market days ahead of the run date, which is 0. Read from the dataset's own projection, not counted from the rows. Horizon 0 is the run date itself and exists only for the unconditional scenario, so a numeric scenario starts at 1."
          },
          "scenario": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Scenario",
            "description": "The branch of the scenario axis this point is on, e.g. '-1.9' or 'All'. Part of the grain when `scenarios` asks for several."
          },
          "metrics": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ForecastMetric"
            },
            "type": "object",
            "title": "Metrics",
            "description": "Metric name -> its value and unit"
          }
        },
        "type": "object",
        "required": [
          "horizon"
        ],
        "title": "ForecastGroup",
        "description": "Every metric of one series, for one component, at one horizon.\n\nGrouped rather than one row per metric: a forecast is read as a point on a\npath, and the flat shape made a client re-assemble a dozen rows to draw one."
      },
      "ForecastMetric": {
        "properties": {
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value",
            "description": "Observed value"
          },
          "slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slug",
            "description": "The preferred handle for this metric's series. A slug names a (label, metric) pair, so it sits here rather than on the group, which spans every metric."
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit",
            "description": "Passed through from the warehouse unchanged — this service neither maps nor validates units, so a correction at source appears here with no release. The forecast dataset reports `pct_aum`, `price` and `ratio`."
          },
          "measure_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Measure Class",
            "description": "`flow`, `level` or `unknown`. Read from dim.flow_measure_class, which lists none of the forecast metrics as of 2026-09-04, so they report `unknown` until rows are added — a data change, not a release."
          }
        },
        "type": "object",
        "title": "ForecastMetric",
        "description": "One measure at one horizon."
      },
      "ForecastResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/ForecastGroup"
            },
            "type": "array",
            "title": "Data"
          },
          "run_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Run Date",
            "description": "The run these projections were made on. There is no forecast_date: resolving one needs a market calendar we do not hold, so a client pairs this with `horizon` itself."
          },
          "scenario": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ForecastScenario"
              },
              {
                "type": "null"
              }
            ],
            "description": "The branch served; null when `scenarios` asked for several."
          },
          "scenarios": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Scenarios",
            "description": "Every branch in this response, in the axis's order."
          },
          "series_labels": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Series Labels"
          },
          "metrics": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Metrics",
            "description": "Metrics present in this page"
          },
          "unresolved": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Unresolved",
            "description": "Identifiers that matched no series"
          },
          "count": {
            "type": "integer",
            "title": "Count",
            "description": "Groups in this page",
            "default": 0
          },
          "pagination": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PaginationMeta"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "type": "object",
        "title": "ForecastResponse",
        "description": "One scenario of the forecast cube, across the requested horizons."
      },
      "ForecastScenario": {
        "properties": {
          "type": {
            "type": "string",
            "title": "Type",
            "description": "Which axis was filtered: `zscore` for cta/rp/vt, `ret` for gamma. Named per component, so read it rather than assuming.",
            "default": "zscore"
          },
          "value": {
            "type": "string",
            "title": "Value",
            "description": "The token served, e.g. '-1.9', 'All' for the unconditional path on the z-score axis, or '25' on `ret`. Always a string here because the z-score domain mixes 'All', '<0' and '>0' with numbers; the filter itself uses the axis's own JSON type."
          }
        },
        "type": "object",
        "required": [
          "value"
        ],
        "title": "ForecastScenario",
        "description": "Which branch of the cube the response describes."
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
          }
        },
        "type": "object",
        "title": "HTTPValidationError"
      },
      "LabelIdentity": {
        "properties": {
          "series_label": {
            "type": "string",
            "title": "Series Label",
            "description": "The label this entry groups"
          },
          "series_ids": {
            "items": {
              "type": "integer"
            },
            "type": "array",
            "title": "Series Ids",
            "description": "Every series under the label"
          },
          "slugs": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Slugs",
            "description": "Preferred handle for each series"
          },
          "dataset_ids": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Dataset Ids",
            "description": "Usually one; 12 labels span several datasets"
          },
          "entities": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Entities"
          },
          "entity_types": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Entity Types"
          },
          "frequencies": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Frequencies"
          },
          "version": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Version",
            "description": "Model version, e.g. \"V1\""
          },
          "model_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Id",
            "description": "Producing model"
          },
          "legacy_series_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Legacy Series Id",
            "description": "VandaXAsset series ID, where one maps"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name",
            "description": "Display name"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description",
            "description": "What the label measures"
          },
          "start_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Start Date",
            "description": "Earliest observation"
          },
          "lag": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lag",
            "description": "Publication lag in days"
          },
          "update_time": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Update Time",
            "description": "Expected publication time"
          }
        },
        "type": "object",
        "required": [
          "series_label"
        ],
        "title": "LabelIdentity",
        "description": "Identity of a label, which covers one or more series."
      },
      "LabelMeasure": {
        "properties": {
          "metrics": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Metrics",
            "description": "e.g. net, buy_value"
          },
          "units": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Units",
            "description": "e.g. USDmn, shares"
          },
          "currency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Currency",
            "description": "Not yet populated"
          },
          "scale": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Scale"
          },
          "measure_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Measure Class",
            "description": "`flow`, `level`, `unknown`, or `mixed` where the label's series are not all the same. Read `series[].measure_class` for the exact value per series. Filtering by `?measure_class=` matches a label if any of its series does, so `mixed` matches nothing."
          },
          "aggregation_rule": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Aggregation Rule"
          },
          "sign_convention": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sign Convention"
          },
          "derivation": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Derivation"
          },
          "zero_policy": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Zero Policy"
          }
        },
        "type": "object",
        "title": "LabelMeasure",
        "description": "Measure semantics for a label. Plural where its series differ."
      },
      "LabelSeriesVariant": {
        "properties": {
          "series_id": {
            "type": "integer",
            "title": "Series Id",
            "description": "Pipeline series ID; changes on reload"
          },
          "slug": {
            "type": "string",
            "title": "Slug",
            "description": "The preferred handle for this series"
          },
          "metric": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Metric",
            "description": "e.g. net, buy_value"
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit",
            "description": "e.g. USDmn, shares, count"
          },
          "frequency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Frequency",
            "description": "Publication cadence"
          },
          "measure_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Measure Class",
            "description": "`flow` (per period, summable), `level` (a position at a point in time) or `unknown`. Chart a flow as bars and a level as a line"
          },
          "entity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Entity"
          },
          "entity_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Entity Type"
          },
          "dataset_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dataset Id"
          },
          "start_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Start Date",
            "description": "First observation"
          },
          "is_active": {
            "type": "boolean",
            "title": "Is Active",
            "description": "Observed within the last 90 days",
            "default": true
          },
          "staleness_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Staleness Days",
            "description": "Days since this series' last observation"
          }
        },
        "type": "object",
        "required": [
          "series_id",
          "slug"
        ],
        "title": "LabelSeriesVariant",
        "description": "One series under a label, with the facts the plural lists cannot pair.\n\n`measure.units` beside `measure.metrics` does not say which metric is\ncounted in what — most labels span more than one unit — so a client\nrendering a row per series reads them from here."
      },
      "LatestResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/FlowLatestPoint"
            },
            "type": "array",
            "title": "Data"
          },
          "series_ids": {
            "items": {
              "type": "integer"
            },
            "type": "array",
            "title": "Series Ids"
          },
          "metrics": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Metrics"
          },
          "frequencies": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Frequencies"
          },
          "unresolved": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Unresolved"
          },
          "count": {
            "type": "integer",
            "title": "Count",
            "default": 0
          }
        },
        "type": "object",
        "title": "LatestResponse",
        "description": "Most recent observation per series."
      },
      "NormalisationEnum": {
        "type": "string",
        "enum": [
          "zscore",
          "percentile_rank"
        ],
        "title": "NormalisationEnum",
        "description": "Normalisations, applied after any transformation."
      },
      "NormalisationPeriodEnum": {
        "type": "string",
        "enum": [
          "3m",
          "6m",
          "1y",
          "2y",
          "5y",
          "Expanding",
          "All"
        ],
        "title": "NormalisationPeriodEnum",
        "description": "Lookback for a normalisation. A calendar range, so it means the same at any\ncadence: `1y` over a monthly series uses twelve observations.\n\n`All` is unbounded in both directions and so not causal — early values are\nnormalised using data from their future."
      },
      "PaginationMeta": {
        "properties": {
          "page_number": {
            "type": "integer",
            "title": "Page Number",
            "description": "Current page, 1-indexed"
          },
          "records_per_page": {
            "type": "integer",
            "title": "Records Per Page",
            "description": "Records requested per page"
          },
          "total_record_count": {
            "type": "integer",
            "title": "Total Record Count",
            "description": "Total records matching the query"
          },
          "total_pages": {
            "type": "integer",
            "title": "Total Pages",
            "description": "Total pages available"
          },
          "has_next": {
            "type": "boolean",
            "title": "Has Next",
            "description": "Whether a further page exists"
          },
          "has_previous": {
            "type": "boolean",
            "title": "Has Previous",
            "description": "Whether a previous page exists"
          }
        },
        "type": "object",
        "required": [
          "page_number",
          "records_per_page",
          "total_record_count",
          "total_pages",
          "has_next",
          "has_previous"
        ],
        "title": "PaginationMeta",
        "description": "Pagination metadata attached to list responses."
      },
      "SeriesAssetDimensions": {
        "properties": {
          "asset_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Asset Type",
            "description": "EQ, FX, FI, COM"
          },
          "asset_subtype": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Asset Subtype"
          },
          "asset_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Asset Code"
          },
          "benchmark": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Benchmark"
          },
          "benchmark_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Benchmark Code"
          }
        },
        "type": "object",
        "title": "SeriesAssetDimensions"
      },
      "SeriesAvailability": {
        "properties": {
          "series_id": {
            "type": "integer",
            "title": "Series Id"
          },
          "series_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Series Label"
          },
          "slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slug"
          },
          "metric": {
            "type": "string",
            "title": "Metric"
          },
          "frequency": {
            "type": "string",
            "title": "Frequency"
          },
          "first_ts": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Ts"
          },
          "last_ts": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Ts"
          },
          "row_count": {
            "type": "integer",
            "title": "Row Count",
            "description": "Deduplicated observation count",
            "default": 0
          }
        },
        "type": "object",
        "required": [
          "series_id",
          "metric",
          "frequency"
        ],
        "title": "SeriesAvailability",
        "description": "Coverage for one series. Counts deduplicated observations, not raw rows."
      },
      "SeriesClassification": {
        "properties": {
          "product": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Product",
            "description": "Commercial surface"
          },
          "domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Domain",
            "description": "Analytical domain"
          },
          "universe": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Universe",
            "description": "Market, e.g. CN, KR, EU"
          },
          "dataset": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dataset",
            "description": "Logical dataset name"
          },
          "model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model",
            "description": "Model name"
          }
        },
        "type": "object",
        "title": "SeriesClassification",
        "description": "Classification block — the Unified Data Model hierarchy."
      },
      "SeriesGeographicDimensions": {
        "properties": {
          "geography": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Geography"
          },
          "region": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Region"
          },
          "country": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Country"
          },
          "country_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Country Code"
          },
          "dm_em": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dm Em",
            "description": "DM or EM"
          }
        },
        "type": "object",
        "title": "SeriesGeographicDimensions"
      },
      "SeriesIdentity": {
        "properties": {
          "series_id": {
            "type": "integer",
            "title": "Series Id",
            "description": "Pipeline series ID; changes on reload"
          },
          "slug": {
            "type": "string",
            "title": "Slug",
            "description": "dataset_id:entity:metric[:series_label] — the preferred handle"
          },
          "series_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Series Label",
            "description": "Source label"
          },
          "version": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Version",
            "description": "Model version, e.g. \"V1\""
          },
          "dataset_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dataset Id",
            "description": "e.g. FLOW.CN.EQ.V1"
          },
          "model_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Model Id",
            "description": "Producing model, e.g. CN_EQ"
          },
          "entity": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Entity",
            "description": "Entity, not unique on its own"
          },
          "entity_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Entity Type",
            "description": "e.g. investor_type|sector"
          },
          "legacy_series_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Legacy Series Id",
            "description": "VandaXAsset series ID, where one maps"
          },
          "aliases": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Aliases",
            "description": "Other identifiers that resolve to this series"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name",
            "description": "Display name"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description",
            "description": "What the series measures"
          },
          "start_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "title": "Start Date",
            "description": "First observation"
          },
          "frequency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Frequency",
            "description": "Publication cadence"
          },
          "lag": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lag",
            "description": "Publication lag in days"
          },
          "update_time": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Update Time",
            "description": "Expected publication time"
          }
        },
        "type": "object",
        "required": [
          "series_id",
          "slug"
        ],
        "title": "SeriesIdentity",
        "description": "Identity block of a catalog entry."
      },
      "SeriesInvestorDimensions": {
        "properties": {
          "investor_category": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Investor Category"
          },
          "investor_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Investor Type"
          },
          "investor_origin": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Investor Origin"
          },
          "investor_subtype": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Investor Subtype"
          }
        },
        "type": "object",
        "title": "SeriesInvestorDimensions"
      },
      "SeriesMeasure": {
        "properties": {
          "metric": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Metric",
            "description": "e.g. net, buy_value"
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit",
            "description": "e.g. USDmn, shares, contracts"
          },
          "currency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Currency",
            "description": "Not yet populated"
          },
          "scale": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Scale"
          },
          "measure_class": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Measure Class",
            "description": "`flow` (a quantity per period, summable over time), `level` (a position at a point in time) or `unknown` when unclassified"
          },
          "aggregation_rule": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Aggregation Rule"
          },
          "sign_convention": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sign Convention"
          },
          "derivation": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Derivation"
          },
          "zero_policy": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Zero Policy",
            "description": "Whether a zero means no flow or not reported"
          }
        },
        "type": "object",
        "title": "SeriesMeasure",
        "description": "Measure semantics. `measure_class` is `flow`, `level` or `unknown`."
      },
      "SortDirectionEnum": {
        "type": "string",
        "enum": [
          "asc",
          "desc"
        ],
        "title": "SortDirectionEnum",
        "description": "Sort direction for timeseries results."
      },
      "TimeseriesResponse": {
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/FlowPoint"
            },
            "type": "array",
            "title": "Data"
          },
          "series": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Series",
            "description": "Slugs that contributed rows"
          },
          "series_ids": {
            "items": {
              "type": "integer"
            },
            "type": "array",
            "title": "Series Ids"
          },
          "metrics": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Metrics",
            "description": "Metrics present in this page"
          },
          "frequencies": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Frequencies",
            "description": "Cadences present in this page"
          },
          "unresolved": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Unresolved",
            "description": "Identifiers that matched no series"
          },
          "count": {
            "type": "integer",
            "title": "Count",
            "description": "Rows in this page",
            "default": 0
          },
          "pagination": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PaginationMeta"
              },
              {
                "type": "null"
              }
            ]
          },
          "transformation": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Transformation",
            "description": "Transformed rows, at transformation.results.data. On failure it carries a Failure status and `data` is still populated."
          }
        },
        "type": "object",
        "title": "TimeseriesResponse",
        "description": "A page of observations."
      },
      "TransformationEnum": {
        "type": "string",
        "enum": [
          "rolling_sum",
          "moving_avg"
        ],
        "title": "TransformationEnum",
        "description": "Windowed transformations. Allowed on every metric, whatever its measure_class."
      },
      "ValidationError": {
        "properties": {
          "loc": {
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "type": "array",
            "title": "Location"
          },
          "msg": {
            "type": "string",
            "title": "Message"
          },
          "type": {
            "type": "string",
            "title": "Error Type"
          },
          "input": {
            "title": "Input"
          },
          "ctx": {
            "type": "object",
            "title": "Context"
          }
        },
        "type": "object",
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "title": "ValidationError"
      },
      "WindowEnum": {
        "type": "string",
        "enum": [
          "5",
          "20",
          "30",
          "60",
          "90",
          "120",
          "252"
        ],
        "title": "WindowEnum",
        "description": "Window length in OBSERVATIONS — the upstream applies it with rowsBetween.\n\nThe names are daily-centric, shared with services that only publish daily\ndata. On a monthly series `M1` (20) means twenty months. Pick the value,\nnot the label."
      }
    },
    "securitySchemes": {
      "HTTPBearer": {
        "type": "http",
        "scheme": "bearer"
      },
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    }
  }
}