September 2026: Rate-limit headers, blockhash and price feeds, a stream that survives deploys, and where the API runs
Rate-limit headers on every response
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Resetreport your bucket in cost units, and a429carries aRetry-Aftercomputed from your plan’s refill rate. They are exposed over CORS, so browser code can read them too. See Rate Limits.
The stream stays connected through our deploys
/api/v1/streamconnections are now held by a separate process. Restarting or upgrading the routing engine no longer disconnects you, and your subscriptions resume by themselves. Keep your reconnect logic anyway: a network or gateway restart can still close the socket.
Blockhash and price feeds on the stream
subscribe_blockhashpushes the latest blockhash on every block, with Fogo’s reallastValidBlockHeight. If you assemble transactions from/instructions, you no longer need a blockhash RPC call.subscribe_pricepushes a mint’s USD price when it changes. See Stream.
Where the API runs
api.vulcx.xyzis served from Amsterdam, Netherlands, with no CDN in front of it. To minimise latency, host nearby and reuse connections: see Server location & latency.
September 2026: Plans, per-account limits, and the stream as a plan feature
Plans
- Seven plans — Free, Starter, Builder, Growth, Scale, Pro, Enterprise — each with its own per-second budget, key quota and stream connections. This replaces the single limit every key shared. See Rate Limits.
- Budgets are per account: every key on the account draws from one bucket. The cost weights are unchanged.
- Protocol fees your swaps pay in the previous 30 days are credited against the subscription, up to the plan price.
The stream needs a plan that includes it
GET /api/v1/streamnow checks the key’s plan.403 STREAM_NOT_IN_PLANwhen the plan has no stream connections,429 STREAM_LIMITwhen the account already holds its plan’s count.- Free keys keep one connection until 14 November 2026.
Keys are self-serve
- Create keys at portal.vulcx.xyz with Google or GitHub, and set a default fee, fee ceiling and fee wallet per key. See Fees.
September 2026: Moonit dropped, excludeDexes removed, /swap gates on its own simulation
excludeDexes is gone
- Removed from
POST /api/v1/cpi/route-accountsand from the WebSocketsubscribe_routepayload. Sending it is now ignored rather than validated. - Its one real use was excluding Moonit to lift the CPI authority-writable requirement. Moonit has moved on and its pools are no longer ingested, so nothing routes through it — and of the venues left, Fluxbeam carries no flow and excluding Vortex leaves nothing to route through.
allowedIntermediateMintsandmaxHopsare unchanged. They bound the ATA set your program must pre-provision and the account count your transaction must carry, which has nothing to do with which venues are live.
Moonit is no longer routed
- Its pools are out of the graph. Routes and quotes now only cross Valiant and Fluxbeam; the
poolTypewire values you will see areVortexandFlux.
/swap rejects a build whose simulation failed
- It used to return one with
200and leave you to noticedata.simulation.success. Now:400insufficient funds,409slippage exceeded,422anything else — and no transaction in the body. The simulation stays atdata.simulationon the rejection, so code already reading that field keeps working. skipSimulation: trueis the opt-out: nothing simulates, so nothing gates.- See Build transaction → Simulation.
Deeper fills on Valiant pools
- Ingestion now subscribes five tick arrays per pool instead of three, matching what the transaction can already execute against. On the FOGO/USDC pair a 20,000 USDC quote returns roughly twice the output it did before, and a 100,000 USDC quote about 2.5x.
August 2026: Additive integrator fees and one flat rate limit
Set your own fee, keep all of it
integratorFeeBpson/swap,/instructions, and/cpi/route-accountscharges your own fee on top of Vulcx’s. You keep 100% of it, paid on-chain to yourreferrerwallet in the same transaction as the swap.- It replaces the referral share. Your rate and Vulcx’s
platformFeeBpsare now independent rates that add — yours is no longer a percentage carved out of ours. Their sum is capped at 100 bps; over-cap requests return400rather than failing on-chain. - Responses now report the breakdown separately:
platformFeeBps/platformFeeAmountandintegratorFeeBps/integratorFeeAmount, alongside the pool fee infeeAmount. - See Fees.
One rate limit, for everyone
- Rate limits no longer vary by plan. Every key gets the same published budget: 100 cost units/second, burst 200. Plans differ only in how many keys you may hold.
- Buckets are debited by request cost, not request count: a quote costs 1, a pools or CPI call 3, a
/swapor/instructionsbuild 5. That is 100 quotes/second, or 20 builds/second, or any mix. - The previously published per-plan ladder (free 5 rps, pro 50, scale 150, enterprise 500) never matched what the service enforced. If you sized an integration against it, you have more headroom than you were told, not less.
- See Rate limits.
July 2026: Signed quotes, the CPI toolkit, and Fogo Sessions firm mode
Signed quotes
- Every quote with a
quoteIdnow also carriesquoteSignature(base58 Ed25519 over the canonicalvulcx-quote-v1message) andquoteExpiresAtMs— provable prices you can verify offline. - New public endpoint
GET /.well-known/vulcx-quote-signerserves the verification key, message format, and encoding. See Firm quotes → Signed quotes.
CPI toolkit
- Route corridors on
POST /api/v1/cpi/route-accounts:allowedIntermediateMints(max 16),maxHops, andexcludeDexesconstrain routing so the account set stays inside what your program pre-provisioned. Constrained requests bypass caches and never split; excludingmoonitlifts the authority-writable requirement. - Per-request referrer fee share: a
referrerwallet on/swap,/instructions, and/cpi/route-accountsearns the protocol’s on-chain referral share, paid in the output token. CPI responses includereferrerAta(must pre-exist). vulcx-cpiRust crate: typed route-CPI builders (RouteAccounts,RouteArgs, per-hop structs,invoke_route_signed) with CI parity tests against the deployed program, plus anapi-featurefrom_api_responsebridge that parses/cpi/route-accountsJSON into typed builders and fails loudly on layout drift.- WebSocket
subscribe_route: the stream now pushes CPI route templates ({"type":"route","seq",…}), only when the template — route plan, accounts, or LUTs — actually changes. Liquidation keepers fire with zero HTTP round-trips. Max 32 route subscriptions per connection. - Structured
400for multi-hop ExactOut naming the ExactIn-with-buffer pattern, instead of an opaque on-chain failure. - See the updated On-Chain Swaps (CPI) guide.
Fogo Sessions
sessionAccountonPOST /api/v1/instructionsbuilds session-shaped routes: the session account signs, the wallet’s ATAs hold the funds, the aggregator’s session-signer PDA rides along, and no ATA-create/SOL-wrap instructions are emitted (requiredTokenAccountsin the response lists what must exist). Session routes are currently Valiant-V1-only.- Widget 0.4.0 firm mode:
setSession(adapter)runs swaps as firm (price-or-fail) session sends — no wallet popup, price locked to what the user saw. SDK 0.4.0 addssessionAccount,referrer, and the signed-quote fields.
July 2026: Firm quotes — the price you see is the price you commit
Firm quotes
quoteIdon every quote:GET /api/v1/quoteresponses and WebSocket quote pushes now carry aquoteId,validForMs(~3s), andfirmForMs(~400ms).- Route pinning: pass
quoteIdtoPOST /api/v1/swaporPOST /api/v1/instructionsto replay the exact quoted route with min-out anchored to the quoted price — no silent re-quote. - Firm redemption: add
"firm": truewithinfirmForMsand slippage collapses to the server’s firm margin (10 bps) around the quoted price — price-or-fail; drift past the margin returns409before any transaction is built. - New error contract:
410quote expired,409route gone / price drifted,403quoteId from another key,400request mismatch. See Error Codes. - Stream invalidation: the WebSocket stream pushes
{"type":"invalidate","quoteId"}when a broadcast quote drifts past the firm margin. - SDK 0.3.0 / Widget 0.3.0:
@vulcx/sdksurfacesquoteId/firmplusQuoteExpiredError/QuoteStaleError; the widget redeems quoteIds automatically and re-quotes on409/410. - Slippage fix: builders now send the raw quote and the on-chain program applies
slippageBpsexactly once — the enforced min-out equals the displayedminAmountOut. Previously the effective tolerance was ~2× the requested bps, so expect slippage failures to now trip at the advertised threshold.
March 2026: Initial public release on Fogo
Initial release
- GET /api/v1/quote: Get best swap route with price impact and fee breakdown.
- POST /api/v1/swap: Build unsigned swap transactions with optional simulation.
- POST /api/v1/instructions: Get raw instructions for custom transaction composition.
- GET /health: Service health check.