Polymarket feedconnecting

One market. Two prices.
crowd and model.

A prediction market quotes one number, and that number is doing two jobs: a forecast, and the premium people pay to hold it. Sonde separates them. Every live market gets the crowd's price and the model's price, side by side, and the distance between them — the sounding — is the only thing worth trading.

market · loading

one quote

Reading the board…one of the board's headline markets
crowd · the price leg · what the book is paying right now
model · the estimate leg · four named terms, no black box
·live markets on the board
·traded across them in 24h
·disagreements of 5pts or more
·refused: too thin to score

Why you'd need this

Four people, one board, incompatible questions.

A prediction market board answers one question well — what is the consensus — and four questions badly. Sonde exists because these four reads are obvious and nobody ships them together.

Edge hunter

Wants the disagreement, not the consensus

Sort the whole board by the gap instead of by volume. Every market carries the crowd's number, the model's number, and a confidence that says whether the gap is a signal or a thin book pretending to be one.

Reads the gap column

Narrative trader

Wants the heat before the price

Markets do not move alone; they move in families. The heatmap scores every narrative on live volume, weekly motion, book depth and how often the model disagrees inside it, so a category warming up is visible before its individual markets reprice.

Reads the heatmap

Wallet follower

Wants the size, not the opinion

Anyone's positions are public. Paste an address and you get their real open book, entry prices, unrealised P&L and how their decided positions actually landed — read live from Polymarket, not reconstructed from a screenshot.

Reads the wallet

Everyone else

Wants a record before risking money

Battles put you on the record against the model on the loudest disagreements. Your votes are graded against where the market actually goes, so you find out whether you are any good at this before it costs you.

Builds a record

None of this needs a new venue. It needs the existing one to stop being read as a single indivisible number.

How it works

One quote, four terms, one verdict.

A sonde is an instrument you drop into something to bring back a reading. This is the whole pass over one market, with real arithmetic: a longshot quoted at 4 cents, four months out, on a book a few hundred thousand deep.

  1. 1

    Read the quote, not the last print

    The crowd price is the mid of the best bid and best ask on the YES token, because that is the number you can actually transact against. The last trade is kept, but only as evidence about who is the aggressor.

    crowd = (bestBid + bestAsk) / 2 = 0.040
  2. 2

    Correct the tail

    Prediction markets pay too much for longshots and too little for favourites. The correction is one constant applied in logit space, so it is exactly zero at even money and grows with the distance from it.

    σ(1.05 × logit(0.040)) − 0.040 = −0.3pts
  3. 3

    Carry a quarter of the week's move

    A move that happened is information that has not finished arriving. A quarter of the 7d move carries, damped near the bounds where there is no room left, and damped again when there is no time left for it to play out.

    0.25 × move7d × room × timeWeight
  4. 4

    Pull toward the near side as it ends

    Close to resolution, the near side gets nearer. The pull decays with a ten day half-life, so a market a year out receives none of it and a market resolving tomorrow receives most of it.

    (target − crowd) × 0.10 × exp(−daysLeft / 10)
  5. 5

    Take the book skew, but only from a tight book

    A print away from the mid on a one-cent spread is someone paying up. The same print on a seven-cent spread is just the spread. Above five cents the term is switched off rather than guessed at, and it is capped at 2pts regardless.

    clamp(0.35 × (lastTrade − mid), ±0.02)
  6. 6

    Refuse what cannot be scored

    Confidence is built from depth, 24h volume, spread, Polymarket's own competitiveness score and the horizon. Under 35 it is quarantine: no verdict, no edge, no place on the board. A market nobody traded today is a memory, not a price.

    confidence < 35 → quarantine · volume24h = 0 → quarantine

What the estimator cannot do. It has no news, no language model, no private feed and no view of the world beyond the numbers above. It is a calibration layer over a crowd: at its best where the crowd is sloppy, useless where the crowd knows something it does not. That blind spot is exactly what the analyst leg is for — and it is kept strictly beside the arithmetic, never inside it.

What we found in the board

Both prices already exist inside the quote.

A prediction market price is not a probability. It is a probability multiplied by what people will pay to hold that probability — the longshot premium, the impatience of momentum traders, the cost of capital until resolution. Those are separate things, trading as one number, and they are separable from data the exchange already publishes.

// gamma-api.polymarket.com/markets?limit=1&order=volume24hr
crowd        0.040     bestBid 0.039 · bestAsk 0.041
move7d      -0.010     oneWeekPriceChange
daysLeft     121.4     endDate − now
liquidity  184,704     resting size on the book
volume24h   41,208     actually traded
                       → model 0.037 · gap −0.3pts · confidence 61

01 · The premium

A quote is never just a forecast

It carries the price of holding the position to resolution. Nobody quotes the two apart, and every terminal shows you their product.

02 · The evidence

Depth is not the same as agreement

Spread, resting size and 24h volume say how much the quote should be believed. Most boards sort on volume alone and hand you the loudest market, not the most reliable one.

03 · The identity

crowd = model + premium + noise

Name the premium terms and what remains is the noise. That subtraction is the whole product; everything else on this site is a view of it.

That last line is the whole idea. The forecast and the premium are already separated inside every quote on the board. They are multiplied together into one number, and nobody is trading them apart. Sonde does not have to invent the decomposition — it has to expose one that is already there.

The problem

A board sorted by volume hands you the loudest market, not the best one.

Volume ranks by attention. Attention is exactly where the crowd is thickest and the edge is thinnest. Sonde ranks by the disagreement between the quote and the model, then refuses to rank at all where the evidence is too thin to support a verdict.

01 · Read

Every live market, one row each

The board is built from Polymarket's own events endpoint, one row per event so a five-legged Fed market cannot take over the page. Siblings stay one click away.

02 · Estimate

Four named terms, no black box

Tail correction, momentum carry, resolution pull, book skew. Each reports its own contribution in points, and they sum to the whole disagreement.

03 · Route

The verdict goes to one leg only

Model above the crowd → the YES leg is cheap. Model below → the NO leg is cheap. Inside the noise → nobody. Too thin to score → quarantine, credited to nobody.

ObservedSondeConfidenceVerdict
Crowd under the model+5pts or more≥55→ YES leg
Crowd over the model−5pts or more≥55→ NO leg
Either, on weak evidence±2.5 to 5pts35–55→ a lean, sized as one
Agreementunder ±2.5ptsany→ nobody
Thin book, or nothing traded in 24hany<35→ quarantine

The estimator

Four terms, summed in probability space.

Verbatim from lib/model.ts. Probability space rather than logit space on purpose: every term can then be reported in the unit a trader reasons in, and the four of them add up to the disagreement with nothing left over.

// lib/model.ts
const longshot   = sigmoid(K_LONGSHOT * logit(crowd)) - crowd;
const momentum   = BETA_MOMENTUM * drift * room * timeWeight;
const resolution = (target - crowd) * KAPPA_PULL * Math.exp(-daysLeft / 10);
const skew       = spread <= 0.05                       // else 0
  ? clamp(LAMBDA_SKEW * (lastTrade - crowd), -MAX_SKEW, MAX_SKEW)
  : 0;

const model = clamp(crowd + longshot + momentum + resolution + skew, 0.01, 0.99);
if (confidence < MIN_CONFIDENCE || volume24hr < 1) return QUARANTINE;  // refuse, don't guess

Live

Run the estimator yourself.

The same function the terminal runs, running in your browser. Move the inputs and watch the verdict change. Note what a thin book does: the disagreement can be enormous and the answer is still no.

The same function runs here, on the market pages and on the terminal. Nothing is fitted to a backtest and nothing is fetched to compute it — move an input and the verdict is recomputed in your browser.

estimator · live

verdict

Aligned

The model and the crowd agree inside the noise. There is nothing here to trade.

Favourite–longshot−0.6
Momentum carry±0.0
Resolution pull±0.0
Book skew±0.0
crowd 4.0% · model 3.4% · gap −0.6 · confidence 71

Below 35 confidence the verdict is always quarantine; below 55 a disagreement is a lean rather than an edge. The four terms above sum to exactly the disagreement — there is no residual and no fifth term you cannot see.

The analyst leg

Two prices, and a third opinion that knows things.

The estimator has never heard of the question it is pricing. It sees a number, a spread, a date and a week of movement, and that is the whole of its world. So on every market page there is a second reader: Claude Opus 5, given the same market — the resolution criteria verbatim, the book, the history, and the estimator's own four terms — and asked what the arithmetic cannot answer.

01 · What it gets

The question, not the chart

The exchange's resolution criteria, both prices, every model term with its points, the depth and lean of the book, a 30-day price summary and who is holding which side. One deterministic prompt, so the request stays cacheable.

02 · What it returns

A schema, not an essay

A structured read: its own probability, whose number it lands nearer, two to four concrete drivers with the side each favours, the one event that would change its mind, and what it cannot see from here. Validated before it renders.

03 · What it never does

Move a number

The crowd price, the model price, the gap, every verdict and every ranking are computed without it. No key, a rate limit, a refusal or a bad night from the model changes nothing about the board — you simply lose the paragraph.

It costs money to run, so it is the one thing on this site that never happens on its own: a POST you trigger by hand, capped at an hourly allowance per server, and each read reused for fifteen minutes. Without an ANTHROPIC_API_KEY the panel says so in plain language and the rest of the page carries on.

// lib/llm.ts
const response = await client.messages.create({
  model: "claude-opus-5",
  max_tokens: 16_000,
  system: [{ type: "text", text: SYSTEM_PROMPT, cache_control: { type: "ephemeral" } }],
  thinking: { type: "adaptive" },
  output_config: { effort: "medium", format: zodOutputFormat(AnalysisSchema) },
  messages: [{ role: "user", content: buildAnalysisPrompt(ctx) }],
});

readAnalysis(response);  // refusal, truncation and off-schema answers each keep their own error

Data

Three public endpoints, no key, no scrape.

Markets and events from gamma-api, books and price history from clob, positions and holders from data-api. Responses are memoised for a minute so a refresh does not turn into a fan-out, and a stale snapshot is served with its age rather than an empty page.

markets

gamma-api

gamma-api.polymarket.com

statusreading…
latency·
detail·

order books

clob

clob.polymarket.com

statusreading…
latency·
detail·

positions

data-api

data-api.polymarket.com

statusreading…
latency·
detail·

coverage

markets on the board·
scored by the estimator·
quarantined (too thin)·
disagreements ≥ 5pts·
24h volume analysed·
resting liquidity seen·
snapshot age·

How to use it

Seven moves, start to finish.

Everything below works right now, with no account, no wallet and no key. Where something is derived rather than official, the step says so.

  1. 1

    Open the terminal works now

    The dashboard is the whole board in one screen: totals, the widest disagreements, the hottest narratives and the wallets holding size in today's markets.

    /dashboard
  2. 2

    Sort the board by the gap works now

    On Markets, switch the sort from volume to gap. Quarantined markets sink to the bottom by construction — they are shown, never ranked.

    /markets?sort=gap
  3. 3

    Paste any Polymarket link works now

    Drop a polymarket.com/event/… URL into the search box and every leg of that event comes back scored, whether or not it is on the board.

    /api/markets/from-url?url=…
  4. 4

    Read a wallet works now

    Smart money takes any 0x address and returns that wallet's live positions, entries, unrealised P&L and how its decided positions landed. Read-only, and public data throughout.

    /smart-money?address=0x…
  5. 5

    Take a side local to your browser

    Battles are the loudest live disagreements. Your votes are stored in your own browser and graded against where the market actually goes. There is no account, so there is also no shared tally to game.

    vote → localStorage → graded on the next price
  6. 6

    Ask the analyst needs a key

    On any market page, the analyst leg reads the question itself and answers with its own probability and the drivers behind it. It runs on request, never on load, and says so plainly when the server has no key.

    POST /api/analysis/<market id>
  7. 7

    Rank the wallets derived, not official

    Polymarket publishes no leaderboard endpoint, so Leaderboard builds one: the holders of today's most-traded markets, each priced from the same positions API. It is a ranking of wallets with size on today's board, not an all-time table, and the page says so on the page.

    holders(top 8 markets) → positions → rank

What this does not do

The uncomfortable half.