API Reference
Base URL: https://rpc.nodius.xyz
All authenticated endpoints require one of: X-Api-Key header, per-request wallet signature (v2) headers (X-Pubkey, X-Signature, X-Timestamp, X-Nonce), or Authorization: Bearer <session-token>. See Authentication.
POST / (RPC Endpoint)
The primary hot-node endpoint. It is optimized for low-latency account reads, recent-chain state, transaction sending, priority-fee helpers, WebSocket traffic, and Yellowstone lite streaming. Heavy indexed scans and archive/history methods are gated by endpoint profile and return deterministic no-charge errors when not enabled.
Also available at POST /rpc.
Request
POST /
Content-Type: application/json
X-Pubkey: <base58-pubkey>
X-Signature: <base58-signature>
X-Timestamp: <unix-timestamp>
X-Nonce: <hex-nonce>
{
"jsonrpc": "2.0",
"id": 1,
"method": "getSlot",
"params": []
}
Or with session token:
POST /
Content-Type: application/json
Authorization: Bearer <session-token>
{
"jsonrpc": "2.0",
"id": 1,
"method": "getSlot",
"params": []
}
Or with API key:
POST /
Content-Type: application/json
X-Api-Key: srpc_live_<base64url>
{
"jsonrpc": "2.0",
"id": 1,
"method": "getSlot",
"params": []
}
Response
HTTP/1.1 200 OK
Content-Type: application/json
X-Credits-Remaining: 9999
X-Request-Id: req_abc123
{
"jsonrpc": "2.0",
"id": 1,
"result": 285943216
}
Batch Requests
Send an array of JSON-RPC requests:
[
{"jsonrpc": "2.0", "id": 1, "method": "getSlot"},
{"jsonrpc": "2.0", "id": 2, "method": "getBlockHeight"},
{"jsonrpc": "2.0", "id": 3, "method": "getBalance", "params": ["vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"]}
]
Response is an array of results in the same order. Each method is billed individually. Maximum 20 requests per batch.
Supported Methods And Launch Profile
READ_CHEAP (1 credit)
getAccountInfo getBalance getBlockCommitment
getBlockHeight getBlockProduction getBlockTime
getClusterNodes getEpochInfo getEpochSchedule
getFeeForMessage getFirstAvailableBlock getGenesisHash
getHealth getHighestSnapshotSlot getIdentity
getInflationGovernor getInflationRate getInflationReward
getLatestBlockhash getLeaderSchedule getMaxRetransmitSlot
getMaxShredInsertSlot getMinimumBalanceForRentExemption
getMultipleAccounts getRecentPerformanceSamples getRecentPrioritizationFees
getSignatureStatuses getSlot getSlotLeader
getSlotLeaders getStakeActivation getStakeMinimumDelegation
getSupply getTokenAccountBalance getTokenAccountsByDelegate
getTokenAccountsByOwner getTokenLargestAccounts getTokenSupply
getTransactionCount getVersion getVoteAccounts
isBlockhashValid minimumLedgerSlot getPriorityFeeEstimate
suggestPriorityFee
READ_MEDIUM (5 credits)
simulateTransaction getAssetsByOwner
getEnrichedTransaction explainTransaction
getTokenAccountsByOwner getTokenAccountsByDelegate
ARCHIVE_HISTORY (5-25 credits, profile-gated)
These methods are supported by the codebase and are enabled on archive/history endpoints. The Frankfurt hot-node launch endpoint returns -32004 without billing when this profile is disabled.
getTransaction getSignaturesForAddress
getConfirmedTransaction getConfirmedSignaturesForAddress2
getBlock getBlocks
getBlocksWithLimit getBlockSignatures
getFirstAvailableBlock
READ_HEAVY (25 credits, profile-gated)
These methods are supported by the codebase and are enabled on heavy-indexed endpoints. The Frankfurt hot-node launch endpoint returns -32004 without billing when this profile is disabled.
getProgramAccounts getLargestAccounts
simulateBundle
SEND (2 credits)
sendTransaction sendSmartTransaction
SEND_BUNDLE (10 credits)
sendBundle
sendBundle is credit-gated and costs more credits because it is resource-intensive.
DENIED
The following methods are not supported:
requestAirdrop
Error Responses
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32601,
"message": "Method not found"
}
}
See Error Reference for all error codes.
POST /account/activate
Create or activate an account. Idempotent โ calling with an already-registered pubkey returns the existing account.
This endpoint uses wallet signature auth (sig_only middleware). Only per-request wallet signature headers are accepted.
Request
POST /account/activate
Content-Type: application/json
X-Pubkey: <base58-pubkey>
X-Signature: <base58-signature>
X-Timestamp: <unix-timestamp>
X-Nonce: <hex-nonce>
{}
Response
{
"ok": true,
"pubkey": "YourPublicKeyBase58...",
"api_key": "srpc_live_...",
"deposit_address": "SharedDepositWalletATA...",
"funding": {
"asset": "USDC",
"network": "solana",
"deposit_address": "SharedDepositWalletATA...",
"credits_per_usdc": 10000,
"credit_expiry_seconds": 864000,
"credit_expiry_days": 10,
"attribution": "send USDC from the same wallet pubkey used to activate the account"
},
"credits_per_usdc": 10000,
"credit_expiry_seconds": 864000,
"balance": 0,
"created": true
}
api_key is returned only when a new key is generated. Bots can ignore it and keep using per-request wallet signatures for all authenticated endpoints.
Errors
| Status | Description |
|---|---|
| 401 | Invalid signature or timestamp |
| 500 | Internal server error |
GET /account/info
Get account details including credit balance and usage.
Request
GET /account/info
X-Pubkey: <base58-pubkey>
X-Signature: <base58-signature>
X-Timestamp: <unix-timestamp>
X-Nonce: <hex-nonce>
Or:
GET /account/info
Authorization: Bearer <token>
Response
{
"ok": true,
"pubkey": "YourPublicKeyBase58...",
"balance": 84521,
"deposit_address": "SharedDepositWalletATA...",
"status": "active",
"total_consumed_credits": 415479,
"created_at": 1705312200,
"last_deposit": {},
"credit_batches": []
}
Errors
| Status | Description |
|---|---|
| 401 | Invalid authentication |
| 404 | Account not found |
GET /account/ledger
Get credit transaction history (deposits, debits, adjustments).
Request
GET /account/ledger
Authorization: Bearer <token>
Response
{
"entries": [
{
"type": "deposit",
"amount": 10000,
"balance": 10000,
"description": "USDC deposit: 1.0 USDC",
"timestamp": "2025-01-15T10:31:00Z"
}
]
}
GET /account/history
Get usage history (RPC call log with credits consumed).
Request
GET /account/history
Authorization: Bearer <token>
Response
{
"entries": [
{
"method": "getSlot",
"credits": 1,
"timestamp": "2025-01-15T10:32:00Z"
}
]
}
POST /account/api-key
Generate a persistent API key for bearer token authentication. Regenerating invalidates the previous key.
Request
POST /account/api-key
Authorization: Bearer <token>
Or with wallet signature headers.
Response
{
"ok": true,
"api_key": "srpc_live_<base64url>",
"message": "Save this key โ it will not be shown again."
}
POST /account/confirm-deposit
Confirm a USDC deposit by providing the transaction signature. This can speed up credit assignment if the automatic detection hasn't processed the deposit yet.
Request
POST /account/confirm-deposit
Authorization: Bearer ***
Content-Type: application/json
{
"signature": "5xYz...base58..."
}
Response
{
"ok": true,
"credits_added": 10000,
"new_balance": 10000,
"already_processed": false
}
POST /auth/challenge
Request a challenge for session token authentication.
Request
POST /auth/challenge
Content-Type: application/json
{
"pubkey": "YourPublicKeyBase58..."
}
No authentication required for this endpoint.
Response
{
"challenge": "a1b2c3d4e5f67890abcdef1234567890a1b2c3d4e5f67890abcdef1234567890",
"expires_in": 300
}
The challenge is a 64-character hex string (32 random bytes). Valid for 300 seconds (5 minutes).
Errors
| Status | Description |
|---|---|
| 400 | Invalid pubkey format or account not found |
| 429 | Too many challenge requests |
POST /auth/verify
Submit a signed challenge to receive a session token. Sign the raw challenge hex string bytes with your Ed25519 keypair.
Request
POST /auth/verify
Content-Type: application/json
{
"pubkey": "YourPublicKeyBase58...",
"challenge": "a1b2c3d4e5f67890abcdef1234567890a1b2c3d4e5f67890abcdef1234567890",
"signature": "Base58EncodedSignature..."
}
The challenge must be the exact 64-character hex string from /auth/challenge.
Response
{
"token": "64-char-hex-session-token...",
"expires_in": 3600
}
Errors
| Status | Description |
|---|---|
| 400 | Missing or malformed fields |
| 401 | Invalid signature or expired challenge |
| 404 | Account not found |
POST /auth/logout
Revoke the current session token.
Request
POST /auth/logout
Authorization: Bearer <token>
Response
{
"status": "ok"
}
Jito Endpoints
POST /jito/sendBundle
Submit a Jito bundle for MEV-protected transaction submission.
Cost: 10 credits per call.
POST /jito/sendBundle
Authorization: Bearer <token>
Content-Type: application/json
{
"transactions": ["base58tx1...", "base58tx2..."]
}
POST /jito/getBundleStatuses
Check the status of previously submitted bundles.
Cost: 2 credits per call.
POST /jito/getBundleStatuses
Authorization: Bearer <token>
Content-Type: application/json
{
"bundleIds": ["bundleId1...", "bundleId2..."]
}
GET /jito/getTipAccounts
Get the list of Jito tip accounts.
Cost: 1 credit per call.
GET /jito/getTipAccounts
Authorization: Bearer <token>
GET /jito/tipFloor
Get the current Jito tip floor (minimum tip amount).
Cost: 1 credit per call.
GET /jito/tipFloor
Authorization: Bearer <token>
Bulk Endpoints
POST /bulk/getBalances
Batch balance lookups for multiple accounts in a single request.
POST /bulk/getBalances
Authorization: Bearer <token>
Content-Type: application/json
{
"accounts": ["pubkey1...", "pubkey2...", "pubkey3..."]
}
POST /bulk/getTokenBalances
Batch token balance lookups for multiple accounts.
POST /bulk/getTokenBalances
Authorization: Bearer <token>
Content-Type: application/json
{
"accounts": ["pubkey1...", "pubkey2..."],
"mint": "TokenMintAddress..."
}
POST /bulk/getTransactions
Batch transaction lookups.
POST /bulk/getTransactions
Authorization: Bearer <token>
Content-Type: application/json
{
"signatures": ["sig1...", "sig2...", "sig3..."]
}
Webhooks
POST /webhooks
Create a webhook subscription.
POST /webhooks
Authorization: Bearer <token>
Content-Type: application/json
{
"url": "https://your-server.com/webhook",
"events": ["account_change"],
"filter": {
"accounts": ["pubkey1..."]
}
}
GET /webhooks
List all webhook subscriptions for your account.
GET /webhooks
Authorization: Bearer <token>
DELETE /webhooks/{id}
Delete a webhook subscription.
DELETE /webhooks/abc123
Authorization: Bearer <token>
GET /ws
WebSocket endpoint for streaming subscriptions.
Connection
wss://rpc.nodius.xyz/ws
Authentication via the Authorization header:
Authorization: Bearer <token>
Or via the Sec-WebSocket-Protocol header (for clients that don't support custom headers):
Sec-WebSocket-Protocol: auth.<token>
Subscription Messages
{
"jsonrpc": "2.0",
"id": 1,
"method": "accountSubscribe",
"params": [
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
{"encoding": "base64", "commitment": "confirmed"}
]
}
Supported Subscription Methods
| Method | Unsubscribe | Description |
|---|---|---|
accountSubscribe |
accountUnsubscribe |
Account data changes |
logsSubscribe |
logsUnsubscribe |
Transaction logs |
programSubscribe |
programUnsubscribe |
Program account changes |
signatureSubscribe |
signatureUnsubscribe |
Transaction signature status |
slotSubscribe |
slotUnsubscribe |
Slot updates |
rootSubscribe |
rootUnsubscribe |
Root slot updates |
blockSubscribe |
blockUnsubscribe |
Block updates |
See the WebSocket Guide for detailed usage.
Yellowstone gRPC
High-performance streaming via Yellowstone geyser plugin.
Endpoint
grpc://rpc.nodius.xyz:10001
Authentication
Provide your session token or API key via the gRPC metadata x-token field:
x-token: <session-token-or-api-key>
Billing
60 credits per minute per active connection. Credits are deducted continuously while connected.
Capabilities
- Subscribe to account updates
- Subscribe to transaction notifications
- Subscribe to slot updates
- Subscribe to block metadata
- Filter by program, account, or transaction signature
See the Yellowstone gRPC documentation for the proto definitions and client libraries.
GET /health
Public health check endpoint. No authentication required.
Request
GET /health
Response
{
"status": "ok",
"solanaSlot": 285943216,
"solanaBlockHeight": 265234567,
"nodeVersion": "2.0.15",
"uptime": 864000
}
| Status | HTTP Code | Description |
|---|---|---|
ok |
200 | Healthy |
degraded |
200 | Operational but experiencing issues |
unhealthy |
503 | Not operational |
Metrics
Prometheus-compatible metrics are available at /internal/metrics on the admin-only localhost port (9090). This endpoint is not publicly accessible.
If you need to monitor your own usage, use the X-Credits-Remaining response header or the GET /account/info endpoint.
Response Headers
All authenticated endpoints include these headers:
| Header | Description |
|---|---|
X-Credits-Remaining |
Current credit balance |
X-Credits-Low |
true if balance < 1,000 credits |
X-Request-Id |
Unique request identifier for debugging |
X-Ratelimit-Limit |
Requests per second limit |
X-Ratelimit-Remaining |
Remaining requests in current window |
X-Ratelimit-Reset |
Unix timestamp when rate limit resets |
Content Types
- All request bodies must be
application/json - All responses are
application/json - The
/wsendpoint uses the WebSocket protocol - The gRPC endpoint uses Protocol Buffers