MadeOnSolMade on Sol

Data APIs

Solana Data APIRobinhood Chain API

Intelligence

Telegram AlertsKOL TrackerWallet ScannerToken LookupDeployer Hunter
Trading BotsTrading TerminalsWallet TrackingToken Scanners
View all solutions
API DocsWebSocket StreamingMCP & SDKsx402 for AI AgentsAgent Intelligence Gateway
Discover ToolsCompare ToolsSubmit a ToolAdvertiseBlog
Pricing
Get real-time feedsSign in
MadeOnSolMade on Sol

Solana and Robinhood Chain intelligence — KOL wallet tracking, deployer intelligence, all-DEX trade streams, and a developer API. Discover, compare, and build.

Product

  • Solana Data API
  • Solana Wallet Checker
  • Robinhood Chain Wallet Checker
  • Robinhood Chain API
  • Robinhood Chain x402
  • MCP Servers & SDKs
  • x402 for AI Agents
  • Agent Intelligence Gateway
  • Pricing
  • Enterprise / For Businesses

Solutions

  • Trading Bots
  • Wallet Tracking
  • Copy Trading
  • Token Scanners
  • Trading Terminals
  • DEX Data
  • Smart Money
  • Token Risk
  • AI Agents
  • ShredPrism Stream
  • View all solutions

Developers

  • API Docs
  • WebSocket Streaming
  • Changelog
  • API Status
  • Latency Benchmarks
  • Data Integrity
  • Data Dictionary
  • Methodology

Resources

  • All Tools
  • Compare Tools
  • Best Trading Bots
  • Best DEXs
  • Best Wallets
  • Best Analytics
  • Best DeFi
  • Best Snipers
  • Blog
  • Blog Archive
  • Signal Scorecard
  • Tool Uptime
  • Community
  • Submit a Tool
  • Advertise

Company

  • About
  • Contact
  • Security
  • Privacy
  • Terms
  • DPA
  • Disclaimer

© 2026 MadeOnSol

MadeOnSol — eenmanszaak, Hulshout, Belgium · KBO/BTW BE 1039.535.538 (art. 56bis, no VAT charged)

Runs on our own dedicated EU servers — self-hosted data stack, own Robinhood Chain node · security

Powered by:constant·k — Private Solana RPC Services
SolutionsCopy Trading

For copy-trade bot developers

Copy-trade signals for any Solana wallet you choose

The MadeOnSol copy-trade API watches the Solana wallets you name, KOL or not, and sends one sized signal per matching swap by webhook, WebSocket or REST; your code places the trade.

Try it free

  • The KOL roster, leaderboard and feed (5 minutes delayed) to shortlist wallets
  • 200 calls a day, no card needed
Get a free API key

Pro

€43/month

  • 3 rules of up to 5 wallets each, any Solana wallet
  • Sized signals by signed webhook, REST and the live stream
  • Real-time KOL feed, 10,000 calls a day
Start Pro

Go further with Ultra

€131/month

  • 20 rules of up to 50 wallets each
  • 10 signed webhooks and 100,000 calls a day
Start Ultra

Billed in euros by card. Checkout shows today's dollar estimate; your card issuer sets the exact amount. USDC or SOL at the day's rate. Cancel anytime.

Free, Pro and Ultra keys are for your own internal use, such as bots, backends and research. Showing MadeOnSol data to your own users, for example in a public terminal or dashboard, needs Business. Compare plans

Solana KOL wallets trackedActive in the live KOL feed · a starting point for copy-trade rules
1,240
KOL trades capturedSolana · tracked KOL wallets · kept forever
7.09M
Sizing modes for suggested_sol_amount
3

Choose any valid wallet, or shortlist one from the KOL leaderboard for its name and track record, write the conditions once, and receive signals your bot can check, size and execute on its own terms.

Step one: choose the wallets

A rule can follow any valid Solana wallet. These optional endpoints help you find wallets worth copying.

  • GET /kol/walletsFree

    Optional: the tracked KOL roster, one place to find wallets to evaluate. A rule can name any valid Solana wallet; one on this list also gets its KOL name on the signal.

    wallet_addressis_activestrategy_tag

  • GET /kol/leaderboardFree

    Rank KOLs by PnL, win rate, profit factor or early entries over a chosen period.

    profit_factor_30dpercentile_pnl_30dwinrate_30d

  • GET /kol/{wallet}/timingFree

    How long a KOL holds, so you know whether your bot can enter before they exit.

    median_hold_minutespct_closed_1h

The problem

Following a wallet sounds like one webhook. A copy-trading product has to decide which traders deserve following, turn each of their transactions into a buy or sell with an amount, drop trades that are too small or entered at the wrong market cap, size the follow, never fire twice on a replayed transaction, and still reach a bot that was offline for a minute.

Show me

One rule, one wallet buy, one signal

The full path for a single trade. Field names are the real request and payload keys; values are illustrative and the frames are abridged.

  1. 1 · Write the rule

    Name the source wallets (any valid Solana addresses; the two here are examples), a size floor, the side, a market cap band, how to size the follow and where to deliver. The response returns webhook_secret once.

    Create a rule
    POST /api/v1/copytrade/subscriptions
    Authorization: Bearer msk_...
    Content-Type: application/json
    
    {
      "name": "two wallets, early buys",
      "source_wallets": ["CyaE...n5Lb", "4BdK...9sQe"],
      "min_trade_sol": 1,
      "only_action": "buy",
      "min_mc_usd": 20000,
      "max_mc_usd": 2000000,
      "sizing_mode": "proportional",
      "sizing_amount": 0.1,
      "delivery_mode": "both",
      "webhook_url": "https://bot.example.com/hooks/copytrade"
    }
  2. 2 · A followed wallet buys

    MadeOnSol parses the swap with the market cap at the trade and hands it to the rule engine. This example wallet happens to be a tracked KOL, so the same swap also appears on kol:trades with its KOL name. A wallet that is not a KOL is checked the same way and its signal carries kol_name null.

    kol:trades frame (abridged)
    {
      "id": "kol:trade:5K7j...",
      "seq": 184219,
      "channel": "kol:trades",
      "event": "kol:trade",
      "data": {
        "kol_name": "Cented",
        "wallet_address": "CyaE...n5Lb",
        "token_mint": "8vdc...pump",
        "token_symbol": "NEW",
        "action": "buy",
        "sol_amount": 5.27,
        "token_amount": 18400000,
        "tx_signature": "5K7j...",
        "slot": 449476688,
        "traded_at": "2026-09-23T10:00:35.000Z",
        "market_cap_usd_at_trade": 28430,
        "liquidity_usd_at_trade": 9120,
        "primary_dex": "pumpfun"
      },
      "ts": 1790157635000
    }
  3. 3 · The rule fires

    5.27 SOL clears the floor, the entry sits inside the band, and 0.1 of the source trade's size becomes suggested_sol_amount. A webhook receives the same data inside { event, data, timestamp }.

    copytrade:signals frame (abridged)
    {
      "id": "copytrade:signal:77120",
      "seq": 184220,
      "channel": "copytrade:signals",
      "event": "copytrade:signal",
      "data": {
        "signal_id": 77120,
        "subscription_id": 41,
        "subscription_name": "two wallets, early buys",
        "fired_at": "2026-09-23T10:00:36.120Z",
        "source_wallet": "CyaE...n5Lb",
        "kol_name": "Cented",
        "action": "buy",
        "token_mint": "8vdc...pump",
        "token_symbol": "NEW",
        "source_sol_amount": 5.27,
        "suggested_sol_amount": 0.527,
        "tx_signature": "5K7j...",
        "traded_at": "2026-09-23T10:00:35.000Z",
        "market_cap_usd_at_trade": 28430,
        "price_usd_at_trade": 0.0000284
      },
      "ts": 1790157636120
    }
  4. 4 · Your bot takes over

    Handle it on the stream, or verify the webhook signature over timestamp.body with the rule's secret. Everything after this line is your code.

    TypeScript · madeonsol-x402 + webhook check
    import crypto from "node:crypto";
    import { MadeOnSolREST } from "madeonsol-x402";
    
    // Option A: WebSocket (delivery_mode "websocket" or "both")
    const rest = new MadeOnSolREST({ apiKey: process.env.MADEONSOL_API_KEY! });
    const stream = rest.stream();
    stream.on("copytrade:signal", (s) => myBot.consider(s)); // your sizing caps, your signer
    stream.subscribe(["copytrade:signals"]);
    
    // Option B: webhook (delivery_mode "webhook" or "both")
    // rawBody:   the exact request bytes (never re-serialized JSON)
    // secret:    the webhook secret exactly as the API returned it (do not hex-decode)
    function verifyMadeOnSol(rawBody: Buffer | string, timestamp: string | undefined, signature: string | undefined, secret: string): boolean {
      // X-MadeOnSol-Timestamp: unix milliseconds, fresh on every retry
      if (typeof timestamp !== "string" || !/^\d{1,16}$/.test(timestamp)) return false;
      // Replay window: your choice, the server does not enforce one
      if (Math.abs(Date.now() - Number(timestamp)) > 5 * 60_000) return false;
      // X-MadeOnSol-Signature: 64 hex characters, bare (no algorithm prefix)
      if (typeof signature !== "string" || !/^[0-9a-f]{64}$/i.test(signature)) return false;
      const expected = crypto
        .createHmac("sha256", secret)
        .update(`${timestamp}.`)
        .update(rawBody)
        .digest();
      // Both sides are exactly 32 bytes here, so this compares in constant time and cannot throw
      return crypto.timingSafeEqual(expected, Buffer.from(signature, "hex"));
    }
    
    // In your raw-body route handler (webhook_secret is returned once at create):
    // verifyMadeOnSol(rawBody, headers["x-madeonsol-timestamp"],
    //                 headers["x-madeonsol-signature"], process.env.RULE_WEBHOOK_SECRET!)
    // body: { "event": "copytrade:signal", "data": { ...same fields, no signal_id }, "timestamp": "..." }
    // dedupe webhook retries on data.subscription_id + data.tx_signature

Same calls in other clients

  • TypeScriptrest.copyTradeCreate(params)
  • TypeScriptrest.copyTradeSignals({ since })
  • Pythonclient.copy_trade_create(...)
  • MCPmadeonsol_copytrade_create

Try it

Shortlist wallets before you write a rule

A free key reads the KOL feed over REST (5 minutes delayed) plus the roster and leaderboard, enough to shortlist wallets and replay what a draft rule would have caught. The KOL Tracker shows the same trades in the browser.

Get a free API key Open the KOL Tracker

From rule to signal

What happens between a wallet's trade and your bot

Each stage reads one part of your rule and one part of the source wallet's trade. The first seven run on MadeOnSol; the last one is yours.

  1. 01 · MadeOnSol

    Scope

    source_walletsvswallet_address

    Every qualifying swap by a wallet one of your active rules lists is checked against that rule, whether or not the wallet is a known KOL. KOL status only adds kol_name to the signal. A trade that arrives more than 10 seconds after it landed on chain is not signalled.

  2. 02 · MadeOnSol

    Size floor

    min_trade_solvssol_amount

    Trades below your floor are dropped. The default floor is 0. USDC and USDT legs are converted to SOL first; a swap by a non-KOL wallet quoted in another token is skipped rather than sized wrong.

  3. 03 · MadeOnSol

    Side

    only_actionvsaction

    buy, sell or both. A rule created without it follows buys only (buy).

  4. 04 · MadeOnSol

    Market cap band

    min_mc_usdmax_mc_usdvsmarket_cap_usd_at_trade

    The source trade's entry must sit inside your band. When a band is set and the trade's market cap is unknown, no signal fires.

  5. 05 · MadeOnSol

    Size

    sizing_modesizing_amountvssol_amount

    fixed returns sizing_amount as SOL. proportional and percent_source both multiply the source trade's SOL amount by sizing_amount. The result is suggested_sol_amount.

  6. 06 · MadeOnSol

    Once per trade

    subscription_idvstx_signature

    One signal per rule per transaction. A trade replayed after a reconnect or restart does not fire the rule twice.

  7. 07 · MadeOnSol

    Delivery

    delivery_modewebhook_url

    webhook posts to your URL signed with the rule's own secret, up to 3 attempts. websocket publishes to copytrade:signals for your connections only. both does both.

  8. 08 · Your bot

    Execution

    suggested_sol_amount

    Your code decides: cap the size, check the token, then build, sign and send the swap with your own wallet and RPC.

Filled chips are rule fields, outlined chips are fields of the source trade or the signal. Copy-trade API reference

Compared

A wallet webhook vs a copy-trade signal

A plain address webhook tells you something touched a wallet. A copy-trade signal tells you a wallet your rule follows made a trade your rule accepts. Seeing every transaction a wallet makes, not only qualifying swaps, is what wallet tracking events are for.

ConcernGeneric wallet webhookMadeOnSol copy-trade signal
What triggers itAny transaction that touches the address: transfers, approvals, failed swaps, dust.A parsed buy or sell by a wallet your rule follows, with SOL and token amounts.actionsol_amounttoken_amount
Who the trader isAn address. Track record is yours to build.Any wallet you choose. When it is a known KOL, the signal names it, and its leaderboard record and hold-time profile are there to query before you follow.kol_nameprofit_factor_30dmedian_hold_minutes
QualificationYour service receives everything and filters it.Size floor, side and market cap band are checked on the server before anything is sent.min_trade_solonly_actionmin_mc_usdmax_mc_usd
What you receiveA raw transaction to decode.A structured signal naming the rule, the source trade, the market cap at entry and a suggested size.subscription_idsuggested_sol_amountmarket_cap_usd_at_trade
Duplicates and historyDeduplication and storage are on your side.One signal per rule per transaction; signals stay readable over REST for 7 days with a delivery flag.tx_signaturedelivereddelivered_at

Plans

Which plan each step needs

StepWherePlan
Find wallets to copy (optional)GET /kol/wallets, /kol/leaderboard, /kol/{wallet}/timingFree
KOL trades over RESTGET /kol/feedFree5 minutes delayed on Free
KOL trades livekol:trades channelFrom Pro
Copy-trade rulesPOST /copytrade/subscriptionsFrom ProRules and wallets per rule depend on the plan
Signals, pushedPer-rule webhook, copytrade:signals channelFrom Pro
Signal historyGET /copytrade/signalsFrom Pro
Multi-KOL confirmationkol:coordination channelFrom Pro

Compare plans for the number of rules and wallets per rule.

Architecture

From a wallet's trade to your signer

  1. 1 · Source

    Chain activity

    Transactions and program events

  2. 2 · MadeOnSol

    Data and intelligence layer

    • Source wallets from your rules
    • Parsed swaps, KOL names when known
    • Rule checks and sizing
  3. 3 · Delivery

    • Webhooksper-rule secret · copytrade:signal
    • WebSocket streamscopytrade:signals · kol:trades
    • REST API/copytrade/* · /kol/*
  4. 4 · Yours

    Your caps, checks and signer

    Keys and business logic stay server-side

  5. 5 · Users

    Your copy-trading product

Build outcomes

What teams can build

  • Copy-trading bots with your own risk limits
  • Paper-trading and backtest harnesses
  • Wallet follow alerts for your users
  • Trader shortlists and scorecards
  • Multi-KOL confirmation filters

Showing MadeOnSol data to your own users requires a Business plan. See pricing

Keep going

Related

Solution

Smart Money

Find wallets to evaluate: the tracked KOL wallets and how they trade.

Solution

Wallet Tracking

Every transaction a wallet makes, not only the swaps a rule acts on.

Product

KOL Tracker

Live KOL trades and the leaderboard in the browser.

Guide

Choose wallets by profit factor and percentile rank

Selection metrics beyond win rate.

Guide

Backtest a copy-trade strategy on priced KOL trades

Test a rule before it runs live.

Guide

Swap on a KOL buy with Jupiter in TypeScript

The execution layer in your own code.

FAQ

Questions copy-trading teams ask

Which wallets can a copy-trade rule follow?+
Any valid Solana wallet address. MadeOnSol monitors the qualifying swaps of every wallet your rules list and checks each one against the rule, whether or not the wallet is a known KOL. When the wallet is on the tracked KOL roster (GET /kol/wallets), the signal also carries its KOL name: extra context, not a requirement. Source wallets on rules do not count against your Wallet Tracker quota. Limits: Pro 3 rules × 5 wallets per rule, Ultra 20 rules × 50 wallets per rule, Business 100 rules × 250 wallets per rule.
How is suggested_sol_amount calculated?+
From the rule's sizing_mode and sizing_amount and the source wallet's SOL amount on that trade. fixed returns sizing_amount itself; proportional and percent_source both return that SOL amount multiplied by sizing_amount, so 0.1 on a 5 SOL buy suggests 0.5 SOL. It is a suggestion: apply your own caps before you trade.
Can one source trade fire the same rule twice?+
No. Each signal is stored once per rule and transaction signature before it is delivered, so a trade replayed after a reconnect or a service restart is skipped. Two different rules that both match the trade each fire once.
How do I catch up on signals my bot missed?+
Read GET /copytrade/signals with since or subscription_id; it keeps 7 days and marks each row delivered or not. On the WebSocket, resume after a disconnect: copytrade:signals is rebuilt from the database when the in-memory buffer cannot cover the gap, within the stream's recovery limits.
Webhook or WebSocket for copy-trade signals?+
Set delivery_mode on the rule. A webhook suits a backend that cannot hold a socket: each POST is signed with the rule's own secret in X-MadeOnSol-Signature and retried up to 3 times. The copytrade:signals channel suits a bot that is already connected to the stream. both sends each signal both ways. The stream frame carries signal_id; the webhook body does not, so dedupe webhook deliveries on subscription_id plus tx_signature (one signal per rule per source trade).
Does MadeOnSol execute trades?+
No. A copy-trade signal says which wallet traded (with its KOL name when it is a known KOL), what, how much, and what size your rule suggests. Your bot applies its own limits, then builds, signs and sends the swap from your wallet.
Can teams prototype first?+
Yes. A free key from the developer page reads the KOL feed over REST (5 minutes delayed), the KOL roster and the leaderboard, which is enough to pick wallets and replay their trades against a draft rule. Rules and signals start on Pro; see pricing.

Next step

Shortlist the wallets, then let a rule watch them.

See how the trades are verified, shortlist wallets on a free key (the KOL leaderboard is one place to start), then turn the shortlist into a rule.

  1. 1 · ProofData integrity How trades are checked against the chain.
  2. 2 · TryGet a free API key Roster and leaderboard; feed 5 min delayed.
  3. 3 · DocsCopy-trade reference Rules, signals, fields.
  4. 4 · PlanCompare plans Rules from Pro.