Every model number on this page comes from a frozen test set: 754 Polymarket markets whose UMA resolution was disputed between 1 August and 30 September 2026, none of which the model saw in training. The test set, labels and model scores are downloadable below so anyone can recompute the table.
Numbers are published once with their window and never edited. New model versions get new rows, never replaced ones. Wording: a market "settles differently from the disputed proposal"; a dispute blocks a proposal, it does not by itself change an outcome.
When a Polymarket market's proposed resolution is disputed on UMA, the free record at GET https://api.predge.io/v1/settlement-risk/{market} now carries settlement_estimate: the probability that the market settles differently from the disputed proposal. It is computed at the moment of the first dispute from what is public at that moment: the market price just before the dispute, the adapter, the market type and duration. Nothing after the first dispute is used. The field is inside the ed25519-signed payload, as a decimal string, next to the chain facts.
Context, 1 January to 2 October 2026 (on-chain, Polygon): 3,005 UMA disputes on 2,666 Polymarket markets; 323 markets disputed twice or more, which sends the outcome to a UMA token-holder vote; 853 of the 2,543 disputed markets that have settled (33.5%) settled differently from the disputed proposal.
Trained on disputes first raised 1 January to 30 June 2026 (1,478 settled disputed markets), calibrated on July (281), tested on August to September (754; 306 settled differently, base rate 40.6%). 95% intervals are bootstrap over the test set (1,000 resamples).
| model, inputs at prediction time | AUC | 95% CI | PR-AUC | P@50 | P@100 | P@250 | status |
|---|---|---|---|---|---|---|---|
| base rate (constant) | 0.52 | 0.48 to 0.56 | 0.42 | 0.42 | 0.41 | 0.42 | reference |
| category prior | 0.55 | 0.52 to 0.58 | 0.44 | 0.52 | 0.52 | 0.39 | reference |
| gradient boosting, creation-time metadata and rules text only | 0.58 | 0.54 to 0.62 | 0.51 | 0.58 | 0.53 | 0.50 | study |
| gradient boosting, plus pre-proposal prices (3 h and 24 h before the dispute) | 0.61 | 0.57 to 0.65 | 0.55 | 0.66 | 0.60 | 0.50 | study |
| settlement-estimate-v1: logistic regression, 15 features incl. price just before the first dispute, isotonic calibration; P@K in one arbitrary order of tied estimates | 0.674 | 0.638 to 0.709 | 0.568 | 0.76 | 0.67 | 0.53 | shipped to 2026-10-15 |
| settlement-estimate-v1.1: the same model and scores as v1; P@K averaged over every order of tied estimates (range: 0.72 to 0.88, 0.53 to 0.85, 0.376 to 0.644) | 0.674 | 0.638 to 0.709 | 0.568 | 0.776 | 0.65 | 0.519 | shipped since 2026-10-15 |
| gradient boosting, same inputs as v1 | 0.73 | 0.70 to 0.77 | 0.66 | 0.78 | 0.76 | 0.62 | study, not shipped |
Precision at K for v1 depends on how ties are broken: the calibrated estimate takes a few dozen distinct values (49 on the test set), and 91 test disputes share the estimate 0.6957 (ranks 69 to 159). The v1 row is the v1 model card's single order (docs/models/settlement-estimate-v1.json), which records signed under v1 carry. Averaged over every tie order they are 0.776, 0.65 and 0.519 for the top 50, 100 and 250 (first published here on 2026-10-14 as 0.78, 0.65 and 0.52). The gradient-boosted scores have no such ties. Brier for a constant forecast at the training-period rate (0.31) is 0.251; at the test period's own rate (0.41) it is 0.241.
Update 2026-10-15. The API now signs settlement-estimate-v1.1. It is v1 with the same constants, so every estimate is identical; the only signed change is evaluation.precision_at_100, now "0.65" (averaged over tied estimates) instead of v1's "0.67" (one tie order). AUC, PR-AUC and Brier do not depend on tie order and are unchanged. The v1 row and its numbers stay as published; records issued under v1 keep their model id and number and still verify.
The shipped model is the logistic one, not the stronger gradient-boosted one. The reason is operational and stated plainly: the logistic model is fifteen multiplications and a lookup, ports to a few lines of TypeScript inside the API, reproduces against fixtures, and needs no job, table or database on a free route. The 0.06 AUC gap is the price of that, and the next version will try to close it without giving up any of those properties.
| estimate bin | n | mean estimate | observed share |
|---|---|---|---|
| 0.00 to 0.20 | 228 | 0.13 | 0.19 |
| 0.30 to 0.40 | 11 | 0.40 | 0.18 |
| 0.40 to 0.50 | 4 | 0.45 | 0.25 |
| 0.50 to 0.60 | 181 | 0.56 | 0.48 |
| 0.60 to 0.70 | 262 | 0.65 | 0.46 |
| 0.70 to 0.80 | 50 | 0.79 | 0.70 |
| 0.80 to 1.00 | 18 | 0.98 | 1.00 |
The 0.60 to 0.70 bin over-estimates by about 0.19: the July calibration month ran hotter (47% settled differently) than August and September (39% and 42%). Monthly recalibration is the planned fix; until then, read a 0.65 as "more likely than not", not as 65%.
Share of settled disputed markets that settled differently from the disputed proposal, by the month the first dispute was raised. Any single headline percentage ages fast; this is why every number here carries its window.
Twice-disputed markets, whose outcome goes to a UMA token-holder vote, settle differently less often than once-disputed ones: 68 of 314 (21.7%, 95% Wilson 17.5% to 26.5%) against 784 of 2,218 (35.3%, 33.4% to 37.4%), disputes raised 1 January to 2 October 2026. For those markets the API gives this reference rate instead of a model score and labels it basis: reference_rate.
What was excluded so the test is honest. The strongest single "feature" available in Polymarket's market index is the last trade price, which alone gives AUC 0.935 on this task. It is excluded: markets keep trading after a proposal and during a dispute, so the last trade already reflects the crowd's view of how the dispute ends. The model uses prices read from the public order-book history at timestamps before the first dispute.
| field or practice | decision | reason |
|---|---|---|
gamma lastTradePrice, outcomePrices, bid, ask, spread | excluded | post-dispute trading and the final resolution |
UMA status history, closedTime, final number of disputes | excluded | encode the outcome of the process |
| final volume | excluded | includes trading during the dispute |
| rules text "Update" paragraphs; bulletin-board posts after the dispute | excluded | appended after the dispute |
| CLOB price just before the first dispute | included, labelled | visible to anyone at that moment; it does contain the market's reaction to the proposal |
| CLOB price 3 h and 24 h before the dispute | included | pre-proposal proxies (challenge windows are 0 to 2 h) |
| random cross-validation | not used | the monthly rate drifts; only the time split counts |
| vocabulary, scaling, class priors | fit on train and calibration months only |
The same study asked whether a market's chance of being disputed at all can be predicted at creation. On the whole population of 3,305,478 closed Polymarket markets with end dates January to September 2026 (2,413 disputed, 0.073%), creation-time features reach a weighted AUC of 0.71 (95% CI 0.69 to 0.72) on the August to September test months, but precision in the 1,000 highest-risk markets is 1 to 3% and a blind rules-reading test on category-matched pairs found no signal (AUC 0.53, 95% CI 0.40 to 0.67). So the API does not carry a per-market dispute probability. It carries segment_dispute_rate: how often markets of the same category and sports market type were disputed in 2026, with a Wilson interval, labelled as a segment statistic.
| category (2026, end dates Jan to Sep) | markets | disputed | rate |
|---|---|---|---|
| geopolitics | 2,389 | 61 | 2.55% |
| politics | 28,502 | 333 | 1.17% |
| tech | 3,020 | 20 | 0.66% |
| culture | 22,252 | 86 | 0.39% |
| finance | 35,379 | 80 | 0.23% |
| esports | 318,332 | 354 | 0.11% |
| weather | 146,648 | 106 | 0.07% |
| sports | 1,879,665 | 1,270 | 0.068% |
| crypto | 868,824 | 100 | 0.012% |
| other | 467 | 3 | 0.64% |
The plan: every new dispute gets its estimate at the moment it is raised, and about 30 days later, once the chain has settled it, the estimate is compared with what the chain settled, month by month (the share that settled differently, and the precision of the 10% highest estimates).
Live tracking starts once the nightly pipeline runs. That pipeline is not running yet, so there are no live numbers on this page. The model figures on this page come from the frozen test set of disputes raised August to September 2026.
| dispute month | settled disputes | settled differently | top-decile precision | mean estimate |
|---|
docs/models/settlement-estimate-v1.1.json (shipped; carries the tie-averaged block metrics_tie_averaged) and docs/models/settlement-estimate-v1.json (v1, unchanged) in predgeAI/predge-x402-api; the record's signature and canonicalization rule: /canonicalization.md.python3 -c "import json;from sklearn.metrics import roc_auc_score as a;r=json.load(open('test-set-2026-08-09.json'))['rows'];print(a([x['settled_differently'] for x in r],[x['estimate_v1'] for x in r]))"
Rules for this page: numbers carry their window; published numbers are never edited; a new model version adds rows. Nothing here is advice or a statement about any market's merits.