MadeOnSolMade on Sol
Pricing
Try freeGet 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
  • Robinhood Chain API
  • Robinhood Chain x402
  • MCP Servers & SDKs
  • x402 for AI Agents
  • Pricing
  • Enterprise / For Businesses

Solutions

  • Trading Bots
  • Wallet Tracking
  • Copy Trading
  • Trading Terminals
  • DEX Data
  • 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

Follow us on XPowered by:constant·k — Private Solana RPC Services
SolutionsCopy Trading

Solutions · Copy trading

Copy-trade signals from tracked Solana KOL wallets

The MadeOnSol copy-trade API checks each trade by the tracked Solana KOL wallets against your rules and emits one copytrade:signal per matching trade, with a suggested SOL size, over a signed webhook, the copytrade:signals WebSocket channel and REST, while the trade itself stays with your code.

Read the copy-trade API Paper-trade KOL wallets first
Solana KOL wallets trackedActive in the live KOL feed · copy-trade rules follow these
1,142
KOL trades capturedSolana · tracked KOL wallets · kept forever
5.36M
Sizing modes for suggested_sol_amount
3

Pick the traders from their record, write the conditions once, and receive signals your bot can check, size and execute on its own terms.

Free API key · plans from €43

Rules and their signals from Pro, over REST, a per-rule webhook or the copytrade:signals channel. A Free key reads the KOL roster and leaderboard, and the KOL feed 5 minutes delayed.

Step one: choose the traders

REST endpoints for deciding which KOL wallets a rule should name.

  • GET /kol/walletsFree

    The tracked KOL roster. Active wallets here are the only addresses a copy-trade rule can fire on.

    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 KOL 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 KOL wallets, 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 kols, 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 tracked KOL buys

    kol-tracker parses the swap and publishes it on kol:trades with the market cap at the trade. The same event feeds the rule engine.

    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 KOL'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 kols, 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")
    function verified(rawBody: string, headers: Record<string, string>): boolean {
      const ts = headers["x-madeonsol-timestamp"];
      const expected = crypto
        .createHmac("sha256", process.env.RULE_WEBHOOK_SECRET!) // returned once at create
        .update(`${ts}.${rawBody}`)
        .digest("hex");
      const got = headers["x-madeonsol-signature"] ?? "";
      return got.length === expected.length &&
        crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(got));
    }
    // body: { "event": "copytrade:signal", "data": { ...same fields }, "timestamp": "..." }

Same calls in other clients

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

Try it

Watch the KOLs 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 KOL trade and your bot

Each stage reads one part of your rule and one part of the kol:trade event. The first seven run on MadeOnSol; the last one is yours.

  1. 01 · MadeOnSol

    Scope

    source_walletsvswallet_address

    Every trade by an active tracked KOL is checked against the rules that list that wallet. A wallet outside the roster produces no kol:trade, so a rule naming it never fires.

  2. 02 · MadeOnSol

    Size floor

    min_trade_solvssol_amount

    Trades below your floor are dropped. The default floor is 0.

  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 KOL'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 KOL'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 KOL 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 tracked trader made a trade your rule accepts. Following addresses outside the KOL roster 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 tracked KOL wallet, with SOL and token amounts.actionsol_amounttoken_amount
Who the trader isAn address. Track record is yours to build.A named KOL with a leaderboard record and hold-time profile you can 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
Choose tradersGET /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 KOL trade to your signer

  1. 1 · Source

    Chain activity

    Transactions and program events

  2. 2 · MadeOnSol

    Data and intelligence layer

    • Tracked KOL roster and records
    • Parsed KOL trades (kol:trade)
    • 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
  • KOL 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

Trading Bots

Deployer alerts and token context next to your copy signals.

Solution

Wallet Tracking

Follow addresses that are not on the KOL roster.

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?+
Tracked KOL wallets only: the roster returned by GET /kol/wallets. The engine evaluates KOL trades, so a rule that lists any other address is stored but never fires, and the Solana create endpoint does not warn about it. To act on arbitrary addresses, use Wallet Tracking events instead.
How is suggested_sol_amount calculated?+
From the rule's sizing_mode and sizing_amount and the KOL's SOL amount on that trade. fixed returns sizing_amount itself; proportional and percent_source both return the KOL's 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 KOL 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; dedupe on signal_id.
Does MadeOnSol execute trades?+
No. A copy-trade signal says which tracked KOL traded, 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 KOLs on a free key, 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.