Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use Venice as a pay-per-call JSON-RPC proxy to 20+ EVM and Starknet networks. Covers GET /crypto/rpc/networks, POST /crypto/rpc/{network}, the 1×/2×/4× method-tier pricing model, per-minute + 24-hour credit rate limits, idempotency keys for safe retries, single vs batch requests, and the unsupported stateful/WebSocket methods (eth_subscribe, eth_newFilter, etc.).
.claude/skills/sediman-agent-venice-crypto-rpc/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 191% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 76% | 0% |
Venice exposes a multi-chain JSON-RPC proxy billed per call. Same request shape as Alchemy / Infura — just change the base URL and pay per credit.
| Endpoint | Auth | Notes | |---|---|---| | GET /crypto/rpc/networks | Bearer or SIWE | Returns { "networks": [...] } (sorted). | | POST /crypto/rpc/{network} | Bearer or SIWE (x402) | Forward a JSON-RPC 2.0 request (single or batch). |
Call GET /crypto/rpc/networks for the current list. It currently returns 23 slugs (always verify — the catalog grows):
arbitrum-mainnet arbitrum-sepolia
avalanche-mainnet avalanche-fuji
base-mainnet base-sepolia
blast-mainnet blast-sepolia
bsc-mainnet bsc-testnet
ethereum-mainnet ethereum-sepolia ethereum-holesky
linea-mainnet linea-sepolia
optimism-mainnet optimism-sepolia
polygon-mainnet polygon-amoy
starknet-mainnet starknet-sepolia
zksync-mainnet zksync-sepoliaUse the slug as :network in the proxy path.
bashcurl -X POST https://api.venice.ai/api/v1/crypto/rpc/ethereum-mainnet \ -H "Authorization: Bearer $VENICE_API_KEY" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
json{ "jsonrpc": "2.0", "id": 1, "result": "0x1" }
bashcurl -X POST https://api.venice.ai/api/v1/crypto/rpc/base-mainnet \ -H "Authorization: Bearer $VENICE_API_KEY" \ -H "Content-Type: application/json" \ -d '[ {"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}, {"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":2} ]'
A single unsupported method in a batch ⇒ the entire batch fails with 400.
viem / etherstsimport { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http('https://api.venice.ai/api/v1/crypto/rpc/ethereum-mainnet', { fetchOptions: { headers: { Authorization: `Bearer ${process.env.VENICE_API_KEY}` } }, }), })
Credits per call = baseCredits[chain] × methodTier.
| Base credits | Chains | |---|---| | 20 | Ethereum, Base, Optimism, Arbitrum, Polygon, Linea, Avalanche, BSC, Blast, Starknet. | | 30 | zkSync Era. |
| Tier | Multiplier | Methods | |---|---|---| | Standard | 1× | eth_call, eth_getBalance, eth_blockNumber, eth_sendRawTransaction, eth_getLogs, net_version, web3_clientVersion, ERC-4337 bundler (eth_sendUserOperation, …), chain-family extensions (zks_*, linea_*, bor_*, starknet_*). | | Advanced | 2× | trace_*, debug_*, txpool_inspect, txpool_status, arbtrace_*. | | Large | 4× | trace_replayBlockTransactions, trace_replayTransaction, txpool_content, arbtrace_replay*. |
At ~$7e-7 per credit:
RPC-level errors (HTTP 200 with error object inside — e.g. method unsupported on that chain, bad params) are billed at a flat 5 credits regardless of tier.
Response headers on 200:
| Header | Meaning | |---|---| | X-Venice-RPC-Credits | Total credits charged (sum over batch). | | X-Venice-RPC-Cost-USD | Dollar cost to 8 decimal places. | | X-Balance-Remaining | Remaining x402 USD — set on routes whose middleware refreshes balance headers. The /crypto/rpc/* handler currently emits credits/cost/request headers; treat X-Balance-Remaining here as best-effort (may be absent on RPC). Use GET /x402/balance/{walletAddress} for an authoritative read. | | X-Request-ID | 32-char correlation ID — include in support tickets. | | Idempotent-Replayed | "true" when served from the idempotency cache. |
These always return 400:
eth_newFilter, eth_newBlockFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter. Filter state is pinned to a single backend and a load-balanced HTTP proxy can't maintain it. Use eth_getLogs instead.eth_subscribe, eth_unsubscribe. This proxy is HTTP only. Run your own WS endpoint for subscriptions.starknet_* on an EVM chain (or vice versa) ⇒ 400.Set the Idempotency-Key header to any [A-Za-z0-9_-]{1,255} string for safe retries:
bashcurl -X POST https://api.venice.ai/api/v1/crypto/rpc/ethereum-mainnet \ -H "Authorization: Bearer $VENICE_API_KEY" \ -H "Idempotency-Key: send-tx-2026-04-21-nonce-42" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x..."] ,"id":1}'
(user, idempotency-key).Idempotent-Replayed: true and is not billed again.400 (prevents silent corruption).Use this for any state-mutating method (eth_sendRawTransaction, eth_sendUserOperation) to survive flaky networks without double-broadcasting.
Two caps per caller, both enforced independently:
| Tier | Per-minute requests | Credits / rolling 24h | |---|---|---| | Paid | 100 | 10,000,000 | | Staff | 1,000 | 100,000,000 |
429 response customMessage identifies which cap tripped. Per-minute cap also sets X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset headers.
Concurrent-call collisions on the per-user mutex also return 429. Retry with jitter.
| Status | Typical cause | |---|---| | 400 | Unsupported network slug, empty body, batch > 100, unsupported/WebSocket/filter method, cross-family call, idempotency-key reuse with a different body. | | 401 | Missing or invalid Bearer / SIWE. The /networks listing is public but the proxy endpoint requires auth. | | 402 | Insufficient balance. x402 wallet users get a PAYMENT-REQUIRED header with structured top-up instructions (see venice-x402). | | 429 | Per-minute, 24-hour credit, or concurrency cap tripped. | | 500 | Upstream fetch failed / timeout. Safe to retry with the same Idempotency-Key. |
402 indicates low credit and carries structured top-up instructions.X-Venice-RPC-Credits and X-Venice-RPC-Cost-USD per request; aggregate by method to see where credits go.Idempotency-Key on eth_sendRawTransaction. The proxy then guarantees exactly-once semantics within 24 hours.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | 17,007 | 13,928 | -18% | 1 | 1 | 0% | 3,516 | 5,172 | +47% | 0 | 0 | — |
case-01 | fail→pass | 16,092 | 12,873 | -20% | 1 | 1 | 0% | 3,219 | 4,815 | +50% | 0 | 0 | — |
case-03 | fail→pass | 15,281 | 8,619 | -44% | 1 | 1 | 0% | 2,893 | 4,042 | +40% | 0 | 0 | — |
case-04 | fail→pass | 5,874 | 3,923 | -33% | 1 | 1 | 0% | 1,050 | 3,052 | +191% | 0 | 0 | — |
case-05 | fail→pass | 12,384 | 6,505 | -47% | 1 | 1 | 0% | 2,004 | 3,520 | +76% | 0 | 0 | — |
case-06 | fail→fail | 13,849 | 7,417 | -46% | 1 | 1 | 0% | 2,385 | 3,758 | +58% | 0 | 0 | — |
case-07 | fail→pass | 7,264 | 1,594 | -78% | 1 | 1 | 0% | 1,013 | 2,540 | +151% | 0 | 0 | — |
case-08 | pass→pass | 11,851 | 2,793 | -76% | 1 | 1 | 0% | 1,752 | 2,736 | +56% | 0 | 0 | — |
case-09 | pass→pass | 6,635 | 2,733 | -59% | 1 | 1 | 0% | 1,016 | 2,737 | +169% | 0 | 0 | — |
case-10 | pass→pass | 13,135 | 1,900 | -86% | 1 | 1 | 0% | 2,024 | 2,609 | +29% | 0 | 0 | — |
case-11 | pass→pass | 8,739 | 2,009 | -77% | 1 | 1 | 0% | 1,400 | 2,622 | +87% | 0 | 0 | — |
case-12 | fail→pass | 11,254 | 8,202 | -27% | 1 | 1 | 0% | 1,918 | 3,876 | +102% | 0 | 0 | — |
case-13 | fail→pass | 9,019 | 3,207 | -64% | 1 | 1 | 0% | 1,480 | 2,829 | +91% | 0 | 0 | — |
case-14 | fail→pass | 8,373 | 3,337 | -60% | 1 | 1 | 0% | 1,365 | 2,886 | +111% | 0 | 0 | — |
case-15 | fail→pass | 15,453 | 3,704 | -76% | 1 | 1 | 0% | 2,371 | 2,942 | +24% | 0 | 0 | — |
case-16 | fail→pass | 14,421 | 7,839 | -46% | 1 | 1 | 0% | 2,113 | 3,662 | +73% | 0 | 0 | — |
case-17 | fail→pass | 13,408 | 2,682 | -80% | 1 | 1 | 0% | 2,043 | 2,744 | +34% | 0 | 0 | — |
case-18 | fail→pass | 14,816 | 2,368 | -84% | 1 | 1 | 0% | 2,225 | 2,655 | +19% | 0 | 0 | — |
case-19 | fail→pass | 6,550 | 1,934 | -70% | 1 | 1 | 0% | 988 | 2,590 | +162% | 0 | 0 | — |
case-20 | pass→pass | 9,716 | 6,186 | -36% | 1 | 1 | 0% | 1,828 | 3,411 | +87% | 0 | 0 | — |
case-21 | pass→pass | 12,233 | 12,584 | +3% | 1 | 1 | 0% | 2,285 | 4,810 | +111% | 0 | 0 | — |
case-22 | fail→fail | 15,164 | 15,049 | -1% | 1 | 1 | 0% | 2,680 | 5,041 | +88% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +64 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.