Developer documentation
The API base is https://api.trueodd.xyz. Interactive schema: https://api.trueodd.xyz/docs · OpenAPI JSON.
Discovery
Fetch GET https://api.trueodd.xyz/v1/service-metadata for the service catalog, identifiers, endpoints,
and payment configuration. GET /v1/supported-markets lists venues, families, and series.
| Service / command | Method & path | Billing role |
|---|---|---|
rwoo.best_signalsrwoo_best_signals | POST /v1/signals | x402-capable |
rwoo.check_marketrwoo_check_market | POST /v1/check-market | x402-capable |
rwoo.cross_venue_edgerwoo_cross_venue_edge | POST /v1/cross-venue-edge | x402-capable |
rwoo.get_calibrationrwoo_get_calibration | GET /v1/calibration | Free evidence |
Buyer-side execution services
Separate from the oracle services above. Every path is static and takes its identifiers —
intent_id, buyer_id — in the JSON request body, because a
marketplace listing URL cannot carry a path parameter. All twelve are x402-capable.
- Non-custodial. You derive your own venue deposit wallet locally and fund it yourself; this service never publishes a funding address and never takes custody.
- Buyer-submitted egress. You sign and post to the venue from your own network, so the venue's jurisdiction rules follow you rather than this host.
- Every identifier travels in the JSON request body. No path carries a placeholder.
- Autonomous execution is disabled. These endpoints prepare, inspect, and record; promotion to live trading stays locked until the evidence gate passes.
| Service | Method & path | Purpose |
|---|---|---|
rwoo.execution.prepare_certification | POST /v1/marketplace/execution/prepare-certification | Durably prepares one operator-approved, minimum-size certification order with risk checks and a committed exit policy. |
rwoo.execution.certification_proof | POST /v1/marketplace/execution/certification-proof | Applies buyer-machine venue proof across the certification phases and closes the session once the position is flat. |
rwoo.execution.submission_package | POST /v1/marketplace/execution/submission-package | Returns the EIP-712 fields, venue URL, and settlement requirements needed to sign a prepared order locally and submit it from your own network. No private key is ever accepted. |
rwoo.execution.record_submission | POST /v1/marketplace/execution/record-submission | Records the venue outcome you observed after submitting yourself. An accepted order is recorded as open, never as filled — only reconciliation establishes a fill. |
rwoo.execution.prepare_exit | POST /v1/marketplace/execution/prepare-exit | Evaluates kill switch, invalidation, stop loss, time exit, and take profit against the live executable bid, returning either a hold or a SELL package to submit yourself. |
rwoo.execution.record_exit | POST /v1/marketplace/execution/record-exit | Reserves a buyer-submitted exit against its position so the same shares cannot be sold twice by a polling agent. |
rwoo.execution.status | POST /v1/marketplace/execution/status | Returns durable execution state and the complete transition history for one intent. |
rwoo.execution.reconcile | POST /v1/marketplace/execution/reconcile | Resolves nonterminal and ambiguous venue outcomes against the venue of record. |
rwoo.execution.cancel | POST /v1/marketplace/execution/cancel | Cancels a prepared intent locally, or delegates an acknowledged order to the venue adapter. |
rwoo.execution.emergency_stop | POST /v1/marketplace/execution/emergency-stop | Engages the buyer-scoped, EOA-signed, replay-protected cancel-only kill switch. The direct route stays reachable without payment — payment must never stand between a buyer and halting their own trading. |
rwoo.execution.emergency_status | POST /v1/marketplace/execution/emergency-status | Reports whether a buyer kill switch is engaged, when, and why. |
rwoo.execution.emergency_clear | POST /v1/marketplace/execution/emergency-clear | Clears an engaged kill switch with a fresh EOA signature. Clearing is a deliberate signed action, never automatic. |
Best Signals command
Command: rwoo_best_signals ·
Service: rwoo.best_signals ·
Endpoint: POST /v1/signals
Send natural language such as Give me the best weather signals now
or
Give me the best signals on Kalshi
. The response ranks only candidates that pass the
current tradability gates. If none pass, it returns status: "no_signal" rather than an error.
{"message":"Give me the best weather signals now","limit":5}
Sports data available now
Sports are disclosed per family and market shape. A registered model does not by itself mean a live, actionable signal exists. The current scan contains 820 sports rows, of which 0 pass the scanner's actionability gates.
| Sport / family | Availability | Priced shapes and data | Honest boundary |
|---|---|---|---|
FIFA World Cupsports.world_cup |
live_signal_candidate |
2026 national-team winner, stage of elimination official FIFA calendar/rankings, World Football Elo |
Props, top scorer, goals, and exact matchup outcomes are not priced. Signals remain experimental unless exact-version prospective evidence is promotion-eligible. |
Tennissports.tennis |
conditional_engine |
head-to-head match winner with exact YES-side binding Ultimate Tennis Statistics Elo |
No qualifying markets in the current scan. Tournament outrights are unsupported because no draw/bracket simulation is wired. |
MLB / baseballsports.mlb |
conditional_engine |
head-to-head game winner with exact YES-side binding official MLB Stats API completed-game results |
No qualifying markets in the current scan. The current-season Elo model has no pitcher or lineup adjustment; World Series/champion outrights are unsupported. |
Club soccersports.club_soccer |
conditional_engine |
head-to-head match winner with exact YES-side binding ClubElo |
No qualifying markets in the current scan. Draw and home-field effects are not modeled, so ambiguous or unsuitable contracts fail closed. |
NBA / basketballsports.nba |
conditional_engine |
head-to-head game winner with exact YES-side binding ESPN season point differential (engine input) |
The conservative head-to-head parser and engine are wired. Champion futures remain model-missing; basketball requests return no_signal when no qualifying head-to-head row exists. |
NHL / hockeysports.nhl |
unsupported_fails_closed |
None currently No approved source/model |
Current champion futures are visible in scans but no approved champion model is wired. |
Esportssports.esports |
unsupported_fails_closed |
None currently No approved source/model |
Markets may be discovered, but no approved source and probability model are wired. |
Machine-readable coverage and live counts: GET /v1/supported-markets →
sports_coverage and current_sports_scan.
Active hurricane and Henry Hub coverage
Series are discovered from venue settlement metadata on each scan. Discovery never bypasses source, shape, model, or evidence gates.
| Market / family | Availability | Priced shapes | Sources / boundary |
|---|---|---|---|
Atlantic seasonal storm countsweather.hurricane_season | live_signal_candidate |
named storms above threshold, hurricanes above threshold, major hurricanes above threshold | NOAA CPC Atlantic seasonal outlook, NHC current-season summary Only structured NOAA-resolved Atlantic count thresholds are priced. Landfall, category-at-landfall, damage, and individual-storm paths are not inferred from this model. |
Henry Hub natural gasenergy.henry_hub_spot | live_signal_candidate |
calendar-year daily spot-price maximum above threshold | EIA Henry Hub DHHNGSP official series via FRED public mirror Only EIA-resolved annual-high thresholds are priced. Futures, weekly/monthly extrema, and unrelated gas-price definitions remain gated until separately validated. |
Natural-language examples: best hurricane signals
and best Henry Hub natural gas signals
.
Technical boundary: other energy and agriculture settlement sources are not product capabilities. Their exact settlement sources are not yet integrated, so those requests return no_signal.
Payments — OKX Agent Payments (x402)
Paid endpoints use x402 v2. An unpaid request receives HTTP 402 with a base64-encoded
PAYMENT-REQUIRED header containing x402Version: 2 and accepts[].
The agent wallet signs an accepted payment and re-sends the identical request body with a
PAYMENT-SIGNATURE header; on success it receives 200, a
PAYMENT-RESPONSE header, and a receipt whose payment_reference links the settlement.
- The official OKX middleware verifies and settles against the advertised amount, recipient, asset, network, and expiry.
- An
Idempotency-Keyretry returns the cached decision rather than initiating another application-level charge. - No buyer private key is ever accepted, and no signing flow is invented — your agent wallet produces the payload.
Prices, asset, network, and recipient appear in /v1/service-metadata.
Payment availability is reported independently from oracle coverage and trading execution.
Call it
curl -sS -X POST https://api.trueodd.xyz/v1/signals \
-H 'Content-Type: application/json' \
-d '{"message":"Give me the best weather signals now","limit":5}'
# A paid deployment answers 402 with a PAYMENT-REQUIRED header;
# have the agent wallet sign it, then re-send the identical body
# with PAYMENT-SIGNATURE to receive 200.
import httpx
BASE = "https://api.trueodd.xyz"
req = {"message": "Give me the best weather signals now", "limit": 5}
r = httpx.post(f"{BASE}/v1/signals", json=req, timeout=30)
if r.status_code == 402:
challenge = r.headers['PAYMENT-REQUIRED']
# Agent wallet signs the challenge; retry the identical body
# with the resulting PAYMENT-SIGNATURE header.
print(r.json())
const BASE = "https://api.trueodd.xyz";
const req = { message: "Give me the best weather signals now", limit: 5 };
const r = await fetch(`${BASE}/v1/signals`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(req),
});
// On 402, read PAYMENT-REQUIRED, sign with the agent wallet,
// then retry the identical body with PAYMENT-SIGNATURE.
console.log(await r.json());
{"message":"Give me the best weather signals now","limit":5}
Refusals vs errors
A market the oracle cannot safely price is a refusal: HTTP 200,
status: "refused", a stable reason_code, an explanation, the missing capability, and a
receipt. Malformed requests, unknown services, and payment failures are transport errors (4xx)
with a stable JSON shape: { "error": { "code", "message" }, "request_id" }.
| Code | HTTP | Meaning |
|---|---|---|
INVALID_REQUEST | 400 | Body failed schema validation or exceeded limits. |
MARKET_NOT_FOUND | 404 | The venue has no such market id. |
UNSUPPORTED_VENUE | 400 | Venue is not one of kalshi, polymarket, limitless. |
UNSUPPORTED_MARKET | 422 | No wired engine covers this market shape (refusal). |
ENTITY_UNBOUND | 422 | The entity/location/strike could not be bound (refusal). |
YES_SIDE_UNBOUND | 422 | Which side YES prices could not be determined (refusal). |
SOURCE_UNAVAILABLE | 503 | A required upstream source could not be reached. |
SOURCE_STALE | 422 | Source data is older than the freshness limit (refusal). |
SOURCE_CONFLICT | 422 | Sources disagree beyond tolerance (refusal). |
MODEL_MISSING | 422 | The engine declined to emit a probability (refusal). |
FEE_UNKNOWN | 422 | The venue fee term is not quantified (refusal). |
RATE_LIMITED | 429 | Too many requests, or an upstream rate limit. |
PAYMENT_REQUIRED | 402 | A paid endpoint was called without payment (x402 challenge). |
PAYMENT_INVALID | 402 | The presented payment failed verification. |
PAYMENT_REPLAYED | 402 | The payment nonce was already used. |
UPSTREAM_TIMEOUT | 504 | An upstream source timed out. |
INTERNAL_ERROR | 500 | An unexpected error (no stack trace is exposed). |
Semantics you must not confuse
Idempotency
Send an Idempotency-Key header to make a retry return the same result and receipt without re-charging.
Rate limits & timeouts
Requests are bounded and time-limited; a slow upstream returns UPSTREAM_TIMEOUT rather than hanging.
Confidence is not calibration
Model agreement (confidence) is the spread of the ensemble now. Calibration is the measured, precommitted historical hit rate. A high confidence with zero resolved events is not evidence — the API always reports the independent sample count.
Missing data stays missing
An unknown entity, unbound strike, or unverified fee never becomes a silent zero — it becomes a refusal.
Versions & changelog
Every forecast carries its model_version. Current engine versions:
| Family | Model version |
|---|---|
| weather.temperature | weather-ensemble-v3-power-calibrated |
| weather.precipitation | weather-hurdle-v2 |
| economics.core_cpi | core-cpi-official-ensemble-v2 |
| economics.headline_cpi | headline-cpi-official-ensemble-v2 |
| economics.gdp | gdp-official-ensemble-v2 |
| economics.labor | labor-official-history-v1 |
| economics.fed_rates | fed-hold-only-v1 |
| economics.recession | spf-recession-v1 |
| sports.world_cup | world-cup-live-bracket-elo-v2 |
| sports.tennis | tennis-uts-elo-v1 |
| sports.nba | nba-point-differential-v1 |
| sports.mlb | mlb-season-elo-v1 |
| sports.club_soccer | clubelo-match-v1 |
| weather.hurricane_season | noaa-seasonal-count-v2-update-aware |
| energy.henry_hub_spot | henry-hub-post-issuance-annual-max-v3 |
- v1.0.0 — ASP surface: Best Signals plus three supporting services, receipts, calibration evidence, and the OKX Agent Payments (x402) flow.