DocsAPI

API changelog

Every change to the public API, newest first, and what to change in your code.

This page lists every change to the API, newest first. The version is in the address: /api/v1.

Inside v1, fields are only added. They are not removed or renamed, unless an entry here says so. Error code values stay the same. The error text can change.

2026-10-19 — Taking wallets out of a project never deletes them#

Changed

  • DELETE /projects/:id/wallets/:walletId and POST /projects/:id/wallets/remove no longer delete a wallet made inside the project. It moves to your pool, with its key and balance. outcome is always unassigned, and deleted is always empty. Both fields stay, so code that reads them keeps working. See A project's wallets.
  • DELETE /projects/:id no longer deletes the project's wallets. They move to your pool. A wallet that another project also uses stays in that project.

2026-10-19 — The Wallet Marketplace is on the API#

Added

  • GET /marketplace/inventory lists the wallets for sale, with the app's filters, 100 per page. GET /marketplace/inventory/stats sums up one wallet type.
  • POST /marketplace/orders reserves the wallets you pick and answers a payment address. Send a requestKey of your own: a retry with the same one returns the same order. A sandbox key gets 403 sandbox_key.
  • GET /marketplace/orders/:id and POST /marketplace/orders/:id/check follow an order until your wallets are delivered. A check counts as a read toward your rate limit, like a GET. GET /marketplace/orders lists your last 50 orders.
  • New MCP tools: list_marketplace_inventory, marketplace_inventory_stats, list_marketplace_orders, get_marketplace_order, create_marketplace_order and check_marketplace_order.

An order moves no funds: you pay it yourself, from any wallet. So a key's max per buy, daily cap and wallet list do not apply. Reads need read; ordering and checking need trade. See Wallet marketplace.

2026-10-17 — Launch tasks follow the same rules as other tasks#

Added

  • tokendisperser can be a launch task type on POST /launch.
  • A limit_order launch task can pick its wallets with walletSource (all or roles) and an empty walletIds, as on POST /tasks. A key with a wallet list cannot do this.

Changed

  • A launch task is now checked before the launch starts, with the same rules as POST /tasks: its wallets, its settings and the task type's own limits. Before, such a launch went ahead and its answer held a task error. Now it gets 400 before anything is funded or minted. See Launch tasks.
  • Buy and Snipe launch tasks leave out the creator wallet, as tasks made after a launch do. It stays in only if it is the one wallet picked, or config.includeDev is true. On an EVM launch the creator no longer counts toward the cap on instant buyers. POST /launch/affordability no longer counts a buy from it.

2026-10-08 — Bulk wallet calls, up to 1,000 wallets each#

Added

  • POST /wallets/delete deletes many wallets in one call. A wallet a task uses, or a project still holds, is listed in active or assigned. The rest of the call goes on. See Delete wallets.
  • POST /wallets/move moves many wallets into a group, or out of one.
  • POST /projects/:id/wallets/remove takes many wallets out of a project.
  • labelStart on POST /wallets sets the number for the first new wallet's label. A set of wallets made over several calls keeps one count.
  • New MCP tools for these: delete_wallets, move_wallets and remove_project_wallets.

Changed

  • One call takes up to 1,000 wallets. This counts for count and privateKeys on POST /wallets, and for walletIds on the three new calls. A longer list gets 400. Send the rest in a second call. Your account still has no wallet limit.

2026-10-08 — Creator fees: unswept fees, and claims the wallet cannot pay for#

Added

  • In GET /tokens/creator-fees, a venue has unswept when part of claimable still sits on the pump.fun bonding curve or the PumpSwap pool. The claim collects it in the same transaction. See Creator fees.

Changed

  • POST /tokens/creator-fees/claim now refuses a claim the creator wallet cannot pay for, before anything is sent. A dry run checks it too. The wallet must hold the network fee plus rent for each new token account the claim opens. The answer is ok: false, and error says how much SOL to add. Before, such a claim was sent and failed on the chain.

2026-09-21 — No caps on counts; slow sell batches become a task#

Changed

  • No more caps on how many. POST /trade/batch takes any number of walletIds (it was 500). POST /wallets takes any count and any number of privateKeys (both were 100), into a project of any size (it was 100). POST /projects/:id/wallets/assign takes any number of walletIds (it was 500). The server still splits the work to fit each transaction. The 2026-10-08 entry later set 1,000 per call on the wallet calls.
  • A slow batch becomes a task, for buys and sells. If the waits add up to over 60 seconds, a sell batch used to get 400. Now it answers 202 with a task, like a buy batch. That task's type is batch (it was buy). A slow buy batch still needs real amounts: token_percentage gets 400. See Slow batches become a task.

2026-09-19 — A new address, and no limits on writes#

Changed

  • The API moved to its own address: https://api.vortexdeployer.com/api/v1 for REST and wss://api.vortexdeployer.com/ws for streams. The old address on the app's dev host was shut the same day. Calls there now get 404 with the new address. Update your settings.
  • Writes have no rate limit now. Buys, sells, batches and launches have no per-minute cap, per key or per account. Only reads (GET) are limited: 300 a minute per key and 600 per account. The X-RateLimit-* headers come on read answers only. If you spaced out trades for the old 60 a minute, you can stop.
  • In MCP, _meta.rateLimit now comes on read tools only.

2026-09-19 — OAuth for the MCP server#

Added

  • MCP clients that can only use OAuth, like Claude.ai custom connectors, can now connect. The server offers discovery at the API host's root, client sign-up at POST https://api.vortexdeployer.com/api/v1/oauth/register, the authorization code flow with PKCE (S256 only), consent in the app, refresh tokens that change on each use, and revoking. See OAuth for connectors.
  • Each grant is tied to one of your API keys, picked on the consent page. Its vdo_… token works everywhere a vd_ key does: MCP, REST and streams. It has that key's scopes and caps. Revoke the key and the grant ends.
  • A 401 on POST /mcp now has a WWW-Authenticate header. It points to the server's resource info (RFC 9728).

Changed

  • Nothing changed for vd_ keys. Clients that use them need no update.

2026-09-17 — Faster Volume in the Mixed style, and trading-bot markers#

Added

  • New settings for volume tasks in the Mixed style (no mode, or mode: "mixed"):
    • maxInFlight — how many trades may be out at once, 1 to 50, one per wallet.
    • maxSameSideStreak — after this many trades on one side, the next one takes the other side. 0 turns it off.
    • maxNetBuySol — the most the run may hold, in the chain's coin. At the cap it only sells until it is back under. 0 turns it off.
  • markerPlatforms on volume (Mixed) and warmup settings: any of PHOTON, TROJAN, BULLX, AXIOM1 and AXIOM2, each once. Default []. Each trade also sends 10 lamports to that bot's fee wallet, so the trade looks like it came from that bot. Solana only. See Volume.

Changed

  • minDelayMs and maxDelayMs in Mixed volume now start at 20 (it was 250). They are now the wait between sends, not between confirmations.
  • maxNetBuySol now measures what the run still holds: the SOL paid for tokens it has not sold back. Before, it was buys minus sells. Fees and slippage made that number grow by itself, so a long run could hit the cap while it held nothing.
  • maxConsecutiveErrors now counts bad moments, not failed trades. With maxInFlight above 1, the extra trades lost in the same bad moment are forgiven once. The real limit is maxConsecutiveErrors + min(maxInFlight, wallets) − 1.
  • A sell sent through a temporary wallet carries no markerPlatforms tag. The temporary wallet signs it, so the tag would mark the wrong wallet. POST /tasks/:id/preview says how many of the task's wallets sell that way.

2026-09-16 — Launch tasks inside the launch call#

Added

  • tasks[] on POST /launch is now a typed list. Each task has type (one of the 14 launch task types at the time), walletIds, config, label and autostart. It has no chain: it uses the launch's. Settings are checked with the task type's own rules. A bad one gets 400 validation_failed that names tasks[i].config. The wallets must be yours and on the key's list. POST /launch/affordability takes the same list. The launch MCP tool shows the full task shape. See Launch tasks.

Changed

  • Before, tasks[] was passed on without checks, and every task needed chain. A task with a chain field is now refused. Leave it out.

2026-09-16 — Everything the app does, on the API#

Each account action in the app that makes sense from code is now a route. Each route has an MCP tool. Key management stays in the app on purpose: a key that could make keys could get around its own limits. No route returns a private key.

Added

  • Wallets: GET and POST /wallets/groups, PATCH and DELETE /wallets/groups/:id. groupId on PATCH /wallets/:id. ?scope=all and ?groupId= on GET /wallets. GET /wallets/:id/profile. GET /wallets/cashback and POST /wallets/cashback/claim. See Groups.
  • Projects: POST /projects (makes a draft), POST /projects/cto, PATCH and DELETE /projects/:id, GET /projects/:id/wallets, POST /projects/:id/wallets/assign, DELETE /projects/:id/wallets/:walletId, POST /projects/:id/closeout (a dry run by default) and POST /pnl/wallet-totals. See Projects.
  • Launch helpers: GET /launch/readiness, GET /launch/mint-address, POST /launch/clone, POST /launch/affordability, POST /launch/supply-preview, POST /launch/metadata, GET /launch/pons/launch-terms and GET /launch/otcdesks/rewards. Supply plans at /supply-plans, with POST /supply-plans/:id/mount. See Checks before you launch.
  • Trading: POST /convert/assets, /convert/quote and /convert. POST /tokens/burn and /tokens/lock (dry runs by default). GET /tokens/creator-fees and POST /tokens/creator-fees/claim. See Convert.
  • Tasks: GET /events (your activity feed, paged with before) and GET /warmup/candidates. See Events.
  • Account: GET and PATCH /settings/trading. GET and POST /kols, PATCH and DELETE /kols/:address. New page: Account settings & KOLs.
  • 43 new MCP tools, 84 in all at the time.

Rules for keys

  • A key with limits (caps, a wallet list or sandbox) can only dry-run a close-out. A sandbox key can only dry-run burns, locks, converts and cashback claims.
  • A key with a wallet list may only name wallets on its list, in every new route that takes wallet ids.

2026-09-16 — Rename and delete wallets#

Added

  • PATCH /wallets/:id changes a wallet's label (null clears it) or role. See Change a wallet.
  • DELETE /wallets/:id deletes a wallet. It gets 409 conflict while a task or a project uses the wallet. ?force=true deletes it past the project check. See Delete wallets.
  • MCP tools update_wallet and delete_wallet.

2026-09-16 — See which quotes a launchpad takes#

Added

  • GET /launchpads lists every launchpad. For each it gives the chain and the quoteToken values it takes. For each quote it says if a pairToken is needed and which dev-buy field to use.
  • GET /launchpads/:launchpad/quotes lists what a launch there can be quoted in right now. That includes the live list of tokenized stocks on pump.fun and StonkFun, and the pair tokens on pons. Each entry has the exact quoteToken and pairToken to send. See Which quotes a launchpad takes.
  • MCP tools list_launchpads and launch_quotes.

2026-09-16 — Import many wallets, straight into a project#

Added

  • POST /wallets takes privateKeys, a list of up to 100 at the time, next to privateKey. projectId puts new or imported wallets straight into one of your projects. An import is all or nothing. A wallet you already have comes back as it is. See Make or import wallets.

Changed

  • Importing a wallet you already have no longer resets its role to trading. It comes back unchanged.

2026-09-16 — Agent discovery#

Added

  • https://vortexdeployer.com/llms.txt lists the docs for AI agents, and https://vortexdeployer.com/llms-full.txt has them all in one Markdown file. Every docs page is also Markdown at its address plus .md.
  • GET https://api.vortexdeployer.com/api/v1 needs no key. It answers JSON with the REST address, the OpenAPI document, the MCP server, the WebSocket and the docs.
  • New page: Build an agent on the API.
  • The docs no longer need sign-in. Every /docs page, the API index and the OpenAPI document are open to all. Keys are still made in the app.
  • https://vortexdeployer.com/agents.txt is a short file for agents: the addresses, how a key works, the safety rules and what may be fetched. GET https://api.vortexdeployer.com/api/v1 names it in agentsTxt.

2026-09-16 — MCP server#

Added

  • POST https://api.vortexdeployer.com/api/v1/mcp serves the API as an MCP server for Claude, Cursor or any MCP client. There is one tool per call, your key signs each request, and the server keeps no session. See MCP for AI agents.
  • Every call in the OpenAPI document now has an operationId, like buy, list_wallets or start_task. Code generators name methods after it, and it is the MCP tool's name.

Removed

  • The EVM site's unpublished /evm/api/v1 and /evm/ws addresses no longer take API keys. REST there answers 404 not_found with the right address, and the socket refuses the key. Use https://api.vortexdeployer.com/api/v1 and wss://api.vortexdeployer.com/ws.

2026-09-16 — camelCase answers, error codes, paging and OpenAPI#

Breaking for early keys. If you started before this date, change your code:

  • Every answer is camelCase. pool_address is now poolAddress, expected_out is expectedOut, created_at is createdAt, wallet_ids is walletIds, and so on for every field. Wallet ids and mints used as map keys stay as they were. Live stream frames keep their snake_case names.
  • Errors have a code, and trace_id is now traceId: { "code": "insufficient_scope", "error": "…", "traceId": "…" }. Check code. See the codes table.
  • GET /tasks is wrapped: { "tasks": [ … ] }, not a bare list. GET /tasks/:id/executions is { "executions": [ … ] }.
  • Internal fields are gone from tasks: user_id, run_seq and execution_epoch.
  • Projects no longer return the stored meta object. Use metadataUri for the token's info file.
  • Check messages have new wording, like Too small: expected number to be >0. Match on code: "validation_failed" and details[].path, never on the message.

Added

  • ?limit=, ?offset= and X-Total-Count on GET /wallets, GET /wallets/balances and GET /portfolio. See Paging.
  • X-RateLimit-Reset next to X-RateLimit-Limit and X-RateLimit-Remaining, and retryAfterSeconds in every 429 body.
  • GET /openapi.json, the OpenAPI 3.1 document for every REST call. No key needed.
  • OPTIONS on any route answers 204 with Allow.

2026-09-16 — v1 opens#

The first release: keys and scopes, buy, sell and batch, launch, wallets, portfolio and PnL, tasks and live streams. See API overview & keys.

See also#