quicknode

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Quicknode Solana Infrastructure

Quicknode Solana 基础设施

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构建高性能Solana应用程序——这是一家支持80多条链的区块链基础设施提供商,提供低延迟RPC端点、DAS API、Yellowstone gRPC流、实时数据管道以及面向开发者的API。

Overview

概述

Quicknode provides:
  • RPC Endpoints: Low-latency Solana access with authentication embedded in the URL
  • DAS API: Unified NFT and token queries — standard NFTs, compressed NFTs (cNFTs), fungible tokens, MPL Core Assets, Token 2022
  • Yellowstone gRPC: Real-time Solana data streaming via Geyser plugin
  • Priority Fee API: Fee estimation for transaction landing
  • Streams: Real-time and historical data pipelines with JavaScript filtering
  • Webhooks: Event-driven blockchain notifications
  • Metis: Jupiter Swap API integration
  • IPFS: Decentralized file storage
  • Key-Value Store: Serverless state persistence for Streams
  • Admin API: Programmatic endpoint management
  • x402: Pay-per-request RPC via USDC micropayments (no API key needed)
  • Multi-Chain: 80+ networks including Ethereum, Polygon, Arbitrum, Base, BSC, Avalanche, Bitcoin, and more
Quicknode提供以下服务:
  • RPC端点:内置身份验证的低延迟Solana访问地址
  • DAS API:统一的NFT和代币查询接口——支持标准NFT、压缩NFT(cNFT)、 fungible代币、MPL Core资产、Token 2022
  • Yellowstone gRPC:通过Geyser插件实现Solana实时数据流
  • 优先费用API:用于估算交易打包所需的优先费用
  • Streams:支持JavaScript过滤的实时与历史数据管道
  • Webhooks:基于区块链事件的驱动式通知
  • Metis:Jupiter Swap API集成
  • IPFS:去中心化文件存储
  • 键值存储:为Streams提供无服务器状态持久化
  • Admin API:程序化端点管理
  • x402:通过USDC微支付实现按次付费RPC(无需API密钥)
  • 多链支持:涵盖以太坊、Polygon、Arbitrum、Base、BSC、Avalanche、Bitcoin等80+网络

Quick Start

快速开始

Get Your Endpoint

获取你的端点

  1. Visit quicknode.com/endpoints
  2. Select Solana and your network (Mainnet / Devnet)
  3. Create an endpoint
  4. Copy the HTTP and WSS URLs
  1. 访问 quicknode.com/endpoints
  2. 选择 Solana 及对应的网络(主网/测试网)
  3. 创建端点
  4. 复制HTTP和WSS地址

Environment Setup

环境配置

bash
undefined
bash
undefined

.env file

.env 文件

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
undefined
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 # 可选:用于Admin API
undefined

Basic Setup with @solana/kit

使用@solana/kit进行基础配置

typescript
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();
typescript
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";

const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);

// 发起RPC调用
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();

Authentication

身份验证

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.
Quicknode端点的身份验证信息内置在URL中:
https://{ENDPOINT_NAME}.solana-mainnet.quiknode.pro/{TOKEN}/
可在Quicknode控制台中启用JWT身份验证或IP白名单以提升安全性。

RPC Endpoints

RPC端点

Solana Endpoints

Solana端点

NetworkURL 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}/
网络URL格式
主网
https://{name}.solana-mainnet.quiknode.pro/{token}/
测试网
https://{name}.solana-devnet.quiknode.pro/{token}/
WebSocket
wss://{name}.solana-mainnet.quiknode.pro/{token}/

Using with @solana/kit

与@solana/kit配合使用

typescript
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();
typescript
import {
  createSolanaRpc,
  createSolanaRpcSubscriptions,
  address,
  lamports,
} from "@solana/kit";

const rpc = createSolanaRpc(process.env.QUICKNODE_RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.QUICKNODE_WSS_URL!);

// 账户余额
const balance = await rpc.getBalance(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk")).send();

// 账户信息
const accountInfo = await rpc.getAccountInfo(address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"), {
  encoding: "base64",
}).send();

// 最新区块哈希
const { value: blockhash } = await rpc.getLatestBlockhash().send();

// 代币账户
const tokenAccounts = await rpc.getTokenAccountsByOwner(
  address("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"),
  { programId: address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") },
  { encoding: "jsonParsed" },
).send();

Using with Legacy web3.js

与旧版web3.js配合使用

typescript
import { Connection, PublicKey } from "@solana/web3.js";

const connection = new Connection(process.env.QUICKNODE_RPC_URL!);
const balance = await connection.getBalance(new PublicKey("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"));
typescript
import { Connection, PublicKey } from "@solana/web3.js";

const connection = new Connection(process.env.QUICKNODE_RPC_URL!);
const balance = await connection.getBalance(new PublicKey("E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk"));

Rate Limits & Plans

速率限制与套餐

PlanRequests/secCredits/month
Free Trial1510M
Build5080M
Accelerate125450M
Scale250950M
Business5002B
套餐请求数/秒月度额度
免费试用151000万
Build508000万
Accelerate1254.5亿
Scale2509.5亿
Business50020亿

DAS API (Digital Asset Standard)

DAS API(数字资产标准)

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).
用于查询Solana数字资产的综合API——支持标准NFT、压缩NFT(cNFT)、fungible代币、MPL Core资产和Token 2022资产。作为Marketplace附加组件提供(Metaplex DAS API)。

Get Assets by Owner

按所有者查询资产

typescript
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
typescript
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 — 资产总数
// result.items — 资产元数据数组
// result.cursor — 用于分页

Search Assets

搜索资产

typescript
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,
    },
  }),
});
typescript
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,
    },
  }),
});

Get Asset Proof (Compressed NFTs)

获取资产证明(压缩NFT)

typescript
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" },
  }),
});
typescript
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" },
  }),
});

DAS Method Reference

DAS方法参考

MethodDescription
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
方法描述
getAsset
获取单个资产的元数据
getAssets
获取多个资产的元数据
getAssetProof
获取压缩资产的默克尔证明
getAssetProofs
获取多个压缩资产的默克尔证明
getAssetsByAuthority
按权限方列出资产
getAssetsByCreator
按创建者列出资产
getAssetsByGroup
按组(如合集)列出资产
getAssetsByOwner
按钱包所有者列出资产
getAssetSignatures
压缩资产的交易签名
getTokenAccounts
按铸币地址或所有者列出代币账户
getNftEditions
主NFT的版本详情
searchAssets
使用灵活过滤器搜索资产

Yellowstone gRPC (Solana Geyser)

Yellowstone gRPC(Solana Geyser)

High-performance Solana Geyser plugin for real-time blockchain data streaming via gRPC. Available as a Marketplace add-on.
高性能Solana Geyser插件,通过gRPC实现区块链实时数据流。作为Marketplace附加组件提供。

Setup

配置

typescript
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,
});
typescript
import Client, { CommitmentLevel } from "@triton-one/yellowstone-grpc";

// 从HTTP端点推导gRPC地址:
// 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("交易:", data.transaction);
  }
  if (data.account) {
    console.log("账户更新:", data.account);
  }
});

// 订阅特定程序的交易
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 Types

过滤器类型

FilterDescription
accountsAccount data changes by pubkey, owner, or data pattern
transactionsTransaction events with vote/failure/account filters
transactionsStatusLightweight transaction status updates
slotsSlot progression and status changes
blocksFull block data with optional tx/account inclusion
blocksMetaBlock metadata without full contents
entryPoH entry updates
过滤器描述
accounts按公钥、所有者或数据模式过滤账户数据变更
transactions包含投票/失败/账户过滤器的交易事件
transactionsStatus轻量级交易状态更新
slots区块槽进度与状态变更
blocks完整区块数据,可选择是否包含交易/账户信息
blocksMeta不含完整内容的区块元数据
entryPoH条目更新

gRPC Best Practices

gRPC最佳实践

  • Use port 10000 for gRPC connections
  • Set commitment to CONFIRMED for most use cases, FINALIZED for irreversibility
  • Enable zstd compression to reduce bandwidth
  • Send keepalive pings every 10 seconds to maintain connections
  • Implement reconnection logic with exponential backoff
  • Use narrow filters (specific accounts or programs) to minimize data volume
  • 使用端口 10000 建立gRPC连接
  • 大多数场景下设置确认级别为 CONFIRMED,需要不可逆性时使用 FINALIZED
  • 启用zstd压缩以减少带宽消耗
  • 10秒发送一次保活 ping 以维持连接
  • 实现带指数退避的重连逻辑
  • 使用窄范围过滤器(特定账户或程序)以最小化数据量

Priority Fee API

优先费用API

Estimate priority fees for optimal transaction landing.
typescript
// 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",
    },
  }),
});
估算优先费用以优化交易打包成功率。
typescript
// 获取推荐的优先费用
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",
    },
  }),
});

Using Priority Fees in Transactions

在交易中使用优先费用

typescript
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),
);
typescript
import {
  pipe,
  createTransactionMessage,
  setTransactionMessageFeePayer,
  setTransactionMessageLifetimeUsingBlockhash,
  prependTransactionMessageInstructions,
  appendTransactionMessageInstruction,
} from "@solana/kit";
import {
  getSetComputeUnitLimitInstruction,
  getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";

// 1. 获取费用估算
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. 构建包含计算预算的交易
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),
);

Metis — Jupiter Swap API

Metis — Jupiter Swap API

Quicknode's hosted Jupiter Swap API for DEX aggregation. Available as a Marketplace add-on.
typescript
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...",
  },
});
Quicknode托管的Jupiter Swap API,用于DEX聚合。作为Marketplace附加组件提供。
typescript
import { createJupiterApiClient } from "@jup-ag/api";

const jupiterApi = createJupiterApiClient({
  basePath: process.env.QUICKNODE_METIS_URL!,
});

// 获取兑换报价
const quote = await jupiterApi.quoteGet({
  inputMint: "So11111111111111111111111111111111111111112",   // SOL
  outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
  amount: 1_000_000_000, // 1 SOL
  slippageBps: 50,
});

// 获取兑换交易
const swapResult = await jupiterApi.swapPost({
  swapRequest: {
    quoteResponse: quote,
    userPublicKey: "YourPubkey...",
  },
});

Streams

Streams

Real-time and historical blockchain data pipelines that filter, transform, and deliver data to destinations.
可过滤、转换并将数据传输至目标地址的实时与历史区块链数据管道。

Stream Types

流类型

TypeDataUse Case
BlockFull block dataBlock explorers, analytics
TransactionTransaction detailsTx monitoring, indexing
LogsContract eventsDeFi tracking, token transfers
ReceiptTransaction receiptsStatus tracking
类型数据使用场景
Block完整区块数据区块浏览器、数据分析
Transaction交易详情交易监控、索引
Logs合约事件DeFi追踪、代币转账
Receipt交易收据状态追踪

Setup

配置

  1. Create a stream in the Quicknode dashboard
  2. Select Solana and the data type
  3. Add a filter function (JavaScript)
  4. Configure destination (webhook, S3, PostgreSQL, Azure)
  1. 在Quicknode控制台中创建流
  2. 选择Solana及数据类型
  3. 添加过滤函数(JavaScript)
  4. 配置目标地址(webhook、S3、PostgreSQL、Azure)

Filter Function Example

过滤函数示例

javascript
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;
}
javascript
function main(data) {
  // 过滤涉及特定程序的交易
  const PROGRAM_ID = "YOUR_PROGRAM_ID";
  const hasProgram = data.transaction?.message?.accountKeys?.some(
    (key) => key === PROGRAM_ID
  );
  if (!hasProgram) return null;
  return data;
}

Streams vs Webhooks

Streams与Webhooks对比

FeatureStreamsWebhooks
ComplexityMore configurationSimple setup
FilteringCustom JavaScriptTemplate-based
DestinationsWebhook, S3, Postgres, Azure, SnowflakeHTTP endpoint only
ProcessingFull transformationLimited
Use CaseComplex pipelinesSimple alerts
特性StreamsWebhooks
复杂度配置较多设置简单
过滤功能自定义JavaScript基于模板
目标地址Webhook、S3、Postgres、Azure、Snowflake仅HTTP端点
处理能力完整转换有限
使用场景复杂管道简单告警

Webhooks

Webhooks

Event-driven notifications for Solana blockchain activity.
针对Solana区块链活动的事件驱动通知。

Webhook Setup

Webhook配置

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.
通过Quicknode控制台或Admin API创建Webhook,当特定链上事件发生时接收通知。
查看 resources/webhooks-reference.md 获取API示例与配置说明。

IPFS Storage

IPFS存储

Decentralized file storage via Quicknode's IPFS gateway.
typescript
// 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}
通过Quicknode的IPFS网关实现去中心化文件存储。
typescript
// 上传文件至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();
// 访问地址: https://quicknode.quicknode-ipfs.com/ipfs/{pin.cid}

Common Use Cases

常见使用场景

  • NFT metadata storage
  • Asset hosting for collections
  • Decentralized content persistence
  • NFT元数据存储
  • 合集资产托管
  • 去中心化内容持久化

Key-Value Store

键值存储

Serverless storage for lists and key-value sets, accessible from Streams filter functions via the
qnLib
helper library.
无服务器存储,支持列表和键值对集合,可通过
qnLib
辅助库在Streams过滤函数中访问。

Stream Integration (qnLib)

与Streams集成(qnLib)

javascript
// 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");
javascript
// 在Streams过滤函数中:

// 列表操作 — 管理地址监控列表
await qnLib.qnAddListItem("my-watchlist", "E645TckHQnDcavVv92Etc6xSWQaq8zzPtPRGBheviRAk");
const isWatched = await qnLib.qnContainsListItems("my-watchlist", [data.from]);

// 集合操作 — 存储键值对
await qnLib.qnAddSet("token-prices", { key: "SOL", value: "$150.25" });
const price = await qnLib.qnGetSet("token-prices", "SOL");

List Operations

列表操作

  • qnLib.qnUpsertList
    — create or update a list
  • qnLib.qnAddListItem
    — add item to a list
  • qnLib.qnRemoveListItem
    — remove item from a list
  • qnLib.qnContainsListItems
    — batch membership check
  • qnLib.qnDeleteList
    — delete a list
  • qnLib.qnUpsertList
    — 创建或更新列表
  • qnLib.qnAddListItem
    — 向列表添加项
  • qnLib.qnRemoveListItem
    — 从列表移除项
  • qnLib.qnContainsListItems
    — 批量成员检查
  • qnLib.qnDeleteList
    — 删除列表

Set Operations

集合操作

  • qnLib.qnAddSet
    — create a key-value set
  • qnLib.qnGetSet
    — retrieve value by key
  • qnLib.qnBulkSets
    — bulk create/remove sets
  • qnLib.qnDeleteSet
    — delete a set
  • qnLib.qnAddSet
    — 创建键值对集合
  • qnLib.qnGetSet
    — 通过键检索值
  • qnLib.qnBulkSets
    — 批量创建/移除集合
  • qnLib.qnDeleteSet
    — 删除集合

Quicknode SDK

Quicknode SDK

Official JavaScript/TypeScript SDK for Quicknode services.
bash
npm install @quicknode/sdk
typescript
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,
});
用于Quicknode服务的官方JavaScript/TypeScript SDK。
bash
npm install @quicknode/sdk
typescript
import { Core } from "@quicknode/sdk";

const core = new Core({
  endpointUrl: process.env.QUICKNODE_RPC_URL!,
});

// 代币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,
});

Admin API

Admin API

REST API for programmatic management of Quicknode endpoints, usage, rate limits, security, and billing.
用于程序化管理Quicknode端点、使用情况、速率限制、安全设置和账单的REST API。

Authentication

身份验证

All Admin API requests use the
x-api-key
header against
https://api.quicknode.com/v0/
.
typescript
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 },
});
所有Admin API请求需在
https://api.quicknode.com/v0/
地址下使用
x-api-key
请求头。
typescript
const QN_API_KEY = process.env.QUICKNODE_API_KEY!;

// 列出所有端点
const res = await fetch("https://api.quicknode.com/v0/endpoints", {
  headers: { "x-api-key": QN_API_KEY },
});
const endpoints = await res.json();

// 获取使用指标
const usage = await fetch("https://api.quicknode.com/v0/usage/rpc", {
  headers: { "x-api-key": QN_API_KEY },
});

Quick Reference

快速参考

ResourceMethodsEndpoint
ChainsGET
/v0/chains
EndpointsGET, POST, PATCH, DELETE
/v0/endpoints
MetricsGET
/v0/endpoints/{id}/metrics
Rate LimitsGET, POST, PUT
/v0/endpoints/{id}/rate-limits
UsageGET
/v0/usage/rpc
BillingGET
/v0/billing/invoices
资源方法端点
GET
/v0/chains
端点GET、POST、PATCH、DELETE
/v0/endpoints
指标GET
/v0/endpoints/{id}/metrics
速率限制GET、POST、PUT
/v0/endpoints/{id}/rate-limits
使用情况GET
/v0/usage/rpc
账单GET
/v0/billing/invoices

x402 (Pay-Per-Request RPC)

x402(按次付费RPC)

Pay-per-request RPC access via USDC micropayments on Base. No API key required.
typescript
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,
  }),
});
通过Base链上的USDC微支付实现按次付费RPC访问,无需API密钥。
typescript
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(),
});

// 包装fetch以自动处理402支付
const x402Fetch = wrapFetch(fetch, walletClient);

// 像普通fetch一样使用——支付将自动处理
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,
  }),
});

Multi-Chain Support

多链支持

Quicknode supports 80+ blockchain networks beyond Solana:
CategoryNetworks
EVMEthereum, Polygon, Arbitrum, Optimism, Base, BSC, Avalanche, Fantom, zkSync, Scroll, Linea, HyperEVM
Non-EVMSolana, Bitcoin, NEAR, Stacks, Cosmos, Sei, Aptos, Sui, TON, Hyperliquid
除Solana外,Quicknode还支持80+区块链网络:
分类网络
EVM以太坊、Polygon、Arbitrum、Optimism、Base、BSC、Avalanche、Fantom、zkSync、Scroll、Linea、HyperEVM
非EVMSolana、Bitcoin、NEAR、Stacks、Cosmos、Sei、Aptos、Sui、TON、Hyperliquid
完整列表: quicknode.com/chains

Multi-Chain Setup

多链配置

typescript
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! }),
};
typescript
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! }),
};

Safety Defaults

安全默认设置

  • Default to devnet when a network is not specified
  • Prefer read-only operations and dry runs before creating resources
  • Never ask for or accept private keys or secret keys
  • Require explicit confirmation before creating Streams, Webhooks, or IPFS uploads
  • 未指定网络时默认使用 测试网
  • 在创建资源前优先使用只读操作和试运行
  • 绝不索要或接受私钥或密钥
  • 创建Streams、Webhooks或上传IPFS前需明确确认

Error Handling

错误处理

typescript
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);
}
typescript
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("无效的端点URL或令牌");
    if (response.status === 429) console.error("超出速率限制——升级套餐或减少请求");
    if (response.status >= 500) console.error("服务器错误——退避后重试");
  }
} catch (error) {
  console.error("网络错误:", error);
}

Common Error Codes

常见错误码

CodeMeaningSolution
401Invalid authenticationVerify endpoint URL and token
429Rate limitedUpgrade plan or add delays
500+Server errorRetry with exponential backoff
代码含义解决方案
401身份验证无效验证端点URL和令牌
429超出速率限制升级套餐或增加请求延迟
500+服务器错误指数退避后重试

Best Practices

最佳实践

API Key Security

API密钥安全

  • Never commit endpoint URLs or API keys to git
  • Use environment variables
  • Enable IP allowlisting for production
  • Use JWT authentication for sensitive operations
  • Rotate credentials periodically
  • 绝不要将端点URL或API密钥提交到git
  • 使用环境变量
  • 生产环境启用IP白名单
  • 敏感操作使用JWT身份验证
  • 定期轮换凭证

Performance

性能

  • Use WebSocket subscriptions for real-time data
  • Batch RPC requests to reduce API calls
  • Cache responses when data does not change frequently
  • Use Yellowstone gRPC for lowest-latency streaming
  • Set appropriate commitment levels (
    confirmed
    for most,
    finalized
    for irreversibility)
  • 实时数据使用WebSocket订阅
  • 批量RPC请求以减少API调用
  • 数据不频繁变化时缓存响应
  • 最低延迟流使用Yellowstone gRPC
  • 设置合适的确认级别(多数场景用
    confirmed
    ,需不可逆性用
    finalized

Reliability

可靠性

  • Implement retry logic with exponential backoff
  • Handle rate limits gracefully with backoff
  • Use Streams for reliable event processing (automatic retries)
  • Monitor endpoint health via Admin API metrics
  • 实现带指数退避的重试逻辑
  • 优雅处理速率限制
  • 使用Streams实现可靠事件处理(自动重试)
  • 通过Admin API指标监控端点健康状况

Resources

资源

Skill Structure

技能结构

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
quicknode/
├── SKILL.md                       # 本文档
├── resources/
│   ├── rpc-reference.md           # RPC方法和WebSocket模式
│   ├── das-api-reference.md       # DAS API方法和参数
│   ├── yellowstone-grpc-reference.md  # gRPC流参考
│   ├── streams-reference.md       # Streams过滤函数和目标地址
│   ├── webhooks-reference.md      # Webhook配置
│   └── marketplace-addons.md      # 代币API、NFT API、Metis、优先费用
├── examples/
│   ├── basic-rpc/                 # 基础RPC调用
│   ├── das-api/                   # DAS API查询
│   ├── streaming/                 # Yellowstone gRPC示例
│   └── streams-webhooks/          # Streams和Webhook配置
├── templates/
│   └── quicknode-setup.ts         # 入门模板
└── docs/
    └── troubleshooting.md         # 常见问题与解决方案