1Quickstart
Send /key to the Telegram bot.
You get one free key per Telegram account, shown once and stored only as a salted hash. /rotate replaces it on the same account (bots and books stay, the old key stops at once) and /revoke turns it off. An operator invite code also works, and grants the plan written on it. At most 3 new keys per network per 24 hours.
Keys look like dr_ plus 43 letters and digits. Send it as Authorization: Bearer dr_.... A request that looks like it carries a private key or seed phrase is refused with SECRET_REJECTED, and nothing in it is stored or logged.
export SIMVEX_BASE_URL=<this site's address>
export SIMVEX_API_KEY=dr_...
H="Authorization: Bearer $SIMVEX_API_KEY"
curl -s "$SIMVEX_BASE_URL/v1/tokens/new?limit=5" -H "$H"
curl -s -X POST $SIMVEX_BASE_URL/v1/bots/default/orders -H "$H" -H 'content-type: application/json' \
-d '{"mint": "<MINT>", "side": "buy", "amount": 0.1, "slippage_bps": 300, "client_order_id": "qs-1"}'
Bots are sub-accounts on one key, each with its own paper book of 10 SOL. A bot can be reset to 10 SOL once every 24 hours; a reset bot leaves the current season's leaderboard. Python and TypeScript SDKs, the examples and the full quickstart are in the guides.
2Endpoints
| Request | What it returns |
|---|---|
| GET /v1/ladder | What is open now and when the rest opens. No key needed |
| GET /v1/me, /v1/plans | Your key, plan and limits; every plan's limits |
| GET /v1/tokens/new | New pairs as they appear, with a rug summary |
| GET /v1/tokens/{mint} | The full rug report, reason codes in plain English and Korean. An untracked mint answers 202 while the collector looks it up |
| GET /v1/quote | A paper quote; quote_source is curve, aggregator or local_cpmm |
| GET /v1/fill-model | The fill model's numbers and version |
| GET /v1/status | Collector lag, tracked tokens, quote failure rate, last snapshot |
| POST /v1/bots/{bot}/orders | market, limit or tp_sl orders, in SOL, tokens or percent, with slippage_bps (1 to 5,000, default 300), priority_fee_lamports and client_order_id: send it twice, get one order |
| GET /v1/bots/{bot}/decisions | Every accept, skip, fill and failure with its reason code and the number that decided it. Positions, fills and the equity curve sit beside it |
| POST /v1/replays, /v1/claims | Replay sessions on recorded days; claim checks |
| GET /v1/board, /v1/arena, /v1/token | The public board, the arena, the token's supply and burns |
3The fill model
Fills are honest on purpose. Nothing is signed or sent, and the same input on the same market data gives the same result. GET /v1/fill-model serves these numbers with the version (fm-2026.11.1); any change is a new version. The fill press on the board runs them on recorded trades.
| Rule | What happens |
|---|---|
| 1. Quote age | A quote older than 3 s at acceptance is fetched again. No quote: QUOTE_UNAVAILABLE. If the quote's price impact is above your slippage_bps: SLIPPAGE_HIGH, nothing reserved |
| 2. Confirmation | The order is pending for 1.2 s, then priced at a fresh quote taken at confirmation time. It never reads data from after that moment |
| 3. Slippage at confirmation | Worse than the accepted price by more than slippage_bps: FILL_FAILED_SLIPPAGE. Principal back; transaction cost and priority fee stay charged |
| 4. Liquidity pulled | Liquidity at or below 20% of its recent peak, the pair gone, or no quote before confirmation: FILL_FAILED_LIQ. Principal, transaction cost and priority fee all come back |
| 5. Fill price | A 100 bps latency penalty off what you receive, plus the pool fee inside the quote (bonding curve 125 bps on top of the net SOL, AMM pools 25 to 30 bps) and any Token-2022 transfer fee |
| 6. Costs | 0.0001 SOL per attempt plus your priority fee (0 to 50,000,000 lamports) |
| 7. Minimum order | 0.01 SOL. A 100% exit is always allowed so dust can be closed |
| 8. Rug while holding | Price down 90% from entry or liquidity at or below 20% of its peak marks the position LIQ_PULLED: from then on it sells only against what is left, slippage check waived |
Where a quote comes from is always in the answer. curve prices a bonding-curve token from its curve account. aggregator asks an outside quote service, cached 2 s and capped server-wide at 0.25 calls a second. local_cpmm is a constant product on the latest snapshot, used when that cap is closed, for a pulled position and inside replays. The full text is in /docs/fill-model.
4Plans and limits
Limits only. The live values are at GET /v1/plans and in /docs/limits.
| Plan | Bots | Calls a minute | Data delay | Tracked mints | WebSocket | Price channels | Replay a month | Board |
|---|---|---|---|---|---|---|---|---|
| free | 1 | 30 | 30 s | 5 | no | 0 | 0 h | no |
| trainee | 3 | 120 | none | 20 | yes | 10 | 5 h | no |
| pro | 10 | 600 | none | 100 | yes | 50 | 20 h | yes |
| desk | 50 | 2,000 | none | 300 | priority | 200 | 100 h | yes, plus arena seed |
The delay applies to reading market data only. Every order on every plan fills on the same live data. Until step 4 of the ladder every key runs on the free limits, whatever plan it holds. While the token is off, every plan may opt a bot in to the leaderboard. Fuel covers heavy use past the plan: replay at 50 cents an hour of market time, a claim check at 20 cents. Without enough fuel the answer is 402 FUEL_REQUIRED. Until the token exists, fuel comes from an operator grant.
5Errors
Every error body is {code, message_ko, message_en, hint} plus the disclaimer. Messages never echo what you sent.
| Code | Meaning |
|---|---|
| SECRET_REJECTED | The request looked like it carried a private key or seed phrase. Refused, not stored |
| UNAUTHORIZED | Missing or invalid API key |
| NOT_YET | The feature opens later; the answer carries opens_at, and GET /v1/ladder has the schedule |
| PLAN_LIMIT | Past your plan's limit |
| RATE_LIMITED | 429: wait for Retry-After; a refused call did nothing, so a retry is safe |
| FUEL_REQUIRED | 402: not enough fuel, with the amount needed |
| QUOTE_UNAVAILABLE | No quote for this token right now |
| FILL_FAILED_SLIPPAGE | The price at confirmation moved past your slippage |
| FILL_FAILED_LIQ | Liquidity was pulled before confirmation |
| LOOKAHEAD | A replay asked for data past its own clock |
6WebSocket
/v1/ws opens at step 3 of the ladder and needs the trainee plan or higher. Authenticate with the first message {"op":"auth","key":"dr_..."} within 10 seconds; a key in the URL is refused. Channels: orders, fills, positions, tokens.new, rug.events, prices:{mint}. Every data frame has a seq, and {"op":"resume","since_seq":N} sends what you missed from the last 5 minutes. The server pings every 20 s and closes a connection silent for 60 s. At most 5 open connections per key.
The launch hour. Step 3 opens the socket an hour before step 4 opens the paid plans. So between those two steps every key gets the free plan plus a WebSocket with 5 price channels, and nobody waits an hour for a socket. From step 4 the plan table applies as written.
7Replay
POST /v1/replays opens a session on a recorded window. Then call the same endpoints with the header X-Replay-Session: the bot code does not change. The clock moves by hand with advance (at most 6 hours a call) or runs at up to 60x. Asking for data past the clock is refused with LOOKAHEAD, and a window without recorded data answers 404 NO_DATA with the range that exists.
Replay is billed in market time, the time that passes on the session clock, not the wall clock. Each plan has monthly replay hours (free has none). Past them, every started hour of market time costs 50 cents of fuel, charged when a clock move would cross into it; a 402 FUEL_REQUIRED leaves the clock where it was.
8Claim checks
When a post says a bot did 100x overnight, send the stated start balance and claimed end in USD, the window and the rules to POST /v1/claims. Simvex replays that window on its own recorded data with those rules and answers one of three verdicts.
| Verdict | When |
|---|---|
| Reproduced | The replayed return is at least the claimed return minus the larger of 5 points and 20% of the claim |
| Not reproduced under these conditions | Anything lower. A same-conditions replay, not a verdict on the author |
| Not enough data | A window under 5 minutes, less than 80% of its minutes covered by snapshots, or no tokens. Costs no fuel |
The other two verdicts cost 20 cents of fuel. USD becomes SOL at the SOL price recorded at the window start; the verdict compares percentages, so the start size does not move it. Try it on the board's claim check.
9Going live
A compatibility layer answers in the exact request and response formats of the quote and trade formats your bot already speaks, so a bot written against it runs on the real services by changing only its base URL. Every value it returns is a paper value; nothing can be signed or sent. It opens at step 5 of the ladder.
X-Dryrun-Client-Order-Idmakes a trade idempotent: the same id on the same bot returns the first order and the same signature. Without it every POST is a new order, as on the real service.X-Dryrun-Botpicks the bot;X-Replay-Sessionruns on a replay clock.- A trade answers after confirmation (up to 8 s). A fill that fails at confirmation answers like a sent transaction that failed, with the reason in
errors. - Slippage in percent becomes bps; a priority fee above 0.05 SOL is refused rather than capped, so a smaller paper cost cannot flatter the bot.
- Only
dr_keys are accepted. Never paste a real trading-service key: treat one that was pasted as exposed.
Field by field: /docs/compat-spec.
10Board and arena
The leaderboard is opt-in per bot, over the last 24 hours, the last 7 days and the running season, live book only. A bot shows with 5 or more fills, a max drawdown of 50% or less and no reset in the period, ranked by return, then the smaller drawdown, then more fills. It shows a pseudonym such as Bot#4821, return, max drawdown, win rate, fills and the last three decision reasons, never a Telegram id, a username or a wallet address. Opt-ins are taken from step 1 and shown from step 3, so the board starts with an hour of records.
The arena runs weekly, Monday 00:00 UTC to Sunday 23:59:59. Season 1 starts with step 5 and runs to the end of that week, or the next week when under 3 days would be left. Every entrant trades its own season book from 10 SOL with the same fill model, under the header X-Arena-Season: current. One bot per key per season; a bot needs one fill to be ranked; a reset disqualifies it. Ranked by season return, ties to the smaller drawdown. Entry is free while the token is off. With the token on, entry costs $5 in the token at the 24-hour price, and desk keys enter without the fee. Results are public. Nothing here promises a prize.
A 1200 x 675 share card exists for any bot on the board, with the disclaimer printed on it.
11The token
NO TOKEN YET
No token exists yet. Simvex does not issue it: a separate developer launches it. Its supply, any unlock schedule and its launch pool settings are set by that developer and published at launch. This page gives no numbers for them. Once it exists, GET /v1/token shows the mint, the supply (read hourly), burn totals and the last burn signature.
Where revenue meets the token
All of this is built and tested, and switched off until the token exists:
- Holding sets your plan. Hold $50, $250 or $1,000 worth for trainee, pro or desk. The value uses Simvex's own 24-hour time-weighted price from its snapshots, never an outside price service. Checked every hour; drop below and the plan drops at the next check. A plan from an operator or an invite is never lowered by holdings.
- Streaks. Hold your tier 7 days for 1.5x calls a minute and replay hours, 30 days for 2x. A streak counts only verified holding time; any dip or a new wallet starts it again at zero.
- Binding a wallet without connecting one. The Telegram bot gives you a unique amount, whole tokens plus a 4-digit suffix such as 1.2347. You send exactly that from your own wallet to the published address, and the sending wallet is bound to your key. One wallet per key and one key per wallet. Nothing is signed on this site.
- Coins spent are burned. Tokens sent for binding, fuel and arena entry are burned every hour, with a public receipt for each burn. The burn of the collector wallet's own balance is the only transaction the server ever signs.
- USDC fuel. Top-ups of $1 to $500. Each is recorded 70% to the team and 30% set aside for buyback, carried out by the token developer, not by Simvex.
What is enforced on chain
Nothing about the token is enforced on chain by this product. Plan tiers, streaks and the revenue ledger are run by Simvex's own service and published so anyone can compare them with the chain. Supply, unlocks, the launch pool, liquidity and the buyback itself live with the token developer.
12What is thin
Said plainly
- Burns only mean something if people pay for heavy features. The free plan exists, and many developers will stay on it.
- The USDC buyback is recorded here and carried out elsewhere.
- Nothing about the token is enforced on chain by this product.
- The plan value uses Simvex's own price of the token; a thin market can move it, and a reading older than 3 hours is not used.
- The bonding-curve fee of 125 bps was calibrated on six live curves on Nov 5. More curves may move it, which would be a new fill model version.
- The outside quote service allows a quarter of a call a second for the whole server, so many quotes are a constant product on the latest snapshot instead.
- All four house bots lost money in the recorded session. That is a normal result, and Simvex shows it as it is.
13Launch ladder
Every feature is built before launch and opens in five steps, so the first hours have a small surface. A call to a feature that is not open answers 403 NOT_YET with opens_at. Live: /docs/ladder.
| Step | Opens | Features |
|---|---|---|
| 1 | T+0 | API keys and bots, market data, orders and fills |
| 2 | T+0 | SDKs, examples and docs, the Telegram bot, the operator console |
| 3 | T+1h | WebSocket, the leaderboard and share cards, the public board |
| 4 | T+2h | Plan upgrades and fuel, replay sessions, claim checks |
| 5 | T+3h | The compatibility layer, arena season 1, the MCP server and /skill.md |
14More to read
- API reference: every endpoint, with a try-it console
- Guides: quickstart, limits, fill model, compat spec, MCP, the SDKs, examples
- Ladder: what is open right now
- /skill.md: one file for a coding agent (from step 5)
- /llms.txt: the docs index for language models