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 / commandMethod & pathBilling role
rwoo.best_signals
rwoo_best_signals
POST /v1/signalsx402-capable
rwoo.check_market
rwoo_check_market
POST /v1/check-marketx402-capable
rwoo.cross_venue_edge
rwoo_cross_venue_edge
POST /v1/cross-venue-edgex402-capable
rwoo.get_calibration
rwoo_get_calibration
GET /v1/calibrationFree 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.

ServiceMethod & pathPurpose
rwoo.execution.prepare_certificationPOST /v1/marketplace/execution/prepare-certificationDurably prepares one operator-approved, minimum-size certification order with risk checks and a committed exit policy.
rwoo.execution.certification_proofPOST /v1/marketplace/execution/certification-proofApplies buyer-machine venue proof across the certification phases and closes the session once the position is flat.
rwoo.execution.submission_packagePOST /v1/marketplace/execution/submission-packageReturns 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_submissionPOST /v1/marketplace/execution/record-submissionRecords 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_exitPOST /v1/marketplace/execution/prepare-exitEvaluates 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_exitPOST /v1/marketplace/execution/record-exitReserves a buyer-submitted exit against its position so the same shares cannot be sold twice by a polling agent.
rwoo.execution.statusPOST /v1/marketplace/execution/statusReturns durable execution state and the complete transition history for one intent.
rwoo.execution.reconcilePOST /v1/marketplace/execution/reconcileResolves nonterminal and ambiguous venue outcomes against the venue of record.
rwoo.execution.cancelPOST /v1/marketplace/execution/cancelCancels a prepared intent locally, or delegates an acknowledged order to the venue adapter.
rwoo.execution.emergency_stopPOST /v1/marketplace/execution/emergency-stopEngages 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_statusPOST /v1/marketplace/execution/emergency-statusReports whether a buyer kill switch is engaged, when, and why.
rwoo.execution.emergency_clearPOST /v1/marketplace/execution/emergency-clearClears 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 / familyAvailabilityPriced shapes and dataHonest boundary
FIFA World Cup
sports.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.
Tennis
sports.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 / baseball
sports.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 soccer
sports.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 / basketball
sports.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 / hockey
sports.nhl
unsupported_fails_closed None currently
No approved source/model
Current champion futures are visible in scans but no approved champion model is wired.
Esports
sports.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-marketssports_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 / familyAvailabilityPriced shapesSources / boundary
Atlantic seasonal storm counts
weather.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 gas
energy.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.

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" }.

CodeHTTPMeaning
INVALID_REQUEST400Body failed schema validation or exceeded limits.
MARKET_NOT_FOUND404The venue has no such market id.
UNSUPPORTED_VENUE400Venue is not one of kalshi, polymarket, limitless.
UNSUPPORTED_MARKET422No wired engine covers this market shape (refusal).
ENTITY_UNBOUND422The entity/location/strike could not be bound (refusal).
YES_SIDE_UNBOUND422Which side YES prices could not be determined (refusal).
SOURCE_UNAVAILABLE503A required upstream source could not be reached.
SOURCE_STALE422Source data is older than the freshness limit (refusal).
SOURCE_CONFLICT422Sources disagree beyond tolerance (refusal).
MODEL_MISSING422The engine declined to emit a probability (refusal).
FEE_UNKNOWN422The venue fee term is not quantified (refusal).
RATE_LIMITED429Too many requests, or an upstream rate limit.
PAYMENT_REQUIRED402A paid endpoint was called without payment (x402 challenge).
PAYMENT_INVALID402The presented payment failed verification.
PAYMENT_REPLAYED402The payment nonce was already used.
UPSTREAM_TIMEOUT504An upstream source timed out.
INTERNAL_ERROR500An 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:

FamilyModel version
weather.temperatureweather-ensemble-v3-power-calibrated
weather.precipitationweather-hurdle-v2
economics.core_cpicore-cpi-official-ensemble-v2
economics.headline_cpiheadline-cpi-official-ensemble-v2
economics.gdpgdp-official-ensemble-v2
economics.laborlabor-official-history-v1
economics.fed_ratesfed-hold-only-v1
economics.recessionspf-recession-v1
sports.world_cupworld-cup-live-bracket-elo-v2
sports.tennistennis-uts-elo-v1
sports.nbanba-point-differential-v1
sports.mlbmlb-season-elo-v1
sports.club_soccerclubelo-match-v1
weather.hurricane_seasonnoaa-seasonal-count-v2-update-aware
energy.henry_hub_spothenry-hub-post-issuance-annual-max-v3