Use cases · Builders
Fintech app builder: 20 ways to use Ora
Ships market insights inside a product: cards, nudges and push notifications. Each example is a complete, runnable request with the real answers it returned (39 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.
ora-fin-0.1.1. Another model changes the request JSON and the Playground link; run it there to see its answers.Rule functions and facts used by this player (43)
sma 10offset 8avg 3beat_eps_last 2days_to_earnings 2rsi 2days_to_ex_div 2div_yield_ttm 2raised_last 2atr 2log 2sqrt 2std 2max 2highest 2ref 2beat_revenue_last 1beat_streak 1next_report_bmo 1last_div_amount 1next_div_amount 1years_of_growth 1abs 1doji 1dragonfly_doji 1gravestone_doji 1harami_bear 1tweezer_top 1atr_pct 1days_since_split 1days_to_split 1last_split_ratio 1reverse_split_last 1splits_5y 1three_white_soldiers 1roc 1dark_cloud 1engulfing_bear 1evening_star 1harami_bull 1piercing_line 1tweezer_bottom 1div_count_ttm 1
Examples 1–10 of 20 · page 1 of 2
Fintech app builder · example 1
An in-app insight card for AAPL: trend, earnings and next week
Render a small card in a banking app's investing tab with three plain facts and one forecast, posted to the card service.
- StateAAPL
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
earn_soon | English → rule | Is earnings in the next 14 days? |
beat | English → rule | Did the stock beat EPS estimates last quarter? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
trendIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9463 | true |
earn_soonIs earnings in the next 14 days compiled to days_to_earnings <= 14 | 0.9463 | true |
beatDid the stock beat EPS estimates last quarter compiled to beat_eps_last > 0.5 | 0.8591 | true |
up_weekHigher in a week | 0.59 | 59% · close to even |
Actions
Rules on the answers decide what to send.
trend >= 0→Webhookcard-service{
"card": "stock_snapshot",
"symbol": "AAPL",
"as_of": "2026-10-30",
"in_uptrend": 0.9463,
"earnings_within_14d": 0.9463,
"beat_last_quarter": 0.8591,
"p_higher_in_week": 0.59
}What it means
For AAPL on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; Is earnings in the next 14 days; Did the stock beat EPS estimates last quarter. Forecasts: Higher in a week 59%. Fired: card (Webhook → card-service).
The card service gets typed probabilities and decides the wording; the app shows facts as yes or no and the forecast as odds.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"earn_soon": {
"type": "yes_no",
"instructions": "Is earnings in the next 14 days?"
},
"beat": {
"type": "yes_no",
"instructions": "Did the stock beat EPS estimates last quarter?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "card",
"when": "trend >= 0",
"do": "webhook",
"connection": "card-service",
"body": {
"card": "stock_snapshot",
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"in_uptrend": "{{trend}}",
"earnings_within_14d": "{{earn_soon}}",
"beat_last_quarter": "{{beat}}",
"p_higher_in_week": "{{up_week}}"
}
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"earn_soon": {
"yes_no": 0.9463,
"rule": "days_to_earnings <= 14",
"basis": "pattern"
},
"beat": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5",
"basis": "pattern"
},
"up_week": {
"yes_no": 0.59
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "card",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "card-service",
"preview": {
"body": {
"card": "stock_snapshot",
"symbol": "AAPL",
"as_of": "2026-10-30",
"in_uptrend": 0.9463,
"earnings_within_14d": 0.9463,
"beat_last_quarter": 0.8591,
"p_higher_in_week": 0.59
}
}
}
]
}Fintech app builder · example 2
Push notification when a watched stock dips in an uptrend (AMZN)
Send a push to users who follow AMZN only when it pulls back inside a long uptrend, not on every red day.
- StateAMZN
- Questions3 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AMZN"} The server fills in the latest completed session.
Questions
dip | rule | C > sma(C, 200) and rsi(C, 14) < 40Pullback in an uptrend: above the 200-day, RSI under 40 |
down3 | English → rule | Has the stock closed lower 3 days in a row? |
bounce_odds | forecast | Will it rally at least 5% at some point in the next month? A 5% rally within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
dipPullback in an uptrend: above the 200-day, RSI under 40 | 0.3073 | false |
down3Has the stock closed lower 3 days in a row compiled to (C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3]) | 0.3106 | false |
bounce_oddsA 5% rally within a month | 0.536 | 54% · close to even |
Actions
Rules on the answers decide what to send.
dip >= 0.6→Webhookpush-gatewayWhat it means
For AMZN on the session of 2026-10-30: Not true: Pullback in an uptrend: above the 200-day, RSI under 40; Has the stock closed lower 3 days in a row. Forecasts: A 5% rally within a month 54%. No action fired: every rule was false.
Most days nothing is pushed; the rule gate keeps notification volume low enough that users do not mute it.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AMZN"
},
"questions": {
"dip": {
"type": "yes_no",
"ask": "C > sma(C, 200) and rsi(C, 14) < 40"
},
"down3": {
"type": "yes_no",
"instructions": "Has the stock closed lower 3 days in a row?"
},
"bounce_odds": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "push",
"when": "dip >= 0.6",
"do": "webhook",
"connection": "push-gateway",
"body": {
"topic": "follow_{{symbol}}",
"title": "{{symbol}} pulled back",
"body": "{{symbol}} dipped while still above its 200-day average.",
"data": {
"symbol": "{{symbol}}",
"p_rally5": "{{bounce_odds}}",
"as_of": "{{as_of}}"
}
}
}
],
"dry_run": true
}Response JSON (AMZN, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"dip": {
"yes_no": 0.3073,
"rule": "C > sma(C, 200) and rsi(C, 14) < 40",
"basis": "rule"
},
"down3": {
"yes_no": 0.3106,
"rule": "(C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3])",
"basis": "pattern"
},
"bounce_odds": {
"yes_no": 0.536
}
},
"context": {
"symbol": "AMZN",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "push",
"fired": false,
"status": "skipped"
}
]
}Fintech app builder · example 3
Earnings badges for a watchlist screen: NVDA, AAPL, MSFT, AMZN, NFLX
Show an 'earnings soon' badge and a 'beat last time' badge next to each symbol in the app's watchlist.
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} then AAPL, MSFT, AMZN, NFLX, one request each. The server fills in the latest completed session.
Questions
soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
beat_both | rule | beat_eps_last > 0.5 and beat_revenue_last > 0.5Beat on EPS and revenue last quarter |
streak | rule | beat_streak >= 4Beat four quarters in a row |
bmo | English → rule | Does the stock report before the market opens next time? |
Answers
| Symbol | soonrule | beat_bothrule | streakrule | bmorule |
|---|---|---|---|---|
NVDA | 0.0563 | 0.8591 | 0.9463 | 0.1409 |
AAPL | 0.9392 | 0.8591 | 0.9463 | 0.1409 |
MSFT | 0.0537 | 0.8591 | 0.9463 | 0.1409 |
AMZN | 0.0537 | 0.1409 | 0.0537 | 0.1409 |
NFLX | 0.0537 | 0.8591 | 0.55 | 0.1409 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 5 symbols: Reports earnings within 10 days: true for AAPL of 5. Beat on EPS and revenue last quarter: true for NVDA, AAPL, MSFT, NFLX of 5. Beat four quarters in a row: true for NVDA, AAPL, MSFT of 5. Does the stock report before the market opens next time: true for none of 5.
Badges map directly to fact rules, so they are either shown or not; no probability needs to reach the user.
Request JSON (NVDA; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"soon": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"beat_both": {
"type": "yes_no",
"ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
},
"streak": {
"type": "yes_no",
"ask": "beat_streak >= 4"
},
"bmo": {
"type": "yes_no",
"instructions": "Does the stock report before the market opens next time?"
}
}
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"soon": {
"yes_no": 0.0563,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"beat_both": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "rule"
},
"streak": {
"yes_no": 0.9463,
"rule": "beat_streak >= 4",
"basis": "rule"
},
"bmo": {
"yes_no": 0.1409,
"rule": "next_report_bmo > 0.5",
"basis": "pattern"
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
}
}beat_eps_last beat_revenue_last beat_streak days_to_earnings next_report_bmo
Fintech app builder · example 4
A dividend calendar widget for income stocks (KO, PG, PEP, JNJ)
Fill a widget that lists upcoming ex-dates, yields and raise history for the user's income holdings.
- State4 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"KO"} then PG, PEP, JNJ, one request each. The server fills in the latest completed session.
Questions
ex_soon | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
yield3 | rule | div_yield_ttm > 3Yield above 3% |
raised | rule | raised_last > 0.5Raised its last dividend |
grower | rule | years_of_growth >= 10Ten years of dividend growth |
next_up | English → rule | Is the next declared dividend larger than the last one? |
Answers
| Symbol | ex_soonrule | yield3rule | raisedrule | growerrule | next_uprule |
|---|---|---|---|---|---|
KO | 0.2049 | 0.0537 | 0.1409 | 0.9463 | 0.45 |
PG | 0.0537 | 0.2091 | 0.1409 | 0.9463 | 0.50 |
PEP | 0.0537 | 0.9463 | 0.1409 | 0.9463 | 0.50 |
JNJ | 0.9187 | 0.0648 | 0.1409 | 0.9463 | 0.45 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 4 symbols: Goes ex-dividend within 30 days: true for JNJ of 4. Yield above 3%: true for PEP of 4. Raised its last dividend: true for none of 4. Ten years of dividend growth: true for KO, PG, PEP, JNJ of 4.
Ex-dates show only once declared; an undeclared next dividend answers no for ex-soon and not known for the next amount.
Request JSON (KO; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "KO"
},
"questions": {
"ex_soon": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"yield3": {
"type": "yes_no",
"ask": "div_yield_ttm > 3"
},
"raised": {
"type": "yes_no",
"ask": "raised_last > 0.5"
},
"grower": {
"type": "yes_no",
"ask": "years_of_growth >= 10"
},
"next_up": {
"type": "yes_no",
"instructions": "Is the next declared dividend larger than the last one?"
}
}
}Response JSON (KO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ex_soon": {
"yes_no": 0.2049,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"yield3": {
"yes_no": 0.0537,
"rule": "div_yield_ttm > 3",
"basis": "rule"
},
"raised": {
"yes_no": 0.1409,
"rule": "raised_last > 0.5",
"basis": "rule"
},
"grower": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 10",
"basis": "rule"
},
"next_up": {
"yes_no": 0.45,
"rule": "next_div_amount > last_div_amount",
"basis": "pattern"
}
},
"context": {
"symbol": "KO",
"as_of": "2026-10-30"
}
}days_to_ex_div div_yield_ttm last_div_amount next_div_amount raised_last years_of_growth
Fintech app builder · example 5
Explain TSLA's volatility in a user-facing tooltip
Tell users in plain words whether today was a big day for this stock and whether bigger swings are likely.
- StateTSLA
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
big_day | English → rule | Was today's move bigger than 1.5 ATR? |
atr3 | English → rule | Is the 14-day ATR more than 3% of the price? |
hv40 | English → rule | Is 20-day historical volatility above 40%? |
vol_rise | forecast | Will volatility rise over the next 5 days? Volatility rising over 5 days |
big_move5 | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
big_dayWas today's move bigger than 1.5 ATR compiled to abs(C - C[-1]) > 1.5 * atr(14) | 0.054 | false |
atr3Is the 14-day ATR more than 3% of the price compiled to atr(14) / C > 0.03 | 0.848 | true |
hv40Is 20-day historical volatility above 40% compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4 | 0.3248 | false |
vol_riseVolatility rising over 5 days | 0.38 | 38% · unlikely |
big_move5A big move either way in 5 days | 0.248 | 25% · unlikely |
What it means
For TSLA on the session of 2026-10-30: True now: Is the 14-day ATR more than 3% of the price. Not true: Was today's move bigger than 1.5 ATR; Is 20-day historical volatility above 40%. Forecasts: Volatility rising over 5 days 38%; A big move either way in 5 days 25%.
The tooltip quotes the yes/no facts for today and the odds for the coming week, so users see the difference between what happened and what might.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"big_day": {
"type": "yes_no",
"instructions": "Was today's move bigger than 1.5 ATR?"
},
"atr3": {
"type": "yes_no",
"instructions": "Is the 14-day ATR more than 3% of the price?"
},
"hv40": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility above 40%?"
},
"vol_rise": {
"type": "yes_no",
"instructions": "Will volatility rise over the next 5 days?"
},
"big_move5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
}
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"big_day": {
"yes_no": 0.054,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "pattern"
},
"atr3": {
"yes_no": 0.848,
"rule": "atr(14) / C > 0.03",
"basis": "pattern"
},
"hv40": {
"yes_no": 0.3248,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4",
"basis": "pattern"
},
"vol_rise": {
"yes_no": 0.38
},
"big_move5": {
"yes_no": 0.248
}
},
"context": {
"symbol": "TSLA",
"as_of": "2026-10-30"
}
}Fintech app builder · example 6
Goal-based savings app: pause auto-invest into VTI in a sharp drawdown?
A savings app asks whether to show a 'stay the course' message when the fund it auto-invests in drops sharply.
- StateVTI
- Questions4 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"VTI"} The server fills in the latest completed session.
Questions
down_month | English → rule | Is the stock down more than 5% over the last month? |
bear | English → rule | Is the stock in bear-market territory, more than 20% below its 52-week high? |
below_200 | English → rule | Is the stock below its 200-day moving average? |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
down_monthIs the stock down more than 5% over the last month compiled to C / C[-21] - 1 < -0.05 | 0.0662 | false |
bearIs the stock in bear-market territory, more than 20% below its 52-week high compiled to C < 0.8 * max(H, 252) | 0.0537 | false |
below_200Is the stock below its 200-day moving average compiled to C < sma(C, 200) | 0.0585 | false |
drop5A 5% drawdown within a month | 0.187 | 19% · unlikely |
Actions
Rules on the answers decide what to send.
down_month >= 0.6 or below_200 >= 0.6→Webhookin-app-messageselse→Webhookin-app-messages{
"segment": "autoinvest_VTI",
"template": "none",
"as_of": "2026-10-30"
}What it means
For VTI on the session of 2026-10-30: Not true: Is the stock down more than 5% over the last month; Is the stock in bear-market territory, more than 20% below its 52-week high; Is the stock below its 200-day moving average. Forecasts: A 5% drawdown within a month 19%. Fired: none (Webhook → in-app-messages).
The app never stops a user's plan on its own; it chooses which message to show, and an explicit none keeps the message queue predictable.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "VTI"
},
"questions": {
"down_month": {
"type": "yes_no",
"instructions": "Is the stock down more than 5% over the last month?"
},
"bear": {
"type": "yes_no",
"instructions": "Is the stock in bear-market territory, more than 20% below its 52-week high?"
},
"below_200": {
"type": "yes_no",
"instructions": "Is the stock below its 200-day moving average?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "reassure",
"when": "down_month >= 0.6 or below_200 >= 0.6",
"do": "webhook",
"connection": "in-app-messages",
"body": {
"segment": "autoinvest_{{symbol}}",
"template": "stay_the_course",
"fund": "{{symbol}}",
"as_of": "{{as_of}}"
}
},
{
"id": "none",
"when": "else",
"do": "webhook",
"connection": "in-app-messages",
"body": {
"segment": "autoinvest_{{symbol}}",
"template": "none",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (VTI, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"down_month": {
"yes_no": 0.0662,
"rule": "C / C[-21] - 1 < -0.05",
"basis": "pattern"
},
"bear": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "pattern"
},
"below_200": {
"yes_no": 0.0585,
"rule": "C < sma(C, 200)",
"basis": "comparison"
},
"drop5": {
"yes_no": 0.187
}
},
"context": {
"symbol": "VTI",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "reassure",
"fired": false,
"status": "skipped"
},
{
"id": "none",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "in-app-messages",
"preview": {
"body": {
"segment": "autoinvest_VTI",
"template": "none",
"as_of": "2026-10-30"
}
}
}
]
}Fintech app builder · example 7
Candle of the day: teach users one pattern on SPY
Show an educational card naming today's candlestick on SPY, if any pattern printed.
- StateSPY
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
doji | rule | doji()doji candle: Body at most 10% of the day's range. |
gravestone | rule | gravestone_doji()gravestone doji candle: Doji with a long upper wick and almost no lower wick. |
dragonfly | rule | dragonfly_doji()dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick. |
harami_bear | rule | harami_bear()harami bear candle: A small red body inside yesterday's green body. |
tweezer_top | rule | tweezer_top()tweezer top candle: Green then red, with highs within 0.1%. |
Answers
| Question | Answer | Reading |
|---|---|---|
dojidoji candle: Body at most 10% of the day's range. | 0.0579 | false |
gravestonegravestone doji candle: Doji with a long upper wick and almost no lower wick. | 0.0537 | false |
dragonflydragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick. | 0.0579 | false |
harami_bearharami bear candle: A small red body inside yesterday's green body. | 0.0597 | false |
tweezer_toptweezer top candle: Green then red, with highs within 0.1%. | 0.0537 | false |
What it means
For SPY on the session of 2026-10-30: Not true: doji candle: Body at most 10% of the day's range.; gravestone doji candle: Doji with a long upper wick and almost no lower wick.; dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.; harami bear candle: A small red body inside yesterday's green body.; tweezer top candle: Green then red, with highs within 0.1%..
Only a pattern that is true gets a card; on most days none prints, and the app falls back to a generic lesson.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"doji": {
"type": "yes_no",
"ask": "doji()"
},
"gravestone": {
"type": "yes_no",
"ask": "gravestone_doji()"
},
"dragonfly": {
"type": "yes_no",
"ask": "dragonfly_doji()"
},
"harami_bear": {
"type": "yes_no",
"ask": "harami_bear()"
},
"tweezer_top": {
"type": "yes_no",
"ask": "tweezer_top()"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"doji": {
"yes_no": 0.0579,
"rule": "doji()",
"basis": "rule"
},
"gravestone": {
"yes_no": 0.0537,
"rule": "gravestone_doji()",
"basis": "rule"
},
"dragonfly": {
"yes_no": 0.0579,
"rule": "dragonfly_doji()",
"basis": "rule"
},
"harami_bear": {
"yes_no": 0.0597,
"rule": "harami_bear()",
"basis": "rule"
},
"tweezer_top": {
"yes_no": 0.0537,
"rule": "tweezer_top()",
"basis": "rule"
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Fintech app builder · example 8
Weekly portfolio digest email for app users holding QQQ and SPY
Every Friday evening, email a short digest with trend and next-week odds for the two funds most users hold.
- ScheduleFri at 17:00 ET
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"QQQ"} then SPY, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
momentum | rule | C > C[-63]Higher than three months ago |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | trendrule | momentumrule | up_weekforecast | drop5forecast | Fired |
|---|---|---|---|---|---|
QQQ | 0.0653 | 0.2786 | 0.561 | 0.443 | digest |
SPY | 0.1128 | 0.3809 | 0.598 | 0.203 | digest |
true false not known for rules; forecasts are odds. Hover a column for its question.
Actions
Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.
trend >= 0→Emailuser-digests{
"subject": "QQQ this week (2026-10-30)",
"text": "QQQ: above its 50-day 7%, higher than three months ago 28%. Odds it is higher in a week 56%; a 5% dip within a month 44%. Information, not advice."
}{
"subject": "SPY this week (2026-10-30)",
"text": "SPY: above its 50-day 11%, higher than three months ago 38%. Odds it is higher in a week 60%; a 5% dip within a month 20%. Information, not advice."
}What it means
Session of 2026-10-30, 2 symbols: Above the 50-day average: true for none of 2. Higher than three months ago: true for none of 2. Highest odds for “Higher in a week”: SPY at 60%. digest fired for QQQ, SPY.
The digest always goes out and always labels the forecast as odds; rules and forecasts are never mixed in one sentence.
As a scheduled workflow (Fri at 17:00 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Weekly portfolio digest email for app users holding QQQ and SPY",
"symbols": "QQQ SPY",
"days": [
5
],
"at_time": "17:00",
"model": "ora-fin-0.1.1",
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"momentum": {
"type": "yes_no",
"ask": "C > C[-63]"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "digest",
"when": "trend >= 0",
"do": "email",
"connection": "user-digests",
"subject": "{{symbol}} this week ({{as_of}})",
"message": "{{symbol}}: above its 50-day {{trend|pct}}, higher than three months ago {{momentum|pct}}. Odds it is higher in a week {{up_week|pct}}; a 5% dip within a month {{drop5|pct}}. Information, not advice."
}
]
}Request JSON (QQQ; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "QQQ"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"momentum": {
"type": "yes_no",
"ask": "C > C[-63]"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "digest",
"when": "trend >= 0",
"do": "email",
"connection": "user-digests",
"subject": "{{symbol}} this week ({{as_of}})",
"message": "{{symbol}}: above its 50-day {{trend|pct}}, higher than three months ago {{momentum|pct}}. Odds it is higher in a week {{up_week|pct}}; a 5% dip within a month {{drop5|pct}}. Information, not advice."
}
],
"dry_run": true
}Response JSON (QQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0653,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"momentum": {
"yes_no": 0.2786,
"rule": "C > C[-63]",
"basis": "rule"
},
"up_week": {
"yes_no": 0.561
},
"drop5": {
"yes_no": 0.443
}
},
"context": {
"symbol": "QQQ",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "digest",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "user-digests",
"preview": {
"subject": "QQQ this week (2026-10-30)",
"text": "QQQ: above its 50-day 7%, higher than three months ago 28%. Odds it is higher in a week 56%; a 5% dip within a month 44%. Information, not advice."
}
}
]
}Fintech app builder · example 9
A 'new 52-week high' badge for COST
Show a celebratory badge when a holding makes a new 52-week high on good volume.
- StateCOST
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"COST"} The server fills in the latest completed session.
Questions
new_high | rule | H > highest(H, 252)New 52-week high |
close_high | English → rule | Did the stock make a new 52-week closing high? |
volume | rule | V > avg(V, 20)Volume above its 20-day average |
pullback_odds | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
new_highNew 52-week high | 0.0669 | false |
close_highDid the stock make a new 52-week closing high compiled to C > highest(C, 252) | 0.0614 | false |
volumeVolume above its 20-day average | 0.9297 | true |
pullback_oddsA 5% drawdown within a month | 0.319 | 32% · unlikely |
Actions
Rules on the answers decide what to send.
new_high >= 0.6→Webhookbadge-serviceWhat it means
For COST on the session of 2026-10-30: True now: Volume above its 20-day average. Not true: New 52-week high; Did the stock make a new 52-week closing high. Forecasts: A 5% drawdown within a month 32%. No action fired: every rule was false.
The badge depends only on the fact rule; the volume flag lets the app add 'on strong volume' when it is true.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "COST"
},
"questions": {
"new_high": {
"type": "yes_no",
"ask": "H > highest(H, 252)"
},
"close_high": {
"type": "yes_no",
"instructions": "Did the stock make a new 52-week closing high?"
},
"volume": {
"type": "yes_no",
"ask": "V > avg(V, 20)"
},
"pullback_odds": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "badge",
"when": "new_high >= 0.6",
"do": "webhook",
"connection": "badge-service",
"body": {
"badge": "new_52w_high",
"symbol": "{{symbol}}",
"closed_at_high": "{{close_high}}",
"volume_confirmed": "{{volume}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (COST, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"new_high": {
"yes_no": 0.0669,
"rule": "H > highest(H, 252)",
"basis": "rule"
},
"close_high": {
"yes_no": 0.0614,
"rule": "C > highest(C, 252)",
"basis": "pattern"
},
"volume": {
"yes_no": 0.9297,
"rule": "V > avg(V, 20)",
"basis": "rule"
},
"pullback_odds": {
"yes_no": 0.319
}
},
"context": {
"symbol": "COST",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "badge",
"fired": false,
"status": "skipped"
}
]
}Fintech app builder · example 10
Round-up investing: which fund gets this week's spare change?
A round-up app picks between a stock fund and a bond fund based on trend and drawdown, then posts the allocation.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"VOO"} then BND, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
dd | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
sma_up | rule | sma(C, 200) > ref(sma(C, 200), -20)The 200-day average is rising |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | trendrule | ddrule | sma_uprule | drop5forecast |
|---|---|---|---|---|
VOO | 0.9463 | 0.0537 | 0.9463 | 0.194 |
BND | 0.2013 | 0.0537 | 0.0674 | 0.007 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 2 symbols: Is the stock above its 200-day moving average: true for VOO of 2. More than 20% off the 52-week high: true for none of 2. The 200-day average is rising: true for VOO of 2. Highest odds for “A 5% drawdown within a month”: VOO at 19%.
Both funds answer the same questions; the app's own policy, not Ora, decides the split from these answers.
Request JSON (VOO; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "VOO"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"dd": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"sma_up": {
"type": "yes_no",
"ask": "sma(C, 200) > ref(sma(C, 200), -20)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
}
}Response JSON (VOO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"dd": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"sma_up": {
"yes_no": 0.9463,
"rule": "sma(C, 200) > ref(sma(C, 200), -20)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.194
}
},
"context": {
"symbol": "VOO",
"as_of": "2026-10-30"
}
}Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Builders: Quant developer, Robo-advisor, Broker app, Algo / bot developer, Data vendor / platform, Trading educator / newsletter.