Predge rules whether an agent's paid job was delivered, with a bond behind every ruling.

Predge is the trust and dispute layer for AI-agent payments. The rails move the money; Predge answers the question they leave open, was the paid job delivered?, with a signed ruling, a refund when the work never arrived, and a bond anyone can take if the ruling cites evidence nobody filed. We do not run a rail. Live today: x402 payments on Base, Solana, Arc, Monad and Algorand, and the arbiter contracts on 16 mainnets including Circle's Arc; the design is rail-agnostic. Prediction markets are the first vertical: the same signed records track settlement risk on Polymarket, where we analyzed 3,005 UMA disputes from 1 Jan to 2 Oct 2026.

Example
An agent pays for a report that never arrives. The payer files its evidence hash on-chain, Predge rules refund citing that hash, and the refund lands. If Predge had cited evidence nobody filed, anyone could take its bond during the next 24 hours.
01 · Agent job delivered?

Verdicts and the bond

Predge sits in the arbiter seat of a refund protocol (the shape of Circle's Refund Protocol and the x402r refund extension). The contract, PredgeRefundArbiter, limits what that seat can do.

  1. Parties file evidence. The payer or the merchant files sha256(evidence) on-chain under its own key.
  2. Predge rules, citing it. The ruling records the evidence hash and the direction (refund or release) before any money moves. rule() only accepts evidence that was already filed on-chain.
  3. 1-day challenge window. Every ruling is backed by a stake held in the contract. For 86,400 seconds anyone can call challenge.
  4. Slash if it cites unfiled evidence. challenge takes no input from the caller: it compares the hash Predge cited with what the party filed. A ruling that cites evidence nobody filed loses the bond. An honest ruling reverts every challenge and its stake is reclaimable after the window.
What the bond covers, plainly: it catches an arbiter that fabricates the record it claims to have read. It does not prove that a ruling was correct.

Live on Arc mainnet (chainId 5042)

ContractAddress
PredgeRefundArbiter0xA9c39e9aEd452Ee638a10aC10f6A6288C4Ca6E89
MockRefundProtocol (demo target)0xf6659f725B3F790287a75f7A83C373E2a3D908aa
PredgeValidatorBond v2.10xfeE8b89eb8aa2499F7025Cd9aaEB13a4b046d0d1
AgentJob (ERC-8183)0x8B9589B8F5857dDe080Ac68e8B370c3bA5E74495
PredgeAgentValidator (ERC-8004)0xbe601d486D821450F9248ab91891736B1a09699F

Read on chain: this arbiter (0xA9c3…6E89) has challengeWindow = 86400 s and minBond = 0.05 USDC (Arc's native gas token); bond disputeWindow = 86400 s. The 0.05 USDC floor applies to this earlier Arc arbiter only.

A full run on mainnet

The payer files evidence, the arbiter rules citing exactly that record, the refund lands, and a challenge against it reverts: fileEvidence · rule. Then a ruling that cites evidence nobody filed, and the challenge that takes its bond.

That run (18 Sep 2026) used the previous arbiter version, 0xA1533757…5Ad967. The live arbiter above adds one rule: evidence must be filed on-chain before it can be cited. Source and receipts: predgeAI/predge-arc.

Live on 16 mainnets, same addresses everywhere

One contract set, one address per contract, on every chain below. Sources verified on Sourcify (exact match).

ChainchainIdLinks
Ethereum1arbiter · source
Base8453arbiter · source
BNB Chain56arbiter · source
Arbitrum One42161arbiter · source
Optimism10arbiter · source
Polygon137arbiter · source
Avalanche C-Chain43114arbiter · source
Celo42220arbiter · source
Gnosis100arbiter · source
Linea59144arbiter · source
Unichain130arbiter · source
Sonic146arbiter · source
Arc5042arbiter · source
Monad143arbiter · source
Mantle5000arbiter · source
Robinhood Chain4663arbiter · source
ContractAddress (all 16 chains)
PredgeRefundArbiter0xb2972B4944Eec83946EB7B23D572AbE04F46E22c
PredgeValidatorBond v2.10x800B5596a8540e752dE8f8a8AF99E927d139A643
PredgeAgentValidator (ERC-8004)0x925767fdce6C819F027f55CC50464e3bCdfD2671
AgentJob (ERC-8183)0xcBaB4a9FA4d756b4C5e2a18F055d2E0132CE7D1D
PredgeSettlement0x47BE8a7d461De505723a0Ac1d74982e53f8E412b
MockRefundProtocol (demo target)0xcaC30945CDF0F963f38972d939e111B87b80Cf79

Read on chain, same on all 16 chains: arbiter challengeWindow = 86400 s, minBond = 1015 wei, i.e. 0.001 of the chain's native token (0.001 ETH on Ethereum and the ETH L2s, 0.001 BNB, POL, AVAX, CELO, xDAI, S, MNT or MON elsewhere; on Arc the native token is USDC, so 0.001 USDC). The bond is posted in the native token.

Deployed 18 Oct 2026 from 0x5d016C1B4d7A42eB7c982da1Ae7fFdB958CFCAe9. Receipts per chain: predgeAI/predge-deploy. The Arc table above is the earlier Arc deployment and the full mainnet run; both stay live. Need another EVM chain? Ask us: it deploys in a day.

Pricing

Free30-day pilot
$0.05per verdict, on calls under $1
$0.50per verdict, on calls of $1 and above

To start a pilot, write to hello@predge.io or Telegram.

02 · Prediction markets

Settlement risk

One call tells you whether a Polymarket market's resolution is settled, disputed or waiting on a UMA vote, read live from UMA's Optimistic Oracle and Polymarket's UMA CTF adapter on Polygon. Free, no key, signed.

curl https://api.predge.io/v1/settlement-risk/:market

:market = condition id, numeric market id or slug.

Protocol V2 markets: UMA-resolved ones are read through Polymarket's OracleAggregator (protocol: "v2"); Chainlink- or EOA-reported and atomic neg-risk V2 markets return 422 unsupported_protocol_v2 until supported. A 422 or 404 is never a "no risk" answer.

What you get

  • risk_level: ok (no proposal or dispute), watch, caution (disputed, sent to a UMA vote, or paused), resolved (the on-chain resolution is final).
  • uma_state, dispute_count, every dispute with its tx, sent_to_uma_vote, bulletin-board updates, onchain_resolution.
  • segment_dispute_rate: how often 2026 markets of this kind were disputed, with a 95% interval.
  • attestation: an ed25519 signature over the record, key id 13fa3d18a369e6c7. See Verify.

Dispute tracker (free)

Every Polymarket market disputed on UMA in the last 30 days, with its status (disputed, uma_vote, resolved) and a link to its signed record. Page: data.predge.io/disputes. Embeddable badge: <iframe src="https://data.predge.io/badge?market=ID" width="320" height="96">.

curl https://api.predge.io/v1/settlement-risk/active

Settlement estimate (paid)

GET https://api.predge.io/v1/settlement-risk/:market/estimate

The full signed record plus settlement_estimate. $0.02 per call over x402, in USDC on Base, Solana, Algorand, Arc or Monad; the payment that bought it sits inside the signed record. A 400/404/422/502 is not charged; Protocol V2 markets return 422 unsupported_protocol_v2 here until the estimate supports them. Pilot partners can get a key (x-predge-key header) that unlocks it without payment.

Signed payment receipts follow the open spec in predgeAI/x402-receipts.

Desk: alerts on the markets your wallets hold

For traders. Add up to 10 wallets; every Polymarket market they hold is watched, and each settlement event is sent to your webhook and Telegram: proposal, dispute, uma_vote (disputed twice, the outcome goes to a UMA vote), bulletin_update (clarifications and other notices) and resolution. Every event carries the signed settlement-risk record, the evidence for each dispute. Desk: contact us (hello@predge.io), 14-day free trial.

curl -H "x-predge-key: $DESK_KEY" https://api.predge.io/v1/desk/config
curl -X PUT -H "x-predge-key: $DESK_KEY" -H "content-type: application/json" \
  -d '{"wallets":["0x…"],"webhook_url":"https://you.example/hook","telegram_chat_ids":["123456789"]}' \
  https://api.predge.io/v1/desk/config
curl -X POST -H "x-predge-key: $DESK_KEY" https://api.predge.io/v1/desk/test
curl -H "x-predge-key: $DESK_KEY" https://api.predge.io/v1/desk/events

Webhook deliveries are signed: x-predge-signature: sha256=HMAC-SHA256(secret, "<x-predge-timestamp>.<raw body>"). Reject timestamps more than 5 minutes off. Non-2xx answers are retried for about an hour. The same key covers 5,000 /estimate calls a month.

03 · For agents

Whale data API and MCP

Polymarket whale trades, wallet track records ranked by outcome-verified edge, smart-money signals and signed attestations. Pay per call in USDC over x402: no account, no API key.

RoutePrice
GET /v1/whales/latest$0.005
GET /v1/wallets/leaderboard$0.01
GET /v1/wallets/:address$0.01
GET /v1/signals/consensus$0.03
GET /v1/attest/:conditionId$0.02, signed

Full route list and prices: api.predge.io · openapi.json · /.well-known/x402. Paid data is delayed 15 minutes.

Call it from code

npx x402-proxy https://api.predge.io/v1/whales/latest?limit=10

Any x402 client works (for example @x402/fetch): request the route, read the 402, pay, retry.

MCP server

claude mcp add predge-whale-data \
  -e BUYER_PRIVATE_KEY=0xYOUR_FUNDED_BASE_KEY \
  -e X402_NETWORK=base \
  -- npx -y @predge/whale-data-mcp

@predge/whale-data-mcp on npm (source). Paid tools spend real USDC and are hard-capped by MAX_PRICE_USD ($0.05 by default) before any money moves. The free tools (discovery, settlement risk, record verification) need no key. Use a dedicated low-balance buyer wallet.

04 · Trust nothing

Verify a signature

Every signed record carries an attestation with canonical (the exact signed bytes), signature and kid. Check it offline against Predge's published key, not the key inside the response.

Key id (kid)13fa3d18a369e6c7
ed25519 public key13fa3d18a369e6c71bf941563ba47822b30182273d5106a0e8fb61c5016352d9
Key registryapi.predge.io/.well-known/predge-keys.json
// Node 20+, no dependencies
import { createPublicKey, verify } from "node:crypto";
const PREDGE_KEY = "13fa3d18a369e6c71bf941563ba47822b30182273d5106a0e8fb61c5016352d9";
const r = await (await fetch("https://api.predge.io/v1/settlement-risk/5608010")).json();
const a = r.attestation;
const key = createPublicKey({ format: "der", type: "spki",
  key: Buffer.concat([Buffer.from("302a300506032b6570032100", "hex"), Buffer.from(PREDGE_KEY, "hex")]) });
console.log(verify(null, Buffer.from(a.canonical, "utf8"), key, Buffer.from(a.signature, "hex"))); // true

What is signed

On settlement-risk records (payload_version: "2", since 18 Oct 2026) the signature also covers the market question and slug, the sha256 of every bulletin-board update, and the Polygon block every read was made at (block: number and hash). Every eth_call runs at that block, so an archive node reproduces the record exactly. Since payload_version: "3" the market dates are signed under their Polymarket names: gamma_end_date (the scheduled end set at creation, often stale), uma_end_date and closed_time (when the market actually closed), each ISO-8601 UTC or null, with the raw Gamma strings in gamma_dates_raw. The version 2 field end_date is gone; read gamma_end_date for the same value. Older records stay valid.

The whole HTTP body is signed too, in the x-predge-body-signature header: ed25519 over predge-body-v1, a newline, then the raw body bytes.

const res = await fetch("https://api.predge.io/v1/settlement-risk/5608010");
const body = Buffer.from(await res.arrayBuffer());
const sig = /sig=([0-9a-f]{128})/.exec(res.headers.get("x-predge-body-signature"))[1];
console.log(verify(null, Buffer.concat([Buffer.from("predge-body-v1\n"), body]), key, Buffer.from(sig, "hex"))); // true

Spec: data.predge.io/canonicalization.md, sections 5a and 5b. Python: python3 verify_record.py record.json --body-signature "<header>" (verify_record.py).

No code: paste a record into data.predge.io/verify. For signed x402 payment receipts, the spec, TypeScript library and test vectors are in predgeAI/x402-receipts.

05 · Talk to us

Contact

Email hello@predge.io or message us on Telegram: t.me/latcom.

PREDGE. · predge.io/docs
Home · Store · For AI · hello@predge.io