Quicknode blockchain infrastructure for Solana — RPC endpoints, DAS API (Digital Asset Standard) for NFTs and compressed assets, Yellowstone gRPC streaming, Priority Fee API, Streams (real-time data pipelines), Webhooks, Metis Jupiter Swap integration, IPFS storage, Key-Value Store, Admin API, and x402 pay-per-request RPC. Supports 80+ chains including Ethereum, Polygon, Arbitrum, Base, and more. Use when setting up Solana RPC infrastructure, querying NFTs/tokens/compressed assets via DAS API, building real-time gRPC streams, configuring data pipelines, estimating priority fees, or integrating Jupiter swaps via Metis. Triggers on mentions of Quicknode, qn_ methods, DAS API, getAssetsByOwner, searchAssets, Yellowstone, gRPC, Geyser, Streams, IPFS, Key-Value Store, qnLib, Metis, x402, or Quicknode RPC.
npx skills add https://github.com/sendaifun/skills --skill quicknode
Build high-performance Solana applications with Quicknode — blockchain infrastructure provider supporting 80+ chains with low-latency RPC endpoints, DAS API, Yellowstone gRPC streaming, real-time data pipelines, and developer-first APIs.
Quicknode provides:
# .env file
QUICKNODE_RPC_URL=https://your-endpoint.solana-mainnet.quiknode.pro/your-token/
QUICKNODE_WSS_URL=wss://your-endpoint.solana-mainnet.quiknode.pro/your-token/
QUICKNODE_API_KEY=your_console_api_key # Optional: for Admin API
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// Make RPC calls
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();
Quicknode endpoints include authentication in the URL:
https://{ENDPOINT_NAME}.solana-mainnet.quiknode.pro/{TOKEN}/
Enable JWT authentication or IP allowlisting in the Quicknode dashboard for additional security.
| Network | URL Pattern |
|---------|-------------|
| Mainnet | https://{name}.solana-mainnet.quiknode.pro/{token}/ |
| Devnet | https://{name}.solana-devnet.quiknode.pro/{token}/ |
| WebSocket | wss://{name}.solana-mainnet.quiknode.pro/{token}/ |
import {
createSolanaRpc,
createSolanaRpcSubscriptions,
address,
lamports,
} from "@solana/kit";
const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);
// Account balance
const balance = await rpc.getBalance(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk")).send();
// Account info
const accountInfo = await rpc.getAccountInfo(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"), {
encoding: "base64",
}).send();
// Recent blockhash
const { value: blockhash } = await rpc.getLatestBlockhash().send();
// Token accounts
const tokenAccounts = await rpc.getTokenAccountsByOwner(
address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"),
{ programId: address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") },
{ encoding: "jsonParsed" },
).send();
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(process.env.QUICKNODE_RPC_URL!);
const balance = await connection.getBalance(new PublicKey("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"));
| Plan | Requests/sec | Credits/month |
|------|-------------|---------------|
| Free Trial | 15 | 10M |
| Build | 50 | 80M |
| Accelerate | 125 | 450M |
| Scale | 250 | 950M |
| Business | 500 | 2B |
Comprehensive API for querying Solana digital assets — standard NFTs, compressed NFTs (cNFTs), fungible tokens, MPL Core Assets, and Token 2022 Assets. Available as a Marketplace add-on (Metaplex DAS API).
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetsByOwner",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
limit: 10,
options: { showFungible: true, showCollectionMetadata: true },
},
}),
});
const { result } = await response.json();
// result.total — total assets
// result.items — array of asset metadata
// result.cursor — for pagination
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "searchAssets",
params: {
ownerAddress: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
tokenType: "fungible",
limit: 50,
},
}),
});
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "getAssetProof",
params: { id: "compressed_nft_id" },
}),
});
| Method | Description |
|--------|-------------|
| getAsset | Get metadata for a single asset |
| getAssets | Get metadata for multiple assets |
| getAssetProof | Get Merkle proof for a compressed asset |
| getAssetProofs | Get Merkle proofs for multiple assets |
| getAssetsByAuthority | List assets by authority |
| getAssetsByCreator | List assets by creator |
| getAssetsByGroup | List assets by group (e.g., collection) |
| getAssetsByOwner | List assets by wallet owner |
| getAssetSignatures | Transaction signatures for compressed assets |
| getTokenAccounts | Token accounts by mint or owner |
| getNftEditions | Edition details of a master NFT |
| searchAssets | Search assets with flexible filters |
High-performance Solana Geyser plugin for real-time blockchain data streaming via gRPC. Available as a Marketplace add-on.
import Client, { CommitmentLevel } from "@triton-one/yellowstone-grpc";
// Derive gRPC URL from HTTP endpoint:
// HTTP: https://example.solana-mainnet.quiknode.pro/TOKEN/
// gRPC: https://example.solana-mainnet.quiknode.pro:10000
const client = new Client(
"https://example.solana-mainnet.quiknode.pro:10000",
"TOKEN",
{}
);
const stream = await client.subscribe();
stream.on("data", (data) => {
if (data.transaction) {
console.log("Transaction:", data.transaction);
}
if (data.account) {
console.log("Account update:", data.account);
}
});
// Subscribe to transactions for a specific program
stream.write({
transactions: {
txn_filter: {
vote: false,
failed: false,
accountInclude: ["PROGRAM_PUBKEY"],
accountExclude: [],
accountRequired: [],
},
},
accounts: {},
slots: {},
blocks: {},
blocksMeta: {},
transactionsStatus: {},
entry: {},
accountsDataSlice: [],
commitment: CommitmentLevel.CONFIRMED,
});
| Filter | Description |
|--------|-------------|
| accounts | Account data changes by pubkey, owner, or data pattern |
| transactions | Transaction events with vote/failure/account filters |
| transactionsStatus | Lightweight transaction status updates |
| slots | Slot progression and status changes |
| blocks | Full block data with optional tx/account inclusion |
| blocksMeta | Block metadata without full contents |
| entry | PoH entry updates |
Estimate priority fees for optimal transaction landing.
// Get recommended priority fees
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: {
last_n_blocks: 100,
account: "YOUR_ACCOUNT_PUBKEY",
},
}),
});
import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
prependTransactionMessageInstructions,
appendTransactionMessageInstruction,
} from "@solana/kit";
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
// 1. Get fee estimate
const feeResponse = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
method: "qn_estimatePriorityFees",
params: { last_n_blocks: 100, account: payer.address },
}),
});
const feeData = await feeResponse.json();
const priorityFee = feeData.result.per_compute_unit.high;
// 2. Build transaction with compute budget
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions([
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: BigInt(priorityFee) }),
], tx),
(tx) => appendTransactionMessageInstruction(mainInstruction, tx),
);
Quicknode's hosted Jupiter Swap API for DEX aggregation. Available as a Marketplace add-on.
import { createJupiterApiClient } from "@jup-ag/api";
const jupiterApi = createJupiterApiClient({
basePath: process.env.QUICKNODE_METIS_URL!,
});
// Get swap quote
const quote = await jupiterApi.quoteGet({
inputMint: "So11111111111111111111111111111111111111112", // SOL
outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
amount: 1_000_000_000, // 1 SOL
slippageBps: 50,
});
// Get swap transaction
const swapResult = await jupiterApi.swapPost({
swapRequest: {
quoteResponse: quote,
userPublicKey: "YourPubkey...",
},
});
Real-time and historical blockchain data pipelines that filter, transform, and deliver data to destinations.
| Type | Data | Use Case |
|------|------|----------|
| Block | Full block data | Block explorers, analytics |
| Transaction | Transaction details | Tx monitoring, indexing |
| Logs | Contract events | DeFi tracking, token transfers |
| Receipt | Transaction receipts | Status tracking |
function main(data) {
// Filter for transactions involving a specific program
const PROGRAM_ID = "YOUR_PROGRAM_ID";
const hasProgram = data.transaction?.message?.accountKeys?.some(
(key) => key === PROGRAM_ID
);
if (!hasProgram) return null;
return data;
}
| Feature | Streams | Webhooks |
|---------|---------|----------|
| Complexity | More configuration | Simple setup |
| Filtering | Custom JavaScript | Template-based |
| Destinations | Webhook, S3, Postgres, Azure, Snowflake | HTTP endpoint only |
| Processing | Full transformation | Limited |
| Use Case | Complex pipelines | Simple alerts |
Event-driven notifications for Solana blockchain activity.
Create webhooks via the Quicknode dashboard or Admin API to receive notifications when specific on-chain events occur.
See resources/webhooks-reference.md for API examples and configuration.
Decentralized file storage via Quicknode's IPFS gateway.
// Upload file to IPFS
const formData = new FormData();
formData.append("file", fileBuffer);
const response = await fetch("https://api.quicknode.com/ipfs/rest/v1/s3/put-object", {
method: "POST",
headers: { "x-api-key": process.env.QUICKNODE_API_KEY! },
body: formData,
});
const { pin } = await response.json();
// Access via: https://quicknode.quicknode-ipfs.com/ipfs/{pin.cid}
Serverless storage for lists and key-value sets, accessible from Streams filter functions via the qnLib helper library.
// In a Streams filter function:
// List operations — manage address watchlists
await qnLib.qnAddListItem("my-watchlist", "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk");
const isWatched = await qnLib.qnContainsListItems("my-watchlist", [data.from]);
// Set operations — store key-value pairs
await qnLib.qnAddSet("token-prices", { key: "SOL", value: "150.25" });
const price = await qnLib.qnGetSet("token-prices", "SOL");
qnLib.qnUpsertList — create or update a listqnLib.qnAddListItem — add item to a listqnLib.qnRemoveListItem — remove item from a listqnLib.qnContainsListItems — batch membership checkqnLib.qnDeleteList — delete a listqnLib.qnAddSet — create a key-value setqnLib.qnGetSet — retrieve value by keyqnLib.qnBulkSets — bulk create/remove setsqnLib.qnDeleteSet — delete a setOfficial JavaScript/TypeScript SDK for Quicknode services.
npm install @quicknode/sdk
import { Core } from "@quicknode/sdk";
const core = new Core({
endpointUrl: process.env.QUICKNODE_RPC_URL!,
});
// Token API
const balances = await core.client.qn_getWalletTokenBalance({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
});
// NFT API
const nfts = await core.client.qn_fetchNFTs({
wallet: "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk",
page: 1,
perPage: 10,
});
REST API for programmatic management of Quicknode endpoints, usage, rate limits, security, and billing.
All Admin API requests use the x-api-key header against https://api.quicknode.com/v0/.
const QN_API_KEY = process.env.QUICKNODE_API_KEY!;
// List all endpoints
const res = await fetch("https://api.quicknode.com/v0/endpoints", {
headers: { "x-api-key": QN_API_KEY },
});
const endpoints = await res.json();
// Get usage metrics
const usage = await fetch("https://api.quicknode.com/v0/usage/rpc", {
headers: { "x-api-key": QN_API_KEY },
});
| Resource | Methods | Endpoint |
|----------|---------|----------|
| Chains | GET | /v0/chains |
| Endpoints | GET, POST, PATCH, DELETE | /v0/endpoints |
| Metrics | GET | /v0/endpoints/{id}/metrics |
| Rate Limits | GET, POST, PUT | /v0/endpoints/{id}/rate-limits |
| Usage | GET | /v0/usage/rpc |
| Billing | GET | /v0/billing/invoices |
Pay-per-request RPC access via USDC micropayments on Base. No API key required.
import { wrapFetch } from "@x402/fetch";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
account,
chain: base,
transport: http(),
});
// Wrap fetch to auto-handle 402 payments
const x402Fetch = wrapFetch(fetch, walletClient);
// Use like normal fetch — payments handled automatically
const response = await x402Fetch("https://x402.quicknode.com/solana-mainnet", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
method: "getSlot",
params: [],
id: 1,
}),
});
Quicknode supports 80+ blockchain networks beyond Solana:
| Category | Networks |
|----------|----------|
| EVM | Ethereum, Polygon, Arbitrum, Optimism, Base, BSC, Avalanche, Fantom, zkSync, Scroll, Linea, HyperEVM |
| Non-EVM | Solana, Bitcoin, NEAR, Stacks, Cosmos, Sei, Aptos, Sui, TON, Hyperliquid |
Full list: quicknode.com/chains
import { Core } from "@quicknode/sdk";
const chains = {
solana: new Core({ endpointUrl: process.env.QUICKNODE_SOL_RPC! }),
ethereum: new Core({ endpointUrl: process.env.QUICKNODE_ETH_RPC! }),
polygon: new Core({ endpointUrl: process.env.QUICKNODE_POLYGON_RPC! }),
};
try {
const response = await fetch(process.env.QUICKNODE_RPC_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "getSlot", params: [] }),
});
if (!response.ok) {
if (response.status === 401) console.error("Invalid endpoint URL or token");
if (response.status === 429) console.error("Rate limited — upgrade plan or reduce requests");
if (response.status >= 500) console.error("Server error — retry with backoff");
}
} catch (error) {
console.error("Network error:", error);
}
| Code | Meaning | Solution |
|------|---------|----------|
| 401 | Invalid authentication | Verify endpoint URL and token |
| 429 | Rate limited | Upgrade plan or add delays |
| 500+ | Server error | Retry with exponential backoff |
confirmed for most, finalized for irreversibility)quicknode/
├── SKILL.md # This file
├── resources/
│ ├── rpc-reference.md # RPC methods and WebSocket patterns
│ ├── das-api-reference.md # DAS API methods and parameters
│ ├── yellowstone-grpc-reference.md # gRPC streaming reference
│ ├── streams-reference.md # Streams filter functions and destinations
│ ├── webhooks-reference.md # Webhook configuration
│ └── marketplace-addons.md # Token API, NFT API, Metis, Priority Fees
├── examples/
│ ├── basic-rpc/ # Basic RPC calls
│ ├── das-api/ # DAS API queries
│ ├── streaming/ # Yellowstone gRPC examples
│ └── streams-webhooks/ # Streams and webhook setup
├── templates/
│ └── quicknode-setup.ts # Starter template
└── docs/
└── troubleshooting.md # Common issues and solutions
Build robust backtesting systems for trading strategies with proper handling of look-ahead bias, survivorship bias, and transaction costs. Use when developing trading algorithms, validating strategies, or building backtesting infrastructure.
Cloudflare Workers Runtime APIs including Fetch, Streams, Crypto, Cache, WebSockets, and Encoding. Use for HTTP requests, streaming, encryption, caching, real-time connections, or encountering API compatibility, response handling, stream processing errors.
Build robust backtesting systems for trading strategies with proper handling of look-ahead bias, survivorship bias, and transaction costs. Use when developing trading algorithms, validating strategies, or building backtesting infrastructure.
Build robust backtesting systems for trading strategies with proper handling of look-ahead bias, survivorship bias, and transaction costs. Use when developing trading algorithms, validating strategies, or building backtesting infrastructure.
Track and analyze portfolio company performance against plan. Ingests monthly/quarterly financial packages (Excel, PDF), extracts KPIs, flags variances to budget, and produces summary dashboards. Use when reviewing portfolio company financials, preparing board materials, or monitoring covenant compliance. Triggers on "review portfolio company", "monthly financials", "how is [company] performing", "covenant check", or "portfolio update".
Expert knowledge for Azure Payment Hsm development including troubleshooting, best practices, decision making, architecture & design patterns, security, and configuration. Use when configuring Payment HSM VNets/peering, FastPath, payShield Manager access, SKUs, HA/DR topologies, or traffic routing, and other Azure Payment Hsm related development tasks. Not for Azure Cloud Hsm (use azure-cloud-hsm), Azure Dedicated HSM (use azure-dedicated-hsm), Azure Key Vault (use azure-key-vault), Azure Security (use azure-security).
Matter budgeting and ongoing WIP/variance monitoring. Build phase-based fee estimates at matter setup, run bottom-up budgets by jurisdiction or workstream, calculate contingency, and structure AFA arrangements (fixed fee, capped fee, phased fixed fees). Ongoing monitoring: WIP tracking against budget, proportionality assessment (spend vs progress), variance commentary with root cause analysis, forecast-to-complete, realisation monitoring, write-off analysis. Trigger on: 'build a budget', 'fee estimate', 'what will this cost', 'WIP review', 'budget vs actual', 'how are we tracking against budget', 'we're over budget', 'realisation is poor', 'what's our ETC', 'budget for the German workstream', 'model the financial impact of this scope change', 'draft a fee adjustment', 'write-off analysis', 'how much contingency', 'AFA structure', 'fixed fee estimate', 'budget update', 'forecast to complete'.
Build robust backtesting systems for trading strategies with proper handling of look-ahead bias, survivorship bias, and transaction costs. Use when developing trading algorithms, validating strategies, or building backtesting infrastructure.
Take sendaifun/quicknode from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm.
Without those the skill loads but fails at the first command.