API reference

Demo setups

GET/demo/{symbol}No key needed

Current setups on a demo symbol, no key needed

Returns the current setups on one demo symbol, exactly as the keyed patterns route would, plus demo: true and a next sentence on getting a key. Only the demo symbols answer; any other symbol is 404 not_a_demo_symbol with the demo set in details.demo_symbols. No key is needed; keyless calls are limited per IP. The demo MCP tool is the same call with the first setup's chart attached as an image.

Authentication

No key needed. Without one the call is limited to 30 requests a minute per IP; with a key it counts against the key's limits instead.

Parameters

NameInTypeRequiredDescription
symbolpathstringyesExchange symbol, upper case (BRK.B, not BRK-B). Lower case is accepted and upper-cased.

Request

curl "https://api.tradingpal.io/api/v1/demo/NVDA"

Response

JSON. The fields this route adds are below; every response also carries the envelope fields (api_version, as_of_session, data_version, source, disclaimer).

FieldTypeDescription
symbolstringThe symbol asked for, upper-cased.
availablebooleanTrue when the nightly has a current candidate book for the symbol. False when the symbol is excluded from pattern analysis or no current book exists; setups is then empty.
reasonstring · nullableWhy available is false, when the reason is known: not_covered means the symbol is excluded from pattern analysis. Absent when available is true, and when the nightly simply has no current book for the symbol.
setupsarray of SetupThe current setups, one per eligible candidate. Empty when nothing is forming.
demobooleanTrue on the demo routes. Absent on the keyed route.
nextstring · nullableOn the demo routes, a sentence saying where to get a key for other tickers. Absent on the keyed route.

Example response

Response
{
  "api_version": "v1",
  "as_of_session": "2026-09-25",
  "symbol": "NVDA",
  "available": true,
  "setups": [
    {
      "setup_id": "NVDA:D:falling_wedge:1",
      "lineage_id": "lineage-1",
      "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
      }
    }
  ]
}

Errors

Errors are JSON with the Error shape; the fix field says what to do.

StatusCodeMeaningFix
429rate_limitedThe key passed 60 requests in a minute or 10,000 in a day, or a keyless caller passed 30 a minute from one IP.Wait details.retry_after_seconds, then retry. Cache the nightly answers; they do not change until the next session.
404not_a_demo_symbolThe keyless demo answers only for its fixed set of large caps.GET /demo lists the demo symbols. For any other ticker, use a key and track it.