On-chain reconciliation for prediction-market bots

Your bot's logs lie.
FillProof doesn't.

FillProof reconciles what your bot claims against what the chain settled — fills, fees, resolutions, PnL. Every number is an on-chain fact or explicitly marked unknown. Nothing in between.

Read-only. No signing keys, no custody, no order routing. Just truth.

Three answers. One is true.
Exhibit Aone wallet · three answers
The bot's dashboardexpected profit, 6,904 signals
+$22,159.14Fiction
Its own shadow resolversame bot, different subsystem
88.3% winsFiction
The chain, 23 fills settledfees included, nothing estimated
−$76.34Fact
Two subsystems of the same bot disagreed with each other — and both disagreed with the chain. Verify it yourself: 0xb4eaaa… $5.285148 · 0xe71571… $5.570289 · 0x5dd3a6… $5.431999
2.51%
of traded volume paid in fees — invisible in every dashboard
$0.00
what the public API reported those fees as. 0 of 23 rows.
6,904 → 6
claimed signals vs fills that ever touched the chain
The fee you can't see is still a fee.

The fee you can't see

Polymarket's public trades API exposes no fee field — at all. Any tool built on it that shows a fee column is showing a fabricated zero. Your net PnL is overstated by every fee you've ever paid, and nothing on screen tells you.

What the API told us

$0.00
fees, across a wallet's complete trade history

What the chain recorded

$9.82
2.51% of $390.80 traded — enough to invert a strategy's profitability

Read three ways, one of them independent — and they must agree

The OrderFilled event's own fee field, on the wallet's row
The dedicated fee event, keyed to the fee-collector address
Settled pUSD transfer − price × size — the gap is the fee

The first two are read from the exchange’s own event log. The third is not — it is the settlement transfer itself, the money that actually moved, and it is the only one of the three outside the exchange’s own reporting. That is why a misreported fee would show up as a disagreement there.

FillProof computes all three on every fill. If they ever disagree, it flags the fill and keeps the fee unknown — a disagreement means the model of the contract is wrong, and you want to know, not average over it. On every fill audited so far, the three agreed exactly. Every figure is a whole number of settlement-token units, so there is no rounding to hide behind: a discrepancy of one millionth of a dollar would break it.

A blank is honest. A zero is a lie.
The rule the whole product is built on

Absent means unknown.
Never zero.

A missing measurement is never presented as a measured value. It's enforced in the schema, the engine, and every response: an unknown fee is null, an unmarked position is unknown, and net PnL stays unknown until every component is a fact. We'd rather show you a blank than a number we can't stand behind.

Five ways your log lies. One report that catches all of them.

POST what your bot thinks it did. FillProof returns the diff against venue truth — and tells you how each match was made, because match confidence is disclosed, not implied.

okprice_slippartialunfilledphantom
Your claimVenue recordDrift
buy 25 @ 0.47
BTC-up-1455
buy 25 @ 0.49
slipped 2¢ · cost $0.50
price slip
sell 40 @ 0.55
ETH-up-1500
sell 40 @ 0.55
exact
ok
buy 50 @ 0.31
SOL-up-1505
no venue record
unfilled
buy 100 @ 0.40
XRP-up-1510
buy 62 @ 0.40
38 shares short
partial
18 matched by order id (certain) 5 matched heuristically (probable) method disclosed on every row
"If you've never reconciled against venue records, you don't know your PnL — you know your bot's opinion of it."
A profitable backtest, a profitable log, and a profitable bot are three different things. Only one of them pays.
FillProof verification seal

Sixty seconds to find out if your bot has been lying to you.

Paste your wallet. Get a drift report on your last 50 fills — real fees, real drift, real net. Free, read-only, no email gate.

We report the gap. We never execute it. No signing keys — ever.

Plans
From a free single-wallet audit to a twenty-wallet desk, with wallet packs and Vault retention on top.
  • Continuous reconciliation on your wallets
  • Drift API — POST claims, get the diff
  • Fees verified on-chain — three readings, one independent, every fill
  • Honest PnL: facts, settlements, and nulls — never blended
  • Verified on-chain*

* Against the settlement contracts we cover — a list we publish and extend as Polymarket deploys new ones. Anything that settled elsewhere appears on your report as unmatched, never counted as verified.

See pricing