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 11–20 of 20 · page 2 of 2
Fintech app builder · example 11
Morning commute alert: did NFLX gap and fill?
Tell commuters whether a followed stock gapped, filled the gap, or held it, in one short notification.
- StateNFLX
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NFLX"} The server fills in the latest completed session.
Questions
gap_up | rule | O > C[-1] * 1.01Opened more than 1% above yesterday's close |
gap_dn | rule | O < C[-1] * 0.99Opened more than 1% below yesterday's close |
faded | rule | O > C[-1] and C < C[-1]Gapped up but closed under yesterday's close |
reclaimed | rule | O < L[-1] and C > C[-1]Opened under yesterday's low, closed up on the day |
filled | English → rule | Did today's gap up fill? |
Answers
| Question | Answer | Reading |
|---|---|---|
gap_upOpened more than 1% above yesterday's close | 0.4929 | on the line (false) |
gap_dnOpened more than 1% below yesterday's close | 0.1197 | false |
fadedGapped up but closed under yesterday's close | 0.4872 | on the line (false) |
reclaimedOpened under yesterday's low, closed up on the day | 0.1484 | false |
filledDid today's gap up fill compiled to (O > C[-1] * 1) and (L <= C[-1]) | 0.6813 | true |
Actions
Rules on the answers decide what to send.
gap_up >= 0.6 or gap_dn >= 0.6→Webhookpush-gatewayWhat it means
For NFLX on the session of 2026-10-30: True now: Did today's gap up fill. Not true: Opened more than 1% below yesterday's close; Opened under yesterday's low, closed up on the day. On the line: Opened more than 1% above yesterday's close; Gapped up but closed under yesterday's close. No action fired: every rule was false.
Gap rules describe the last completed session; the app words it as yesterday's session, never as live trading.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NFLX"
},
"questions": {
"gap_up": {
"type": "yes_no",
"ask": "O > C[-1] * 1.01"
},
"gap_dn": {
"type": "yes_no",
"ask": "O < C[-1] * 0.99"
},
"faded": {
"type": "yes_no",
"ask": "O > C[-1] and C < C[-1]"
},
"reclaimed": {
"type": "yes_no",
"ask": "O < L[-1] and C > C[-1]"
},
"filled": {
"type": "yes_no",
"instructions": "Did today's gap up fill?"
}
},
"actions": [
{
"id": "gap_note",
"when": "gap_up >= 0.6 or gap_dn >= 0.6",
"do": "webhook",
"connection": "push-gateway",
"body": {
"topic": "follow_{{symbol}}",
"title": "{{symbol}} gapped",
"data": {
"gap_up": "{{gap_up}}",
"gap_down": "{{gap_dn}}",
"faded": "{{faded}}",
"reclaimed": "{{reclaimed}}",
"as_of": "{{as_of}}"
}
}
}
],
"dry_run": true
}Response JSON (NFLX, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_up": {
"yes_no": 0.4929,
"rule": "O > C[-1] * 1.01",
"basis": "rule"
},
"gap_dn": {
"yes_no": 0.1197,
"rule": "O < C[-1] * 0.99",
"basis": "rule"
},
"faded": {
"yes_no": 0.4872,
"rule": "O > C[-1] and C < C[-1]",
"basis": "rule"
},
"reclaimed": {
"yes_no": 0.1484,
"rule": "O < L[-1] and C > C[-1]",
"basis": "rule"
},
"filled": {
"yes_no": 0.6813,
"rule": "(O > C[-1] * 1) and (L <= C[-1])",
"basis": "pattern"
}
},
"context": {
"symbol": "NFLX",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "gap_note",
"fired": false,
"status": "skipped"
}
]
}Fintech app builder · example 12
Inputs for a simple risk meter on ARKK
Fill a one-to-five risk meter in the app from volatility rules and the drawdown forecast.
- StateARKK
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"ARKK"} The server fills in the latest completed session.
Questions
atr | rule | atr_pct(14) > 3A typical day moves more than 3% |
hv | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
wide | rule | (H - L) > 2 * avg(H - L, 20)Range more than twice the 20-day average range |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
hv30 | forecast | Will annualized volatility over the next 21 sessions exceed 30%? Next-month volatility above 30% |
Answers
| Question | Answer | Reading |
|---|---|---|
atrA typical day moves more than 3% | 0.9369 | true |
hvAnnualized 20-day volatility above 40% | 0.7844 | true |
wideRange more than twice the 20-day average range | 0.0603 | false |
drop10A 10% drawdown within a month | 0.61 | 61% · likely |
hv30Next-month volatility above 30% | 0.426 | 43% · close to even |
What it means
For ARKK on the session of 2026-10-30: True now: A typical day moves more than 3%; Annualized 20-day volatility above 40%. Not true: Range more than twice the 20-day average range. Forecasts: A 10% drawdown within a month 61%; Next-month volatility above 30% 43%.
The meter adds up true volatility rules and scales by the forecast; each input is shown on tap so the score is explainable.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "ARKK"
},
"questions": {
"atr": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"wide": {
"type": "yes_no",
"ask": "(H - L) > 2 * avg(H - L, 20)"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
},
"hv30": {
"type": "yes_no",
"instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
}
}
}Response JSON (ARKK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr": {
"yes_no": 0.9369,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"hv": {
"yes_no": 0.7844,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
},
"wide": {
"yes_no": 0.0603,
"rule": "(H - L) > 2 * avg(H - L, 20)",
"basis": "rule"
},
"drop10": {
"yes_no": 0.61
},
"hv30": {
"yes_no": 0.426
}
},
"context": {
"symbol": "ARKK",
"as_of": "2026-10-30"
}
}Fintech app builder · example 13
Explain a past split on NVDA's chart
When users see a jump in share count or an old price, show a card explaining the split history.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
split3y | rule | days_since_split <= 1095Split in the last three years |
ratio4 | rule | last_split_ratio >= 4Last split at least 4-for-1 |
multi | rule | splits_5y >= 2Two or more splits in five years |
reverse | English → rule | Was the last split a reverse split? |
announced | English → rule | Is a stock split coming up? |
Answers
| Question | Answer | Reading |
|---|---|---|
split3ySplit in the last three years | 0.9463 | true |
ratio4Last split at least 4-for-1 | 0.9463 | true |
multiTwo or more splits in five years | 0.1409 | false |
reverseWas the last split a reverse split compiled to reverse_split_last > 0.5 | 0.1409 | false |
announcedIs a stock split coming up compiled to days_to_split <= 365 | 0.0537 | false |
What it means
For NVDA on the session of 2026-10-30: True now: Split in the last three years; Last split at least 4-for-1. Not true: Two or more splits in five years; Was the last split a reverse split; Is a stock split coming up.
Split facts come from the corporate-action record and are exact; the card only appears when a recent split is true.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"split3y": {
"type": "yes_no",
"ask": "days_since_split <= 1095"
},
"ratio4": {
"type": "yes_no",
"ask": "last_split_ratio >= 4"
},
"multi": {
"type": "yes_no",
"ask": "splits_5y >= 2"
},
"reverse": {
"type": "yes_no",
"instructions": "Was the last split a reverse split?"
},
"announced": {
"type": "yes_no",
"instructions": "Is a stock split coming up?"
}
}
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"split3y": {
"yes_no": 0.9463,
"rule": "days_since_split <= 1095",
"basis": "rule"
},
"ratio4": {
"yes_no": 0.9463,
"rule": "last_split_ratio >= 4",
"basis": "rule"
},
"multi": {
"yes_no": 0.1409,
"rule": "splits_5y >= 2",
"basis": "rule"
},
"reverse": {
"yes_no": 0.1409,
"rule": "reverse_split_last > 0.5",
"basis": "pattern"
},
"announced": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "pattern"
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
}
}days_since_split days_to_split last_split_ratio reverse_split_last splits_5y
Fintech app builder · example 14
A crypto tile for bitcoin ETFs: IBIT and FBTC
Show users who hold spot bitcoin ETFs whether trend and volatility are calm or stretched.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IBIT"} then FBTC, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
stretched | rule | C > sma(C, 20) + 2 * atr(14)Stretched: more than 2 ATR above the 20-day |
atr | English → rule | Is the 14-day ATR more than 3% of the price? |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
rally10 | forecast | Will it rally at least 10% at some point in the next month? A 10% rally within a month |
Answers
| Symbol | trendrule | stretchedrule | atrrule | drop10forecast | rally10forecast |
|---|---|---|---|---|---|
IBIT | 0.1649 | 0.0618 | 0.2365 | 0.566 | 0.64 |
FBTC | 0.1693 | 0.0624 | 0.1881 | 0.573 | 0.642 |
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: Above the 50-day average: true for none of 2. Stretched: more than 2 ATR above the 20-day: true for none of 2. Is the 14-day ATR more than 3% of the price: true for none of 2. Highest odds for “A 10% drawdown within a month”: FBTC at 57%.
Both funds track the same asset, so their answers should be close; a big difference would point to a data issue worth checking.
Request JSON (IBIT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IBIT"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"stretched": {
"type": "yes_no",
"ask": "C > sma(C, 20) + 2 * atr(14)"
},
"atr": {
"type": "yes_no",
"instructions": "Is the 14-day ATR more than 3% of the price?"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
},
"rally10": {
"type": "yes_no",
"instructions": "Will it rally at least 10% at some point in the next month?"
}
}
}Response JSON (IBIT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.1649,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"stretched": {
"yes_no": 0.0618,
"rule": "C > sma(C, 20) + 2 * atr(14)",
"basis": "rule"
},
"atr": {
"yes_no": 0.2365,
"rule": "atr(14) / C > 0.03",
"basis": "pattern"
},
"drop10": {
"yes_no": 0.566
},
"rally10": {
"yes_no": 0.64
}
},
"context": {
"symbol": "IBIT",
"as_of": "2026-10-30"
}
}Fintech app builder · example 15
Re-engagement email when a followed stock (DIS) breaks out
Bring back dormant users who follow a stock by emailing them when it makes a meaningful move up.
- StateDIS
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"DIS"} The server fills in the latest completed session.
Questions
breakout | rule | C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)20-day breakout on 1.5× volume |
cross50 | English → rule | Did the stock cross above its 50-day moving average today? |
soldiers | rule | three_white_soldiers()three white soldiers candle: Three green bars, each closing higher and opening inside the previous body. |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
breakout20-day breakout on 1.5× volume | 0.0758 | false |
cross50Did the stock cross above its 50-day moving average today compiled to (C > sma(C, 50)) and (C[-1] <= ref(sma(C, 50), -1)) | 0.1105 | false |
soldiersthree white soldiers candle: Three green bars, each closing higher and opening inside the previous body. | 0.0793 | false |
up_weekHigher in a week | 0.562 | 56% · close to even |
Actions
Rules on the answers decide what to send.
breakout >= 0.6 or soldiers >= 0.6→EmaillifecycleWhat it means
For DIS on the session of 2026-10-30: Not true: 20-day breakout on 1.5× volume; Did the stock cross above its 50-day moving average today; three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.. Forecasts: Higher in a week 56%. No action fired: every rule was false.
Lifecycle emails tied to real events beat calendar blasts; the rule gate means a dormant user hears only when something happened.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "DIS"
},
"questions": {
"breakout": {
"type": "yes_no",
"ask": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)"
},
"cross50": {
"type": "yes_no",
"instructions": "Did the stock cross above its 50-day moving average today?"
},
"soldiers": {
"type": "yes_no",
"ask": "three_white_soldiers()"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "winback",
"when": "breakout >= 0.6 or soldiers >= 0.6",
"do": "email",
"connection": "lifecycle",
"subject": "{{symbol}} is moving",
"message": "{{symbol}} ({{as_of}}) broke out on volume ({{breakout|pct}}) or printed three white soldiers ({{soldiers|pct}}). Open the app to see the full picture."
}
],
"dry_run": true
}Response JSON (DIS, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"breakout": {
"yes_no": 0.0758,
"rule": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"cross50": {
"yes_no": 0.1105,
"rule": "(C > sma(C, 50)) and (C[-1] <= ref(sma(C, 50), -1))",
"basis": "comparison"
},
"soldiers": {
"yes_no": 0.0793,
"rule": "three_white_soldiers()",
"basis": "rule"
},
"up_week": {
"yes_no": 0.562
}
},
"context": {
"symbol": "DIS",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "winback",
"fired": false,
"status": "skipped"
}
]
}Fintech app builder · example 16
Feed a sector heatmap: XLK, XLF, XLE, XLV, XLU, XLY
Color six sector tiles by trend and momentum from one rule set, posted to the app's heatmap endpoint.
- State6 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"XLK"} then XLF, XLE, XLV, XLU, XLY, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
roc | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
rsi | rule | rsi(C, 14) > 50RSI above 50 |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | trendrule | rocrule | rsirule | up_weekforecast | Fired |
|---|---|---|---|---|---|
XLK | 0.0776 | 0.0537 | 0.0957 | 0.546 | tile |
XLF | 0.6692 | 0.606 | 0.7929 | 0.541 | tile |
XLE | 0.9432 | 0.897 | 0.9318 | 0.592 | tile |
XLV | 0.9447 | 0.9157 | 0.9415 | 0.571 | tile |
XLU | 0.8865 | 0.8282 | 0.8929 | 0.515 | tile |
XLY | 0.8156 | 0.4761 | 0.8376 | 0.479 | tile |
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→Webhookheatmap{
"tile": "XLK",
"trend": 0.0776,
"roc20_over_5": 0.0537,
"rsi_over_50": 0.0957,
"p_up_week": 0.546,
"as_of": "2026-10-30"
}{
"tile": "XLF",
"trend": 0.6692,
"roc20_over_5": 0.606,
"rsi_over_50": 0.7929,
"p_up_week": 0.541,
"as_of": "2026-10-30"
}{
"tile": "XLE",
"trend": 0.9432,
"roc20_over_5": 0.897,
"rsi_over_50": 0.9318,
"p_up_week": 0.592,
"as_of": "2026-10-30"
}{
"tile": "XLV",
"trend": 0.9447,
"roc20_over_5": 0.9157,
"rsi_over_50": 0.9415,
"p_up_week": 0.571,
"as_of": "2026-10-30"
}{
"tile": "XLU",
"trend": 0.8865,
"roc20_over_5": 0.8282,
"rsi_over_50": 0.8929,
"p_up_week": 0.515,
"as_of": "2026-10-30"
}{
"tile": "XLY",
"trend": 0.8156,
"roc20_over_5": 0.4761,
"rsi_over_50": 0.8376,
"p_up_week": 0.479,
"as_of": "2026-10-30"
}What it means
Session of 2026-10-30, 6 symbols: Above the 50-day average: true for XLF, XLE, XLV, XLU, XLY of 6. Up more than 5% in 20 sessions: true for XLF, XLE, XLV, XLU of 6. RSI above 50: true for XLF, XLE, XLV, XLU, XLY of 6. Highest odds for “Higher in a week”: XLE at 59%. tile fired for XLK, XLF, XLE, XLV, XLU, XLY.
Every sector posts a tile; the app colors by the count of true rules and shows the forecast on hover.
Request JSON (XLK; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"roc": {
"type": "yes_no",
"ask": "roc(C, 20) > 5"
},
"rsi": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "tile",
"when": "trend >= 0",
"do": "webhook",
"connection": "heatmap",
"body": {
"tile": "{{symbol}}",
"trend": "{{trend}}",
"roc20_over_5": "{{roc}}",
"rsi_over_50": "{{rsi}}",
"p_up_week": "{{up_week}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0776,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"roc": {
"yes_no": 0.0537,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"rsi": {
"yes_no": 0.0957,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
},
"up_week": {
"yes_no": 0.546
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "tile",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "heatmap",
"preview": {
"body": {
"tile": "XLK",
"trend": 0.0776,
"roc20_over_5": 0.0537,
"rsi_over_50": 0.0957,
"p_up_week": 0.546,
"as_of": "2026-10-30"
}
}
}
]
}Fintech app builder · example 17
A gentle warning card after a bearish candle on MSFT
Show a 'watch this' card when an evening star, bearish engulfing or dark cloud prints on a holding.
- StateMSFT
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
evening | rule | evening_star()evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. |
engulf_bear | rule | engulfing_bear()engulfing bear candle: A red body that engulfs yesterday's green body. |
dark_cloud | rule | dark_cloud()dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). |
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 |
|---|---|---|
eveningevening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. | 0.0631 | false |
engulf_bearengulfing bear candle: A red body that engulfs yesterday's green body. | 0.0823 | false |
dark_clouddark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). | 0.0643 | false |
drop5A 5% drawdown within a month | 0.422 | 42% · close to even |
What it means
For MSFT on the session of 2026-10-30: Not true: evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.; engulfing bear candle: A red body that engulfs yesterday's green body.; dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).. Forecasts: A 5% drawdown within a month 42%.
A bearish candle is a reason to look, not a sell signal; the app shows the drawdown odds next to the pattern to keep it in proportion.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"evening": {
"type": "yes_no",
"ask": "evening_star()"
},
"engulf_bear": {
"type": "yes_no",
"ask": "engulfing_bear()"
},
"dark_cloud": {
"type": "yes_no",
"ask": "dark_cloud()"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
}
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"evening": {
"yes_no": 0.0631,
"rule": "evening_star()",
"basis": "rule"
},
"engulf_bear": {
"yes_no": 0.0823,
"rule": "engulfing_bear()",
"basis": "rule"
},
"dark_cloud": {
"yes_no": 0.0643,
"rule": "dark_cloud()",
"basis": "rule"
},
"drop5": {
"yes_no": 0.422
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
}
}Fintech app builder · example 18
Pre-market cards for the five most-followed stocks
Each weekday before the open, generate a card per stock with yesterday's facts and today's odds.
- ScheduleMon–Fri at 08:30 ET
- State5 symbols
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then TSLA, NVDA, AMZN, MSFT, one request each. The server fills in the latest completed session.
Questions
up_day | English → rule | Did the stock close higher than yesterday? |
above_50 | rule | C > sma(C, 50)Above the 50-day average |
gap_up | forecast | Will it gap up tomorrow? A gap up tomorrow |
gap_down | forecast | Will it gap down tomorrow? A gap down tomorrow |
up_tomorrow | forecast | Will the stock be up tomorrow? Up tomorrow |
Answers
| Symbol | up_dayrule | above_50rule | gap_upforecast | gap_downforecast | up_tomorrowforecast | Fired |
|---|---|---|---|---|---|---|
AAPL | 0.127 | 0.9119 | 0.053 | 0.056 | 0.556 | card |
TSLA | 0.2949 | 0.8961 | 0.224 | 0.157 | 0.482 | card |
NVDA | 0.0732 | 0.0746 | 0.191 | 0.116 | 0.485 | card |
AMZN | 0.1852 | 0.0964 | 0.198 | 0.131 | 0.476 | card |
MSFT | 0.1148 | 0.7088 | 0.071 | 0.071 | 0.548 | card |
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.
up_day >= 0→Webhookcard-service{
"card": "pre_market",
"symbol": "AAPL",
"closed_up": 0.127,
"above_50d": 0.9119,
"p_gap_up": 0.053,
"p_gap_down": 0.056,
"p_up_today": 0.556,
"as_of": "2026-10-30"
}{
"card": "pre_market",
"symbol": "TSLA",
"closed_up": 0.2949,
"above_50d": 0.8961,
"p_gap_up": 0.224,
"p_gap_down": 0.157,
"p_up_today": 0.482,
"as_of": "2026-10-30"
}{
"card": "pre_market",
"symbol": "NVDA",
"closed_up": 0.0732,
"above_50d": 0.0746,
"p_gap_up": 0.191,
"p_gap_down": 0.116,
"p_up_today": 0.485,
"as_of": "2026-10-30"
}{
"card": "pre_market",
"symbol": "AMZN",
"closed_up": 0.1852,
"above_50d": 0.0964,
"p_gap_up": 0.198,
"p_gap_down": 0.131,
"p_up_today": 0.476,
"as_of": "2026-10-30"
}{
"card": "pre_market",
"symbol": "MSFT",
"closed_up": 0.1148,
"above_50d": 0.7088,
"p_gap_up": 0.071,
"p_gap_down": 0.071,
"p_up_today": 0.548,
"as_of": "2026-10-30"
}What it means
Session of 2026-10-30, 5 symbols: Did the stock close higher than yesterday: true for none of 5. Above the 50-day average: true for AAPL, TSLA, MSFT of 5. Highest odds for “A gap up tomorrow”: TSLA at 22%. card fired for AAPL, TSLA, NVDA, AMZN, MSFT.
Cards are built from the last completed session, so the as_of date is always shown; the forecasts cover the session about to open.
As a scheduled workflow (Mon–Fri at 08:30 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": "Pre-market cards for the five most-followed stocks",
"symbols": "AAPL TSLA NVDA AMZN MSFT",
"days": [
1,
2,
3,
4,
5
],
"at_time": "08:30",
"model": "ora-fin-0.1.1",
"questions": {
"up_day": {
"type": "yes_no",
"instructions": "Did the stock close higher than yesterday?"
},
"above_50": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"gap_up": {
"type": "yes_no",
"instructions": "Will it gap up tomorrow?"
},
"gap_down": {
"type": "yes_no",
"instructions": "Will it gap down tomorrow?"
},
"up_tomorrow": {
"type": "yes_no",
"instructions": "Will the stock be up tomorrow?"
}
},
"actions": [
{
"id": "card",
"when": "up_day >= 0",
"do": "webhook",
"connection": "card-service",
"body": {
"card": "pre_market",
"symbol": "{{symbol}}",
"closed_up": "{{up_day}}",
"above_50d": "{{above_50}}",
"p_gap_up": "{{gap_up}}",
"p_gap_down": "{{gap_down}}",
"p_up_today": "{{up_tomorrow}}",
"as_of": "{{as_of}}"
}
}
]
}Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"up_day": {
"type": "yes_no",
"instructions": "Did the stock close higher than yesterday?"
},
"above_50": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"gap_up": {
"type": "yes_no",
"instructions": "Will it gap up tomorrow?"
},
"gap_down": {
"type": "yes_no",
"instructions": "Will it gap down tomorrow?"
},
"up_tomorrow": {
"type": "yes_no",
"instructions": "Will the stock be up tomorrow?"
}
},
"actions": [
{
"id": "card",
"when": "up_day >= 0",
"do": "webhook",
"connection": "card-service",
"body": {
"card": "pre_market",
"symbol": "{{symbol}}",
"closed_up": "{{up_day}}",
"above_50d": "{{above_50}}",
"p_gap_up": "{{gap_up}}",
"p_gap_down": "{{gap_down}}",
"p_up_today": "{{up_tomorrow}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"up_day": {
"yes_no": 0.127,
"rule": "C > C[-1]",
"basis": "comparison"
},
"above_50": {
"yes_no": 0.9119,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"gap_up": {
"yes_no": 0.053
},
"gap_down": {
"yes_no": 0.056
},
"up_tomorrow": {
"yes_no": 0.556
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "card",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "card-service",
"preview": {
"body": {
"card": "pre_market",
"symbol": "AAPL",
"closed_up": 0.127,
"above_50d": 0.9119,
"p_gap_up": 0.053,
"p_gap_down": 0.056,
"p_up_today": 0.556,
"as_of": "2026-10-30"
}
}
}
]
}Fintech app builder · example 19
Two-candle reversal lesson on BA: harami and piercing line
Power an interactive lesson that checks whether a bullish two-candle reversal printed on the latest bars.
- StateBA
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"BA"} The server fills in the latest completed session.
Questions
harami | rule | harami_bull()harami bull candle: A small green body inside yesterday's red body. |
piercing | rule | piercing_line()piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open). |
tweezer | rule | tweezer_bottom()tweezer bottom candle: Red then green, with lows within 0.1% of each other. |
below_50 | English → rule | Is the stock below its 50-day moving average? |
Answers
| Question | Answer | Reading |
|---|---|---|
haramiharami bull candle: A small green body inside yesterday's red body. | 0.1092 | false |
piercingpiercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open). | 0.1092 | false |
tweezertweezer bottom candle: Red then green, with lows within 0.1% of each other. | 0.1092 | false |
below_50Is the stock below its 50-day moving average compiled to C < sma(C, 50) | 0.9381 | true |
What it means
For BA on the session of 2026-10-30: True now: Is the stock below its 50-day moving average. Not true: harami bull candle: A small green body inside yesterday's red body.; piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).; tweezer bottom candle: Red then green, with lows within 0.1% of each other..
The lesson shows each pattern's yes or no with its rule, and the trend context, so learners see why a reversal needs a prior decline.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "BA"
},
"questions": {
"harami": {
"type": "yes_no",
"ask": "harami_bull()"
},
"piercing": {
"type": "yes_no",
"ask": "piercing_line()"
},
"tweezer": {
"type": "yes_no",
"ask": "tweezer_bottom()"
},
"below_50": {
"type": "yes_no",
"instructions": "Is the stock below its 50-day moving average?"
}
}
}Response JSON (BA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"harami": {
"yes_no": 0.1092,
"rule": "harami_bull()",
"basis": "rule"
},
"piercing": {
"yes_no": 0.1092,
"rule": "piercing_line()",
"basis": "rule"
},
"tweezer": {
"yes_no": 0.1092,
"rule": "tweezer_bottom()",
"basis": "rule"
},
"below_50": {
"yes_no": 0.9381,
"rule": "C < sma(C, 50)",
"basis": "comparison"
}
},
"context": {
"symbol": "BA",
"as_of": "2026-10-30"
}
}Fintech app builder · example 20
Income nudge: tell holders of O when the next payout is close
Remind users who hold a monthly payer that the ex-date is near, with the yield and recent raise record.
- StateO
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"O"} The server fills in the latest completed session.
Questions
monthly | English → rule | Does the stock pay a monthly dividend? |
ex_soon | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
yield | English → rule | Is the dividend yield above 3%? |
raised | English → rule | Did the stock raise its dividend last time? |
Answers
| Question | Answer | Reading |
|---|---|---|
monthlyDoes the stock pay a monthly dividend compiled to div_count_ttm >= 11 | 0.9317 | true |
ex_soonGoes ex-dividend within 30 days | 0.0537 | false |
yieldIs the dividend yield above 3% compiled to div_yield_ttm > 3 | 0.9463 | true |
raisedDid the stock raise its dividend last time compiled to raised_last > 0.5 | 0.1409 | false |
Actions
Rules on the answers decide what to send.
ex_soon >= 0.6→Webhookpush-gatewayWhat it means
For O on the session of 2026-10-30: True now: Does the stock pay a monthly dividend; Is the dividend yield above 3%. Not true: Goes ex-dividend within 30 days; Did the stock raise its dividend last time. No action fired: every rule was false.
The reminder only fires on a declared ex-date; if none is declared yet, the app stays quiet rather than guessing.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "O"
},
"questions": {
"monthly": {
"type": "yes_no",
"instructions": "Does the stock pay a monthly dividend?"
},
"ex_soon": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"yield": {
"type": "yes_no",
"instructions": "Is the dividend yield above 3%?"
},
"raised": {
"type": "yes_no",
"instructions": "Did the stock raise its dividend last time?"
}
},
"actions": [
{
"id": "remind",
"when": "ex_soon >= 0.6",
"do": "webhook",
"connection": "push-gateway",
"body": {
"topic": "holders_{{symbol}}",
"title": "{{symbol}} goes ex-dividend soon",
"data": {
"monthly_payer": "{{monthly}}",
"yield_over_3": "{{yield}}",
"as_of": "{{as_of}}"
}
}
}
],
"dry_run": true
}Response JSON (O, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"monthly": {
"yes_no": 0.9317,
"rule": "div_count_ttm >= 11",
"basis": "pattern"
},
"ex_soon": {
"yes_no": 0.0537,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"yield": {
"yes_no": 0.9463,
"rule": "div_yield_ttm > 3",
"basis": "pattern"
},
"raised": {
"yes_no": 0.1409,
"rule": "raised_last > 0.5",
"basis": "pattern"
}
},
"context": {
"symbol": "O",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "remind",
"fired": false,
"status": "skipped"
}
]
}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.