关于 integrating-jupiter
integrating-jupiter 是面向调用 Jupiter API 的开发者和 Agent 的集成技能,覆盖交易、借贷、订单、价格及投资组合等 API。它提供意图路由、执行流程和常见错误处理要点。
主要功能
- 01按任务选择 Jupiter API
- 02提供各 API 的执行流程
- 03说明认证与金额单位
- 04列出常见错误及处理建议
适用场景
- 01根据需求选择 Jupiter API
- 02实现或调试代币兑换
- 03构建借贷或限价订单流程
- 04查询价格与投资组合信息
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jup-ag/ agent-skills --skill integrating-jupiter安装后在 Claude Code 中输入/integrating-jupiter确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdexamples/lend.mdprice.mdswap.mdtrigger.md详细介绍
Jupiter API 集成
适用于所有 Jupiter API 的单一技能,针对快速路由和确定性执行进行了优化。
基础 URL:https://api.jup.ag
身份验证:从 developers.jup.ag 获取的 x-api-key(Jupiter REST 端点必需)
适用场景/不适用场景
适用于:
- 任务需要选择或调用 Jupiter 端点。
- 任务涉及交换、借贷、永续合约、订单、定价、投资组合、发送、studio、锁定或路由。
- 用户需要排查 Jupiter API 调用问题。
不适用于:
- 任务是通用 Solana 设置,且不使用 Jupiter API。
- 任务仅涉及 UI,不涉及 API 行为决策。
- Agent 上下文不属于 DeFi/加密货币领域(
buy、sell、trade等通用触发词默认指向 DeFi 场景)。
触发词:swap、quote、gasless、best route、buy、sell、trade、convert、token exchange、jupiter api、jup.ag、ultra、metis、ultra swap、ultra api、ultra-api.jup.ag、lend、borrow、earn、yield、apy、deposit、liquidation、perps、leverage、long、short、position、futures、margin trading、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、status page、health check、service health、accumulate、auto-buy
开发者快速入门
import { Connection, Keypair, VersionedTransaction } from '@solana/web3.js';
const API_KEY = process.env.JUPITER_API_KEY!; // from developers.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: Number(res.headers.get('Retry-After')) || 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;
}
代币数量与小数位数
Jupiter 的每个 amount 字段都使用代币的最小单位(原始整数),绝不是人类可读/UI 值。
- 常见小数位数:SOL 和 wSOL = 9,USDC 和 USDT = 6。规范铸币地址:SOL
So11111111111111111111111111111111111111112,USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v。 - 将人类可读数量转换为原始数量:
raw = Math.round(human * 10 ** decimals)。示例:1 SOL → 1_000_000_000、100 USDC → 100_000_000。slippageBps的单位是基点:0.5% = 50、1% = 100。 - 通过
@solana/spl-token中的getMint(connection, mintPubkey)在链上读取每种铸币的 decimals——不要硬编码(不同代币的小数位数不同),也不要仅为查询小数位数而调用 Price API。
意图路由器(第一步)
| 用户意图 | API 系列 | 首要操作 |
|---|---|---|
| 交换/报价 | Swap | GET /swap/v2/order -> 签名 -> POST /swap/v2/execute |
| 借贷/收益 | Lend | POST /lend/v1/earn/deposit 或 /withdraw |
| 杠杆/永续合约 | Perps | 通过 Anchor IDL 在链上操作(目前没有 REST API) |
| 限价订单 | Trigger | JWT 身份验证 -> POST /trigger/v2/orders/price |
| DCA/定期买入 | Recurring | POST /recurring/v1/createOrder -> 签名 -> POST /recurring/v1/execute |
| 代币搜索 | Tokens | GET /tokens/v2/search?query={mint} |
| 代币验证/元数据更新 | 使用 jupiter-vrfd skill | 暂不处理——此技能不负责 |
| 价格查询 | 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 trait)或 RFQ(webhook)路径 |
API 操作指南
将每个区块用作最小执行约定。获取链接的参考资料,以查看完整的请求/响应结构、TypeScript 接口和参数详情。
Swap
-
基础 URL:
https://api.jup.ag/swap/v2 -
触发词:
swap、quote、gasless、best route -
费用:因交易对而异 — 0 bps(Jupiter 代币/锚定代币)、2 bps(SOL-稳定币)、5 bps(LST-稳定币)、10 bps(大多数交易对)、50 bps(发行不足 24 小时的代币)。推荐费:50-255 bps(Jupiter 保留 20%)。
-
速率限制:基础限制为每 10 秒 50 个请求,会根据 24 小时执行量调整(见速率限制)
-
端点:
/order(GET)、/execute(POST)、/build(GET,仅 Metis 提供原始指令) -
报价与执行:如需只读报价/价格预览,调用
GET /order并省略taker— 响应中的transaction为null,读取outAmount、routePlan[].swapInfo.label和价格影响字段即可。只有在确实打算执行兑换时,才传入taker(然后签名并调用POST /execute)。没有单独的报价端点 —/swap/v1/quote已弃用;报价也请使用/swap/v2/order。 -
路由:4 个路由器参与竞争 — Metis(
metis)、JupiterZ(jupiterz)、Dflow(dflow)、OKX(okx)。响应字段router会返回其中一个值。swapType为aggregator(Metis、Dflow 或 OKX)或rfq(JupiterZ)。响应字段mode:"ultra"(所有路由器,默认参数)或"manual"(由可选参数限制)。/build仅使用 Metis。 -
Gasless:有三种途径 — 自动(由 Jupiter 承担费用)、JupiterZ(由 MM 承担费用)、集成方付款方(
payer参数,仅路由至 Metis)。资格取决于余额、交易规模和所用参数。当前门槛和不符合资格的参数请参阅 Gasless 文档。 -
注意事项:
- 已签名的负载有效期约为 2 分钟。收到交易后不可更改。
- 在代码和日志中分开处理订单与执行。条件可能发生变化时,请在执行前重新报价。
- 可选参数对路由的影响:
referralAccount+referralFee仅禁用 JupiterZ(Metis/Dflow/OKX 仍可用);payer(集成方承担 Gasless 费用)会将路由限制为仅 Metis(禁用 JupiterZ、Dflow 和 OKX);receiver不会限制路由,但必须与taker不同(receiver=taker会返回400 "Receiver cannot be same as taker")。 /build交易不能使用/execute— 请通过 RPC 自行管理。
-
从旧版集成迁移? 使用
jupiter-swap-migration技能。 -
参考资料:概览 | 订单与执行 | 构建 | Gasless | 迁移 | OpenAPI
费用在订单与执行及构建页面中有详细说明;路由器竞争和参数对路由影响的对照表见概览及订单与执行页面。
/swap/v2/execute 返回的常见错误代码及建议操作:
| 代码 | 类别 | 含义 | 可重试 | 操作 |
|---|---|---|---|---|
0 | 成功 | 交易已确认 | — | — |
-1 | 执行 | 缓存的订单缺失或已过期 | 是 | 重新报价并重试 |
-2 | 执行 | 签名交易无效 | 否 | 修正交易签名 |
-3 | 执行 | 消息字节无效 | 否 | 修正序列化 |
-1000 | 聚合器 | 尝试上链失败 | 是 | 调整参数后重新报价 |
-1001 | 聚合器 | 未知错误 | 是 | 退避后重试 |
-1002 | 聚合器 | 交易无效 | 否 | 修正交易构造 |
-1003 | 聚合器 | 交易未完成签名 | 否 | 确保所有必需的签名者都已签名 |
-1004 | 聚合器 | 区块高度无效 | 是 | 重新报价(区块哈希已过期) |
-2000 | RFQ | 上链失败 | 是 | 重新报价并重试 |
-2001 | RFQ | 未知错误 | 是 | 退避后重试 |
-2002 | RFQ | 负载无效 | 否 | 修正请求负载 |
-2003 | RFQ | 报价已过期 | 是 | 重新报价并重试 |
-2004 | RFQ | 交换被拒绝 | 是 | 重新报价,可能需要使用不同路线 |
429 | 速率限制 | 请求受限 | 是 | 使用指数退避,并等待 10 秒窗口 |
成功时,/execute 会返回 { status: "Success", code: 0, signature, inputAmountResult, outputAmountResult, slot, totalInputAmount, totalOutputAmount }。失败时会返回 status: "Failed"、非零 code 和 error 字符串。inputAmountResult/outputAmountResult 是链上的实际金额;请与报价核对。
借贷
- 基础 URL:
https://api.jup.ag/lend/v1 - 触发词:
lend、borrow、earn、liquidation - 程序:Earn
jup3YeL8QhtSx1e253b2FDvsMNC87fDrgQZivbrndc9,Borrowjupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi - SDK:
@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) - 注意事项:每次执行会改变状态的操作前,都要重新计算账户状态。将风险检查(健康因子、清算边界)设为前置条件。所有存款、取款、铸造和赎回操作都会返回 base64 编码的未签名
VersionedTransaction。 - 如需使用
@jup-ag/lend和@jup-ag/lend-read进行 SDK 级集成,请使用jupiter-lendskill。 - 参考:概览 | Earn | SDK | OpenAPI
永续合约
- 状态:API 仍在开发中。目前没有 REST 端点。请通过 Anchor IDL 在链上交互。
- 触发词:
perps、leverage、long、short、position - 社区 SDK:github.com/julianfssen/jupiter-perps-anchor-idl-parsing
- 注意事项:最多可同时持有 9 个仓位:3 个多头(SOL、wETH、wBTC)+ 6 个空头(3 种代币 x 2 种抵押品 USDC/USDT)。请根据账户模型验证保证金和杠杆。
- 参考:概览 | 仓位账户 | 仓位请求
触发(限价单)
- 基础 URL:
https://api.jup.ag/trigger/v2 - 触发条件:
limit order、trigger、price condition - 最低订单金额:等值 10 USD
- 身份验证:双重身份验证 — 所有请求都需要
x-api-key,修改订单还需要Authorization: Bearer <jwt>。JWT 通过质询-响应流程获取:POST /auth/challenge→ 使用钱包签署质询 →POST /auth/verify→ 获取令牌。JWT 过期不会影响未完成订单——这些订单会继续执行。 - 端点:
/auth/challenge(POST,请求体:walletPubkey+type)、/auth/verify(POST,请求体:type+walletPubkey+ base58signature)、/vault(GET)、/vault/register(GET)、/deposit/craft(POST)、/orders/price(POST 创建,PATCH 更新)、/orders/price/cancel/{orderId}(POST,发起提现)、/orders/price/confirm-cancel/{orderId}(POST,提交已签名的提现请求 +cancelRequestId)、/orders/history(GET,钱包地址通过 JWT 隐式指定) - 订单类型:
single(单向触发)、oco(止盈 + 止损组合)、otoco(入场触发 + OCO)。triggerCondition:"above"或"below"。 - 架构:每个钱包都有一个链下托管金库(Privy)。订单在执行前不会显示在链上——可抵御 MEV。触发条件基于 USD 价格(而非池子汇率比例)。支持部分成交。
- 注意事项:
- 创建订单分 3 步 —
GET /vault/register(如果是新用户则注册;如果已注册则返回409 "Vault already registered",可忽略)、POST /deposit/craft(返回transaction+requestId;请求体必须包含orderType: "price"和orderSubType(single/oco/otoco)),签署存款交易,然后使用depositRequestId+depositSignedTx调用POST /orders/price。 - 取消订单分两步 —
POST /cancel/{orderId}返回transaction+requestId;签署交易,然后使用signedTransaction+cancelRequestId调用POST /confirm-cancel/{orderId}。 - 创建响应中的字段是
id(不是orderId);订单历史对象使用orderState/rawState(没有status字段)。
- 创建订单分 3 步 —
- 参考:概览 | 身份验证 | 创建订单 | 订单历史 | 管理订单 | OpenAPI
定期交易(DCA)
- 基础 URL:
https://api.jup.ag/recurring/v1 - 触发条件:
dca、recurring、scheduled swaps - 费用:所有定期订单均收取 0.1% 费用
- 限制:总金额至少 100 USD,至少 2 笔订单,每笔订单至少 50 USD
- 分页:每页 10 笔订单
- 端点:
/createOrder(POST)、/cancelOrder(POST)、/execute(POST)、/getRecurringOrders(GET) - 注意事项:不支持 Token-2022。使用
params.time安排订单;不支持基于价格的订单。 - 参考:概览 | 创建 | 获取订单 | 最佳实践 | OpenAPI
代币
- 基础 URL:
https://api.jup.ag/tokens/v2 - 触发词:
token metadata、token search、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) - 注意事项:
- 使用 mint 地址作为主要标识;将符号/名称视为便利用途。
- 主要信任信号是顶层的
isVerified(布尔值),以及organicScore(0-100)和organicScoreLabel(high/medium/low)。 - 次要风险标记:
audit.isSus——这是仅在值为true时才会出现的布尔字段(安全代币完全没有isSus键),因此应防御性地检查token.audit?.isSus === true,切勿直接读取。已验证的代币也可能被标记(开发者持有约 100% 的供应量);这类代币的isVerified: null,且organicScoreLabel: "low"。缺少isSus并不能证明代币安全——并非所有风险代币都有此标记。 - 实时 API 返回的其他条件性
audit字段:mintAuthorityDisabled、freezeAuthorityDisabled、topHoldersPercentage、devBalancePercentage、devMigrations、devMints(均可为 null,也可能缺失;API 会返回devMigrations,但当前 OpenAPI 架构中缺少该字段)。
- 参考:概览 | 代币信息 v2 | OpenAPI
价格
- 基础 URL:
https://api.jup.ag/price/v3 - 触发词:
price、valuation、price feed - 限制:每个请求最多包含 50 个 mint ID
- 端点:
/price/v3?ids={mints}(GET,以逗号分隔) - 响应:以 mint 为键,每个值包含
usdPrice、blockId、decimals、priceChange24h、liquidity、createdAt(某些代币还会包含launchpad、stockData、scaledUiConfig等条件性字段)。价格 API V3 没有confidenceLevel字段(该字段属于 V2)。 - 注意事项:定价不可靠的代币会完全从响应中省略(这不是错误,也不会以
null占位)。为安全敏感操作考虑时,如果请求的 mint 未出现在响应中,应采取失败关闭策略。使用blockId检查价格的时效性。 - 参考:概览 | OpenAPI
投资组合
- 基础 URL:
https://api.jup.ag/portfolio/v1 - 状态:Beta 版——仅限 Jupiter 平台
- 触发词:
portfolio、positions、holdings - 端点:
/positions/{address}(GET)、/positions/{address}?platforms={ids}(GET)、/platforms(GET)、/staked-jup/{address}(GET) - 注意事项:空仓位应视为有效状态。响应处于 Beta 阶段——应将其规范化为稳定的内部架构。元素类型:
multiple、liquidity、trade、leverage、borrowlend。 - 参考:概览 | Jupiter 仓位 | OpenAPI
预测市场
- 基础 URL:
https://api.jup.ag/prediction/v1 - 状态:Beta(可能会有破坏性变更)
- 地理限制:屏蔽来自美国和韩国 IP 的访问
- 价格约定:1,000,000 个原生单位 = 1.00 美元
- 触发词:
prediction markets、market odds、event market - 存入代币:JupUSD(
JuprjznTrTSp2UFa3ZBUFgwdAmtZCq4MQCwysN55USD)、USDC - 最低订单额:5 美元(5,000,000 个原生单位)
- 端点:
/events(GET,返回{data, pagination})、/events/search(GET)、/markets/{marketId}(GET)、/orderbook/{marketId}(GET,返回{yes, no, yes_dollars, no_dollars})、/orders(POST,需要isBuy布尔值和ownerPubkey)、/orders/status/{orderPubkey}(GET)、/positions(GET,?ownerPubkey=)、/positions/{positionPubkey}(DELETE)、/positions/{positionPubkey}/claim(POST)、/history(GET)、/leaderboards(GET) - 注意事项:
- 领取前检查
position.claimable。获胜者每份合约可获得 1 美元。 - 市场数据是扁平结构——
provider、marketId、result、resolveAt、outcomes、clobTokenIds等字段位于顶层,而非嵌套在metadata下。 - 合约数量可以是小数:使用
contractsMicro(1,000,000 = 1 份合约)或contractsDecimal,不要使用旧版整数contracts。
- 领取前检查
- 参考:概览 | 事件 | 持仓 | OpenAPI
Send
- 基础 URL:
https://api.jup.ag/send/v1 - 状态:Beta
- 触发词:
invite transfer、send、clawback - 支持的代币:SOL、USDC、memecoins
- 端点:
/craft-send(POST)、/craft-clawback(POST)、/pending-invites(GET)、/invite-history(GET) - 注意事项:需要双重签名——发送者和接收者密钥对(从邀请码派生)。只能通过 Jupiter Mobile 领取(不支持通过 API 领取)。切勿泄露邀请码。
- 参考:概览 | 邀请码 | 创建发送交易 | OpenAPI
Studio
- 基础 URL:
https://api.jup.ag/studio/v1 - 状态:Beta
- 触发词:
create 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) - 流程:create-tx -> 将图片上传到预签名 URL -> 将元数据上传到预签名 URL -> 签名 -> 通过
/dbc-pool/submit提交 - 注意事项:必须通过
/dbc-pool/submit提交(不能在外部提交),代币才能在 jup.ag 上获得 Studio 页面。错误代码:403= 无权使用该资金池,404= 找不到代理账户。 - 参考:概览 | 创建代币 | 领取费用 | OpenAPI
Lock
- 程序 ID:
LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn - 触发词:
vesting、distribution lock、unlock schedule - 集成方式:仅限链上程序(无 REST API)
- 源码:github.com/jup-ag/jup-lock
- 界面:lock.jup.ag
- 安全性:经 OtterSec 和 Sec3 审计
- 注意事项:无 REST API。使用仓库
cli/src/bin/instructions目录中的指令脚本。 - 参考:Lock 概览
路由
- 触发词:
dex integration、rfq integration、routing engine - 引擎:Juno(元聚合器)、Metis(多跳 DEX 路由,为 Swap API 提供支持;原名为 Iris)、JupiterZ(RFQ 做市商报价)
- DEX 集成(接入 Metis):免费,无费用。前提条件:代码质量、安全审计、市场吸引力。实现
jupiter-amm-interfacecrate。重要:实现中不得进行网络调用(账户会预先批量获取并缓存)。参考实现:github.com/jup-ag/rust-amm-implementation - RFQ 集成(JupiterZ):做市商在
/jupiter/rfq/quote(POST,250ms)、/jupiter/rfq/swap(POST)、/jupiter/rfq/tokens(GET)托管 webhook。要求:95% 成交率、250ms 响应时间、55s 有效期。SDK:github.com/jup-ag/rfq-webhook-toolkit - 市场上架:上架时间不足 30 天的代币可即时路由。常规路由(每 30 分钟检查一次)要求:以 $500 进行往返交易时亏损低于 30%,或比较 $1k 与 $500 交易时价格影响低于 20%。
- 参考:DEX 集成 | RFQ 集成 | 市场上架
速率限制
Swap API(动态,基于交易量):
| 24h 执行交易量 | 每个 10s 时间窗口的请求数 |
|---|---|
| $0 | 50 |
| $10,000 | 51 |
| $100,000 | 61 |
| $1,000,000 | 165 |
配额每 10 分钟重新计算一次。Pro 套餐不会提高 Swap API 限额。
其他 API:在门户级别管理。请查看门户速率限制。
遇到 HTTP 429 时:使用带抖动的指数退避:delay = min(baseDelay * 2^attempt + random(0, jitter), maxDelay)。等待 10s 滑动窗口刷新。不要激进地突发发送请求。
生产环境加固
- 身份验证:如果缺少或无效
x-api-key,立即失败。 - 超时:报价设为 5s,执行设为 30s,另设总操作超时。
- 重试:仅对暂时性故障、网络故障或速率限制进行重试,并采用带抖动的指数退避。
- 幂等性:Swap
/execute在最多 2 min 内接受相同的signedTransaction和requestId,且不会重复执行。 - 验证:调用前验证 mint 地址、金额精度和钱包所有权。
- 安全性:根据应用配置强制执行滑点和最大金额保护措施。
- 可观测性:记录
requestId、API 系列、端点、延迟、状态和错误代码。 - 用户体验韧性:返回可采取行动的状态(
retry、adjust params、insufficient balance、rate limited)。 - 一致性:在向用户报告最终成功前,对账异步状态(已提交、已确认或失败)。
- 时效性:当行为与预期流程不同时,重新获取所引用的文档。
集成最佳实践
- 编写端点调用代码前,先阅读对应 API 的概览。
- 将身份验证设为每个请求的硬性前提。参考:门户设置
- 根据文档说明的速率限制行为设计重试逻辑,不要依赖固定假设。参考:速率限制
- 根据文档规定的响应语义,将所有非成功响应映射为有类型的应用错误。参考:API 响应
- 对于基于订单的产品(Swap/Trigger/Recurring),在代码和日志中分开处理创建、执行和检索阶段。
- 将网络和服务健康状况视为运行时行为的一部分(优雅降级)。参考:状态页
跨领域错误模式
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 } };
}
// Swap execute errors (negative codes)
if (typeof code === 'number' && code < 0) {
const retryable = [-1, -1000, -1001, -1004, -2000, -2001, -2003, -2004].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 辅助函数;在生产环境中,对 execute 调用应用 withRetry。
- 兑换:端到端 — 下单 -> 签名 -> 执行 -> 确认流程
- 借贷:存入 USDC — 存入 Jupiter Lend 收益池
- 触发:限价单 — 创建并执行限价单
- 价格:多代币查询 — 获取价格并进行置信度筛选
最新上下文策略
执行操作指南前,始终从引用的文档/规范中获取最新上下文。
- 使用
Intent Router确定意图。 - 编写代码前,获取操作指南链接的参考资料(概览和特定 API 文档)。
- 如需验证或消除歧义,获取 OpenAPI 规范。
- 将获取的文档视为事实依据,优先于缓存的记忆。
- 如果获取的文档与此文件冲突,请遵循获取的文档并注明不一致之处。
- 如果无法获取文档,请说明上下文已过时/未经验证,并继续提供当前所知的最佳指导。
- 保持认证要求不变:Jupiter REST 端点必须提供
x-api-key(Perps/Lock 等仅限链上操作的流程除外)。