Pre-trade resolution audit · Cross-venue event markets

The same match is not the same bet.

One venue settles a cancelled match to “No”; the other resolves it to a fair price. One market ends at 90 minutes; another includes extra time. Crosswire is a pre-trade resolution audit for cross-venue event markets: before your agent fires both legs of a hedge, it asks us whether the two contracts actually settle the same way. It gets the exact divergence that would break the trade. SAFE, CAUTION, or BLOCK.

Get an API key Call the MCP tool
operator · zsh
$ curl -s https://api.crosswire-api.com/v1/audit \ -H "X-API-Key: $CROSSWIRE_KEY" -H "Content-Type: application/json" \ -d '{"canonical_event_id": "wc26:match:MEX-RSA:2026-06-11:result#home"}' \ | jq '{execution_verdict, findings: [.findings[].code]}' { "execution_verdict": "block", "findings": ["void_rule", "settlement_source", "settlement_timing"] }
What the gate checks

Three ways the “same” market breaks.

Cross-venue price gaps survive because the two legs are not actually the same bet. The audit names the divergence before it costs you the hedge.

01 · Scope

Where does the match end?

A market that pays on the 90-minute result is not a hedge for one that includes extra time and penalties. A draw at 90 that is decided on penalties settles the two legs inconsistently. The spread between them was never capturable.

02 · Void rules

What happens to a cancelled match?

On the matches we cover today, Polymarket resolves a cancelled match to “No” while Kalshi resolves the same cancellation to a fair price. One leg voids while the other settles. This divergence is live on every covered pair. It is the launch finding. The gate blocks on it.

03 · Settlement source & timing

Who declares the result, and when?

fifa.com statistics adjudicated by UMA on one venue; internal settlement with no external source cited on the other, and no stated timing. Contested or late-corrected results can settle differently, or hours apart.

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":
    "wc26:match:MEX-RSA:2026-06-11:result#home"
}

Authenticated with the X-API-Key header. The pair can also be named by its two venue market ids.

BLOCK Response · 200 · served from production
fsao.json · abridged
{
  "audit_id": "aud_01KTW12YWQ7981AXFX2SFE3JAE",
  "canonical_event_id": "wc26:match:MEX-RSA:2026-06-11:result#home",
  "leg_a": { "venue": "polymarket", "market_id": "0x4cd77d45…10ff" },
  "leg_b": { "venue": "kalshi", "market_id": "KXWCGAME-26JUN11MEXRSA-MEX" },
  "matching_confidence": 0.98,
  "semantically_fungible": false,
  "scope_divergence_flag": false,
  "void_rule_divergence_flag": true,
  "settlement_source_divergence_flag": true,
  "settlement_timing_divergence_flag": true,
  "findings": [
    { "code": "void_rule", "severity": "fatal",
      "detail": "Void conditions differ … A core void asymmetry
                 can void one leg while the other settles.",
      "affects_fungibility": true },
    { "code": "settlement_source", "severity": "warn",
      "detail": "fifa.com (UMA-adjudicated) vs Kalshi internal …" },
    { "code": "settlement_timing", "severity": "warn",
      "detail": "2h statistics fallback vs unspecified …" }
  ],
  "fee_adjusted_true_spread": -0.011,
  "execution_verdict": "block",
  "ruleset_sha": "af11f6c92521…b6029f"
}
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.

Operating facts · measured, not promised
1.9 ms
server-side p50 per audit
4
matches covered today
12
contract pairs audited
af11f6c92521
frozen ruleset sha

p50 measured on the production serving path over 100 keyed requests, 2026-06-11. The request path is a cache read, not a live recompute, and we make no latency guarantees. Network time from your machine is yours. Every verdict is logged, append-only, and reproducible from {ruleset_sha, snapshot_ts, canonical_event_id}.

Covered now.

The identity graph is curated by hand: equivalence, void rules and resolution sources are read from the venues’ own rules text, then frozen and hashed. Coverage expands daily through the tournament; each freeze bumps the ruleset sha.

As of launch · 2026-06-11 ruleset af11f6c92521
Mexico vs South Africa2026-06-113 pairs · home / draw / away
Korea Republic vs Czechia2026-06-113 pairs · home / draw / away
Canada vs Bosnia-Herzegovina2026-06-123 pairs · home / draw / away
United States vs Paraguay2026-06-123 pairs · home / draw / away

Each match is three contract pairs (home, draw, away), matched across Polymarket and Kalshi at 0.98 confidence. Free endpoints (/v1/health, /v1/events, the MCP tools) are rate-limited at 10 requests per second per IP; /v1/audit requires a key.

For agents

Your agent can wire this in without you.

Crosswire speaks MCP. An agent that discovers the endpoint can list the covered events and run a pre-trade audit on its own. No human in the loop; no key needed for the MCP tools.

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

Free opening-weekend keys are issued by mail while the program runs. Three lines to a verdict:

quickstart.sh
curl -s https://api.crosswire-api.com/v1/audit \
  -H "X-API-Key: $CROSSWIRE_KEY" -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.