Docs

How KYRO works

Where every number comes from, how a swap is built, and the public API.

Data sources

  • Jupiter: token lists, live prices, organic score, holder counts, audit flags (mint and freeze authority, top holders), and swap routes.
  • GeckoTerminal: pools on every Solana DEX, liquidity, volume and OHLCV candles.
  • Solana RPC: balances, token accounts, transactions and largest holders, read directly from the chain.

Answers are cached for seconds to minutes so the public sources are not overloaded. A failed upstream is shown as an error with a retry, never as an empty list or a zero.

Wallets

KYRO supports every wallet that implements the Solana Wallet Standard (Phantom, Solflare, Backpack, Magic Eden, OKX, Glow and more), plus Coinbase Wallet, Trust and Ledger through dedicated adapters. The connect dialog lists what is installed first and links to the rest.

KYRO never receives keys. Transactions are built server-side, shown and signed in your wallet, then submitted through KYRO's RPC proxy and confirmed by polling their status.

Swaps

  1. The widget asks Jupiter for the best route straight from your browser, with /api/quote as the fallback, refreshed every 15 seconds.
  2. On Swap, Jupiter (or /api/swap as the fallback) returns an unsigned versioned transaction with a dynamic compute limit and a capped priority fee.
  3. Your wallet signs it; KYRO sends it and waits for confirmation, then links the result on Solscan.

Slippage is set by you (default 0.5%). Price impact above 1% is highlighted and above 5% asks you to confirm twice.

Limit orders and recurring buys use Jupiter's order programs: you sign one transaction that deposits the amount, Jupiter's keepers fill it on-chain, and cancelling returns whatever is left.

Vault program

The KYRO Vault is an open-source Solana program: deposit USDC, receive shares, withdraw pro rata at any time. The admin can pause deposits but never withdrawals, and cannot move user funds. It is live on Mainnet with a 10,000 USDC deposit cap while it awaits an external audit. See Vault for addresses.

Public API

The app uses these endpoints itself. They answer JSON, are cached at the edge, and return { error } with a 4xx or 5xx status when something is wrong.

Endpoints

18 routes
GET/api/tokens?list=trending&interval=24h&limit=100

Token lists with live stats. list: trending, traded, organic, recent, verified. interval: 5m, 1h, 6h, 24h.

Try it: /api/tokens?list=trending&interval=1h&limit=5
GET/api/tokens/search?q=bonk

Search by symbol, name or mint. Comma-separate up to 100 mints for a batch lookup.

Try it: /api/tokens/search?q=jup
GET/api/token/:mint

One token's record and every pool it trades in across Solana DEXs.

Try it: /api/token/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
GET/api/token/:mint/candles?tf=1h

OHLCV candles in USD from the deepest pool (or ?pool=). tf: 5m, 15m, 1h, 4h, 1d.

Try it: /api/token/So11111111111111111111111111111111111111112/candles?tf=1h
GET/api/token/:mint/holders

The 20 largest holders with owner wallets and share of supply.

GET/api/prices?ids=<mint>,<mint>

USD price and 24h change for up to 100 mints.

Try it: /api/prices?ids=So11111111111111111111111111111111111111112,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
GET/api/pools?list=top

Pools across every Solana DEX. list: top, trending, new.

Try it: /api/pools?list=trending
GET/api/wallet/:address

Priced holdings, net worth and the last 25 transaction signatures.

GET/api/wallet/:address/activity

The last 25 transactions, the newest 15 explained from the wallet's point of view (swaps, transfers, staking).

GET/api/holdings/:address

Just the priced balances, refreshed every 10 seconds.

GET/api/tx/:signature

What a transaction did: headline, balance changes per account, programs, fee and logs.

GET/api/quote?inputMint=&outputMint=&amount=&slippageBps=50

A Jupiter route. amount is in base units of the input token.

Try it: /api/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippageBps=50
POST/api/swap

Body { quoteResponse, userPublicKey }. Returns an unsigned versioned transaction (base64) for the user's wallet to sign.

POST/api/orders/limit

Body { maker, inputMint, outputMint, makingAmount, takingAmount, expiredAt? }. An unsigned Jupiter limit order (minimum $5).

POST/api/orders/recurring

Body { user, inputMint, outputMint, inAmount, numberOfOrders, interval }. An unsigned recurring buy (at least $50 per order; interval 3600, 86400, 604800 or 2592000).

POST/api/orders/execute

Body { kind, signedTransaction, requestId }. Submits a signed order or cancel transaction through Jupiter.

GET/api/orders?user=<wallet>

Open and past limit orders and recurring buys for a wallet.

GET/api/status

Health of the upstreams: Solana RPC, devnet RPC, Jupiter, GeckoTerminal.

Try it: /api/status

Limits and errors

Without a dedicated RPC the public Solana endpoint is used, which rate-limits heavier reads such as largest holders. Set SOLANA_RPC_URL on the server to lift that. JUPITER_API_KEY switches Jupiter to its keyed host.