CoinMarketCap APIkeyless0 credits2026-09-07

The tape says balanced. One wallet is 62% of the sell side.

Net flow is a sum, and summing is lossy.

what every dashboard prints net flow +2.1% sell · 333 swaps · 111 wallets one wallet · 62.0% · $25,459,824 in 12 swaps buy · 467 swaps · 212 wallets largest wallet · 11.7%
the largest single wallet on that side every other wallet on it — one colour per side
AUSD · ethereum · 800 swaps · 8 pages · 29.4 s captured 2026-09-07 07:00:52 UTC · reproduce ↓
The number

$25.5M sold in 12 swaps, by one address, into 212 buyers.

AUSD on ethereum, 800 consecutive swaps ending 2026-09-07 07:00:52 UTC. Net flow read +2.1% — a number every flow dashboard renders as "balanced". Split the same swaps by maker address and the sell side is mostly one wallet.

net flow — the only number a dashboard shows +2.1%
sideswapswalletstop maker's share
sell 333 111
62.0%
$25,459,824 in 12 swaps
buy 467 212
11.7%
$4,998,916 in 4 swaps

Top seller 0x9f681e397f51137215b8240b8bf4e523d898661b. Supporting columns: 467 buys averaging $91,700, 333 sells averaging $123,273, ticket ratio 1.3× — which is exactly why ticket size was never the story.

Check it by hand — thirty seconds

The hero row from the committed receipt — values verbatim, fifteen of its keys shown, the full row one click below. Three fields are marked. Divide the first by the second.

{
  "symbol": "AUSD",
  "platform": "ethereum",
  "swaps": 800,
  "net_flow_pct": 2.1148175505180515,
  "sells": 333,
  "sell_wallets": 111,
  "sell_vol": 41049940.75883942,
  "sell_top_maker": "0x9f681e397f51137215b8240b8bf4e523d898661b",
  "sell_top_swaps": 12,
  "sell_top_vol": 25459823.583279844,
  "sell_top_share": 0.6202158422798087,
  "buys": 467,
  "buy_wallets": 212,
  "buy_top_share": 0.11673241056880844,
  "confidence": "ok"
}
sell_top_vol ÷ sell_vol = 25,459,823.58 ÷ 41,049,940.76 = 0.6202 → 62.0%
The 12 swaps behind the number — raw records, running sum

Every swap in the window whose maker is 0x9f68…661b and whose side is sell. Verbatim v values from /v1/dex/tokens/transactions; the running sum lands on sell_top_vol.

#time (UTC)txvenuev (USD)running
108-31 15:350xf324…7547Uniswap v3$5,000,016.38$5,000,016.38
208-31 15:450xc4e0…cb84Uniswap v3$333,324.58$5,333,340.97
308-31 15:570xc8ea…34a2Uniswap v3$847,105.36$6,180,446.33
408-31 16:440xca5b…0568Uniswap v3$3,291,115.23$9,471,561.56
508-31 16:570x5cc5…9023Uniswap v3$527,666.60$9,999,228.15
609-01 17:010xc029…475dUniswap v3$5,000,006.77$14,999,234.92
709-01 17:440xe972…a77eUniswap v3$2,652,498.67$17,651,733.59
809-01 18:570x253c…3c89Uniswap v3$347,138.65$17,998,872.24
909-02 17:570x4e17…d86cUniswap v3$992,842.73$18,991,714.97
1009-02 20:250x114d…3957Uniswap v3$4,344,882.05$23,336,597.02
1109-03 07:280xd688…aebdUniswap v3$1,428,198.57$24,764,795.58
1209-03 08:510x2ea3…ddeaUniswap v3$695,028.00$25,459,823.58
sum of v — equals sell_top_vol$25,459,823.58
The full receipt row — every key, verbatim

Sorted keys; the two per-wallet share arrays are elided here and complete in docs/proof/ausd.json (opens in a new tab).

{
  "address": "0x00000000efe302beaa2b3e6e1b18d08d69a9012a",
  "avg_buy": 91699.60505994596,
  "avg_sell": 123273.09537189016,
  "buy_maker_shares": [ /* 212 shares, largest first — see the receipt */ ],
  "buy_top10": [
    {
      "maker": "0xa994295e2e3598460c959b4a9d91c763fd5c3827",
      "share": 0.11673241056880844,
      "swaps": 4,
      "vol": 4998915.547181376
    },
    {
      "maker": "0x9f681e397f51137215b8240b8bf4e523d898661b",
      "share": 0.10012676345387925,
      "swaps": 4,
      "vol": 4287800.038392184
    },
    /* … 8 more in the receipt */
  ],
  "buy_top_maker": "0xa994295e2e3598460c959b4a9d91c763fd5c3827",
  "buy_top_share": 0.11673241056880844,
  "buy_top_swaps": 4,
  "buy_top_vol": 4998915.547181376,
  "buy_vol": 42823715.56299476,
  "buy_wallets": 212,
  "buys": 467,
  "concentrated_side": "sell",
  "confidence": "ok",
  "elephant_side": "sell",
  "net_flow_pct": 2.1148175505180515,
  "pages": 8,
  "platform": "ethereum",
  "sell_maker_shares": [ /* 111 shares, largest first — see the receipt */ ],
  "sell_top10": [
    {
      "maker": "0x9f681e397f51137215b8240b8bf4e523d898661b",
      "share": 0.6202158422798087,
      "swaps": 12,
      "vol": 25459823.583279844
    },
    {
      "maker": "0x55fa9aac40af97faab697cc74d4da452abf0272c",
      "share": 0.1895169247068887,
      "swaps": 106,
      "vol": 7779658.532015212
    },
    {
      "maker": "0x4352cc849b33a936ad93bb109afdec1c89653b4f",
      "share": 0.06479697272695308,
      "swaps": 1,
      "vol": 2659911.8917935574
    },
    {
      "maker": "0xb00fe7a3e0eaa061de1f74af0d48de97c244f58d",
      "share": 0.02385250156296454,
      "swaps": 1,
      "vol": 979143.7761098191
    },
    {
      "maker": "0xd920214f742dadc85a091607884740fe56fffd23",
      "share": 0.017326672583654577,
      "swaps": 1,
      "vol": 711258.8831068276
    },
    {
      "maker": "0xb81a0e6c38c3fec8a171cfe9631f60127a0c5bfd",
      "share": 0.017076772832615394,
      "swaps": 6,
      "vol": 701000.5131310204
    },
    {
      "maker": "0xdb895a86e220b3655c48ba378bca20c675c7c234",
      "share": 0.009744515478687798,
      "swaps": 2,
      "vol": 400011.7831237279
    },
    {
      "maker": "0x4768a347622b94ad651aea437e40326a3abec9b2",
      "share": 0.009742369549021714,
      "swaps": 1,
      "vol": 399923.6928380625
    },
    {
      "maker": "0x7abfe03949efa657e717f16d7eddc44ee94d702e",
      "share": 0.00819607553825963,
      "swaps": 2,
      "vol": 336448.41530053073
    },
    {
      "maker": "0x548b3100036f4772efdabb455a15f196adcfbc57",
      "share": 0.006605872448997531,
      "swaps": 1,
      "vol": 271170.6726917981
    }
  ],
  "sell_top_maker": "0x9f681e397f51137215b8240b8bf4e523d898661b",
  "sell_top_share": 0.6202158422798087,
  "sell_top_swaps": 12,
  "sell_top_vol": 25459823.583279844,
  "sell_vol": 41049940.75883942,
  "sell_wallets": 111,
  "sells": 333,
  "swaps": 800,
  "symbol": "AUSD",
  "ticket_ratio": 1.3443143543672185,
  "top_share": 0.6202158422798087,
  "wallet_ratio": 1.90990990990991
}
Top ten makers on each side

sell — 111 wallets

#makerUSDswapsshare
10x9f68…661b$25,459,8241262.0%
20x55fa…272c$7,779,65910619.0%
30x4352…3b4f$2,659,91216.5%
40xb00f…f58d$979,14412.4%
50xd920…fd23$711,25911.7%
60xb81a…5bfd$701,00161.7%
70xdb89…c234$400,01221.0%
80x4768…c9b2$399,92411.0%
90x7abf…702e$336,44820.8%
100x548b…bc57$271,17110.7%

buy — 212 wallets

#makerUSDswapsshare
10xa994…3827$4,998,916411.7%
20x9f68…661b$4,287,800410.0%
30xf4db…9c33$3,444,97058.0%
40xd758…5fda$3,063,14647.2%
50xa33e…62a2$2,865,03256.7%
60x8da3…dab4$2,206,760155.2%
70x2058…a734$1,799,954444.2%
80x289c…671c$1,599,93523.7%
90x7c52…77fc$1,393,31323.3%
100x86ab…13a0$1,109,95932.6%
Why the sum cannot contain it

Two opposite markets. Identical net flow.

Net flow is buy volume minus sell volume. You can always re-add a split into a sum; nothing recovers the split from the sum. So we never sum — we pull the individual swaps and attribute each side to the wallets that made it.

structure A — one desk, a thousand buyers
sell · 1 wallet · $1,000,000buy · 1,000 wallets · $1,000 each
net flow0.0% top seller's share100% top buyer's share0.1%
structure B — a thousand sellers, a thousand buyers
sell · 1,000 wallets · $1,000 eachbuy · 1,000 wallets · $1,000 each
net flow0.0% top seller's share0.1% top buyer's share0.1%
01 · PULL

The swaps, not the aggregate

/v1/dex/tokens/transactions, keyless. Per swap: the side tp, the USD value v, the maker address ma. Eight pages, cursor on the envelope.

02 · SPLIT

Partition on the side

Buys in one bucket, sells in the other. Net flow is computed too — only so it can be shown losing.

03 · ATTRIBUTE

Sum per wallet, rank, take the top

Per side, Σ v grouped by ma. The largest wallet's share of the side is the number. No model, no threshold, no label.

the arithmetic — split_tape.py, split()
# the whole product — scripts/split_tape.py, split()
buys  = [s for s in swaps if s.tp == "buy"]
sells = [s for s in swaps if s.tp == "sell"]

by_maker[side][s.ma] += s.v          # per side, per wallet
top_share[side] = max(by_maker[side].values()) / sum(side.v)

net_flow = (Σ buys.v − Σ sells.v) / (Σ buys.v + Σ sells.v)
# shown beside the split so the disagreement is visible in one row
why not ticket size?

Why not ticket size? The first version headlined average buy ticket ÷ average sell ticket. At flat net flow buy volume ≈ sell volume, so that ratio collapses to n_sells / n_buys — the count ratio, measured twice. Across 54 flat tokens the two agreed to within a median 5.8%, and the best real value was 5.2×.

Maker share is a second, independent quantity, and it is the one the project is named for. Ticket size stays as a supporting column.

The map

Four tokens, all "balanced". Four different markets.

Every point below has net flow within ±5% of zero. Plot who owns each side and they separate into the four market structures a summed number cannot name. Each point is a keyless run of the same script — hover or focus a point to read it.

25%25%50%50%75%75%100%100%0 distribution to retail one seller, many buyers accumulation from a crowd one buyer, many sellers wash-shaped symmetry one wallet on both sides churn crowds on both sides AUSD net +2.1% SHFL net +0.9% BINGO net −0.4% GME net −0.9% top maker's share of the SELL side → top maker's share of the BUY side →

AUSD ethereum

net +2.1%
distribution to retail
sell62.0% buy11.7%

One wallet sold $25.5M in 12 swaps to 212 distinct buyers.

SHFL ethereum

net +0.9%
accumulation from a crowd
sell7.8% buy54.1%

The mirror: one wallet took 54.1% of the buy side in 120 swaps, from 425 distinct sellers.

BINGO solana

net −0.4%
wash-shaped symmetry
sell97.9% buy99.3%

The same wallet, FyARhG…JioV, is the top maker on both sides — 800 swaps of tiny size trading with itself.

GME solana

net −0.9%
churn
sell2.9% buy3.7%

Crowds on both sides: 217 sellers, 175 buyers, nobody above a tenth. The only one of the four where "balanced" was true.

The API

One neglected endpoint is the whole engine.

CoinMarketCap publishes individual DEX swaps with side, USD value and maker address together, in one keyless call. No other field in the catalogue — and no other major market-data API we know of — makes the wallet count available at all.

endpointused forkey
/public-api/v1/dex/tokens/transactionsThe engine. Per-swap tp, v, ma; cursor pagination via data.lastId.none
/public-api/v4/dex/spot-pairs/latestUniverse enumeration for the sweep that found the four tokens above.none
/public-api/v4/dex/pairs/quotes/latestLiquidity context. Its 24h_buy_volume / 24h_sell_volume are deliberately not used — see below.none
/v1/dex/holders/countOffline holder-count collector. Not on the judged path.Startup
finding 1 · pagination
100 → 800

The cursor is data.lastId on the response envelope. The first paginator read it off the last swap, so it never advanced and every number until 2026-09-07 came from one 100-swap window. Reading the envelope reached 864 swaps in 10 pages.

finding 2 · identity
89 / 91 / 100

One page of 100 swaps carried 89 distinct tx and 91 distinct lgid. A routed trade emits several swaps under one hash. Neither field is a key; the pair is. De-duplicating on tx alone silently dropped 11% of real swaps.

finding 3 · the aggregate fields
6 / 200

24h_buy_volume + 24h_sell_volume reconciled with volume_24h on six of 200 sampled pairs; 55 were off by more than 100×. The counts are fine and the volumes are not, so the project computes from individual swaps instead.

the fix — split_tape.py, pull_swaps()
# scripts/split_tape.py · pull_swaps() — the fix that made depth real
-        cursor = batch[-1].get("txId") or batch[-1].get("lgid")   # a per-swap index: never advances
+        cursor = data.get("lastId")                                 # the envelope's cursor: advances
-        fresh = [s for s in batch if s.get("tx") not in seen]        # a routed trade = several swaps, one tx
+        key = (s.get("tx"), s.get("lgid"))                          # the pair is the identity
Run it before you score it

No key. No install. About thirty seconds.

This page is a dated snapshot — CoinMarketCap sends no Access-Control-Allow-Origin, so a static page cannot call it. The live capability is the script. It is stdlib-only Python and the endpoint is keyless, so the command below runs on a clean machine unchanged.

elephant — keyless
$ git clone https://github.com/edycutjong/elephant.git && cd elephant
$ python3 scripts/split_tape.py --address 0x00000000efe302beaa2b3e6e1b18d08d69a9012a --symbol AUSD --pages 8 --json ausd.json

splitting the tape — keyless, 8 page(s) x 100 swaps per token

token    swaps   avg buy $  avg sell $   ticket   buy w  sell w  top buy  top sell  net flow  note
AUSD       800   91,699.61  123,273.10     1.3x     212     111    11.7%     62.0%      2.1%

HERO — rule: max top-maker share of either side among |net flow| < 5.0%
  AUSD: one wallet is 62.0% of the sell side while net flow reads +2.1%
  sell: $25,459,824 in 12 swaps from 0x9f681e397f51137215b8240b8bf4e523d898661b
  buy: 467 swaps from 212 distinct wallets, largest 11.7%

wrote ausd.json  (29.4s wall clock, 0 credits — keyless)

Your numbers will differ — the window moves with the market, and that is the point: the receipt above was produced by this exact command at 2026-09-07 07:00:52 UTC. If the same wallet still dominates when you run it, the finding is persistent; if it does not, you have just watched the tape change.

Also in the repo: 36 tests (31 offline, 5 against the live contract), a 2,000-case property check that the maker share can never escape its own denominator, and a CI job that runs the real split on every push with no secret configured.

Questions a judge will ask

Honest limits.

Is this page live?

No, and it says so on every number. It is a snapshot captured 2026-09-07 07:00:52 UTC by the committed script. CoinMarketCap does not send Access-Control-Allow-Origin (verified on GET and OPTIONS), so a browser cannot fetch it directly and a page that pretended to would fail silently. The live thing is the CLI.

Is one wallet one entity?

Not necessarily, in either direction. One entity can spread across wallets, which makes the measured share a floor. A router or aggregator contract can appear as one maker for many users, which inflates it — the same address showing up as the top maker on both sides of a churn token is that pattern. The number is "share of the side attributed to one address", exactly as the API reports it, and nothing more is claimed.

How wide is the window?

The most recent 800 swaps at capture time, not 24 hours. For a stablecoin that may be days; for a meme coin, minutes. Wallet counts are distinct makers within the window, not lifetime holders. The confidence floors — at least five swaps per side, no side averaging under $1 — are printed, and rows failing them are shown with the reason rather than hidden.

Why not just use the 24h buy / sell volume fields?

Because they reconcile with volume_24h on 6 of 200 sampled pairs. An earlier design divided them; the sample killed it before a wrong number reached a judge. Everything here is computed from individual swaps, which also gives the maker address the aggregate fields never could.

What throttles?

The anonymous tier, per IP, and it reports the throttle as an HTTP 500 as often as a 429 (error 1022). The script backs off (15 s, 30 s, 60 s) and retries rather than failing the row, so a throttled run is slow rather than broken; when one IP's quota is exhausted outright — observed at roughly 3,700 calls in a day — it stops with a message that says so instead of printing a number. 29.4 s is the clean-path time. The way through is to wait a few minutes, or to export a free key as CMC_API_KEY, which moves the same call to the keyed endpoint. The default stays keyless; every receipt on this page was taken with no key set.

What is not built?

A hosted live tool with a token input. It needs a CORS proxy, and the project has not deployed one — claiming it would be a lie. What exists is the CLI, its receipts, this page and the deck. Alerts, watchlists, price charts and wallet labelling are deliberately out of scope: the product splits the tape, and that verb is the whole scope.

Net flow is one number. The split is four.

Run the split on a token you care about.