Ora
All guides All guides

Getting started

Your first decision in the Playground Call the API from your code Save, share and reuse queries

Financial decisions

Decide on a stock with just its symbol Write your own rule Read probabilities and choose thresholds

Rule playground

From English to rule Combining conditions Offsets and windows Reading beliefs Rules plus forecasts in one request Turning a rule into an alert or workflow

Automation

Send a Slack alert when a rule fires Send decisions to your own system Run a watchlist every day after the close

Production

Handle errors, rate limits and retries

Cookbooks

All cookbooks Rank a watchlist by probability Send a pre-open digest Trend filter plus entry trigger Breakout confirmation with volume RSI and Bollinger mean-reversion checks Gap-fill playbook to your order system Confidence-gated actions Detect two-way risk Size positions by volatility regime Risk guardrail before an order Ask many questions in one request Self-consistency: three wordings Route support tickets Is a headline relevant to a symbol?

Use cases

Tag financial news for trading signalsGuardrails for LLM appsSupport ticket triage and routingFilter retrieved passages before your LLM answersVerify claims and citations against a source

Guides / Cookbooks

Cookbooks · Screening and digests · Beginner · about 10 min

Rank a watchlist by probability

Ask the same three questions about every symbol on a list, send one request per symbol in parallel, and sort the list by the answers.

  1. When to use it

    You keep a list of 5 to 100 names and want a ranking after the close or before the open: which ones lean up for the week, and which ones have the widest monthly range. Each symbol is independent, so the requests can run side by side. For the same thing on a schedule with no code, see Send a pre-open digest.

  2. The request

    One request per symbol. Only state.symbol changes; the server fills in that symbol's latest completed session.

    {
      "model": "ora-fin1",
      "state": {
        "symbol": "AAPL"
      },
      "questions": {
        "rally5": {
          "type": "yes_no",
          "instructions": "Will it rally at least 5% at some point in the next month?"
        },
        "drop5": {
          "type": "yes_no",
          "instructions": "Will it drop at least 5% at some point in the next month?"
        },
        "up_week": {
          "type": "yes_no",
          "instructions": "Will the stock be higher in a week?"
        }
      }
    }
    Open this in the Playground
  3. The real response

    For AAPL:

    {
      "model": "ora-fin1",
      "answers": {
        "rally5": {
          "type": "yes_no",
          "yes_no": 0.446
        },
        "drop5": {
          "type": "yes_no",
          "yes_no": 0.365
        },
        "up_week": {
          "type": "yes_no",
          "yes_no": 0.59
        }
      },
      "usage": {
        "input_tokens": 362,
        "output_tokens": 12
      },
      "context": {
        "source": "server",
        "symbol": "AAPL",
        "as_of": "2026-10-30"
      },
      "version": "ora-fin-0.1.1"
    }

    All eight symbols, ranked by up_week (session of 2026-10-30):

    Symbolup_weekrally5drop5rally5 − drop5
    XLE0.5920.4910.491+0.000
    AAPL0.590.4460.365+0.081
    AMD0.5770.8360.763+0.073
    MSFT0.5740.4950.422+0.073
    QQQ0.5610.5010.443+0.058
    NVDA0.5270.6160.523+0.093
    AMZN0.4930.5360.462+0.074
    TSLA0.4870.6870.638+0.049
  4. The code

    The single request in your language:

    Requires curl 7.76+. Save as run.sh, then: bash run.sh
    curl -sS https://oramodel.com/v1/systemone \
      -H "Authorization: Bearer $JEV_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "model": "ora-fin1",
      "state": {
        "symbol": "AAPL"
      },
      "questions": {
        "rally5": {
          "type": "yes_no",
          "instructions": "Will it rally at least 5% at some point in the next month?"
        },
        "drop5": {
          "type": "yes_no",
          "instructions": "Will it drop at least 5% at some point in the next month?"
        },
        "up_week": {
          "type": "yes_no",
          "instructions": "Will the stock be higher in a week?"
        }
      }
    }'

    The whole list, four requests at a time, ranked:

    import os
    import requests
    
    URL = "https://oramodel.com/v1/systemone"
    HEADERS = {"Authorization": f"Bearer {os.environ['JEV_API_KEY']}"}
    from concurrent.futures import ThreadPoolExecutor
    
    SYMBOLS = ["AAPL","MSFT","NVDA","TSLA","AMZN","AMD","QQQ","XLE"]
    QUESTIONS = {
        "rally5": {
            "type": "yes_no",
            "instructions": "Will it rally at least 5% at some point in the next month?"
        },
        "drop5": {
            "type": "yes_no",
            "instructions": "Will it drop at least 5% at some point in the next month?"
        },
        "up_week": {
            "type": "yes_no",
            "instructions": "Will the stock be higher in a week?"
        }
    }
    
    def ask(symbol):
        r = requests.post(URL, headers=HEADERS, timeout=30,
                          json={"model": "ora-fin1", "state": {"symbol": symbol}, "questions": QUESTIONS})
        if r.status_code == 422:          # symbol not covered: skip it
            return symbol, None
        r.raise_for_status()
        return symbol, {k: v["yes_no"] for k, v in r.json()["answers"].items()}
    
    with ThreadPoolExecutor(max_workers=4) as pool:
        rows = [(s, a) for s, a in pool.map(ask, SYMBOLS) if a]
    
    for s, a in sorted(rows, key=lambda r: r[1]["up_week"], reverse=True):
        print(f"{s:5} up_week {a['up_week']:.3f}  rally5 {a['rally5']:.3f}  drop5 {a['drop5']:.3f}  skew {a['rally5'] - a['drop5']:+.3f}")

    In JavaScript (Node 18+):

    const SYMBOLS = ["AAPL","MSFT","NVDA","TSLA","AMZN","AMD","QQQ","XLE"];
    const QUESTIONS = {
      "rally5": {
        "type": "yes_no",
        "instructions": "Will it rally at least 5% at some point in the next month?"
      },
      "drop5": {
        "type": "yes_no",
        "instructions": "Will it drop at least 5% at some point in the next month?"
      },
      "up_week": {
        "type": "yes_no",
        "instructions": "Will the stock be higher in a week?"
      }
    };
    
    async function ask(symbol) {
      const res = await fetch("https://oramodel.com/v1/systemone", {
        method: "POST",
        headers: { Authorization: `Bearer ${process.env.JEV_API_KEY}`, "Content-Type": "application/json" },
        body: JSON.stringify({ model: "ora-fin1", state: { symbol }, questions: QUESTIONS }),
      });
      if (res.status === 422) return null;               // not covered
      if (!res.ok) throw new Error(`${symbol}: ${res.status}`);
      const { answers } = await res.json();
      return { symbol, ...Object.fromEntries(Object.entries(answers).map(([k, v]) => [k, v.yes_no])) };
    }
    
    const rows = (await Promise.all(SYMBOLS.map(ask))).filter(Boolean);
    rows.sort((a, b) => b.up_week - a.up_week);
    console.table(rows);

    Keep the pool small: limits are per organization and shared with the console. On a 429, wait Retry-After seconds (Handle errors and retries).

  5. Act on it

    A ranking is relative. On this session the top up_week is XLE at 0.592 and the bottom is TSLA at 0.487: nothing is far from a coin flip on the week, so a sensible screen acts on none of them and just watches the top of the list. Decide the line first (for example up_week >= 0.62), then rank what clears it. Read probabilities and choose thresholds shows how.

    The other columns tell a different story. AMD has the highest odds of both a 5% rally and a 5% drop (84% and 76%): a wide range rather than a direction. That case has its own recipe, Detect two-way risk.

  6. Variations

Information, not investment advice. Every number on this page is a real response for the session shown; answers change with each session.

What's next

Create an account Open the Playground Everything here also lives in the console, next to your keys and usage.