Every tinycorp.ai strategy is a JSON config. The Builder lets you assemble it visually, but the raw shape is documented here so power users can fork-and-edit. The engine runs your config against live market data every 5 minutes and logs simulated fills.
Every cycle (every 5 minutes), the engine fetches markets matching platforms + categories, then applies the entry filter rules in order. Matching markets get a simulated fill at the current ask.
platforms + categories
Field
Type
Notes
platforms
list<str>
Subset of kalshi, poly, manifold. Defaults to ["kalshi"] if omitted.
categories
list<str>
Optional. Empty list = all categories. Kalshi has weather. Poly has crypto, sports, politics, economics, commodities, stocks, other, world-events, entertainment.
Price filters
Field
Type
Notes
entry.yes_ask_min
float 0-1
Minimum YES ask (e.g., 0.85 = 85¢).
entry.yes_ask_max
float 0-1
Maximum YES ask. Use both for a band.
entry.yes_bid_min
float 0-1
Minimum YES bid.
entry.yes_bid_max
float 0-1
Maximum YES bid.
Liquidity filters
Field
Type
Notes
entry.vol_24h_min
int
Minimum 24h volume in USD (or MANA on Manifold).
entry.open_interest_min
int
Minimum open interest contracts.
Kalshi quirk:volume_24h is NULL on most weather brackets. If you set vol_24h_min on a kalshi+weather strategy, you'll exclude most candidates. Leave it off for weather; use it for poly markets.
Timing filters
Field
Type
Notes
entry.hours_to_close_min
float
Min hours until market close. 0.5 = at least 30 min out.
entry.hours_to_close_max
float
Max hours until close. 8 = within 8 hours of close.
entry.title_contains
list<str>
Market title must contain each substring (case-insensitive). E.g., ["minimum"] for LOW brackets.
Momentum signals
Price-delta filters that require a lookback window. Engine reads from market_price_snapshots (cached every 1-3 min per platform).
Field
Type
Notes
entry.ya_change_window_min
int (minutes)
Required when using ya_change filters. Defines the lookback. E.g., 30 = look 30 min back.
entry.ya_change_min_cents
int
YES ask must have RISEN by at least this many cents in the window. Positive value.
entry.ya_change_max_cents
int
YES ask must have DROPPED by at least this many cents (use negative). E.g., -5 = dropped 5+ cents.
// "Buy when ya dropped 5+¢ in the last 30 min"
{
"yes_ask_min": 0.40,
"yes_ask_max": 0.85,
"ya_change_max_cents": -5,
"ya_change_window_min": 30
}
Short-circuit filters that fire before any market query. Use for strategies that should only run during specific times.
Field
Type
Notes
entry.hour_of_day_min
int 0-23
UTC hour. Strategy skips entire cycle outside the range.
entry.hour_of_day_max
int 0-23
UTC hour.
entry.day_of_week_in
list<int>
Mon=0..Sun=6. [0,1,2,3,4] = weekdays only.
External anchors
Signals that reference external data sources we poll.
Field
Type
Notes
entry.crypto_anchor
object
{"symbol": "bitcoin", "usd_above": 70000} or "usd_below". Spot price from CoinGecko (free, polled every 5 min). Supported symbols: bitcoin, ethereum, solana, ripple, dogecoin. Fails closed if no fresh data in 30 min.
entry.nws_anchor
object
{"value_above": 50} or {"value_below": 60} — degrees F. Per-candidate filter: parses the Kalshi weather ticker (e.g. KXLOWTSFO-26MAY24-B49.5 → SFO low for May 24), fetches the latest NWS forecast for that station/date, applies the threshold. Supported stations: KSFO, KAUS, KATL, KBOS, KDCA, KDEN, KDAL, KHOU, KLAS, KLAX, KMDW, KMIA, KMSP, KNYC, KOKC, KPHL, KPHX, KSAT, KSEA. NWS forecasts updated hourly. Fails closed when no forecast available.
Combining anchors: a strategy can use any/all of these in the same entry block. E.g., a weather-fade strategy can require both nws_anchor.value_above AND a price band — both must pass.
Exit + sizing
Field
Type
Notes
exit.at
str
"expiry" is the only supported value in v1. Strategies hold to market close; engine settles based on official result (Kalshi) or last_price (Poly/Manifold).
sizing.type
str
"flat" only in v1.
sizing.amount_cents
int
Dollars-per-trade in cents. 500 = $5/trade. House strategies use $5.
sizing.max_fills_per_day
int
Optional cap on total fills per UTC day. Useful for broad-match strategies (cheap-price lottery, vol-spike on Poly's "other" category) that would otherwise fire on dozens of markets per cycle. Once the cap is reached, the engine stops opening new positions for the strategy until tomorrow.
Live preview: drop any config into the Builder — the "Markets matching now" panel re-evaluates against live data on every chip click via POST /api/quants/preview.
API reference
Endpoint
Method
Notes
/api/quants/strategies
GET
List public strategies. Params: category, status, sort (sharpe/pnl/win_rate/newest), limit.
/api/quants/strategies/<slug>
GET
Single strategy preview + config (when entitled).
/api/quants/strategies/<slug>/pnl
GET
Cumulative realized P&L points for the chart.
/api/quants/strategies/<slug>/trades
GET
Simulated trade log (5 for preview, 50 for unlocked).
/api/quants/strategies/<slug>/candidates
GET
Markets currently matching all entry rules.
/api/quants/strategies/<slug>/versions
GET
Edit history snapshots.
/api/quants/preview
POST
Evaluate an ad-hoc config (used by the Builder). Body: {"config": <config>}.
/api/quants/leaderboard
GET
Sortable list. Params: sort, limit.
/api/quants/activity
GET
Recent fills + publishes + unlocks platform-wide.
/api/quants/stats
GET
Topline platform numbers.
House strategies using each signal
Live snapshot from /api/quants/strategies. Click any strategy name to see its full config + live performance.