{
  "info": {
    "name": "TradeWave Data API (v1)",
    "description": "Seasonal-edge + ML-scored seasonal patterns. Seasonal patterns only - no raw prices. Set the collection variable api_key to your tw_live_ key (get one at https://tradewave.ai/account/api/keys). Docs: https://developers.tradewave.ai/docs/",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.tradewave.ai/v1",
      "type": "string"
    },
    {
      "key": "api_key",
      "value": "tw_live_REPLACE_ME",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "GET /scan",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/scan?markets=2,11&window=now&direction=long&min_win_rate=0.6&min_years=5&rank_by=sharpe&limit=10",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "scan"
          ],
          "query": [
            {
              "key": "markets",
              "value": "2,11",
              "disabled": false,
              "description": "csv of ids, list_markets names, or common aliases ('sp500', 'crypto', 'europe'), e.g. '2,11' or 'S&P 500 STOCKS,ETFs'. Unknown tokens are reported in markets_no"
            },
            {
              "key": "window",
              "value": "now",
              "disabled": false,
              "description": "'now' | 'next_2_weeks' | 'next_month' | a 'from..to' range. The underlying primitive (OppList4) is keyed to a SINGLE entry date, so the scan evaluates opportuni"
            },
            {
              "key": "direction",
              "value": "long",
              "disabled": false,
              "description": ""
            },
            {
              "key": "min_win_rate",
              "value": "0.6",
              "disabled": false,
              "description": "filter on historical_win_rate (share of profitable years), NOT ml_win_prob. Rows past the enrichment cap are excluded when set."
            },
            {
              "key": "min_years",
              "value": "5",
              "disabled": false,
              "description": "trust filter - require years_tested >= N"
            },
            {
              "key": "min_days",
              "value": "",
              "disabled": true,
              "description": "minimum pattern length (holding period) in calendar days, e.g. 10"
            },
            {
              "key": "max_days",
              "value": "",
              "disabled": true,
              "description": "maximum pattern length (holding period) in calendar days, e.g. 90"
            },
            {
              "key": "min_avg_return",
              "value": "",
              "disabled": true,
              "description": "minimum average seasonal profit in PERCENT (e.g. 5 means >= 5%); matches stats.avg_return_pct"
            },
            {
              "key": "min_median_return",
              "value": "",
              "disabled": true,
              "description": "minimum median seasonal profit in PERCENT; matches stats.median_return_pct"
            },
            {
              "key": "min_sharpe",
              "value": "",
              "disabled": true,
              "description": "minimum Sharpe ratio, e.g. 1.5; matches stats.sharpe_ratio"
            },
            {
              "key": "pe_cycle",
              "value": "",
              "disabled": true,
              "description": "presidential election cycle mode: 'consecutive' (default, consecutive years) or 'pe' (the current presidential-cycle position only)"
            },
            {
              "key": "years",
              "value": "",
              "disabled": true,
              "description": "pattern LOOKBACK: how many years (5-98, data-dependent) to scan for patterns. In pe mode this is the number of PE-position occurrences."
            },
            {
              "key": "min_winning_years",
              "value": "",
              "disabled": true,
              "description": "of those `years`, the minimum WINNING years for a pattern to be listed (the win-rate floor; year2). DEFAULTS to ~90% of `years` (so years=20 -> a valid 20-18). "
            },
            {
              "key": "rank_by",
              "value": "sharpe",
              "disabled": false,
              "description": "ranking key; default sharpe (Sharpe ratio)"
            },
            {
              "key": "limit",
              "value": "10",
              "disabled": false,
              "description": "tier-capped (free 3, dev 100, pro 1000, business 5000)"
            },
            {
              "key": "view",
              "value": "",
              "disabled": true,
              "description": "response verbosity. 'full' (API default) = complete cards; 'evidence' = full rank-1 winner + lean runners; 'decision' = lean cards; 'table' = compact rows. MCP "
            },
            {
              "key": "include",
              "value": "",
              "disabled": true,
              "description": "include=chart attaches the two-chart evidence data/specifications to the rank-1 winner only."
            }
          ]
        },
        "description": "Scan in-scope markets for the best seasonal setups (ranked PatternCards)"
      }
    },
    {
      "name": "GET /analyze/{symbol}",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/analyze/DOV?market=2&direction=long&days_out=30",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "analyze",
            "DOV"
          ],
          "query": [
            {
              "key": "market",
              "value": "2",
              "disabled": false,
              "description": "permanent resource key '0'..'16'. Optional - resolved if the symbol is unique."
            },
            {
              "key": "direction",
              "value": "long",
              "disabled": false,
              "description": ""
            },
            {
              "key": "days_out",
              "value": "30",
              "disabled": false,
              "description": "holding period in days (internal: daysOut). With entry_date, pins the exact window."
            },
            {
              "key": "entry_date",
              "value": "",
              "disabled": true,
              "description": "YYYY-MM-DD. Pin analysis to THIS exact opportunity instead of the auto-picked best."
            },
            {
              "key": "pe_cycle",
              "value": "",
              "disabled": true,
              "description": "score over presidential-election-cycle years (same phase as the entry year) instead of consecutive. Default consecutive."
            },
            {
              "key": "years",
              "value": "",
              "disabled": true,
              "description": "lookback length (default 10)."
            },
            {
              "key": "period",
              "value": "",
              "disabled": true,
              "description": "wave-viewer date-range preset; overrides entry_date/days_out."
            },
            {
              "key": "reverse",
              "value": "",
              "disabled": true,
              "description": "invert the period to all-of-year-except-that-window."
            },
            {
              "key": "view",
              "value": "",
              "disabled": true,
              "description": "response verbosity. 'full'/'evidence' = complete evidence card; 'decision' = lean; 'table' = compact. MCP defaults to evidence."
            },
            {
              "key": "include",
              "value": "",
              "disabled": true,
              "description": "include=chart attaches the canonical two-chart data and rendering specifications. MCP additionally renders them as native image content blocks."
            }
          ]
        },
        "description": "Deep-dive one symbol into a single rich PatternCard + alternate setups"
      }
    },
    {
      "name": "GET /markets",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/markets",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "markets"
          ]
        },
        "description": "List the 15 active markets (ids 0-13, 16) and the caller's access scope + pattern coverage"
      }
    },
    {
      "name": "GET /me",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/me",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "me"
          ]
        },
        "description": "Identity + capabilities for the caller's key (plan, quotas, market scope)"
      }
    },
    {
      "name": "GET /markets/{market_id}/symbols",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/markets/2/symbols?limit=10",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "markets",
            "2",
            "symbols"
          ],
          "query": [
            {
              "key": "prefix",
              "value": "",
              "disabled": true,
              "description": "ticker prefix filter, case-insensitive (e.g. 'AA' matches AAPL, AAL)"
            },
            {
              "key": "limit",
              "value": "10",
              "disabled": false,
              "description": "max rows returned (after the prefix filter); omitted = all matching rows"
            }
          ]
        },
        "description": "List symbols in a market (pageable)"
      }
    },
    {
      "name": "GET /opportunities",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/opportunities?market=2&direction=long&min_win_rate=0.6&limit=10",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "opportunities"
          ],
          "query": [
            {
              "key": "market",
              "value": "2",
              "disabled": false,
              "description": "market id '0'..'16'"
            },
            {
              "key": "from",
              "value": "",
              "disabled": true,
              "description": "entry_date to evaluate; defaults to today"
            },
            {
              "key": "to",
              "value": "",
              "disabled": true,
              "description": "ACCEPTED but ignored - does not widen the window (window_supported:false). Use /scan for windows."
            },
            {
              "key": "direction",
              "value": "long",
              "disabled": false,
              "description": ""
            },
            {
              "key": "min_win_rate",
              "value": "0.6",
              "disabled": false,
              "description": "filter on the REAL historical win_rate (share of profitable years), not the ML win_prob. Rows are enriched per symbol from ChartData4 'Percent Profitable', capp"
            },
            {
              "key": "min_days",
              "value": "",
              "disabled": true,
              "description": "minimum pattern length (holding period) in calendar days, e.g. 10"
            },
            {
              "key": "max_days",
              "value": "",
              "disabled": true,
              "description": "maximum pattern length (holding period) in calendar days, e.g. 90"
            },
            {
              "key": "min_avg_return",
              "value": "",
              "disabled": true,
              "description": "minimum average seasonal profit in PERCENT (e.g. 5 means >= 5%)"
            },
            {
              "key": "min_median_return",
              "value": "",
              "disabled": true,
              "description": "minimum median seasonal profit in PERCENT"
            },
            {
              "key": "min_sharpe",
              "value": "",
              "disabled": true,
              "description": "minimum Sharpe ratio, e.g. 1.5"
            },
            {
              "key": "pe_cycle",
              "value": "",
              "disabled": true,
              "description": "presidential election cycle mode: 'consecutive' (default) or 'pe' (the current cycle position)"
            },
            {
              "key": "years",
              "value": "",
              "disabled": true,
              "description": "pattern lookback in years (5-98, data-dependent)"
            },
            {
              "key": "min_winning_years",
              "value": "",
              "disabled": true,
              "description": "of those `years`, the minimum WINNING years (the win-rate floor; year2). DEFAULTS to ~90% of `years`. Single market: validated against that market's DETECTION B"
            },
            {
              "key": "limit",
              "value": "10",
              "disabled": false,
              "description": "tier-capped (free 3, dev 100, pro 1000, business 5000)"
            }
          ]
        },
        "description": "Ranked seasonal opportunities (single entry-date primitive)"
      }
    },
    {
      "name": "GET /opportunities/{symbol}",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/opportunities/DOV",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "opportunities",
            "DOV"
          ]
        },
        "description": "A symbol's top seasonal patterns across the year, ranked by Sharpe (the wave-viewer pattern list)"
      }
    },
    {
      "name": "GET /securities/{symbol}/patterns",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/securities/DOV/patterns",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "securities",
            "DOV",
            "patterns"
          ]
        },
        "description": "A symbol's top seasonal patterns across the year, ranked by Sharpe (clearly-named alias)"
      }
    },
    {
      "name": "GET /patterns/{market_id}/{symbol}",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/patterns/2/DOV?days_out=30",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "patterns",
            "2",
            "DOV"
          ],
          "query": [
            {
              "key": "pe_cycle",
              "value": "",
              "disabled": true,
              "description": "presidential cycle: consecutive (default), pe (current position), or a specific position pe0..pe3 (PE+0 = election years, PE+2 = current in 2026)"
            },
            {
              "key": "years",
              "value": "",
              "disabled": true,
              "description": "lookback count (years, or number of cycle occurrences when pe_cycle is a pe* value)"
            },
            {
              "key": "days_out",
              "value": "30",
              "disabled": false,
              "description": ""
            },
            {
              "key": "period",
              "value": "",
              "disabled": true,
              "description": "date-range PRESET (overrides entry_date/days_out): a month, quarter, season, ytd, year_end, or buy_hold"
            },
            {
              "key": "reverse",
              "value": "",
              "disabled": true,
              "description": "use the COMPLEMENT of the window (e.g. period=mar&reverse=true = all year except March). buy_hold cannot be reversed."
            }
          ]
        },
        "description": "Seasonal pattern stats for a symbol (aggregate stats, no price series)"
      }
    },
    {
      "name": "GET /seasonal-chart",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/seasonal-chart?market=2&symbol=DOV&days_out=30&direction=long",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "seasonal-chart"
          ],
          "query": [
            {
              "key": "market",
              "value": "2",
              "disabled": false,
              "description": ""
            },
            {
              "key": "symbol",
              "value": "DOV",
              "disabled": false,
              "description": ""
            },
            {
              "key": "entry_date",
              "value": "",
              "disabled": true,
              "description": ""
            },
            {
              "key": "days_out",
              "value": "30",
              "disabled": false,
              "description": ""
            },
            {
              "key": "direction",
              "value": "long",
              "disabled": false,
              "description": ""
            },
            {
              "key": "years",
              "value": "",
              "disabled": true,
              "description": "lookback window, stays a string"
            },
            {
              "key": "pe_cycle",
              "value": "",
              "disabled": true,
              "description": "presidential cycle for the curve: consecutive (default), pe (current position), or a specific position pe0..pe3"
            },
            {
              "key": "period",
              "value": "",
              "disabled": true,
              "description": "date-range PRESET (overrides entry_date/days_out): a month, quarter, season, ytd (year to date), year_end (today to year end), or buy_hold (Jan 1 to Jan 1, full"
            },
            {
              "key": "reverse",
              "value": "",
              "disabled": true,
              "description": "use the COMPLEMENT of the window - everything except it (e.g. period=mar&reverse=true = all year except March). A full-year (buy_hold) range cannot be reversed "
            }
          ]
        },
        "description": "Seasonal trendchart data for a symbol (normalized 0-100 curve, no price series)"
      }
    },
    {
      "name": "POST /score",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          },
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/score",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "score"
          ]
        },
        "description": "ML scores for opportunities (all tiers, metered per day)",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"opportunities\": [\n    {\n      \"symbol\": \"DOV\",\n      \"date\": \"2026-06-02\",\n      \"days_out\": 30,\n      \"direction\": \"long\",\n      \"market\": \"2\"\n    }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      }
    },
    {
      "name": "GET /daily-pick",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/daily-pick",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "daily-pick"
          ],
          "query": [
            {
              "key": "view",
              "value": "",
              "disabled": true,
              "description": "response verbosity: 'full' (default), 'evidence' (full rank-1 card), 'decision' (lean), or 'table'."
            },
            {
              "key": "include",
              "value": "",
              "disabled": true,
              "description": "include=chart attaches a `chart` block (Trend Chart curve + per-year bars) to the pick card."
            }
          ]
        },
        "description": "Today's AI pick as a PatternCard, with its live track record"
      }
    },
    {
      "name": "GET /daily-pick/track-record",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Accept",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/daily-pick/track-record",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "daily-pick",
            "track-record"
          ]
        },
        "description": "Historical track record of past daily picks (realized win/loss)"
      }
    }
  ]
}