Skip to main content
API updates and changes in reverse chronological order.
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-Remaining and X-RateLimit-Reset report your bucket in cost units, and a 429 carries a Retry-After computed 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/stream connections 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_blockhash pushes the latest blockhash on every block, with Fogo’s real lastValidBlockHeight. If you assemble transactions from /instructions, you no longer need a blockhash RPC call.
  • subscribe_price pushes a mint’s USD price when it changes. See Stream.

Where the API runs

  • api.vulcx.xyz is 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/stream now checks the key’s plan. 403 STREAM_NOT_IN_PLAN when the plan has no stream connections, 429 STREAM_LIMIT when 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-accounts and from the WebSocket subscribe_route payload. 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.
  • allowedIntermediateMints and maxHops are 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 poolType wire values you will see are Vortex and Flux.

/swap rejects a build whose simulation failed

  • It used to return one with 200 and leave you to notice data.simulation.success. Now: 400 insufficient funds, 409 slippage exceeded, 422 anything else — and no transaction in the body. The simulation stays at data.simulation on the rejection, so code already reading that field keeps working.
  • skipSimulation: true is 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

  • integratorFeeBps on /swap, /instructions, and /cpi/route-accounts charges your own fee on top of Vulcx’s. You keep 100% of it, paid on-chain to your referrer wallet in the same transaction as the swap.
  • It replaces the referral share. Your rate and Vulcx’s platformFeeBps are 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 return 400 rather than failing on-chain.
  • Responses now report the breakdown separately: platformFeeBps / platformFeeAmount and integratorFeeBps / integratorFeeAmount, alongside the pool fee in feeAmount.
  • See Fees.
feeAmount has always been the DEX pool fee, but the reference described it as the aggregator fee. Vulcx’s own cut is platformFeeAmount. If you were reading feeAmount as what Vulcx takes, it was never that number.

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 /swap or /instructions build 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 quoteId now also carries quoteSignature (base58 Ed25519 over the canonical vulcx-quote-v1 message) and quoteExpiresAtMs — provable prices you can verify offline.
  • New public endpoint GET /.well-known/vulcx-quote-signer serves 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, and excludeDexes constrain routing so the account set stays inside what your program pre-provisioned. Constrained requests bypass caches and never split; excluding moonit lifts the authority-writable requirement.
  • Per-request referrer fee share: a referrer wallet on /swap, /instructions, and /cpi/route-accounts earns the protocol’s on-chain referral share, paid in the output token. CPI responses include referrerAta (must pre-exist).
  • vulcx-cpi Rust crate: typed route-CPI builders (RouteAccounts, RouteArgs, per-hop structs, invoke_route_signed) with CI parity tests against the deployed program, plus an api-feature from_api_response bridge that parses /cpi/route-accounts JSON 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 400 for 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

  • sessionAccount on POST /api/v1/instructions builds 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 (requiredTokenAccounts in 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 adds sessionAccount, referrer, and the signed-quote fields.
July 2026: Firm quotes — the price you see is the price you commit

Firm quotes

  • quoteId on every quote: GET /api/v1/quote responses and WebSocket quote pushes now carry a quoteId, validForMs (~3s), and firmForMs (~400ms).
  • Route pinning: pass quoteId to POST /api/v1/swap or POST /api/v1/instructions to replay the exact quoted route with min-out anchored to the quoted price — no silent re-quote.
  • Firm redemption: add "firm": true within firmForMs and slippage collapses to the server’s firm margin (10 bps) around the quoted price — price-or-fail; drift past the margin returns 409 before any transaction is built.
  • New error contract: 410 quote expired, 409 route gone / price drifted, 403 quoteId from another key, 400 request 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/sdk surfaces quoteId/firm plus QuoteExpiredError/QuoteStaleError; the widget redeems quoteIds automatically and re-quotes on 409/410.
  • Slippage fix: builders now send the raw quote and the on-chain program applies slippageBps exactly once — the enforced min-out equals the displayed minAmountOut. Previously the effective tolerance was ~2× the requested bps, so expect slippage failures to now trip at the advertised threshold.
See the full guide: Firm quotes.
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.
Supported DEXs on Fogo: Valiant (concentrated liquidity), Fluxbeam (AMM), Moonit (bonding curves).Features: multi-hop routing (up to 5 hops), ExactIn/ExactOut modes, slippage protection, price impact severity classification, Address Lookup Table (ALT) support.
Last modified on September 22, 2026