Loading...
Loading...
Comprehensive guidance for integrating Jupiter APIs (Ultra Swap, Lend, Perps, Trigger, Recurring, Tokens, Price, Portfolio, Prediction Markets, Send, Studio, Lock, Routing). Use for endpoint selection, integration flows, error handling, and production hardening.
npx skill4agent add jup-ag/agent-skills integrating-jupiterhttps://api.jup.agx-api-keyswapquotegaslessbest routelendborrowearnliquidationperpsleveragelongshortpositionlimit 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;
}| User intent | API family | First action |
|---|---|---|
| Swap/quote | Ultra Swap | |
| Lend/borrow/yield | Lend | |
| Leverage/perps | Perps | On-chain via Anchor IDL (no REST API yet) |
| Limit orders | Trigger | |
| DCA/recurring buys | Recurring | |
| Token search/verification | Tokens | |
| Price lookup | Price | |
| Portfolio/positions | Portfolio | |
| Prediction market integration | Prediction Markets | |
| Invite send/clawback | Send | |
| Token creation/fees | Studio | |
| Vesting/distribution | Lock | On-chain program |
| DEX/RFQ integration | Routing | Choose DEX (AMM trait) vs RFQ (webhook) path |
https://api.jup.ag/ultra/v1swapquotegaslessbest route/order/execute/holdings/{account}/shield/search/routershttps://api.jup.ag/lend/v1lendborrowearnliquidationjup3YeL8QhtSx1e253b2FDvsMNC87fDrgQZivbrndc9jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi@jup-ag/lend/earn/deposit/earn/withdraw/earn/mint/earn/redeem/earn/deposit-instructions/earn/withdraw-instructions/earn/tokens/earn/positions/earn/earningsVersionedTransactionperpsleveragelongshortpositionhttps://api.jup.ag/trigger/v1limit ordertriggerprice condition/createOrder/cancelOrder/cancelOrders/execute/getTriggerOrdersslippageBpshttps://api.jup.ag/recurring/v1dcarecurringscheduled swaps/createOrder/cancelOrder/execute/getRecurringOrdersparams.timehttps://api.jup.ag/tokens/v2token metadatatoken searchverificationshield/search?query={q}/tag?query={tag}verifiedlst/{category}/{interval}toporganicscoretoptradedtoptrending5m1h6h24h/recentaudit.isSusorganicScorehttps://api.jup.ag/price/v3pricevaluationprice feed/price/v3?ids={mints}nullconfidenceLevelhttps://api.jup.ag/portfolio/v1portfoliopositionsholdings/positions/{address}/positions/{address}?platforms={ids}/platforms/staked-jup/{address}multipleliquiditytradeleverageborrowlendhttps://api.jup.ag/prediction/v1prediction marketsmarket oddsevent marketJuprjznTrTSp2UFa3ZBUFgwdAmtZCq4MQCwysN55USD/events/events/search/markets/{marketId}/orderbook/{marketId}/orders/orders/status/{pubkey}/positions/positions/{pubkey}/positions/{pubkey}/claim/history/leaderboardsposition.claimablehttps://api.jup.ag/send/v1invite transfersendclawback/craft-send/craft-clawback/pending-invites/invite-historyhttps://api.jup.ag/studio/v1create tokenstudioclaim fee/dbc-pool/create-tx/dbc-pool/submit/dbc-pool/addresses/{mint}/dbc/fee/dbc/fee/create-tx/dbc-pool/submit/dbc-pool/submit403404LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjnvestingdistribution lockunlock schedulecli/src/bin/instructionsdex integrationrfq integrationrouting enginejupiter-amm-interface/jupiter/rfq/quote/jupiter/rfq/swap/jupiter/rfq/tokens| 24h Execute Volume | Requests per 10s window |
|---|---|
| $0 | 50 |
| $10,000 | 51 |
| $100,000 | 61 |
| $1,000,000 | 165 |
delay = min(baseDelay * 2^attempt + random(0, jitter), maxDelay)x-api-key/executesignedTransactionrequestIdrequestIdretryadjust paramsinsufficient balancerate limitedinterface 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 } };
}
}Intent Routerx-api-key