This guide covers the full self-serve path on Fyxvo devnet. Wallet auth, project activation, SOL funding, relay usage, analytics, and SDK reference — all in one place.
Devnet only
What Fyxvo is, who it is for, and what is live on devnet today.
A developer platform for Solana teams that need a real, funded RPC relay path — not a mock dashboard.
Solana teams validating funded RPC, priority relay, and analytics before widening traffic.
The full devnet path is active: wallet auth, project activation, SOL funding, standard relay, priority relay, analytics, and public status.
The four-step path from wallet connect to first confirmed relay request.
Open the dashboard. The app requests a challenge from the API, asks the connected wallet to sign it, and exchanges that signature for a JWT-backed API session. Phantom is the most direct path for browser-first devnet usage.
Project creation prepares the on-chain activation transaction immediately. The project becomes usable as soon as the wallet signs and devnet confirms it. The API derives the PDA and prepares everything — you only need to sign.
Prepare a SOL funding transaction from the project page, review the lamport amount, sign it in the wallet, and wait for API verification. The API then refreshes the project's on-chain balance view so the gateway can accept traffic.
Generate a relay key scoped to rpc:request. Copy the /rpc endpoint and send a small JSON-RPC request. That first request should appear in project analytics and on the status surface within seconds.
From zero to a live devnet relay request using curl only. No SDK required.
curl -s -X POST https://api.fyxvo.com/v1/auth/challenge \
-H "content-type: application/json" \
-d '{"walletAddress":"YOUR_WALLET_ADDRESS_BASE58"}'
# Save the nonce and message from the response
# { "walletAddress": "...", "nonce": "abc123", "message": "Fyxvo Authentication\nWallet: ...\nNonce: abc123\n..." }# Sign the exact message string returned from the challenge endpoint.
# Using the Solana CLI (base58 output):
echo -n "Fyxvo Authentication\nWallet: YOUR_WALLET\nNonce: abc123\n..." | \
solana sign-offchain-message - --keypair ~/.config/solana/id.json
# Or use @solana/wallet-adapter-base in the browser:
# const sig = await wallet.signMessage(Buffer.from(message));
# const sigBase58 = bs58.encode(sig);curl -s -X POST https://api.fyxvo.com/v1/auth/verify \
-H "content-type: application/json" \
-d '{
"walletAddress": "YOUR_WALLET_ADDRESS_BASE58",
"message": "THE_EXACT_CHALLENGE_MESSAGE",
"signature": "YOUR_BASE58_SIGNATURE"
}'
# { "token": "eyJhbGci...", "user": { "walletAddress": "...", "role": "MEMBER" } }
export JWT="eyJhbGci..."curl -s -X POST https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/api-keys \
-H "authorization: Bearer $JWT" \
-H "content-type: application/json" \
-d '{"label":"my-key","scopes":["project:read","rpc:request"]}'
# { "item": { "id": "...", "prefix": "fyxvo_live_...", ... }, "plainTextKey": "fyxvo_live_...secret" }
export API_KEY="fyxvo_live_...secret"curl -s -X POST https://rpc.fyxvo.com/rpc \
-H "content-type: application/json" \
-H "x-api-key: $API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}'
# { "jsonrpc": "2.0", "result": "ok", "id": 1 }
# Priority relay (requires priority:relay scope):
curl -s -X POST https://rpc.fyxvo.com/priority \
-H "content-type: application/json" \
-H "x-api-key: $API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'That's it
Ready-to-run examples for the most common Solana development environments.
Server component example using @solana/web3.js in a Next.js App Router route handler.
// app/api/solana/route.ts
import { Connection } from "@solana/web3.js";
const connection = new Connection(
`https://rpc.fyxvo.com/rpc?api-key=${process.env.FYXVO_API_KEY}`
);
export async function GET() {
const slot = await connection.getSlot();
return Response.json({ slot });
}Wallet-signed JWT flow: challenge, sign, verify.
How the wallet session works
curl -X POST https://api.fyxvo.com/v1/auth/challenge \
-H "content-type: application/json" \
-d '{"walletAddress":"YOUR_WALLET"}'Use wallet.signMessage(Buffer.from(challenge)) from @solana/wallet-adapter-base. Convert the resulting Uint8Array signature to base58 before sending.
# 1. Get challenge — returns the exact message to sign
curl -X POST https://api.fyxvo.com/v1/auth/challenge \
-H "content-type: application/json" \
-d '{"walletAddress":"YOUR_WALLET"}'
# Response: { "walletAddress": "...", "nonce": "...", "message": "fyxvo:YOUR_WALLET:NONCE" }
# 2. Sign the message with your wallet (browser, @solana/wallet-adapter-base)
const encoded = new TextEncoder().encode(message);
const signatureBytes = await wallet.signMessage(encoded);
const signature = bs58.encode(signatureBytes);
# 3. Verify signature and receive JWT
curl -X POST https://api.fyxvo.com/v1/auth/verify \
-H "content-type: application/json" \
-d '{
"walletAddress": "YOUR_WALLET",
"message": "<message-from-step-1>",
"signature": "<base58-signature>"
}'
# Response: { "token": "eyJ...", "user": { "id": "...", "walletAddress": "...", "role": "MEMBER" } }JWT expiry
Supported wallets
SOL funding flow on devnet — prepare, sign, verify.
SOL is live on devnet
# 1. Prepare the unsigned funding transaction
curl -X POST https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/funding/prepare \
-H "authorization: Bearer YOUR_JWT" \
-H "content-type: application/json" \
-d '{"asset":"SOL","amountLamports":100000000,"funderWalletAddress":"YOUR_WALLET"}'
# Response: { "item": { "id": "FUNDING_ID", "transactionBase64": "<unsigned-tx>", "amount": "100000000" } }
# 2. Decode, sign, and broadcast (using @solana/web3.js)
import { Transaction, Connection } from "@solana/web3.js";
const fundingItem = response.item;
const tx = Transaction.from(Buffer.from(fundingItem.transactionBase64, "base64"));
const signed = await wallet.signTransaction(tx);
const connection = new Connection("https://api.devnet.solana.com");
const sig = await connection.sendRawTransaction(signed.serialize());
await connection.confirmTransaction(sig, "confirmed");
# 3. Verify the confirmed transaction with the API
curl -X POST https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/funding/FUNDING_ID/verify \
-H "authorization: Bearer YOUR_JWT" \
-H "content-type: application/json" \
-d '{"signature": "<tx-signature>"}'Unsigned transaction review
USDC stays gated
Send standard JSON-RPC traffic through the /rpc relay endpoint.
Required scope
rpc:request scope. Under-scoped keys receive a 403, not silent broad access.# Standard relay — requires rpc:request scope
curl -X POST https://rpc.fyxvo.com/rpc \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[]}'
# Also accepts Authorization: Bearer
curl -X POST https://rpc.fyxvo.com/rpc \
-H "content-type: application/json" \
-H "authorization: Bearer YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getLatestBlockhash","params":[{"commitment":"confirmed"}]}'Endpoint
https://rpc.fyxvo.com/rpcLatency-sensitive traffic on the /priority endpoint with a separately scoped key.
Required scope
rpc:request and priority:relay scopes. Sending a standard key to /priority returns 403.# Priority relay — requires rpc:request AND priority:relay scopes
curl -X POST https://rpc.fyxvo.com/priority \
-H "content-type: application/json" \
-H "x-api-key: YOUR_PRIORITY_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"sendTransaction","params":["<base64-tx>",{"encoding":"base64","skipPreflight":false}]}'| Property | Standard | Priority |
|---|---|---|
| Endpoint | /rpc | /priority |
| Scope | rpc:request | + priority:relay |
| Rate limit | 300 / min | 60 / min |
Why they are separate
Monitor request volume, latency, and errors across your Fyxvo projects.
Fyxvo provides a two-level analytics surface: an overview endpoint that aggregates totals across all your projects, and a per-project endpoint that surfaces method breakdowns, latency percentiles, status code distributions, and recent error events. Both endpoints require a valid JWT and respect the standard rate limit window.
Fetch usage data across all projects or drill into a specific project.
curl https://api.fyxvo.com/v1/analytics/overview \
-H "authorization: Bearer YOUR_JWT"
# Response shape:
# {
# "item": {
# "totals": { "projects": 3, "apiKeys": 5, "fundingRequests": 2, "requestLogs": 14200 },
# "latency": { "averageMs": 42, "maxMs": 312 },
# "requestsByService": [{ "service": "gateway", "count": 14200 }]
# }
# }curl https://api.fyxvo.com/v1/analytics/projects/YOUR_PROJECT_ID?range=24h \
-H "authorization: Bearer YOUR_JWT"
# Range options: 1h | 6h | 24h | 7d | 30d (default: all time)
# Response shape:
# {
# "item": {
# "totals": { "requestLogs": 4800, "apiKeys": 2, "fundingRequests": 1 },
# "latency": { "averageMs": 38, "maxMs": 210, "p95Ms": 95 },
# "statusCodes": [{ "statusCode": 200, "count": 4750 }, { "statusCode": 429, "count": 50 }],
# "recentRequests": [{ "route": "/rpc", "method": "POST", "statusCode": 200, "durationMs": 38 }]
# }
# }Aggregates totals across all projects owned by the authenticated wallet: total requests, success rate, average latency, and 24-hour rolling count.
Returns per-project metrics including method breakdown, recent error log, and latency percentiles for both standard and priority paths.
Both endpoints require a valid JWT Bearer token in the Authorization header. Use the wallet auth flow to obtain one.
Read project-level public stats with a project-scoped API key from your backend services.
Keep keys off the client
x-api-key from a backend service, serverless function, or CI job. Do not ship project keys in browser bundles.curl https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/stats/public \
-H "x-api-key: $FYXVO_API_KEY"const response = await fetch("https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/stats/public", {
headers: {
"x-api-key": process.env.FYXVO_API_KEY!,
},
cache: "no-store",
});
const stats = await response.json();
console.log(stats);import process from "node:process";
const response = await fetch("https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/stats/public", {
headers: {
"x-api-key": process.env.FYXVO_API_KEY ?? "",
},
});
console.log(await response.json());import os
import requests
response = requests.get(
"https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/stats/public",
headers={"x-api-key": os.environ["FYXVO_API_KEY"]},
timeout=10,
)
print(response.json())Try live API endpoints directly from the docs. Paste your JWT token to test authenticated routes.
API Explorer
/healthCheck API service health and database connectivity.
curl
curl https://api.fyxvo.com/health \ -H "Content-Type: application/json"
Receive HTTP POST callbacks when events happen in your project.
Webhooks let you integrate Fyxvo events into your own systems. Every delivery includes an x-fyxvo-signature header with format sha256=<hex>.
Supported events
funding.confirmedapikey.createdapikey.revokedbalance.lowproject.activatedcurl -X POST https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/webhooks \
-H "authorization: Bearer YOUR_JWT" \
-H "content-type: application/json" \
-d '{"url":"https://your-server.example.com/webhook","events":["funding.confirmed","balance.low"]}'curl -X POST https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/webhooks/WEBHOOK_ID/test \
-H "authorization: Bearer YOUR_JWT"const crypto = require('crypto');
const sig = req.headers['x-fyxvo-signature'];
const computed = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
if (sig !== computed) return res.status(401).send('Unauthorized');Retry behavior
lastTriggeredAt is not updated. URLs must be HTTPS — localhost and private IP ranges are blocked.Invite team members to your project by Solana wallet address.
Project owners can invite other Fyxvo users by wallet address. Invitations are pending until the invitee accepts via PATCH /v1/projects/:id/members/:memberId/accept.
Member permissions
Team management
curl -X POST https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/members/invite \
-H "authorization: Bearer YOUR_JWT" \
-H "content-type: application/json" \
-d '{"walletAddress":"MEMBER_WALLET_ADDRESS"}'curl https://api.fyxvo.com/v1/projects/YOUR_PROJECT_ID/members \
-H "authorization: Bearer YOUR_JWT"Share your project's aggregate stats publicly — no API key required.
Enable a public URL for your project from Settings → Project settings → Public profile. The public page at /p/[your-slug] shows total requests and average latency. No API keys or balances are shown.
README badge
[](https://www.fyxvo.com/p/YOUR_SLUG)The API Playground lets you send live JSON-RPC requests to the Fyxvo gateway and inspect responses without writing any code.
Toggle Compare in the request builder to run the same request on both the standard and priority paths simultaneously. The priority response badge turns green when it is faster.
Click Schema next to any method to see the expected response shape — field names, types, and descriptions — before you send the request.
Click Share to encode the current method and parameters into the URL. Send the link to a colleague and they will land on the same request configuration.
@fyxvo/sdk — TypeScript SDK for the Fyxvo gateway and control-plane API.
SDK install
npm install @fyxvo/sdkyarn add @fyxvo/sdkpnpm add @fyxvo/sdkimport { createFyxvoClient } from "@fyxvo/sdk";
const client = createFyxvoClient({
baseUrl: "https://rpc.fyxvo.com",
apiKey: process.env.FYXVO_API_KEY,
});// Standard RPC request
const health = await client.rpc({
id: 1,
method: "getHealth",
});
// With params
const blockhash = await client.rpc({
id: 2,
method: "getLatestBlockhash",
params: [{ commitment: "confirmed" }],
});
console.log(blockhash.result.value.blockhash);// Priority relay request (requires priority:relay scoped key)
// Pass the /priority path via the options second argument
const slot = await client.rpc(
{ id: 1, method: "getSlot" },
{ path: "/priority" }
);
if ("result" in slot) {
const slotNumber = slot.result as number;
// use slotNumber
}import { FyxvoError, FyxvoApiError } from "@fyxvo/sdk";
try {
const result = await client.rpc({ id: 1, method: "getHealth" });
} catch (err) {
if (err instanceof FyxvoApiError) {
// HTTP-level error from the gateway (4xx / 5xx)
// err.status holds the HTTP status code, err.message has the description
const status: number | undefined = err.status;
const message: string = err.message;
void status; void message;
} else if (err instanceof FyxvoError) {
// SDK-level error (network, timeout, config)
const message: string = err.message;
void message;
}
}import { createFyxvoClient } from "@fyxvo/sdk";
// Step 1 — request a challenge
const api = createFyxvoClient({ baseUrl: "https://api.fyxvo.com" });
const challenge = await api.request<{ message: string; nonce: string }>({
method: "POST",
path: "/v1/auth/challenge",
body: { walletAddress: "YOUR_WALLET_ADDRESS" },
});
// Step 2 — sign the message with your wallet
const encoded = new TextEncoder().encode(challenge.message);
const sigBytes = await wallet.signMessage(encoded);
const signature = bs58.encode(sigBytes);
// Step 3 — verify and receive a JWT
const session = await api.request<{ token: string }>({
method: "POST",
path: "/v1/auth/verify",
body: {
walletAddress: "YOUR_WALLET_ADDRESS",
message: challenge.message,
signature,
},
});
// Step 4 — use the JWT as a bearer token for subsequent calls
const authedClient = createFyxvoClient({
baseUrl: "https://api.fyxvo.com",
headers: { authorization: `Bearer ${session.token}` },
});// Create a gateway relay API key (requires JWT from auth flow)
const authedClient = createFyxvoClient({
baseUrl: "https://api.fyxvo.com",
headers: { authorization: "Bearer YOUR_JWT" },
});
const created = await authedClient.request<{
item: { id: string; prefix: string; scopes: string[] };
plainTextKey: string;
}>({
method: "POST",
path: "/v1/api-keys",
body: { label: "my-relay-key", scopes: ["rpc:request"] },
});
const apiKey = created.plainTextKey;import { createFyxvoClient, type RpcResponse } from "@fyxvo/sdk";
// Gateway client — use your relay API key here
const gateway = createFyxvoClient({
baseUrl: "https://rpc.fyxvo.com",
apiKey: process.env.FYXVO_API_KEY,
});
// Standard RPC call
const health = await gateway.rpc<string>({ method: "getHealth" });
// With typed params
interface BlockhashResult {
blockhash: string;
lastValidBlockHeight: number;
}
const response: RpcResponse<{ value: BlockhashResult }> = await gateway.rpc({
id: 1,
method: "getLatestBlockhash",
params: [{ commitment: "confirmed" }],
});
if ("result" in response) {
const blockhash: string = response.result.value.blockhash;
void blockhash;
}import requests
response = requests.post(
"https://rpc.fyxvo.com/rpc",
headers={"x-api-key": "YOUR_KEY", "Content-Type": "application/json"},
json={"jsonrpc": "2.0", "id": 1, "method": "getHealth", "params": []}
)
print(response.json())FyxvoError
FyxvoApiError
Per-key limits for standard and priority paths, and how to handle 429 responses.
Limit: 300 requests per 60-second window
Scope: rpc:request
Enforcement: Redis-backed, per API key
Limit: 60 requests per 60-second window
Scope: priority:relay
Enforcement: Separate window from standard
# The gateway returns 429 when a key exceeds its rate window.
# Response headers include:
# x-ratelimit-limit: <requests per window>
# x-ratelimit-remaining: <remaining in current window>
# x-ratelimit-reset: <unix timestamp when the window resets>
# Standard path (rpc:request scope) — 300 req / 60 s per key
# Priority path (priority:relay scope) — 60 req / 60 s per key
# Retry with backoff after a 429:
async function withRetry(fn, maxAttempts = 3) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
return await fn();
} catch (err) {
if (err?.statusCode === 429 && attempt < maxAttempts - 1) {
await new Promise((r) => setTimeout(r, 1000 * (attempt + 1)));
} else {
throw err;
}
}
}
}Rate limit headers
x-ratelimit-limit, x-ratelimit-remaining, and x-ratelimit-reset headers. Use these to implement adaptive backoff without waiting for a 429.Test against the gateway without using your project balance or touching Solana devnet.
Other methods may pass through or return a stub error in simulation mode.
# Standard path with simulation enabled
curl -X POST "https://rpc.fyxvo.com/rpc?simulate=true" \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth","params":[]}'
# Response (canned — not from devnet):
# {"jsonrpc":"2.0","id":1,"result":"ok"}Simulation mode is intended for development and testing only. Production integrations must omit the ?simulate=true parameter to ensure requests are routed to Solana devnet and fees are applied correctly against your project balance.
How Fyxvo versions its REST API and what counts as a breaking change.
Version: v1
Base path: /v1/
Version header: X-Fyxvo-API-Version: v1
Every API response includes the X-Fyxvo-API-Version: v1 header. Check this header in your client to detect version mismatches before they cause silent behavior changes.
Deprecations are announced via a Deprecation header in affected API responses and in the changelog. Deprecated endpoints remain available for a minimum of 90 days after the announcement. Watch the Deprecation header in your HTTP client to catch these early.
// After any fetch call, check the version header:
const response = await fetch("https://api.fyxvo.com/v1/...", { /* ... */ });
const apiVersion = response.headers.get("X-Fyxvo-API-Version");
if (apiVersion && apiVersion !== "v1") {
// Version mismatch — review the changelog for migration steps
}
// curl: observe the header in verbose output
curl -I https://api.fyxvo.com/health
# X-Fyxvo-API-Version: v1A detailed diagnostic guide for the most common failure categories.
The gateway or API rejected your credentials. This covers both missing-token (401) and insufficient-scope (403) failures.
Causes
rpc:request for standard, priority:relay for priority)Diagnosis
Check the error.code field in the response body. Code TOKEN_EXPIRED means re-authenticate. Code INSUFFICIENT_SCOPE means generate a new key with the right scopes.
Fix
POST /v1/auth/challenge + POST /v1/auth/verifyX-Api-Key or Authorization: Bearer header is present and correctly formatted# Step 1 — get a challenge
curl -X POST https://api.fyxvo.com/v1/auth/challenge \
-H "content-type: application/json" \
-d '{"walletAddress":"YOUR_WALLET"}'
# Step 2 — sign the returned message with your wallet and verify
curl -X POST https://api.fyxvo.com/v1/auth/verify \
-H "content-type: application/json" \
-d '{"walletAddress":"YOUR_WALLET","message":"<from-step-1>","signature":"<base58-sig>"}'The request never reaches the gateway or returns a non-JSON response.
Causes
Fix
https://rpc.fyxvo.com/rpccurl https://rpc.fyxvo.com/health
# Expected: {"status":"ok"}
curl https://api.fyxvo.com/health
# Expected: {"status":"ok"}The gateway returned a 429 Too Many Requests. Your project has exceeded its per-minute request quota.
Causes
Diagnosis
Check the X-RateLimit-Remaining and Retry-After headers on the 429 response.
Fix
Retry-After header valuecurl -i -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[]}'
# Look for: X-RateLimit-Limit, X-RateLimit-Remaining, Retry-AfterA 402 Payment Required means the project does not have enough SOL credits to cover the relay request.
Causes
Fix
POST /v1/projects/:id/funding/:fid/verifycurl https://api.fyxvo.com/v1/me/balance \
-H "authorization: Bearer YOUR_JWT"
# Returns: { "availableSolCredits": "...", "totalSolFunded": "..." }The gateway reached Solana devnet but the RPC call itself failed. Check the fyxvo_hint field in the error response for a human-readable diagnosis.
Causes
getLatestBlockhash again)Common codes
-32002 — Transaction simulation failed: check transaction logs in the response-32003 — Blockhash expired: fetch a fresh blockhash and re-sign-32016 — Blockhash not found: same resolution as -32003# A Fyxvo error response looks like:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32002,
"message": "Transaction simulation failed",
"fyxvo_hint": "The transaction failed simulation. Check that the fee payer has enough SOL and all accounts are valid."
}
}A quick reference for every error code returned by the Fyxvo API and gateway.
All Fyxvo API errors follow the shape { error: string, message: string }. HTTP status codes map directly to problem categories: 400 for validation, 401 for auth, 402 for insufficient balance, 403 for scope or role issues, 429 for rate limits, and 503 for protocol unavailability. See the Error Codes table below for the full list with resolution guidance.
How to use Fyxvo API keys safely in automated pipelines.
Store your API key in an environment secret (e.g. FYXVO_API_KEY) and pass it as the X-Api-Key header. In GitHub Actions, use ${{ secrets.FYXVO_API_KEY }}. Never commit keys directly. Use separate keys per environment so you can revoke CI access without affecting production.
Switch to Fyxvo from Helius, QuickNode, or any other Solana RPC provider.
Fyxvo is a drop-in replacement for any standard Solana JSON-RPC provider. Replace your existing endpoint URL with the Fyxvo gateway URL and add an X-Api-Key header containing your relay key. No SDK changes are required — any library that speaks JSON-RPC over HTTP works without modification.
How to check the live condition of the API, gateway, and protocol.
# API health
curl https://api.fyxvo.com/health
# { "status": "ok", "timestamp": "..." }
# Gateway health
curl https://rpc.fyxvo.com/health
# { "status": "ok" }
# Gateway full status (metrics, node count, pricing)
curl https://rpc.fyxvo.com/v1/status
# Status page
open https://status.fyxvo.comhttps://status.fyxvo.comPublic status page. Combines API health, gateway health, and protocol readiness into a single honest surface. Share this with teammates during evaluation.
https://api.fyxvo.com/healthReturns { "status": "ok" } when the control plane, database, and Redis are operational. Include this in your monitoring setup.
https://rpc.fyxvo.com/v1/statusReturns the full gateway state: node count, upstream availability, pricing config, scope enforcement status, and live relay metrics.
Interpreting a degraded status
What shipped in each version of the Fyxvo devnet platform.
Initial devnet launch release
Challenge–sign–verify JWT flow. Supports Phantom, Solflare, Backpack, and Wallet Standard adapters.
On-chain project account creation via Anchor PDA derivation. Wallet signs the activation transaction; API verifies confirmation.
API-prepared unsigned transactions for SOL deposits into the Anchor-managed project vault. Includes verify endpoint for balance refresh.
JSON-RPC relay at /rpc with API key validation, funded balance enforcement, multi-node routing, and fallback.
Separate /priority path with priority:relay scope requirement, independent rate window, and distinct pricing from standard.
Overview endpoint for cross-project totals and per-project endpoint for method breakdown, latency, and error log.
Request counts and success rates broken down by individual API key so teams can trace which key is responsible for traffic.
Analytics surface includes per-method request counts and average latency to identify expensive or high-volume RPC methods.
Recent error events surfaced in the analytics API with timestamps, error codes, and affected project identifiers.
In-product notification surface for balance warnings, rate limit events, and project status changes.
Switch to Fyxvo in two lines of code. No SDK changes required.
Fyxvo is a drop-in Solana RPC provider. Replace the endpoint URL and add your API key header. Everything else stays the same.
const connection = new Connection("https://mainnet.helius-rpc.com/?api-key=YOUR_KEY");
// or
const connection = new Connection("https://solana-mainnet.quiknode.pro/YOUR_KEY/");const connection = new Connection("https://rpc.fyxvo.com/rpc", {
httpHeaders: { "X-Api-Key": "fyxvo_live_YOUR_KEY" }
});What stays the same
What is different
X-Api-Key header (not a URL query param)Per-key rate limits on devnet. Limits will increase as the network scales.
| Path | Scope required | Limit | Window |
|---|---|---|---|
| /rpc (standard) | rpc:request | 300 req | 60 s |
| /priority (priority) | priority:relay | 60 req | 60 s |
| API (auth, projects) | n/a (JWT) | 120 req | 60 s |
| API (analytics) | n/a (JWT) | 120 req | 60 s |
Rate limit headers: x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset. On 429, wait for the reset timestamp before retrying.
Common error codes returned by the API and gateway.
| HTTP | Code | Meaning | Resolution |
|---|---|---|---|
| 400 | validation_error | Request body failed schema validation | Check the details field for which fields are invalid |
| 400 | invalid_message | Auth challenge message does not match | Request a new challenge and sign the exact returned message |
| 401 | unauthorized | No JWT token provided | Include Authorization: Bearer <token> header |
| 401 | invalid_token | JWT is malformed or expired | Re-authenticate via /v1/auth/challenge + /v1/auth/verify |
| 401 | invalid_signature | Wallet signature verification failed | Sign with the correct wallet and the exact challenge message |
| 401 | session_expired | Session version has been rotated | Re-authenticate to get a fresh JWT |
| 402 | insufficient_balance | Project has no spendable SOL credits | Fund the project treasury and wait for confirmation |
| 403 | forbidden | Action requires elevated privileges | Check your account role in Settings |
| 403 | scope_missing | API key lacks the required scope | Revoke the key and create a new one with the correct scopes |
| 404 | not_found | Project, key, or resource not found | Verify the ID is correct and belongs to your account |
| 409 | project_already_activated | Activation transaction already confirmed | The project is already active — no action needed |
| 429 | rate_limited | Rate limit exceeded for this window | Back off and retry after x-ratelimit-reset timestamp |
| 503 | protocol_not_ready | Fyxvo program not ready on chain | Check /status for protocol readiness details |
Real questions from developers integrating with Fyxvo.
Is Fyxvo production-ready for mainnet?
Not yet. Fyxvo is currently a private devnet alpha. Mainnet support is on the roadmap. Devnet-graduated projects will have a clear migration path when mainnet launches.
What happens if my SOL balance runs out?
Gateway requests will return a 402 Insufficient Balance error until you fund the project treasury. Your project data, API keys, and analytics are preserved — only relay access is paused.
Can I use Fyxvo without a wallet?
No. Wallet ownership is the authentication anchor. You need a Solana wallet (Phantom, Backpack, etc.) to create a project, fund the treasury, and receive a session JWT.
How do I get more devnet SOL for testing?
Use the Solana devnet faucet: `solana airdrop 2 YOUR_WALLET --url devnet`. You can also use https://faucet.solana.com. Note: devnet SOL has no real value.
What RPC methods are compute-heavy and cost more?
The following methods cost 3,000 lamports instead of 1,000: getProgramAccounts, getLargestAccounts, getSignaturesForAddress, getSignaturesForAddress2, getTokenLargestAccounts. These are expensive upstream queries that require heavier node compute.
Can I have multiple projects?
Yes. Each project is an independent on-chain account with its own treasury, API keys, and analytics. Create additional projects from the Dashboard.
How do volume discounts work?
Discounts apply to your billing rate: ≥1M requests/month → 20% off standard rate; ≥10M requests/month → 40% off. During devnet alpha, contact the team to apply volume pricing manually.
Why does the gateway return a 401 even with a valid API key?
The most common causes: (1) the key was revoked, (2) the key lacks the required scope (rpc:request for standard, priority:relay for priority), or (3) the X-Api-Key header is missing or misspelled.
Can I use Fyxvo with languages other than JavaScript?
Yes. Any HTTP client works. Use the X-Api-Key header and POST JSON-RPC to the gateway endpoint. Python, Rust, Go, and curl all work identically.
How do I withdraw unused SOL from my project treasury?
Treasury withdrawal is not yet available via the dashboard UI. During the devnet alpha, contact the team to initiate a withdrawal. Mainnet will have a self-serve withdrawal flow.
A glossary of key Solana JSON-RPC methods routed through the Fyxvo gateway.
getBalanceStandard[pubkey]Returns the lamport balance of the account at the given public key.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBalance","params":["FQ5pyjBQvfadKPPxd66YXksgn8veYnjEw2R1g6aQnFaa"]}'getAccountInfoStandard[pubkey]Returns all information associated with the account at the given public key.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getAccountInfo","params":["FQ5pyjBQvfadKPPxd66YXksgn8veYnjEw2R1g6aQnFaa",{"encoding":"base58"}]}'getMultipleAccountsStandard[pubkeys[]]Get info for multiple accounts at once.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getMultipleAccounts","params":[["PUBKEY1","PUBKEY2"],{"encoding":"base58"}]}'getTokenAccountBalanceStandard[pubkey]Get token account balance for an SPL Token account.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getTokenAccountBalance","params":["TOKEN_ACCOUNT_PUBKEY"]}'getTokenAccountsByOwnerStandard[ownerAddress, { mint | programId }]Get all token accounts owned by an address, filtered by mint or program ID.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getTokenAccountsByOwner","params":["OWNER_PUBKEY",{"programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},{"encoding":"jsonParsed"}]}'getTokenLargestAccountsStandard[mintAddress]Get the 20 largest token accounts for a given mint.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getTokenLargestAccounts","params":["MINT_ADDRESS"]}'getTokenSupplyStandard[mintAddress]Get the total supply of an SPL Token mint.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getTokenSupply","params":["MINT_ADDRESS"]}'getProgramAccountsStandard⚡ Heavy[programId]Get all accounts owned by a program. Compute-heavy — use filters to narrow results.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getProgramAccounts","params":["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"]}'getSlotStandardReturns the slot that has reached the given or default commitment level.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[]}'getBlockStandard⚡ Heavy[slot]Returns identity and transaction information about a confirmed block in the ledger. Compute-heavy.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBlock","params":[SLOT_NUMBER,{"encoding":"json","maxSupportedTransactionVersion":0}]}'getLatestBlockhashStandardReturns the latest blockhash and the last block height at which it is valid.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getLatestBlockhash","params":[{"commitment":"confirmed"}]}'getBlockHeightStandardReturns the current block height of the node.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBlockHeight","params":[]}'getBlockTimeStandard[slot]Get estimated production time of a block, as Unix timestamp.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBlockTime","params":[SLOT_NUMBER]}'getBlocksStandard[startSlot, endSlot?]Get confirmed blocks in a slot range.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getBlocks","params":[START_SLOT,END_SLOT]}'getFirstAvailableBlockStandardGet the slot of the lowest confirmed block that has not been purged from the ledger.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getFirstAvailableBlock","params":[]}'sendTransactionPriority[encodedTransaction]Submits a signed transaction to the cluster for processing.
curl -X POST https://rpc.fyxvo.com/priority \
-H "x-api-key: YOUR_PRIORITY_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"sendTransaction","params":["<base64-signed-tx>",{"encoding":"base64","skipPreflight":false}]}'simulateTransactionPriority[transaction]Simulate sending a transaction without actually submitting it to the network.
curl -X POST https://rpc.fyxvo.com/priority \
-H "x-api-key: YOUR_PRIORITY_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"simulateTransaction","params":["<base64-tx>",{"encoding":"base64","sigVerify":false}]}'getTransactionStandard[signature]Returns transaction details for a confirmed transaction.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["SIGNATURE",{"encoding":"json","maxSupportedTransactionVersion":0}]}'getTransactionsStandard[signatures[]]Get details for multiple transactions by signature array.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getTransactions","params":[["SIG1","SIG2"],{"encoding":"json","maxSupportedTransactionVersion":0}]}'getSignaturesForAddressStandard[address]Get confirmed signatures for transactions involving an address.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSignaturesForAddress","params":["FQ5pyjBQvfadKPPxd66YXksgn8veYnjEw2R1g6aQnFaa",{"limit":10}]}'getSignatureStatusesStandard[signatures[]]Returns the statuses of a list of transaction signatures.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSignatureStatuses","params":[["SIG1","SIG2"],{"searchTransactionHistory":false}]}'getHealthStandardReturns the current health of the node — “ok” if healthy.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth","params":[]}'getVersionStandardReturns the current Solana version running on the node.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getVersion","params":[]}'getEpochInfoStandardReturns information about the current epoch including slot index and epoch number.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getEpochInfo","params":[]}'getEpochScheduleStandardGet epoch schedule information from the cluster’s genesis config.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getEpochSchedule","params":[]}'getGenesisHashStandardReturns the genesis hash of the ledger.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getGenesisHash","params":[]}'getClusterNodesStandardGet information about all cluster nodes participating in the network.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getClusterNodes","params":[]}'getLeaderScheduleStandardGet the leader schedule for the current or a specific epoch.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getLeaderSchedule","params":[]}'getMinimumBalanceForRentExemptionStandard[dataSize]Get minimum balance required to make account rent exempt for a given data size.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getMinimumBalanceForRentExemption","params":[128]}'getRecentPerformanceSamplesStandard[limit?]Get recent performance samples showing transactions and slots per second.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getRecentPerformanceSamples","params":[5]}'getStakeActivationStandard[pubkey]Get epoch activation information for a stake account.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getStakeActivation","params":["STAKE_ACCOUNT_PUBKEY"]}'getVoteAccountsStandardGet account info and stake for all voting accounts in the current bank.
curl -X POST https://rpc.fyxvo.com/rpc \
-H "x-api-key: YOUR_API_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"getVoteAccounts","params":[]}'