API & MCP
Everything the site shows is available as JSON. Free tier: 90 requests a minute per IP, 30 compiles a day. All results are simulated.
| Method | Path | What |
|---|---|---|
| POST | /api/v1/compile | {text, mint} → DSL + plain-language rules + assumptions, or a refusal. No side effects. |
| POST | /api/v1/validate | {dsl} → validation errors or the normalized DSL, rules and warnings. |
| POST | /api/v1/backtest | {dsl, days?, to?, sol_usd?} → result (200) or fetching progress (202, poll again). |
| GET | /api/v1/backtest/<hash> | A stored backtest result by result hash. |
| GET | /api/v1/strategy/<id> | Rules, versions, backtest summary and live paper record. |
| GET | /api/v1/signals/<id>?since=<row id> | Record rows (signals and fills) with their leaf JSON. |
| GET | /api/v1/leaderboard?mint=&timeframe= | The leaderboard and its sort rule. |
| GET | /api/v1/proof/<row id> | Merkle proof of one record row against its daily root. |
| GET | /api/v1/roots | Daily roots and their memo transactions. |
| GET | /api/v1/token/<mint> | Main pool, liquidity, market cap; 422 when not tradable. |
| POST | /api/v1/keys | Create an owner key (the secret is shown once; also your API key). |
| POST | /api/v1/strategies | x-api-key · {dsl, sentence?, backtest_hash?} → start a dry run. |
| POST | /api/v1/strategy/<id>/versions | stop | restart | listing | x-api-key · edit (new version), stop, restart, list/unlist. |
| GET | /s/<id>/feed.json · /s/<id>/rss.xml | Signal feeds per strategy. |
MCP
Remote MCP server (Streamable HTTP, stateless): https://dryrun.space/mcp. Tools: compile_strategy (DSL + readable rules, no side effects), backtest (DSL + mint → results), get_strategy, leaderboard.
{ "mcpServers": { "dry-run": { "url": "https://dryrun.space/mcp" } } }
Example
curl -s https://dryrun.space/api/v1/compile -H 'content-type: application/json' \
-d '{"text":"Buy $20 when it drops 10% in an hour, stop loss 8%","mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"}'