Prediction market friction tracker
Structured KYC, fee, and withdrawal data across 12 prediction-market venues, plus a change feed for when those terms move and a natural-language "which venue is best for X" recommendation tool. Built for AI agents that need to check execution friction before routing a trade — not for humans clicking around a dashboard.
Live now: https://prediction-friction-tracker-production.up.railway.app
For agents: three ways in
- Plain HTTP —
GET /friction/venues,GET /friction/venue/{slug},GET /friction/changes?since=<ISO8601>. Full OpenAPI spec at/openapi.json, interactive docs at/docs, agent-readable summary at/llms.txt. - MCP — a streamable-HTTP MCP server mounted at
/mcp/, exposinglist_venues,get_venue,recommend_venue, andget_changes_infoas tools. Point any MCP-compatible client at the/mcp/URL directly. - x402 —
/friction/changes(the time-sensitive change feed) is gated by the x402 protocol: unpaid requests get a real402with a payment challenge; pay $0.05 USDC on Base mainnet and retry to get the data. This is live, verified end-to-end with real money, not a demo — seeapi.pyfor the CDP-facilitator wiring.
Endpoints
| Endpoint | Cost | What it returns |
|---|---|---|
GET /friction/venues | Free | Current snapshot of every tracked venue. Optional ?confidence=verified|stale|unconfirmed filter. |
GET /friction/venue/{slug} | Free | One venue's current fee/KYC/withdrawal/API-access data, e.g. /friction/venue/kalshi. |
GET /friction/changes?since=<ISO8601> | $0.05 USDC (x402) | Append-only log of every detected change since a timestamp — the time-sensitive product. |
Every record carries a confidence field: verified (spot-checked or
high-confidence extraction), stale (source was unreachable, showing a
cached value), or unconfirmed (LLM extraction was ambiguous). Treat
unconfirmed as a lead to verify against the venue directly, not a fact to
trade on.
MCP tools
list_venues(confidence)— browse/filter the current snapshot.get_venue(slug)— one venue's full data.recommend_venue(query)— free-text "which venue is best for lowest fees on high-frequency trading" / "I don't want to do KYC" / "API access without a wallet" style questions, reasoned over the current dataset. Says so explicitly rather than guessing when a query depends on data this tracker doesn't have (liquidity, volume, spread, uptime).get_changes_info()— describes the paid change feed (URL, price) without reimplementing it for free.
What's here
| File | What it does |
|---|---|
schema.py | The data model — one VenueFriction record per venue, plus the VenueRecommendation response shape |
venues.py | The 12 tracked venues and their policy-page source URLs |
scrapers/base.py | Fetches and cleans raw policy-page text (requests + Playwright fallback for JS-rendered pages) |
extract.py | Sends raw page text to Claude, gets back a structured VenueFriction matching the schema |
recommend.py | Natural-language venue recommendation — reasons over the current dataset via Claude, structured-output constrained to real venue slugs |
reference_check.py | Cross-checks scraped fees against a third-party source (TradeBlock), flags divergences for human review |
storage.py | SQLite: current_state table (latest snapshot) + change_log table (append-only, the paid product) |
diff.py | Compares a fresh extraction to the stored one, writes a ChangeEvent for anything that moved |
run_pipeline.py | Orchestrates fetch → extract → diff → store, for all 12 venues |
api.py | FastAPI server — the HTTP endpoints above, x402 payment gating, MCP mount |
mcp_server.py | The MCP tool definitions, mounted into api.py at /mcp/ |
test_pipeline_logic.py, test_recommend_logic.py | Pure-logic tests, no API key needed |
Running it locally
pip install -r requirements.txt
python test_pipeline_logic.py # no API key needed, proves storage/diff logic
python test_recommend_logic.py # no API key needed, proves recommendation logic
export ANTHROPIC_API_KEY=sk-ant-...
python run_pipeline.py # real scrape -> extract -> store, all 12 venues
uvicorn api:app --reload # boots the API on localhost:8000
Then in another terminal:
curl http://localhost:8000/friction/venues
curl http://localhost:8000/friction/venue/kalshi
curl "http://localhost:8000/friction/changes?since=2020-01-01T00:00:00Z"
See CLAUDE.md for environment quirks, Claude API usage notes, and the
data-quality/confidence model in more depth.
Informational only — not financial or legal advice. Verify directly with the venue before acting on any figure returned here.