The incentive world-model, callable over HTTP. Ask any yes/no question about the future — it maps the actors and their incentives, selects the reasoning lenses, runs the physics, and returns a probability with its full reasoning. JSON in, JSON out — built to be consumed by agents and apps, not just humans. Free and rate-limited while experimental.
A forecast runs several independent reasoning passes plus an Ising physics solve, so it takes ~30–60s. The call is therefore asynchronous: submit a question, get a jobId, then poll until it's done.
| body | {"question": "<8–280 chars>"} — a yes/no question about the future |
| 200 | {"jobId": "j…"} |
| 400 | question must be 8–280 characters |
| 429 | rate limit: 8 questions/hour/IP |
| 503 | engine busy (≥4 forecasts running) — retry shortly |
| 200 | {"status": "running"|"done"|"error", "result": {…}, "elapsed": <sec>} |
| 404 | no such job (jobs expire ~15 min after completion) |
# 1) submit
JID=$(curl -s -X POST https://predict.wick.pics/api/ask \
-H 'content-type: application/json' \
-d '{"question":"Will the US and China sign a major trade deal before mid-2027?"}' \
| jq -r .jobId)
# 2) poll every 3s until done
while :; do
R=$(curl -s https://predict.wick.pics/api/ask/$JID)
[ "$(echo "$R" | jq -r .status)" = "done" ] && echo "$R" | jq .result && break
sleep 3
done
| probability | number 0–1 — P(the question resolves YES) |
| confidence | "low"|"med"|"high" — from ensemble agreement + structural coherence |
| incentive_map | string — the key actors and their real incentives driving the outcome |
| order_parameters | string[] — the 1–4 macro variables that actually govern the outcome |
| lenses_used | string[] — which simplifying theories were applied (e.g. veto_players, incentives, base_rates) |
| archetypes / patterns | string[] — the actor archetypes & incentive patterns the model tagged |
| coupling | object|null — the Ising actor graph: {actors, couplings, structural_p, frustration} (frustration→genuine contestedness) |
| base_rate | string — how people behaved under similar incentives historically |
| reasoning | string — 2–4 sentences, leads with the lens logic |
| analogs | string[] — historical analogs |
| ensemble | {passes:[{stance,p}], pooled} — the 3 reasoning stances + the pooled estimate |
| engine_version | string — e.g. 0.8-outside-view |
| generated_at | ISO-8601 timestamp |
The 50 standing forecasts are append-only and immutable once made, and will be externally scored as they resolve. That data is published as plain JSON:
| forecasts.json | all standing forecasts (claim, probability, reasoning, resolution criteria + date, status) |
| forecast/wm-NNNN.json | one forecast in full — e.g. wm-0001.json |
| scoreboard.json | Brier vs outcome and vs the crowd — populates as questions resolve (lower Brier = better; beating the market Brier = we add value) |
| index.json | machine-readable manifest |
GET /api/health → {"ok":true,"engine":"0.8-outside-view","jobs":N}
Access-Control-Allow-Origin: *). Current limits are 8 forecasts/hour/IP and 4 concurrent. Pay-per-call (x402) for higher throughput is planned — if you're an agent or builder who wants that, this is the surface it will hang off.