scan

What the nightly scan found across the market, ranked

Returns every setup the last nightly run sees across the whole market (stocks & crypto), ranked exactly as the TradingPal screener ranks them: rank 1 is the best-ranked setup of the night. Default status forming returns setups whose trigger has not fired; in_progress returns the ones that triggered and are running; all returns both. Each row is the same Setup object the per-ticker route returns, plus rank and the three numbers the screener shows on each setup: expected_gain_pct (Typical return, the value the ranking sorts by), win_rate_pct with win_rate_trades, and distance_to_trigger_pct (how close the last close is to the trigger). Narrow with family, direction or max_distance_pct, or run your own screen with filters, the same filter list the TradingPal screener takes (price, market cap, volume, RSI, moving averages, performance, win rate, reward to risk, security type, exchange, industry and more); page with limit and offset; count says how many matched. The book changes nightly and the answer is served from a short cache, so page through it within a session and say as_of_session when presenting it. Needs a key on an account with Premium+; no ticker needs to be tracked.

get/scan

Request

  • Base URL: https://api.tradingpal.io/api/v1
  • URL: https://api.tradingpal.io/api/v1/scan
  • Auth: one of:
    • HTTP bearer
    • OAuth 2 (authorization code, authorization URL https://api.tradingpal.io/oauth/authorize, token URL https://api.tradingpal.io/oauth/token, scopes: patterns)

Query parameters

family'rising_wedge' | 'falling_wedge' | 'bullish_pennant' | 'bearish_pennant' | 'triangle'

Keep one family: rising_wedge, falling_wedge, bullish_pennant, bearish_pennant, triangle. Omit for all five. Anything else answers 400 bad_request.

direction'bullish' | 'bearish'

Keep one direction. Omit for both.

status'forming' | 'in_progress' | 'all'

forming (default): setups whose trigger has not fired. in_progress: setups that triggered and are running. all: both, forming first. Outcomes are never served here.

max_distance_pctnumber

Keep forming setups whose last close is within this many percent of the trigger (absolute distance), for "about to break out". In-progress rows are not filtered by it.

filtersstring

The screener's own filters, URL-encoded: a JSON array of predicates, one per kind: numeric kinds take op (<, <=, >, >=, =) and value, choice and text kinds take value, boolean kinds take value true or false, and the moving-average, performance and high/low kinds also take period. For example filters=[{"kind":"price","op":">","value":10},{"kind":"rsi","op":"<","value":40},{"kind":"asset_type","value":"stock"}]. Every predicate must match; a setup with no evidence for a kind never matches. The kinds, with what each takes and means, are the x-filters list on this operation (the reference page shows it as a table). A malformed list answers 400 bad_request with the reason.

limitinteger

Page size, 1 to 200 (default 50); clamped. count says how many matched.

offsetinteger

Rows to skip, for paging.

Headers

X-TradingPal-Clientstring

Optional name of the agent or script making the call. It is recorded in the account's usage log so the user can see which client made which calls; the User-Agent is recorded when it is absent.

Response

OK

api_version'v1' required

The contract version, always v1. Field names in v1 do not change, and v1 stays available at least 12 months after a v2 ships.

as_of_sessionstring date nullable required

The last trading session the data describes, as an ISO date. Setups change nightly, so say it when presenting data and do not cache setups across days. Null on routes that do not read a dated artifact (account, tickers, history, families, universe and the demo index).

data_versionstring nullable

Identifier of the stored artifact the answer came from: the candidate-book generation for patterns, the sealed manifest for family records. Null when the route reads no versioned artifact.

disclaimer'Educational breakout-pattern analysis from TradingPal, not investment advice. Past results do not guarantee future outcomes.' required

The educational-use disclaimer, constant on every response. Repeat it when presenting a setup as something the user might act on.

availableboolean required

True when the nightly has a current book. False when no book exists for the session; setups is then empty.

status'forming' | 'in_progress' | 'all' required

The status filter applied: forming, in_progress or all.

countinteger required

How many setups matched the filters, before paging.

limitinteger required

The page size applied (1 to 200).

offsetinteger required

The offset applied.

Example response

{
  "api_version": "v1",
  "as_of_session": "2026-09-25",
  "available": true,
  "status": "forming",
  "filters": {
    "family": null,
    "direction": null,
    "max_distance_pct": null,
    "predicates": []
  },
  "count": 212,
  "limit": 50,
  "offset": 0,
  "setups": [
    {
      "rank": 1,
      "expected_gain_pct": 6.8,
      "win_rate_pct": 54,
      "win_rate_trades": 31,
      "distance_to_trigger_pct": 3.69,
      "setup_id": "NVDA:D:falling_wedge:1",
      "lineage_id": "lineage-1",
      "page_url": "https://www.tradingpal.io/screener/falling-wedge?interval=D&focus=NVDA&p=aB3",
      "symbol": "NVDA",
      "interval": "D",
      "family": "falling_wedge",
      "family_label": "Falling wedge",
      "pattern_type": "falling_wedge",
      "direction": "bullish",
      "status": "forming",
      "pattern_start": "2026-08-08",
      "pattern_end": "2026-09-07",
      "as_of_session": "2026-09-25",
      "last_close": 101.5,
      "price_scale": "log",
      "lines": {
        "upper": {
          "start": {
            "date": "2026-08-08",
            "price": 110
          },
          "end": {
            "date": "2026-09-07",
            "price": 104
          },
          "touch_count": 3,
          "touches": [
            {
              "date": "2026-08-08",
              "price": 111.2
            }
          ]
        },
        "lower": {
          "start": {
            "date": "2026-08-08",
            "price": 90
          },
          "end": {
            "date": "2026-09-07",
            "price": 98
          },
          "touch_count": 2,
          "touches": []
        }
      },
      "trigger_rule": "A daily close above the upper line; the trigger price moves with the line.",
      "plans": [
        {
          "direction": "bullish",
          "trigger_price": 105.25,
          "stop_price": 96,
          "target_price": 120
        }
      ],
      "track_record": {
        "family": {
          "scope": "family",
          "family": "falling_wedge",
          "symbol": null,
          "win_rate_pct": 54,
          "sample_size": 1287,
          "wins": 695,
          "losses": 592,
          "avg_win_pct": 8.1,
          "avg_loss_pct": -4.2,
          "median_win_pct": 6.3,
          "avg_trade_pct": 2.4,
          "avg_r": 0.41,
          "expected_r": 0.41,
          "profit_factor": 1.61,
          "avg_hold_bars": 11.2,
          "backtest_range": [
            "2006-09-25",
            "2026-09-25"
          ],
          "measured": "Every detector-confirmed breakout … open trades are excluded.",
          "summary": "Falling wedge: 1,287 resolved trades from 2006-09-25 to 2026-09-25; 54% reached the target, average win +8.1%, average loss -4.2%, median win +6.3%."
        },
        "ticker": null
      }
    }
  ]
}

Changes

No recorded changes to this operation across all 1 revision of this API.