GET /v1/edge/backtest

$0.05dailytier: deepcache 86400sEngine C — Weather × Markets Edge

Aggregates stored edge signals whose markets have resolved: how often the model beat the market (hit rate), average absolute-error improvement (edge captured), a model calibration curve, and per-hazard breakdowns. model_label is explicit about which model produced the signals.

Parameters

NameInTypeRequiredNotes
windowqueryintegerno (default: 90)
min_divergencequerynumberno

Example

curl "https://x402-factory.com/v1/edge/backtest?window=90"

Example response

{
  "data": {
    "n_signals": 106,
    "hit_rate": 0.547,
    "avg_edge_captured": 0.0089,
    "calibration_curve": [
      {
        "bucket": "0.0–0.1",
        "predicted": 0.066,
        "realized": 0
      },
      {
        "bucket": "0.1–0.2",
        "predicted": 0.157,
        "realized": 0.286
      },
      {
        "bucket": "0.2–0.3",
        "predicted": 0.267,
        "realized": 0.571
      },
      {
        "bucket": "0.3–0.4",
        "predicted": 0.346,
        "realized": 0.357
      },
      {
        "bucket": "0.4–0.5",
        "predicted": 0.435,
        "realized": 0.556
      },
      {
        "bucket": "0.5–0.6",
        "predicted": 0.545,
        "realized": 0.615
      },
      {
        "bucket": "0.6–0.7",
        "predicted": 0.643,
        "realized": 0.688
      },
      {
        "bucket": "0.7–0.8",
        "predicted": 0.754,
        "realized": 0.727
      },
      {
        "bucket": "0.8–0.9",
        "predicted": 0.844,
        "realized": 0.867
      },
      {
        "bucket": "0.9–1.0",
        "predicted": 0.958,
        "realized": 0.857
      }
    ],
    "by_hazard": [
      {
        "hazard": "precip_above",
        "n": 24,
        "hit_rate": 0.5
      },
      {
        "hazard": "wind_above",
        "n": 24,
        "hit_rate": 0.625
      },
      {
        "hazard": "temp_above",
        "n": 23,
        "hit_rate": 0.435
      },
      {
        "hazard": "any_precip",
        "n": 19,
        "hit_rate": 0.632
      },
      {
        "hazard": "named_storm_landfall",
        "n": 16,
        "hit_rate": 0.563
      }
    ],
    "model_label": "stub-model"
  },
  "meta": {
    "endpoint": "/v1/edge/backtest",
    "version": "1.0.0",
    "generated_at": "2026-08-18T22:54:16.054Z",
    "freshness": "daily",
    "sources": [
      "stub-model",
      "kalshi",
      "polymarket"
    ],
    "request_id": "req_00000000",
    "docs": "https://x402-factory.com/docs/edge.backtest",
    "data_mode": "live"
  }
}

Response schema (data payload)

{
  "type": "object",
  "properties": {
    "n_signals": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "hit_rate": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "avg_edge_captured": {
      "type": "number"
    },
    "calibration_curve": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "bucket": {
            "type": "string"
          },
          "predicted": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "realized": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        },
        "required": [
          "bucket",
          "predicted",
          "realized"
        ],
        "additionalProperties": false
      }
    },
    "by_hazard": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "hazard": {
            "type": "string"
          },
          "n": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "hit_rate": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        },
        "required": [
          "hazard",
          "n",
          "hit_rate"
        ],
        "additionalProperties": false
      }
    },
    "model_label": {
      "type": "string"
    }
  },
  "required": [
    "n_signals",
    "hit_rate",
    "avg_edge_captured",
    "calibration_curve",
    "by_hazard",
    "model_label"
  ],
  "additionalProperties": false
}

The platform wraps every payload in an envelope: { "data": …, "meta": { endpoint, version, generated_at, freshness, sources, request_id, docs, data_mode } }.

Payment (x402)

Unpaid requests receive 402 with payment requirements (accepts). Pay $0.05 in USDC on Base per call via an X-PAYMENT header — see docs.x402.org. With PAYMENT_MODE=disabled (local dev) the endpoint is open.

Errors

StatusCodeMeaning
400INVALID_PARAMSInput failed validation; message lists the offending fields.
404NOT_FOUNDNo matching resource; suggestion may point to a sibling endpoint.
410RESOLVEDMarket/event settled; body includes a resolution summary.
503STALE_DATAUpstream feed down; stale data is never silently served beyond 2× cache TTL.
500INTERNALOur bug. The request_id helps us find it.