Openfloor documentation

Turn any AI agent into a trading desk for tokenized stocks on Robinhood Chain. Ask it for prices, test ideas on three months of real history, trade on paper at live prices. No signup. No API keys.

Install

Nothing to install. Add the hosted endpoint to your agent. Add an API key from your account to unlock paper trading and history.

Read https://openfloor.trade/agents.md and set yourself up with Openfloor so you can read, backtest and paper trade tokenized stocks on Robinhood Chain.
ClientCommand
Any agentRead https://openfloor.trade/agents.md and set yourself up with Openfloor so you can read, backtest and paper trade tokenized stocks on Robinhood Chain.
Claude Codeclaude mcp add --transport http openfloor https://openfloor.trade/api/mcp
Cursor · JSON{ "mcpServers": { "openfloor": { "url": "https://openfloor.trade/api/mcp" } } }
Endpointhttps://openfloor.trade/api/mcp

Recommended workflow

  1. about gives the agent the map: data sources, caveats, tool order.
  2. list_assets with hasFeed: true lists the 38 tokens that have history.
  3. market_status and get_price establish the session and the current oracle price.
  4. get_history then backtest, iterate on params or write custom code.
  5. find_pools and quote check that the size you want actually fills at a sane price.
  6. With an API key: paper_order for a few days, then paper_portfolio to read the PnL.

Tools

about
open to everyone

What the server does, data sources, caveats and the recommended workflow. Agents call it first.

list_assets
open to everyone

Every Robinhood stock token and ETF with address, decimals, multiplier and whether it has an oracle feed.

{ "hasFeed": true }
market_status
open to everyone

Regular, extended, overnight or closed, plus the next open and close in ET.

get_price
open to everyone

Latest Chainlink price with age and staleness. Token price and implied share price.

{ "symbols": ["NVDA", "AAPL"] }
get_history
open to everyone

OHLC bars built from every oracle update since launch. 15m to 1d.

{ "symbol": "NVDA", "interval": "1h" }
list_presets
open to everyone

Built-in strategies and the full ctx API for writing your own.

backtest
open to everyone

Run a preset or your own JavaScript on real bars. Return, drawdown, Sharpe, trades, equity curve.

{ "symbol": "NVDA", "preset": "sma_cross", "params": { "fast": 8, "slow": 34 } }
find_pools
open to everyone

Uniswap v4 and v3 pools for an asset with liquidity and 24h volume, plus the on-chain spot.

{ "symbol": "TSLA" }
quote
open to everyone

Exact-input quote on the deepest pool with price impact and premium versus the oracle.

{ "symbol": "NVDA", "side": "buy", "amount": 1000 }
paper_order
with an API key

Simulated fill at live oracle or pool price with fees. Kept in your account between sessions.

{ "symbol": "SPY", "side": "buy", "usd": 500 }
paper_portfolio
with an API key

Cash, positions marked to market, PnL and recent fills.

paper_reset
with an API key

Fresh paper book with a chosen starting cash.

Strategy API

A strategy is plain JavaScript with an onBar(ctx) function. It runs in a sandbox with a CPU budget, no network and no filesystem. The agent usually writes it in one shot from the description below.

Your code runs in a sandbox with no network or filesystem. Define:

  function onBar(ctx) { ... }        // called once per bar, oldest to newest
  function onStart(ctx) { ... }      // optional, called once before the first bar

ctx fields:
  bar          current bar {time, t, open, high, low, close, updates, session}
  bars         all bars up to and including the current one (array)
  i            index of the current bar
  close(n)     array of the last n closes (oldest first)
  position     quantity held (0 when flat)
  cash         cash in USD
  equity       cash + position * bar.close
  entryPrice   average entry price of the open position (0 when flat)
  params       the params object you passed to backtest
  session      'regular' | 'extended' | 'overnight' | 'closed' at bar time
  dow, hourET  day of week (0=Sunday) and hour in New York time
  buy(fraction=1, reason?)   spend this fraction of cash at the bar close (after costs)
  sell(fraction=1, reason?)  sell this fraction of the position
  closeAll(reason?)          flatten
  log(...args)               collect debug output (max 200 lines)
  sma(n), ema(n), rsi(n), stdev(n), highest(n), lowest(n), change(n)   indicators on closes up to now

Fills happen at the current bar close, minus fee and slippage. Shorting is not supported.

Example, a crossover restricted to the regular session:

function onBar(ctx) {
  if (ctx.session !== 'regular') return
  if (ctx.i < 40) return
  const fast = ctx.sma(10), slow = ctx.sma(40)
  if (fast > slow && !ctx.position) ctx.buy(1, 'cross up')
  if (fast < slow && ctx.position) ctx.sell(1, 'cross down')
}

Presets

buy_holdno params

Buy on the first bar and hold.

function onBar(ctx){ if(ctx.i===0) ctx.buy(1,'initial') }
sma_cross{"fast":10,"slow":40}

Long when the fast SMA is above the slow SMA, flat otherwise.

function onBar(ctx){
  const {fast, slow} = ctx.params
  if (ctx.i < slow) return
  const f = ctx.sma(fast), s = ctx.sma(slow)
  if (f > s && !ctx.position) ctx.buy(1, 'fast>slow')
  else if (f < s && ctx.position) ctx.sell(1, 'fast<slow')
}
rsi_meanrev{"period":14,"low":30,"high":60}

Buy when RSI drops under the low threshold, exit above the high one.

function onBar(ctx){
  const {period, low, high} = ctx.params
  if (ctx.i < period + 1) return
  const r = ctx.rsi(period)
  if (r < low && !ctx.position) ctx.buy(1, 'rsi ' + r.toFixed(1))
  else if (r > high && ctx.position) ctx.sell(1, 'rsi ' + r.toFixed(1))
}
weekend_gapno params

Hold through the weekend: buy in the last regular hour on Friday, sell in the first regular hour on Monday. Meant for 1h or 15m bars.

function onBar(ctx){
  if (ctx.dow === 5 && ctx.session === 'regular' && ctx.hourET >= 15 && !ctx.position) ctx.buy(1,'friday close')
  if (ctx.dow === 1 && ctx.session === 'regular' && ctx.position) ctx.sell(1,'monday open')
}
breakout{"entry":20,"exit":10}

Buy a close above the N-bar high, sell a close below the M-bar low.

function onBar(ctx){
  const {entry, exit} = ctx.params
  if (ctx.i < entry) return
  const hi = ctx.highest(entry, 1), lo = ctx.lowest(exit, 1)
  if (ctx.bar.close > hi && !ctx.position) ctx.buy(1,'breakout')
  else if (ctx.bar.close < lo && ctx.position) ctx.sell(1,'breakdown')
}
regular_hours_only{"lookback":6}

Momentum that only trades during the regular NYSE session and is flat overnight.

function onBar(ctx){
  if (ctx.session !== 'regular') { if (ctx.position) ctx.sell(1,'session end'); return }
  if (ctx.i < ctx.params.lookback) return
  const ch = ctx.change(ctx.params.lookback)
  if (ch > 0 && !ctx.position) ctx.buy(1,'momentum up')
  else if (ch < 0 && ctx.position) ctx.sell(1,'momentum down')
}

Account and API keys

Sign in at openfloor.trade/account with your wallet. One signature, no gas, no email. Create a key and give it to your agent:

claude mcp add --transport http openfloor https://openfloor.trade/api/mcp --header "Authorization: Bearer of_..."

With a key, the paper trading tools are enabled, the paper book is kept in your account, and every call shows up in your history. 500 hosted calls a day are free. Beyond that, 1 dollar of ETH on Robinhood Chain buys 1,000 calls. Without a key, the endpoint is anonymous and limited to 60 calls a minute.

Data and caveats

  • Token addresses and ERC-8056 multipliers come from the Robinhood asset registry. Token price equals share price times multiplier. Dividends and splits move the multiplier, not your balance.
  • Prices come from Chainlink Data Feeds on Robinhood Chain. Feeds update on every 0.5% move or once a day, 24/5. On weekends and holidays they hold the last value while pools keep trading.
  • History is rebuilt from every AnswerUpdated event since 2026-07-01, so bars are exact, not sampled. Bars with no update are carried forward and flagged.
  • Backtests fill at the bar close with the fee and slippage you choose. They use oracle prices, not pool fills. Use quote to see what a real size costs.
  • Pool discovery uses a public search endpoint. Quotes and spot prices read the Uniswap contracts directly.
  • The hosted RPC proxy only allows read methods and has per-instance rate limits.

FAQ

Do I need an account or an API key?

No. Add the server and it works. A free account adds paper trading and a history of everything your agent did.

Where does the data come from?

Robinhood Chain itself: the asset registry, Chainlink feeds, Uniswap contracts. Nothing modelled.

What does a backtest run on?

Every Chainlink update since July 1, 2026, as bars. Fills at the close, with fee and slippage.

Can my agent trade real money?

Not from Openfloor yet. It gets the real Uniswap price for any size and paper trades at live prices.

Can an agent run up a bill?

No. There is no account. On chain it can only spend what you sent it.

Do you keep my prompts?

No. Without a key nothing is stored. With a key, only your agent's tool calls, for your history.

Which assets are covered?

194 stock tokens and ETFs plus USDG and WETH. 38 have a feed for history and backtests.

Is this investment advice?

No. Openfloor is tooling. Every order is your responsibility. Stock tokens are for eligible users outside the United States.

Back to the landing page.