Billing Model
Nodius uses a prepaid credit system with per-method pricing. No subscriptions, no invoices. Deposit USDC (SPL) on Solana mainnet (minimum $0.01), receive credits, spend credits on RPC calls.
How It Works
- Send USDC (SPL) on Solana mainnet to the deposit wallet (minimum $0.01). Credits appear within seconds.
- Credits are applied automatically (~30 seconds after finalization)
- Each RPC method deducts credits based on its computational weight
- When credits reach 0, requests return 402 Payment Required
โ ๏ธ Token & chain: Only SPL USDC on Solana mainnet is accepted. USDC mint:
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. Do not send SOL or other tokens โ they will be permanently lost. Obtain the deposit address programmatically viaGET /account/infoor the402responsedata.deposit_address.
Deposit Attribution
Credits are attributed to the wallet that owns the source token account โ the authority field on the SPL token transfer instruction. This is the wallet that signed the transfer, not the transaction fee payer.
Send USDC from the same wallet you use for authentication. If your wallet's pubkey is ABC..., the USDC transfer must be signed by ABC.... Credits will be added to the account ABC....
What works
- Standard wallet transfers โ Phantom, Solflare, Backpack, or any wallet that signs an SPL token transfer. The transfer authority is your wallet pubkey.
- Programmatic transfers โ
sendTransactionwith a signed SPL token transfer instruction. The authority is extracted from the instruction, not the fee payer. - Multisig wallets โ The multisig authority (the M-of-N signer set) is used. Credits go to the multisig's pubkey, which must be the same pubkey used for auth.
- Transfers via smart contracts โ If the transfer instruction has an
authorityfield, it's used. If the transfer is done via CPI with a different authority, that authority is attributed.
What doesn't work
- Centralized exchange withdrawals โ CEX withdrawals use the exchange's treasury wallet as the transfer authority, not your deposit address. The credits will be attributed to the exchange's wallet, not yours. Transfer from a self-custodial wallet instead.
- Transfers with no identifiable authority โ If the transfer instruction cannot be parsed (e.g., raw byte instructions without parsed metadata), the deposit is held for manual review. Contact support with the transaction signature to claim it.
What happens with ambiguous deposits
- First-time deposits from a new wallet โ If wallet X sends USDC and the transfer authority can be identified, the account for wallet X is created automatically and credited. No prior authentication or API key generation is required โ sending USDC is sufficient proof of intent.
- Unidentifiable senders โ If the transfer instruction cannot be parsed (e.g., raw byte instructions without parsed metadata, or no explicit SPL token transfer instruction), the deposit is held for manual review. Contact support with the transaction signature to claim it.
- Multiple senders in one transaction โ Each SPL token transfer instruction in the transaction is evaluated independently. If two wallets each send USDC in the same transaction, both deposits are attributed to their respective authorities and each wallet's account is created or credited.
Credit Rate
| Purchase | Credits |
|---|---|
| 1 USDC | 10000 credits |
Credits expire after 10 days from the deposit date. Monitor via GET /account/info and the credit_batches field.
Method Costs
READ_CHEAP โ 1 Credit
getSlot,getBalance,getAccountInfo,getMultipleAccounts(1 per account),getLatestBlockhash,getEpochInfo,getHealth,getVersion,getTransactionCount,getBlockHeight,getBlockTime,isBlockhashValid,getTokenAccountBalance,getPriorityFeeEstimate- Other lightweight reads
READ_MEDIUM โ 5 Credits
simulateTransaction,getTransaction,getSignaturesForAddress,suggestPriorityFee- Medium-weight account/transaction queries
ARCHIVE_HISTORY โ Not Available
getEnrichedTransaction,explainTransaction,getConfirmedTransaction,getConfirmedSignaturesForAddress2- These return
-32004at no charge. Use an archive provider for enriched/historical transaction data.
READ_HEAVY โ 25 Credits
getAssetsByOwnersimulateBundle,getBlock,getBlocks,getBlocksWithLimit,getTokenAccountsByOwner- getBlock methods are served from hot-node retention (~3.7h of history); slots outside retention return the upstream node's native error.
SEND โ 2 Credits
sendTransaction,sendSmartTransaction
SEND_BUNDLE โ 10 Credits
sendBundle(Jito integration)
Jito Tips: Nodius charges credits for the API call, but Jito tips are paid by the customer on-chain. Your transaction/bundle must include a tip instruction to a Jito tip account. Nodius does not add, modify, or pay tips. Use
GET /jito/getTipAccountsandGET /jito/tipFloorto determine the appropriate tip amount before submitting.
Jito Endpoints
| Endpoint | Cost |
|---|---|
| POST /jito/sendBundle | 10 credits |
| POST /jito/getBundleStatuses | 2 credits |
| GET /jito/getTipAccounts | 1 credit |
| GET /jito/tipFloor | 1 credit |
WebSocket Billing
| Event | Cost |
|---|---|
| Creating a subscription | 5 credits (WS_SUBSCRIBE) |
| Each notification received | 1 credit (WS_NOTIFICATION) |
| Unsubscribing | Free |
| Connection / disconnection | Free |
Connection requirements:
- Minimum 100 credits to connect
- Auto-disconnect below 10 credits (close code 4002)
Cost estimates per hour:
slotSubscribe: ~9,000 credits/hour (~2.5 notifications/sec)accountSubscribe(active): varies by activitylogsSubscribe("all"): ~360,000 credits/hourprogramSubscribe(Token Program): ~1,800,000 credits/hour
Yellowstone gRPC Billing
| Usage | Cost |
|---|---|
| Established gRPC request or subscription | 1 credits |
| Each subsequent 60 seconds of an active request or subscription | 60 credits |
Each authenticated gRPC request or subscription has its own billing lifetime, including unary calls. Authenticate every request, even when reusing a channel. The setup charge is earned when the upstream session is established; unsuccessful setup is refunded. Ongoing charges occur at 60-second intervals while the request remains active, and stop when it completes or disconnects. Notifications carry no separate charge.
Read the current yellowstone_grpc.connect_credits and yellowstone_grpc.credits_per_minute values from GET /pricing.
Batch Requests
Batch JSON-RPC requests are supported. Each method in the batch is billed individually by method cost. A batch of 5 getBalance calls costs 5 credits (5 x 1). Each item counts toward the request rate limit; heavy items also consume their own concurrent-work slots.
Monitoring Your Balance
Every HTTP response includes: X-Credits-Remaining: 84521
When balance drops below 1000: X-Credits-Low: true
At 0 credits: HTTP 402 Payment Required
Refund Policy
- Credits are non-refundable
- No withdrawals, chargebacks, or credit transfers between accounts
- Expired credit batches (10-day TTL) are not refunded
- Requests that fail before reaching the upstream do not consume credits
- Upstream transport failures are refunded automatically
- Only SPL USDC on Solana mainnet is supported (mint:
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v). Do not send SOL or other tokens to the deposit wallet. - Minimum deposit is $0.01 USDC. Deposits below this amount are recorded but not credited.
Lifecycle Webhooks
In addition to on-chain signature watching, Nodius supports lifecycle event webhooks that fire on account-level events. Create a webhook with filter_type: "lifecycle" and specify which events to subscribe to via the lifecycle_events array.
Available Events
| Event | Fires When | Payload Fields |
|---|---|---|
low_balance |
Balance drops below 1,000 credits | balance, credits_per_usdc |
deposit.credited |
A deposit is processed and credits granted | amount_usd, credits_awarded, new_balance, tx_signature |
credits.expiring |
A credit batch is within 24h of expiry | batch_id, credits_remaining, expires_at |
api_key.rotated |
API key is rotated via POST /account/api-key | old_key_prefix, new_key_prefix |
Dedup Behavior
low_balance: Emitted when a paid debit takes the balance from at least 1,000 to below 1,000 credits. The payload'sbalanceandtimestampdescribe the balance at the event, not a later account balance.credits.expiring: One notification per batch per hour. Fires every reaper cycle (60s) if not already notified.deposit.creditedandapi_key.rotated: Fire once per event (no dedup needed).
Creating a Lifecycle Webhook
POST /webhooks
{
"url": "https://your-server.com/webhook",
"filter_type": "lifecycle",
"lifecycle_events": ["low_balance", "deposit.credited"]
}
All webhooks (on-chain and lifecycle) use the same delivery infrastructure: HMAC-signed payloads, exponential backoff retry, per-delivery billing, and SSRF protection.