{"openapi":"3.1.0","info":{"title":"Tigzig V2 Unified Data Surface","version":"3.1.0","description":"Category-first unified data API: macro, credit, valuation, insurance, India, global, markets, and FX indicators across 8 categories. Pick a domain, drill into its indicators, pull series, or bulk-download the whole dataset. MCP server at /v2/mcp/http (Streamable HTTP).\n\nRate limit: 60 requests/min per IP. Downloads: 10/min. No auth required.\n\nApp: https://tremor.tigzig.com"},"paths":{"/v2/":{"get":{"tags":["V2 - Unified Data Surface"],"summary":"V2 catalog - lists every category with a one-liner","description":"V2 catalog entry point. Returns the categories list + tool surface\nsummary. Convenient for humans to inspect; MCP agents see the same\ninformation via the server-instructions field at session init.","operationId":"v2_catalog","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/categories/{category}/indicators":{"get":{"tags":["V2 - Unified Data Surface"],"summary":"List indicators in a V2 category","description":"Returns metadata for every visible indicator in one Tigzig V2 category.\n\nEach indicator row carries: indicator_id, name, country, frequency, unit, source, source_series_id, seasonally_adjusted, first_date, last_date, record_count, and `notes` (free-text caveats: annualization rules, cumulative-vs-per-period semantics, base-year vintages, source-method discontinuities). READ THE NOTES before computing - they capture the gotchas that the name + unit fields alone don't convey. Pick which ids you need, then call v2_get_series with those ids.\n\nTip: pass compact=true for big categories - returns just {indicator_id, name, frequency, last_date} per row (no notes), saves tokens.\n\nCategories:\n  us_macro       US macro: FRED + Michigan + UMCSENT. Monetary, labor, inflation, GDP, consumer sentiment, housing, financial conditions.\n  us_credit      US credit stress: delinquency + charge-offs from FRED + FFIEC, NCUA credit-union aggregates, NY Fed Household Debt, FDIC bank aggregates.\n  us_valuation   US equity-market valuation: Shiller CAPE, Buffett indicator (market cap / GDP), nominal GDP, US Treasury bond yields.\n  us_insurance   US insurance industry: Fed Z.1 invested asset breakdown for Life and P&C insurers (general account, separate account, by asset class).\n  india_macro    India macro + credit: RBI WSS (rates, FX reserves, money supply), MoSPI (IIP, CPI, WPI, GDP, GFCF), NSE Nifty 50 PE/PB/DivYield.\n  global_macro   Global macro: OECD Business Confidence Indicator (37 countries), European sovereign bond yields (Bund, Gilt, ECB AAA + all-issuer).\n  markets        Daily market prices (Yahoo Finance): 16 symbols. Equity indices (SPX, Nifty, Nikkei, Hang Seng, DAX, Shanghai), bond yields (US 10Y), currencies (DXY, USD/INR, USD/JPY), commodities (Gold, Silver, Copper, WTI, Brent, Natural Gas).\n  currencies     Daily FX rates (FRED DEX* series): USDINR, USDJPY, USDKRW, USDTWD. Designed for INR-vs-EM-Asia peer cuts.\n\nUnknown category returns HTTP 404 with the valid list, so an agent that skipped list_categories can still recover.","operationId":"list_indicators_in_category","parameters":[{"name":"category","in":"path","required":true,"schema":{"type":"string","title":"Category"}},{"name":"compact","in":"query","required":false,"schema":{"type":"boolean","description":"If true, return {indicator_id, name, frequency, last_date} only. Lighter payload for big categories.","default":false,"title":"Compact"},"description":"If true, return {indicator_id, name, frequency, last_date} only. Lighter payload for big categories."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/categories":{"get":{"tags":["V2 - Unified Data Surface"],"summary":"List all V2 categories with one-liner descriptions","description":"Returns the full menu of Tigzig V2 categories with a one-line summary of each. Call this first when you don't know which domain a question lives in. Then call list_indicators_in_category to expand any.\n\nCategories:\n  us_macro       US macro: FRED + Michigan + UMCSENT. Monetary, labor, inflation, GDP, consumer sentiment, housing, financial conditions.\n  us_credit      US credit stress: delinquency + charge-offs from FRED + FFIEC, NCUA credit-union aggregates, NY Fed Household Debt, FDIC bank aggregates.\n  us_valuation   US equity-market valuation: Shiller CAPE, Buffett indicator (market cap / GDP), nominal GDP, US Treasury bond yields.\n  us_insurance   US insurance industry: Fed Z.1 invested asset breakdown for Life and P&C insurers (general account, separate account, by asset class).\n  india_macro    India macro + credit: RBI WSS (rates, FX reserves, money supply), MoSPI (IIP, CPI, WPI, GDP, GFCF), NSE Nifty 50 PE/PB/DivYield.\n  global_macro   Global macro: OECD Business Confidence Indicator (37 countries), European sovereign bond yields (Bund, Gilt, ECB AAA + all-issuer).\n  markets        Daily market prices (Yahoo Finance): 16 symbols. Equity indices (SPX, Nifty, Nikkei, Hang Seng, DAX, Shanghai), bond yields (US 10Y), currencies (DXY, USD/INR, USD/JPY), commodities (Gold, Silver, Copper, WTI, Brent, Natural Gas).\n  currencies     Daily FX rates (FRED DEX* series): USDINR, USDJPY, USDKRW, USDTWD. Designed for INR-vs-EM-Asia peer cuts.","operationId":"list_categories","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/find":{"get":{"tags":["V2 - Unified Data Surface"],"summary":"Cross-category indicator search by id substring or name","description":"Substring search over indicator IDs and display names across ALL V2 categories. Use this when you know what you want but not which category it lives in (e.g. 'usdinr', 'shiller', 'cape', 'nominal').\n\nReturns: {indicator_id, name, category, country, frequency, first_date, last_date}. Match is case-insensitive substring on indicator_id OR display name. The `category` field on each hit tells you which V2 category to call list_indicators_in_category or v2_get_series against.","operationId":"find_indicator","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":60,"description":"Substring to match against indicator_id or display name.","title":"Query"},"description":"Substring to match against indicator_id or display name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max results to return.","default":50,"title":"Limit"},"description":"Max results to return."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/series":{"get":{"tags":["V2 - Unified Data Surface"],"summary":"Get time-series data for one or more V2 indicators (wide format)","description":"Returns wide-format time series: one row per date, one column per indicator. Works seamlessly across V2 backends - mix macro indicators and market prices in one call.\n\nRequired: ids (comma-separated, max 10). Optional: from + to (YYYY-MM-DD), format (json | tsv).\n\nUse format=tsv for long / daily series to save tokens - much lighter than the default JSON. The TSV body has this shape:\n  # meta: count=N unknown=[id1,...] empty=[id1,...]\n  date<TAB>id1<TAB>id2<TAB>...\n  YYYY-MM-DD<TAB>val<TAB>val<TAB>...\nFirst line is always a '#' meta comment - same unknown/empty signals as the JSON path. Most TSV parsers skip '#' lines (pandas: comment='#'; duckdb read_csv: SKIP). The HTTP headers X-V2-Unknown-Ids / X-V2-Empty-Ids / X-V2-Count also carry this info for REST consumers.\n\nJSON response includes meta.unknown_ids (ids not in any V2 catalog) and meta.empty_ids (ids that exist but returned no rows in the date range). Use these to distinguish 'typo' from 'no data here'.","operationId":"v2_get_series","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated indicator ids. Max 10.","title":"Ids"},"description":"Comma-separated indicator ids. Max 10."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"From"},"description":"YYYY-MM-DD"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"To"},"description":"YYYY-MM-DD"},{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"Response format: 'json' (default, wide-pivot with meta) or 'tsv' (tab-separated; meta goes into response headers).","default":"json","title":"Format"},"description":"Response format: 'json' (default, wide-pivot with meta) or 'tsv' (tab-separated; meta goes into response headers)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/downloads/manifest":{"get":{"tags":["V2 - Unified Data Surface"],"summary":"Manifest of pre-generated download files (sizes, row counts, generated_at)","description":"Returns the manifest of pre-generated bulk download files. The manifest is the source of truth - iterate over it instead of hard-coding filenames, so future tables auto-appear without breaking client code.\n\nSame files served by V1's /tremor/v1/downloads/manifest - V2 is just a URL alias so V2 consumers don't need to know V1's prefix.","operationId":"v2_downloads_manifest","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/download/all":{"head":{"tags":["V2 - Unified Data Surface"],"summary":"Download ALL Tremor tables in one file (sqlite or duckdb)","description":"Single file with macro_indicators (visible-filtered), stock_prices, and indicator_config (data dictionary). README.md inside the zip.\n\nFormats: sqlite (default, .db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz. CSV/TSV/Parquet are per-table only - use /v2/download/{table}.\n\nSame file served by V1's /tremor/v1/download/all.","operationId":"v2_download_all","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"One-file-everything format. Choose: sqlite (default, .db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz. CSV/TSV/Parquet are per-table only (use /v2/download/{table_name}).","enum":["sqlite","sqlite.gz","duckdb","duckdb.gz"],"default":"sqlite","title":"Format"},"description":"One-file-everything format. Choose: sqlite (default, .db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz. CSV/TSV/Parquet are per-table only (use /v2/download/{table_name})."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["V2 - Unified Data Surface"],"summary":"Download ALL Tremor tables in one file (sqlite or duckdb)","description":"Single file with macro_indicators (visible-filtered), stock_prices, and indicator_config (data dictionary). README.md inside the zip.\n\nFormats: sqlite (default, .db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz. CSV/TSV/Parquet are per-table only - use /v2/download/{table}.\n\nSame file served by V1's /tremor/v1/download/all.","operationId":"v2_download_all","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"One-file-everything format. Choose: sqlite (default, .db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz. CSV/TSV/Parquet are per-table only (use /v2/download/{table_name}).","enum":["sqlite","sqlite.gz","duckdb","duckdb.gz"],"default":"sqlite","title":"Format"},"description":"One-file-everything format. Choose: sqlite (default, .db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz. CSV/TSV/Parquet are per-table only (use /v2/download/{table_name})."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/download/{table_name}":{"head":{"tags":["V2 - Unified Data Surface"],"summary":"Download one Tremor table as a pre-generated file","description":"Available tables (visible-filtered):\n- macro_indicators: long-format time series, ~290 visible indicators\n- stock_prices: daily OHLCV for 16 market symbols\n- indicator_config: data dictionary (display name, source, notes per indicator)\n\nFormats: csv (zip), csv.gz, tsv (zip), tsv.gz, parquet (default), sqlite (.db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz.\n\nSame files served by V1's /tremor/v1/download/{table_name}.","operationId":"v2_download_table","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"File format. Choose: csv (zip), csv.gz, tsv (zip), tsv.gz, parquet (default), sqlite (.db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz.","enum":["csv","csv.gz","tsv","tsv.gz","parquet","sqlite","sqlite.gz","duckdb","duckdb.gz"],"default":"parquet","title":"Format"},"description":"File format. Choose: csv (zip), csv.gz, tsv (zip), tsv.gz, parquet (default), sqlite (.db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["V2 - Unified Data Surface"],"summary":"Download one Tremor table as a pre-generated file","description":"Available tables (visible-filtered):\n- macro_indicators: long-format time series, ~290 visible indicators\n- stock_prices: daily OHLCV for 16 market symbols\n- indicator_config: data dictionary (display name, source, notes per indicator)\n\nFormats: csv (zip), csv.gz, tsv (zip), tsv.gz, parquet (default), sqlite (.db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz.\n\nSame files served by V1's /tremor/v1/download/{table_name}.","operationId":"v2_download_table","parameters":[{"name":"table_name","in":"path","required":true,"schema":{"type":"string","title":"Table Name"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"File format. Choose: csv (zip), csv.gz, tsv (zip), tsv.gz, parquet (default), sqlite (.db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz.","enum":["csv","csv.gz","tsv","tsv.gz","parquet","sqlite","sqlite.gz","duckdb","duckdb.gz"],"default":"parquet","title":"Format"},"description":"File format. Choose: csv (zip), csv.gz, tsv (zip), tsv.gz, parquet (default), sqlite (.db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}