Pre-trade resolution-truth gate · Cross-venue trading agents

The same market is not the same bet.

Two venues list what looks like one trade (“BTC above $60,000,” “Mexico beats South Africa”), and your agent hedges one leg against the other. But they can settle on different oracles, at different instants, under different void rules. When they diverge, the risk-free hedge is a naked directional bet. Crosswire is the resolution-truth gate that sits in front of that trade: send two market references, get back SAFE / CAUTION / BLOCK and the exact divergence, before either leg fires. Stateless, machine-to-machine, $0.02 a call on Base.

Wire in the MCP Pay-per-call on Base

Read the x402 manifest →

agent · zsh
$ curl -s https://api.crosswire-api.com/v1/audit \ -H "Content-Type: application/json" \ -d '{"canonical_event_id": "crypto:btc-above:2026-06-27:strike-60000"}' \ | jq '{execution_verdict, findings: [.findings[].code]}' { "execution_verdict": "caution", "findings": ["settlement_source", "settlement_timing"] }

Polymarket settles on the Binance noon-ET close; Kalshi settles on CF Benchmarks BRTI, five hours later. Same strike, different oracle and a different instant. That gap is the finding.

The insight

Three ways the “same” market breaks.

A cross-venue price gap survives because the two legs are not the same bet. Crosswire names which divergence before it costs you the hedge. Lead example: a daily matched-strike “BTC above $X” pair.

01 · Settlement source

Who declares the result?

Polymarket’s bitcoin-above resolves on the Binance 1-minute close. Kalshi’s KXBTCD resolves on CF Benchmarks’ BRTI, a 60-second averaged index across multiple exchanges. Same strike, two different oracles. On a sharp wick they can disagree on which side of $60,000 the print landed. The hedge you booked against “the BTC price” was booked against two prices.

02 · Settlement timing

At exactly what instant?

Two legs that look simultaneous can resolve hours apart. The crypto pair that proved our pipeline was cross-hour: Polymarket resolved at noon ET (16:00Z), Kalshi at 5 PM EDT (21:00Z): a five-hour gap on the same calendar day. Even when the clock labels match, a single-minute close and a 60-second rolling average sample different windows. Crosswire flags the timing divergence rather than letting your bot assume simultaneity.

03 · Void rules & scope

What if it doesn’t resolve cleanly?

Void and scope rules diverge across venues, and a cancellation or out-of-scope outcome can void one leg while the other settles, turning a closed hedge into one open directional leg. On the free World Cup pairs this is live and fatal: Polymarket resolves a cancelled match to “No” while Kalshi resolves the same cancellation to a fair price. The gate BLOCKs on it. (Try that one without paying; see Live audit.)

One endpoint. An auditable answer.

Send the two market references; receive a Fungibility & Settlement Audit Object with the verdict and its reasons. Two real responses:

POST/v1/audit Request
request.json
{
  "canonical_event_id":
    "crypto:btc-above:2026-06-27:strike-60000"
}

Metered: 402 → sign → verdict (see “Wire it in”). CAUTION, not BLOCK: the question type matches, but the settlement source and instant diverge.

CAUTION Response · 200 · abridged · real engine output
fsao.json · abridged
{
  "canonical_event_id": "crypto:btc-above:2026-06-27:strike-60000#above",
  "leg_a": { "venue": "polymarket", "market_id": "0xb91da4c0…096af", "outcome": "Yes", "side": "yes" },
  "leg_b": { "venue": "kalshi", "market_id": "KXBTCD-26JUN2717-T59999.99", "outcome": "yes", "side": "yes" },
  "matching_confidence": 0.95,
  "semantically_fungible": true,
  "scope_divergence_flag": false,
  "void_rule_divergence_flag": false,
  "settlement_source_divergence_flag": true,
  "settlement_timing_divergence_flag": true,
  "findings": [
    { "code": "settlement_source", "severity": "warn", "affects_fungibility": false,
      "detail": "Polymarket = Binance BTC/USDT 1-minute close; Kalshi = CF Benchmarks BRTI 60-second average." },
    { "code": "settlement_timing", "severity": "warn", "affects_fungibility": false,
      "detail": "Polymarket resolves noon ET (16:00Z); Kalshi resolves 5 PM EDT (21:00Z): a 5-hour cross-hour pairing, flagged not papered over." }
  ],
  "fee_adjusted_true_spread": 0.046,
  "snapshot_age_seconds": 43,
  "execution_verdict": "caution",
  "ruleset_sha": "5d571399…df91f0"
}
Advisory · fail-open by default

The gate advises; it never trades. If Crosswire is unreachable, your bot proceeds exactly as it would without us, and the SDK marks the result degraded=true so you can alert on it. Strict mode (halt on uncertainty) is opt-in. During an outage in advisory mode a trap can slip through. That is the trade, and we state it rather than hide it.

The paid rail
Proof of life · real and on-chain, nothing invented
0
false-SAFEs to date
$0.02
settled M2M on Base
on-chain settlement
3 / day
free calls per identity

The settlement above is a real on-chain payment; verify it yourself on Basescan. It was our own funded test wallet paying to prove the rail end-to-end; it is not evidence of external demand, and we will not dress it up as traction. What is proven: the engine returns audited verdicts and the x402 rail settles real USDC. What is unproven: whether agents other than us pay for it yet. Every verdict is reproducible from {ruleset_sha, snapshot_ts, canonical_event_id}.

Covered now.

The identity graph is curated by hand: equivalence, settlement source, timing and void rules are read from each venue’s own rules text, then frozen and hashed. Free World Cup football pairs and the metered crypto matched-strike inventory (GRAPH-CRYPTO-01).

As of launch · 2026-06-11 ruleset af11f6c92521
World Cup football pairs · freeSee /v1/events for the live covered set · three pairs (home / draw / away) per match.
crypto: matched-strike daily “BTC above $X”Polymarket (Binance) ↔ Kalshi (BRTI) · metered

World Cup matches are three contract pairs (home, draw, away), matched across Polymarket and Kalshi at high confidence and free to call. The crypto inventory is the matched-strike pair that proved the pipeline, not a 24/7 market: the clean noon↔noon pair rolls daily and has a narrow live window, and a standing always-on sellable pair depends on the daily-roll resolver still in flight. Free endpoints (/v1/health, /v1/events, the MCP tools) are rate-limited at 10 requests per second per IP; the crypto /v1/audit inventory meters by x402, not by key.

For agents

Your agent wires this in without you.

Crosswire speaks MCP and x402. An agent that discovers the endpoint lists covered events and runs a pre-trade audit on its own, with no human and no key for the free tools. The World Cup graph is free; the crypto oracle-divergence inventory is metered at $0.02 USDC/call over x402 on Base.

x402 · pay-per-call Base mainnet

$0.02 USDC / audit

World Cup pairs stay free forever. The crypto: oracle-divergence inventory is metered: after 3 free calls/day, POST /v1/audit returns HTTP 402 with payment terms. Your agent signs a USDC micropayment, retries, and gets the FSAO. No API key, no human. Discoverable in the x402 Bazaar via /.well-known/x402.json.

/.well-known/x402.json · accepts[0]
{
  "scheme": "exact",
  "network": "eip155:8453",
  "amount": "20000",
  "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "payTo": "0x337878b1F8CcE042305Af9ac77201A5903a82218",
  "maxTimeoutSeconds": 60,
  "extra": { "assetTransferMethod": "eip3009", "name": "USD Coin", "version": "2" }
}

MCP · free, no key

  • check_resolution_risk: two market refs in, full FSAO out
  • list_covered_events: coverage, pair ids, ruleset sha
mcp.json
{
  "mcpServers": {
    "crosswire": {
      "url": "https://api.crosswire-api.com/mcp"
    }
  }
}

REST · keyed

Optional X-API-Key for free WC pairs; the crypto inventory meters by x402, not by key. Three lines to a verdict:

quickstart.sh
curl -s https://api.crosswire-api.com/v1/audit \
  -H "Content-Type: application/json" \
  -d '{"canonical_event_id": "wc26:match:USA-PAR:2026-06-12:result#home"}'

What we never do.

The boundary is the trust anchor. It is written into the spec and it does not move.