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,suggestPriorityFee- Other lightweight reads
READ_MEDIUM โ 5 Credits
simulateTransaction,getTransaction,getSignaturesForAddress,getAssetsByOwner- 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
simulateBundle,getBlock,getBlocks,getBlocksWithLimit,getTokenAccountsByOwner,getTokenAccountsByDelegate- 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 |
|---|---|
| Active gRPC connection | 60 credits per minute |
Yellowstone gRPC connections are billed at a flat rate per minute while connected. There is no per-notification charge. This makes it cost-effective for high-throughput streaming use cases.
Connection billing:
- Charge starts when the gRPC stream is established
- Billed every 60 seconds while connected
- No charge for the initial connection handshake
- Partial minutes are billed as full minutes
- Disconnecting stops billing โ you are not charged for the remainder of the minute after disconnection, but any partial minute already started before the disconnection is counted as a full minute
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). Batch requests count as 1 request for rate limiting.
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: One notification per hour per account while balance remains below threshold. Cleared when balance recovers above 1,000.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.