integrating-jupiter by jup-ag/agent-skills
npx skills add https://github.com/jup-ag/agent-skills --skill integrating-jupiter适用于所有 Jupiter API 的单一技能,针对快速路由和确定性执行进行了优化。
基础 URL : https://api.jup.ag 认证 : 来自 portal.jup.ag 的 x-api-key (Jupiter REST 端点必需)
在以下情况使用:
在以下情况不使用:
触发词 : swap, quote, gasless, best route, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
lendborrowearnliquidationperpsleveragelongshortpositionlimit ordertriggerprice conditiondcarecurringscheduled swapstoken metadatatoken searchverificationshieldpricevaluationprice feedportfoliopositionsholdingsprediction marketsmarket oddsevent marketinvite transfersendclawbackcreate tokenstudioclaim feevestingdistribution lockunlock scheduledex integrationrfq integrationrouting engineimport { Connection, Keypair, VersionedTransaction } from '@solana/web3.js';
const API_KEY = process.env.JUPITER_API_KEY!; // from portal.jup.ag
if (!API_KEY) throw new Error('Missing JUPITER_API_KEY');
const BASE = 'https://api.jup.ag';
const headers = { 'x-api-key': API_KEY };
async function jupiterFetch<T>(path: string, init?: RequestInit): Promise<T> {
const res = await fetch(`${BASE}${path}`, {
...init,
headers: { ...headers, ...init?.headers },
});
if (res.status === 429) throw { code: 'RATE_LIMITED', retryAfter: 10 };
if (!res.ok) {
const raw = await res.text();
let body: any = { message: raw || `HTTP_${res.status}` };
try {
body = raw ? JSON.parse(raw) : body;
} catch {
// keep text fallback body
}
throw { status: res.status, ...body };
}
return res.json();
}
// Sign and send any Jupiter transaction
async function signAndSend(
txBase64: string,
wallet: Keypair,
connection: Connection,
additionalSigners: Keypair[] = []
): Promise<string> {
const tx = VersionedTransaction.deserialize(Buffer.from(txBase64, 'base64'));
tx.sign([wallet, ...additionalSigners]);
const sig = await connection.sendRawTransaction(tx.serialize(), {
maxRetries: 0,
skipPreflight: true,
});
return sig;
}
| 用户意图 | API 系列 | 首选操作 |
|---|---|---|
| 交换/报价 | Ultra Swap | GET /ultra/v1/order -> 签名 -> POST /ultra/v1/execute |
| 借贷/收益 | Lend | POST /lend/v1/earn/deposit 或 /withdraw |
| 杠杆/永续合约 | Perps | 通过 Anchor IDL 在链上操作(尚无 REST API) |
| 限价订单 | Trigger | POST /trigger/v1/createOrder -> 签名 -> POST /trigger/v1/execute |
| DCA/定期购买 | Recurring | POST /recurring/v1/createOrder -> 签名 -> POST /recurring/v1/execute |
| 代币搜索/验证 | Tokens | GET /tokens/v2/search?query={mint} |
| 价格查询 | Price | GET /price/v3?ids={mints} |
| 投资组合/持仓 | Portfolio | GET /portfolio/v1/positions/{address} |
| 预测市场集成 | Prediction Markets | GET /prediction/v1/events -> POST /prediction/v1/orders |
| 邀请发送/收回 | Send | POST /send/v1/craft-send -> 签名 -> 发送到 RPC |
| 代币创建/费用 | Studio | POST /studio/v1/dbc-pool/create-tx -> 上传 -> 提交 |
| 归属/分发 | Lock | 链上程序 LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn |
| DEX/RFQ 集成 | Routing | 选择 DEX(AMM 特性)路径或 RFQ(webhook)路径 |
将每个模块视为最小执行契约。获取链接的参考资料以了解完整的请求/响应结构、TypeScript 接口和参数详情。
https://api.jup.ag/ultra/v1swap, quote, gasless, best route/order (GET), /execute (POST), /holdings/{account} (GET), /shield (GET), /search (GET), /routers (GET)/ultra/v1/execute 返回的常见错误代码及建议操作:
| 代码 | 含义 | 可重试 | 操作 |
|---|---|---|---|
-1 | 交易已过期 | 是 | 重新报价并重试 |
-1000 | 交易失败(通用) | 是 | 调整参数后重新报价 |
-1001 | 滑点超出 | 是 | 增加 slippageBps 或重新报价 |
-1005 | 交易未确认 | 是 | 等待并检查状态,然后重试 |
-1006 | 交易被丢弃 | 是 | 重新报价并重试 |
-2000 | 内部错误 | 是 | 使用退避策略重试 |
-2003 | 服务不可用 | 是 | 使用更长的退避时间重试 |
-2005 | 超时 | 是 | 使用退避策略重试 |
6001 | 滑点容差超出(链上) | 否 | 增加滑点或减少金额 |
6003 | 资金不足 | 否 | 检查钱包余额 |
429 | 速率限制 | 是 | 指数退避,等待 10 秒窗口 |
https://api.jup.ag/lend/v1lend, borrow, earn, liquidationjup3YeL8QhtSx1e253b2FDvsMNC87fDrgQZivbrndc9, Borrow jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi@jup-ag/lend (TypeScript)/earn/deposit (POST), /earn/withdraw (POST), /earn/mint (POST), /earn/redeem (POST), /earn/deposit-instructions (POST), /earn/withdraw-instructions (POST), /earn/tokens (GET), /earn/positions (GET), /earn/earnings (GET)VersionedTransaction。perps, leverage, long, short, positionhttps://api.jup.ag/trigger/v1limit order, trigger, price condition/createOrder (POST), /cancelOrder (POST), /cancelOrders (POST, 每笔交易最多 5 个), /execute (POST), /getTriggerOrders (GET)slippageBps 以使用更高成交率的 "Ultra" 模式。https://api.jup.ag/recurring/v1dca, recurring, scheduled swaps/createOrder (POST), /cancelOrder (POST), /execute (POST), /getRecurringOrders (GET)params.time。https://api.jup.ag/tokens/v2token metadata, token search, verification, shield/search?query={q} (GET, 用逗号分隔 mint 地址,最多 100 个), /tag?query={tag} (GET, verified 或 lst), /{category}/{interval} (GET, 类别: toporganicscore, toptraded, toptrending; 时间间隔: 5m, 1h, 6h, 24h), /recent (GET)audit.isSus 和 organicScore。https://api.jup.ag/portfolio/v1portfolio, positions, holdings/positions/{address} (GET), /positions/{address}?platforms={ids} (GET), /platforms (GET), /staked-jup/{address} (GET)multiple, liquidity, trade, leverage, borrowlend。https://api.jup.ag/prediction/v1prediction markets, market odds, event marketJuprjznTrTSp2UFa3ZBUFgwdAmtZCq4MQCwysN55USD), USDC/events (GET), /events/search (GET), /markets/{marketId} (GET), /orderbook/{marketId} (GET), /orders (POST), /orders/status/{pubkey} (GET), /positions (GET), /positions/{pubkey} (DELETE), /positions/{pubkey}/claim (POST), /history (GET), /leaderboards (GET)position.claimable。获胜者每份合约获得 1 美元。https://api.jup.ag/send/v1invite transfer, send, clawback/craft-send (POST), /craft-clawback (POST), /pending-invites (GET), /invite-history (GET)https://api.jup.ag/studio/v1create token, studio, claim fee/dbc-pool/create-tx (POST), /dbc-pool/submit (POST, multipart/form-data), /dbc-pool/addresses/{mint} (GET), /dbc/fee (POST), /dbc/fee/create-tx (POST)/dbc-pool/submit 提交/dbc-pool/submit 提交(不能外部提交),代币才能在 jup.ag 上获得 Studio 页面。错误代码: 403 = 无权访问池, 404 = 代理账户未找到。LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjnvesting, distribution lock, unlock schedulecli/src/bin/instructions 目录中的指令脚本。dex integration, rfq integration, routing enginejupiter-amm-interface crate。关键点 : 实现中不能有网络调用(账户已预批处理和缓存)。参考实现: github.com/jup-ag/rust-amm-implementation/jupiter/rfq/quote (POST, 250ms), /jupiter/rfq/swap (POST), /jupiter/rfq/tokens (GET) 托管 webhook。要求: 95% 成交率, 250ms 响应, 55 秒有效期。SDK: github.com/jup-ag/rfq-webhook-toolkitUltra Swap(动态,基于交易量):
| 24 小时执行量 | 每 10 秒窗口请求数 |
|---|---|
| $0 | 50 |
| $10,000 | 51 |
| $100,000 | 61 |
| $1,000,000 | 165 |
配额每 10 分钟重新计算一次。专业版计划不会增加 Ultra 限制。
其他 API : 在门户级别管理。查看 门户速率限制。
遇到 HTTP 429 时 : 使用抖动的指数退避: delay = min(baseDelay * 2^attempt + random(0, jitter), maxDelay)。等待 10 秒滑动窗口刷新。不要激进地突发请求。
x-api-key 缺失或无效,快速失败。/execute 接受相同的 signedTransaction + requestId,最长 2 分钟,不会重复执行。requestId、API 系列、端点、延迟、状态和错误代码。retry, adjust params, insufficient balance, rate limited)。interface JupiterResult<T> {
ok: boolean;
result?: T;
error?: { code: string | number; message: string; retryable: boolean };
}
async function jupiterAction<T>(action: () => Promise<T>): Promise<JupiterResult<T>> {
try {
const result = await action();
return { ok: true, result };
} catch (error: any) {
const code = error?.code ?? error?.status ?? 'UNKNOWN';
// Rate limit — retry with backoff
if (code === 429 || code === 'RATE_LIMITED') {
return { ok: false, error: { code: 'RATE_LIMITED', message: 'Rate limited', retryable: true } };
}
// Ultra execute errors (negative codes)
if (typeof code === 'number' && code < 0) {
const retryable = [-1, -1000, -1001, -1005, -1006, -2000, -2003, -2005].includes(code);
return { ok: false, error: { code, message: error?.error ?? 'Execute failed', retryable } };
}
// Program errors (positive codes like 6001 = slippage)
if (typeof code === 'number' && code > 0) {
return { ok: false, error: { code, message: error?.error ?? 'Program error', retryable: false } };
}
return { ok: false, error: { code, message: error?.message ?? 'UNKNOWN_ERROR', retryable: false } };
}
}
async function withRetry<T>(action: () => Promise<T>, maxRetries = 3): Promise<T> {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const result = await jupiterAction(action);
if (result.ok) return result.result!;
if (!result.error?.retryable || attempt === maxRetries) throw result.error;
const delay = Math.min(1000 * 2 ** attempt + Math.random() * 500, 10000);
await new Promise(r => setTimeout(r, delay));
}
throw new Error('Retry exhausted');
}
生产就绪的代码片段。每个示例都使用上述章节中的 jupiterFetch、signAndSend 和 withRetry 辅助函数。
在执行操作手册之前,始终从引用的文档/规范中获取最新的上下文。
意图路由器 解析意图。x-api-key 是 Jupiter REST 端点必需的(不适用于 Perps/Lock 等纯链上流程)。每周安装次数
120
代码仓库
GitHub 星标数
61
首次出现
2026年2月17日
安全审计
已安装于
codex102
gemini-cli99
opencode99
kimi-cli97
github-copilot97
amp96
Single skill for all Jupiter APIs, optimized for fast routing and deterministic execution.
Base URL : https://api.jup.ag Auth : x-api-key from portal.jup.ag (required for Jupiter REST endpoints)
Use when:
Do not use when:
Triggers : swap, quote, gasless, best route, lend, borrow, earn, liquidation, perps, leverage, long, short, position, limit order, trigger, price condition, dca, recurring, scheduled swaps, token metadata, token search, verification, shield, price, valuation, price feed, portfolio, positions, holdings, prediction markets, market odds, event market, invite transfer, send, clawback, create token, studio, claim fee, vesting, distribution lock, unlock schedule, dex integration, rfq integration, routing engine
import { Connection, Keypair, VersionedTransaction } from '@solana/web3.js';
const API_KEY = process.env.JUPITER_API_KEY!; // from portal.jup.ag
if (!API_KEY) throw new Error('Missing JUPITER_API_KEY');
const BASE = 'https://api.jup.ag';
const headers = { 'x-api-key': API_KEY };
async function jupiterFetch<T>(path: string, init?: RequestInit): Promise<T> {
const res = await fetch(`${BASE}${path}`, {
...init,
headers: { ...headers, ...init?.headers },
});
if (res.status === 429) throw { code: 'RATE_LIMITED', retryAfter: 10 };
if (!res.ok) {
const raw = await res.text();
let body: any = { message: raw || `HTTP_${res.status}` };
try {
body = raw ? JSON.parse(raw) : body;
} catch {
// keep text fallback body
}
throw { status: res.status, ...body };
}
return res.json();
}
// Sign and send any Jupiter transaction
async function signAndSend(
txBase64: string,
wallet: Keypair,
connection: Connection,
additionalSigners: Keypair[] = []
): Promise<string> {
const tx = VersionedTransaction.deserialize(Buffer.from(txBase64, 'base64'));
tx.sign([wallet, ...additionalSigners]);
const sig = await connection.sendRawTransaction(tx.serialize(), {
maxRetries: 0,
skipPreflight: true,
});
return sig;
}
| User intent | API family | First action |
|---|---|---|
| Swap/quote | Ultra Swap | GET /ultra/v1/order -> sign -> POST /ultra/v1/execute |
| Lend/borrow/yield | Lend | POST /lend/v1/earn/deposit or /withdraw |
| Leverage/perps | Perps | On-chain via Anchor IDL (no REST API yet) |
| Limit orders | Trigger | POST /trigger/v1/createOrder -> sign -> POST /trigger/v1/execute |
Use each block as a minimal execution contract. Fetch the linked refs for full request/response shapes, TypeScript interfaces, and parameter details.
https://api.jup.ag/ultra/v1swap, quote, gasless, best route/order (GET), /execute (POST), /holdings/{account} (GET), /shield (GET), (GET), (GET)Common error codes returned by /ultra/v1/execute with recommended actions:
| Code | Meaning | Retryable | Action |
|---|---|---|---|
-1 | Transaction expired | Yes | Re-quote and retry |
-1000 | Transaction failed (generic) | Yes | Re-quote with adjusted params |
-1001 | Slippage exceeded | Yes | Increase slippageBps or re-quote |
-1005 | Transaction not confirmed |
https://api.jup.ag/lend/v1lend, borrow, earn, liquidationjup3YeL8QhtSx1e253b2FDvsMNC87fDrgQZivbrndc9, Borrow jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi@jup-ag/lend (TypeScript)/earn/deposit (POST), (POST), (POST), (POST), (POST), (POST), (GET), (GET), (GET)perps, leverage, long, short, positionhttps://api.jup.ag/trigger/v1limit order, trigger, price condition/createOrder (POST), /cancelOrder (POST), /cancelOrders (POST, max 5 per tx), /execute (POST), /getTriggerOrders (GET)https://api.jup.ag/recurring/v1dca, recurring, scheduled swaps/createOrder (POST), /cancelOrder (POST), /execute (POST), /getRecurringOrders (GET)https://api.jup.ag/tokens/v2token metadata, token search, verification, shield/search?query={q} (GET, comma-separate mints, max 100), /tag?query={tag} (GET, verified or lst), /{category}/{interval} (GET, categories: , , ; intervals: , , , ), (GET)https://api.jup.ag/price/v3price, valuation, price feed/price/v3?ids={mints} (GET, comma-separated)null or are omitted (not an error). Fail closed on missing/low-confidence data for safety-sensitive actions. Use confidenceLevel field.https://api.jup.ag/portfolio/v1portfolio, positions, holdings/positions/{address} (GET), /positions/{address}?platforms={ids} (GET), /platforms (GET), /staked-jup/{address} (GET)multiple, , , , .https://api.jup.ag/prediction/v1prediction markets, market odds, event marketJuprjznTrTSp2UFa3ZBUFgwdAmtZCq4MQCwysN55USD), USDC/events (GET), /events/search (GET), /markets/{marketId} (GET), (GET), (POST), (GET), (GET), (DELETE), (POST), (GET), (GET)https://api.jup.ag/send/v1invite transfer, send, clawback/craft-send (POST), /craft-clawback (POST), /pending-invites (GET), /invite-history (GET)https://api.jup.ag/studio/v1create token, studio, claim fee/dbc-pool/create-tx (POST), /dbc-pool/submit (POST, multipart/form-data), /dbc-pool/addresses/{mint} (GET), /dbc/fee (POST), /dbc/fee/create-tx (POST)LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjnvesting, distribution lock, unlock schedulecli/src/bin/instructions directory.dex integration, rfq integration, routing enginejupiter-amm-interface crate. Critical : No network calls in implementation (accounts are pre-batched and cached). Ref impl: github.com/jup-ag/rust-amm-implementation/jupiter/rfq/quote (POST, 250ms), /jupiter/rfq/swap (POST), /jupiter/rfq/tokens (GET). Reqs: 95% fill rate, 250ms response, 55s expiry. SDK: Ultra Swap (dynamic, volume-based):
| 24h Execute Volume | Requests per 10s window |
|---|---|
| $0 | 50 |
| $10,000 | 51 |
| $100,000 | 61 |
| $1,000,000 | 165 |
Quotas recalculate every 10 minutes. Pro plan does NOT increase Ultra limits.
Other APIs : Managed at portal level. Check portal rate limits.
On HTTP 429 : Exponential backoff with jitter: delay = min(baseDelay * 2^attempt + random(0, jitter), maxDelay). Wait for 10s sliding window refresh. Do NOT burst aggressively.
x-api-key is missing or invalid./execute accepts same signedTransaction + requestId for up to 2 min without duplicate execution.requestId, API family, endpoint, latency, status, and error code.retry, adjust params, , ).interface JupiterResult<T> {
ok: boolean;
result?: T;
error?: { code: string | number; message: string; retryable: boolean };
}
async function jupiterAction<T>(action: () => Promise<T>): Promise<JupiterResult<T>> {
try {
const result = await action();
return { ok: true, result };
} catch (error: any) {
const code = error?.code ?? error?.status ?? 'UNKNOWN';
// Rate limit — retry with backoff
if (code === 429 || code === 'RATE_LIMITED') {
return { ok: false, error: { code: 'RATE_LIMITED', message: 'Rate limited', retryable: true } };
}
// Ultra execute errors (negative codes)
if (typeof code === 'number' && code < 0) {
const retryable = [-1, -1000, -1001, -1005, -1006, -2000, -2003, -2005].includes(code);
return { ok: false, error: { code, message: error?.error ?? 'Execute failed', retryable } };
}
// Program errors (positive codes like 6001 = slippage)
if (typeof code === 'number' && code > 0) {
return { ok: false, error: { code, message: error?.error ?? 'Program error', retryable: false } };
}
return { ok: false, error: { code, message: error?.message ?? 'UNKNOWN_ERROR', retryable: false } };
}
}
async function withRetry<T>(action: () => Promise<T>, maxRetries = 3): Promise<T> {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const result = await jupiterAction(action);
if (result.ok) return result.result!;
if (!result.error?.retryable || attempt === maxRetries) throw result.error;
const delay = Math.min(1000 * 2 ** attempt + Math.random() * 500, 10000);
await new Promise(r => setTimeout(r, delay));
}
throw new Error('Retry exhausted');
}
Production-ready code snippets. Each example uses the jupiterFetch, signAndSend, and withRetry helpers from the sections above.
Always fetch the freshest context from referenced docs/specs before executing a playbook.
Intent Router.x-api-key is required for Jupiter REST endpoints (not on-chain-only flows like Perps/Lock).Weekly Installs
120
Repository
GitHub Stars
61
First Seen
Feb 17, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
codex102
gemini-cli99
opencode99
kimi-cli97
github-copilot97
amp96
Lark Skill Maker 教程:基于飞书CLI创建AI技能,自动化工作流与API调用指南
31,500 周安装
| DCA/recurring buys | Recurring | POST /recurring/v1/createOrder -> sign -> POST /recurring/v1/execute |
| Token search/verification | Tokens | GET /tokens/v2/search?query={mint} |
| Price lookup | Price | GET /price/v3?ids={mints} |
| Portfolio/positions | Portfolio | GET /portfolio/v1/positions/{address} |
| Prediction market integration | Prediction Markets | GET /prediction/v1/events -> POST /prediction/v1/orders |
| Invite send/clawback | Send | POST /send/v1/craft-send -> sign -> send to RPC |
| Token creation/fees | Studio | POST /studio/v1/dbc-pool/create-tx -> upload -> submit |
| Vesting/distribution | Lock | On-chain program LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn |
| DEX/RFQ integration | Routing | Choose DEX (AMM trait) vs RFQ (webhook) path |
/search/routers| Yes |
| Wait and check status, then retry |
-1006 | Transaction dropped | Yes | Re-quote and retry |
-2000 | Internal error | Yes | Retry with backoff |
-2003 | Service unavailable | Yes | Retry with longer backoff |
-2005 | Timeout | Yes | Retry with backoff |
6001 | Slippage tolerance exceeded (on-chain) | No | Increase slippage or reduce amount |
6003 | Insufficient funds | No | Check wallet balance |
429 | Rate limited | Yes | Exponential backoff, wait 10s window |
/earn/withdraw/earn/mint/earn/redeem/earn/deposit-instructions/earn/withdraw-instructions/earn/tokens/earn/positions/earn/earningsVersionedTransaction.slippageBps for "Ultra" mode with higher fill rate.params.timetoporganicscoretoptradedtoptrending5m1h6h24h/recentaudit.isSus and organicScore in UX.liquiditytradeleverageborrowlend/orderbook/{marketId}/orders/orders/status/{pubkey}/positions/positions/{pubkey}/positions/{pubkey}/claim/history/leaderboardsposition.claimable before claiming. Winners get $1/contract./dbc-pool/submit/dbc-pool/submit (not externally) for token to get a Studio page on jup.ag. Error codes: 403 = not authorized for pool, 404 = proxy account not found.insufficient balancerate limited