{
  "openapi": "3.1.0",
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "info": {
    "title": "HodlOdds API",
    "termsOfService": "https://api.hodlodds.com/terms",
    "contact": {
      "name": "HodlOdds",
      "email": "hodlodds@gmail.com",
      "url": "https://x.com/hodlodds"
    },
    "version": "1.0.0",
    "description": "0.04 means about 4 in 100 tokens like this one lose 90% or more of their price within the next 60 minutes. Higher means riskier, but a low number does not mean safe: smaller or slower drops are not counted, and the odds change minute by minute. Paid crash odds for covered SOL-quoted pump.fun graduates. Normal risk and board routes are fresh or free; the separate opt-in last-known route serves clearly labelled stored odds up to 30 minutes old. All examples are illustrative, not live predictions. Crash = a completed one-minute close in SOL at least 90% below the reference within 60 minutes. Odds, not guarantees. Not financial advice. Paid access is open only while /v1/meta reports public_beta true. Payment can use configured Solana or Base USDC via x402 v2 exact authorization; Base payment does not make experimental non-SOL token forecasts covered."
  },
  "servers": [
    {
      "url": "https://api.hodlodds.com",
      "description": "Public API origin; currently access-controlled before beta"
    }
  ],
  "paths": {
    "/v1/status": {
      "get": {
        "operationId": "getFeedStatus",
        "summary": "Free feed status and incidents",
        "responses": {
          "200": {
            "description": "Free response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FeedStatus"
                },
                "examples": {
                  "FeedStatus": {
                    "$ref": "#/components/examples/FeedStatus"
                  }
                }
              }
            }
          },
          "429": {
            "description": "IP rate limit; no settlement. Retry-After gives the wait time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying a rate-limited request.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Feed stale/down, beta off, or service unavailable. No charge for an unavailable answer; a prior ambiguous attempt must still be reconciled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/v1/meta": {
      "get": {
        "operationId": "getMeta",
        "summary": "Free model, coverage, pricing and confidence rule",
        "responses": {
          "200": {
            "description": "Free response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Meta"
                }
              }
            }
          },
          "429": {
            "description": "IP rate limit; no settlement. Retry-After gives the wait time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying a rate-limited request.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Feed stale/down, beta off, or service unavailable. No charge for an unavailable answer; a prior ambiguous attempt must still be reconciled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/v1/risk/{mint}": {
      "get": {
        "operationId": "getRiskAnswer",
        "summary": "Fresh covered SOL crash odds",
        "description": "Recomputed every 60 seconds, starting about 20 seconds after each minute closes; publication can take longer. Each score covers the 60 minutes after as_of and is valid only until the next update; odds can change sharply between minutes. HTTP x402 v2 authorization flow. An unsigned eligible request returns 402. A successful paid 200 carries PAYMENT-RESPONSE. Eligibility is checked before payment work and again before settlement. Default risk price is $0.01; boards cost $0.005 per delivered coin; /v1/meta and the 402 requirements are authoritative. Odds describe uncertain outcomes. Recovery uses the identical PAYMENT-SIGNATURE on this route (board: same normalized query). Pending reconciliation returns free 409 with Retry-After. Final not_settled returns free 409; a new offer is required. A reconciled undelivered payment can be redeemed once within 24 hours of verification for the current eligible answer. Stale/uncovered answers or fewer than priced_n board matches leave the redeem available. No second settlement; success carries HodlOdds-Redeemed. HodlOdds-Redeem: 1 requires recovery only and refuses unknown claims.",
        "parameters": [
          {
            "name": "PAYMENT-SIGNATURE",
            "in": "header",
            "required": false,
            "description": "Official SDK base64 JSON payment payload; a private credential bound to the original request.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mint",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 32,
              "maxLength": 44,
              "pattern": "^[1-9A-HJ-NP-Za-km-z]+$"
            }
          },
          {
            "in": "header",
            "name": "HodlOdds-Redeem",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Recovery of the original payment only; no new settlement."
          }
        ],
        "responses": {
          "200": {
            "description": "Fresh covered answer; successfully settled payment receipt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RiskAnswer"
                },
                "examples": {
                  "RiskAnswer": {
                    "$ref": "#/components/examples/RiskAnswer"
                  }
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              },
              "HodlOdds-Redeemed": {
                "schema": {
                  "type": "string"
                },
                "description": "Original on-chain transaction; this answer consumed its one-time redeem."
              }
            }
          },
          "402": {
            "description": "Payment required or payment verification/settlement failed. A 402 after payment is not proof that nothing transferred: PAYMENT-RESPONSE and reconciliation provide payment evidence.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/PaymentRequired"
                    },
                    {
                      "$ref": "#/components/schemas/Error"
                    },
                    {
                      "type": "object"
                    }
                  ]
                }
              }
            },
            "headers": {
              "PAYMENT-REQUIRED": {
                "description": "Base64 JSON x402 v2 requirements for the official SDK, including scheme, network, USDC mint, recipient and amount for approval before signing.",
                "schema": {
                  "type": "string"
                }
              },
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Free hodlodds.coverage.v1 explanation for an unknown, uncovered or experimental non-SOL mint; no payment challenge or settlement. Available experimental details remain included.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoverageRefusal"
                }
              }
            }
          },
          "409": {
            "description": "Signed payment already claimed. No new settlement for this replay. The original payment may have settled and requires reconciliation before another payment. Also pending on-chain verification (Retry-After), final not_settled, already redeemed or expired; no new settlement.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds before checking a pending payment again."
              }
            }
          },
          "422": {
            "description": "Malformed route input; no settlement.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "IP rate limit; no settlement. Retry-After gives the wait time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying a rate-limited request.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Feed stale/down, beta off, or service unavailable. No charge for an unavailable answer; a prior ambiguous attempt must still be reconciled. When that mint has an eligible last-known answer, includes hint and last_known_age_s. The hint does not authorize automatic paid fallback.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/v1/board": {
      "get": {
        "operationId": "getBoardAnswer",
        "summary": "Fresh covered SOL odds board",
        "description": "Recomputed every 60 seconds, starting about 20 seconds after each minute closes; publication can take longer. Each score covers the 60 minutes after as_of and is valid only until the next update; odds can change sharply between minutes. Current fresh covered SOL rows, ordered and filtered in one response; no pagination or cursors. `safest` — lowest predicted odds first (a ranking, not a safety claim). Ties use mint ascending; missing sort values rank last. Numeric filters exclude null values; min_confidence uses high > medium > low and excludes missing confidence. Unknown/invalid parameters or reversed bounds return free 400. Limit is 10..500 (default 50); fewer matching rows may be returned. Charge is exactly 5,000 atomic USDC ($0.005) per delivered coin: 37 matches with limit 100 costs $0.185, and 500 cost $2.50. Zero matches return free 200 with empty rows. The x402 requirement binds the normalized query and priced count. On a paid retry the current fresh ranking is recomputed: exactly the priced count is delivered if enough matches remain, otherwise free 409 is returned; stale feed returns free 503. Content can change as the feed updates. Eligibility is rechecked immediately before settlement. min_liquidity_sol is quote reserve, not executable sell depth. Recovery uses the identical PAYMENT-SIGNATURE on this route (board: same normalized query). Pending reconciliation returns free 409 with Retry-After. Final not_settled returns free 409; a new offer is required. A reconciled undelivered payment can be redeemed once within 24 hours of verification for the current eligible answer. Stale/uncovered answers or fewer than priced_n board matches leave the redeem available. No second settlement; success carries HodlOdds-Redeemed. HodlOdds-Redeem: 1 requires recovery only and refuses unknown claims.",
        "parameters": [
          {
            "name": "PAYMENT-SIGNATURE",
            "in": "header",
            "required": false,
            "description": "Official SDK base64 JSON payment payload; a private credential bound to the original request.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 10,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "safest",
                "riskiest",
                "liquidity",
                "newest",
                "active"
              ],
              "default": "safest"
            }
          },
          {
            "name": "max_risk",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            }
          },
          {
            "name": "min_risk",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            }
          },
          {
            "name": "min_liquidity_sol",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "min_age_min",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "max_age_min",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "min_trades_5",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "min_confidence",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "high",
                "medium",
                "low"
              ]
            }
          },
          {
            "in": "header",
            "name": "HodlOdds-Redeem",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Recovery of the original payment only; no new settlement."
          }
        ],
        "responses": {
          "200": {
            "description": "Current fresh covered board, with PAYMENT-RESPONSE after settlement; empty rows are free and have no payment headers.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BoardAnswer"
                },
                "examples": {
                  "BoardAnswer": {
                    "$ref": "#/components/examples/BoardAnswer"
                  }
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              },
              "HodlOdds-Redeemed": {
                "schema": {
                  "type": "string"
                },
                "description": "Original on-chain transaction; this answer consumed its one-time redeem."
              }
            }
          },
          "402": {
            "description": "Exact dynamic total required for the normalized query and priced coin count, or verification/settlement failed. PAYMENT-RESPONSE and reconciliation resolve ambiguous paid responses before another payment.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/PaymentRequired"
                    },
                    {
                      "$ref": "#/components/schemas/Error"
                    },
                    {
                      "type": "object"
                    }
                  ]
                }
              }
            },
            "headers": {
              "PAYMENT-REQUIRED": {
                "description": "Base64 JSON x402 v2 requirements for the official SDK, including scheme, network, USDC mint, recipient and amount for approval before signing.",
                "schema": {
                  "type": "string"
                }
              },
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "description": "Matches changed and require a new request, or payment amount/query disagrees with the offer. No new settlement. A replayed authorization also returns 409; its original transaction may have settled and must be reconciled. Also pending on-chain verification (Retry-After), final not_settled, already redeemed or expired; no new settlement.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds before checking a pending payment again."
              }
            }
          },
          "429": {
            "description": "IP rate limit; no settlement. Retry-After gives the wait time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying a rate-limited request.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Feed stale/down, beta off, or service unavailable. No charge for an unavailable answer; a prior ambiguous attempt must still be reconciled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Unknown or invalid query, duplicate parameters, reversed risk/age bounds, or limit outside 10..500. Free, without a payment challenge.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/risk/{mint}/last": {
      "get": {
        "operationId": "getLastRiskAnswer",
        "summary": "Opt-in last-known SOL crash odds, at most 30 minutes old",
        "description": "Explicit opt-in x402 v2 authorization flow; default $0.002 USDC (2,000 atomic units). The latest stored snapshot must cover the SOL mint and satisfy now - issued_at <= 1800 seconds, including exactly 1800. Age and coverage are checked before payment work and again before settlement. Works while live at the same lower price; then odds equal the fresh route and stale is false. Stale answers retain the original forecast and expiry and downgrade confidence one level. Stored odds are not sold as fresh. /v1/meta and the 402 requirement give the active price. No board/last route. Recovery uses the identical PAYMENT-SIGNATURE on this route (board: same normalized query). Pending reconciliation returns free 409 with Retry-After. Final not_settled returns free 409; a new offer is required. A reconciled undelivered payment can be redeemed once within 24 hours of verification for the current eligible answer. Stale/uncovered answers or fewer than priced_n board matches leave the redeem available. No second settlement; success carries HodlOdds-Redeemed. HodlOdds-Redeem: 1 requires recovery only and refuses unknown claims.",
        "parameters": [
          {
            "name": "PAYMENT-SIGNATURE",
            "in": "header",
            "required": false,
            "description": "Official SDK base64 JSON payment payload; a private credential bound to the original request.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mint",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 32,
              "maxLength": 44,
              "pattern": "^[1-9A-HJ-NP-Za-km-z]+$"
            }
          },
          {
            "in": "header",
            "name": "HodlOdds-Redeem",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            },
            "description": "Recovery of the original payment only; no new settlement."
          }
        ],
        "responses": {
          "200": {
            "description": "Covered last-known answer; a successful settlement receipt. This may be stale and is not a newly issued forecast.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LastRiskAnswer"
                },
                "examples": {
                  "LastRiskAnswer": {
                    "$ref": "#/components/examples/LastRiskAnswer"
                  }
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              },
              "HodlOdds-Redeemed": {
                "schema": {
                  "type": "string"
                },
                "description": "Original on-chain transaction; this answer consumed its one-time redeem."
              }
            }
          },
          "402": {
            "description": "Payment required or payment verification/settlement failed. A 402 after payment is not proof that nothing transferred: PAYMENT-RESPONSE and reconciliation provide payment evidence.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/PaymentRequired"
                    },
                    {
                      "$ref": "#/components/schemas/Error"
                    },
                    {
                      "type": "object"
                    }
                  ]
                }
              }
            },
            "headers": {
              "PAYMENT-REQUIRED": {
                "description": "Base64 JSON x402 v2 requirements for the official SDK, including scheme, network, USDC mint, recipient and amount for approval before signing.",
                "schema": {
                  "type": "string"
                }
              },
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Free hodlodds.coverage.v1 explanation for an unknown, uncovered or experimental non-SOL mint; no payment challenge or settlement. Available experimental details remain included.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoverageRefusal"
                }
              }
            }
          },
          "409": {
            "description": "Signed payment already claimed. No new settlement for this replay. The original payment may have settled and requires reconciliation before another payment. Also pending on-chain verification (Retry-After), final not_settled, already redeemed or expired; no new settlement.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                },
                "description": "Seconds before checking a pending payment again."
              }
            }
          },
          "422": {
            "description": "Malformed route input; no settlement.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "IP rate limit; no settlement. Retry-After gives the wait time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying a rate-limited request.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "No snapshot, beta disabled, or service unavailable; or the snapshot was replaced or became stale while preparing settlement. Free response, without settlement. Ordinary feed staleness alone is allowed up to 1800 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "PAYMENT-RESPONSE": {
                "description": "Base64 JSON SDK settlement receipt (PaymentReceipt when decoded). May also accompany failed settlement; retention and reconciliation resolve ambiguous payments.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "410": {
            "description": "The latest stored snapshot is more than 1800 seconds old. Free response, without settlement. Exactly 1800 seconds remains eligible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LastKnownTooOld"
                },
                "examples": {
                  "LastKnownTooOld": {
                    "$ref": "#/components/examples/LastKnownTooOld"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/coverage/{mint}": {
      "get": {
        "operationId": "getMintCoverage",
        "summary": "Free observed coverage for a mint",
        "description": "No payment headers are needed or issued. Cacheable for 60 seconds. Stages describe bounded observations at as_of, not a probability or a promise of a fresh paid answer. Unknown means not observed in the current coverage directory, not that a mint does not exist. Curve last-trade time may be unknown.",
        "parameters": [
          {
            "name": "mint",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Free coverage explanation, including unknown mints. Not a probability or payment challenge.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "public, max-age=60"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoverageAnswer"
                },
                "examples": {
                  "CoverageAnswer": {
                    "$ref": "#/components/examples/CoverageAnswer"
                  }
                }
              }
            }
          },
          "429": {
            "description": "IP rate limit; no settlement. Retry-After gives the wait time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying a rate-limited request.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "description": "Coverage storage unavailable; free response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Model": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "experimental_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "hashes": {
            "type": "object",
            "minProperties": 1,
            "additionalProperties": {
              "type": "string",
              "pattern": "^[a-fA-F0-9]{16,64}$"
            }
          }
        },
        "required": [
          "id",
          "hashes"
        ],
        "additionalProperties": false
      },
      "Coverage": {
        "type": "object",
        "properties": {
          "universe": {
            "type": "string"
          },
          "active": {
            "type": "integer",
            "minimum": 0
          },
          "scored": {
            "type": "integer",
            "minimum": 0
          },
          "abstained": {
            "type": "integer",
            "minimum": 0
          },
          "experimental_scored": {
            "type": "integer",
            "minimum": 0
          },
          "experimental_abstained": {
            "type": "integer",
            "minimum": 0
          },
          "experimental_quotes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "experimental_abstentions": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "minimum": 0
            }
          }
        },
        "required": [
          "universe",
          "active",
          "scored",
          "abstained",
          "experimental_scored",
          "experimental_abstained"
        ],
        "additionalProperties": false
      },
      "Band": {
        "type": "object",
        "properties": {
          "lo": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "hi": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "historical_observed": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "n": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "basis": {
            "type": "string"
          }
        },
        "required": [
          "lo",
          "hi",
          "historical_observed",
          "n",
          "basis"
        ],
        "additionalProperties": false
      },
      "ConfidenceBand": {
        "type": "object",
        "properties": {
          "lo": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "hi": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "n": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "pred": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "obs": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              {
                "type": "null"
              }
            ]
          },
          "positives": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "lo",
          "hi",
          "n",
          "pred",
          "obs",
          "positives"
        ],
        "additionalProperties": false
      },
      "Confidence": {
        "type": "object",
        "properties": {
          "rule_version": {
            "const": "hodlodds.confidence.v1"
          },
          "level": {
            "enum": [
              "high",
              "medium",
              "low",
              "experimental"
            ]
          },
          "basis": {
            "type": "string"
          },
          "band": {
            "$ref": "#/components/schemas/ConfidenceBand"
          },
          "direction": {
            "enum": [
              "historically under-predicted",
              "historically over-predicted",
              null
            ]
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "rule_version",
          "level",
          "basis",
          "band",
          "direction",
          "reasons"
        ],
        "additionalProperties": false,
        "description": "Historical group calibration and evidence size, not a token-specific confidence interval. Based on already-seen weekly BF refits, not this frozen serving fit. Absent or null on legacy snapshots; no level is implied. The last-known route applies a presentation-only stale downgrade, leaving this rule version and its historical evidence unchanged."
      },
      "RiskRow": {
        "type": "object",
        "properties": {
          "mint": {
            "type": "string",
            "minLength": 32,
            "maxLength": 44,
            "pattern": "^[1-9A-HJ-NP-Za-km-z]+$"
          },
          "p_crash_60m": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Decimal probability of a completed one-minute SOL close at least 90% below the reference in the 60 minutes after as_of, recomputed every 60 seconds starting about 20 seconds after each minute closes. Valid only until the next update; publication can take longer and odds can change sharply between minutes."
          },
          "band": {
            "$ref": "#/components/schemas/Band"
          },
          "resq_sol": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "age_min": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "ret_5": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "ret_60": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "dd_60": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "trades_5": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ]
          },
          "symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "alert": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Confidence"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "mint",
          "p_crash_60m",
          "band",
          "resq_sol",
          "age_min",
          "ret_5",
          "ret_60",
          "dd_60",
          "trades_5"
        ],
        "additionalProperties": false,
        "description": "SOL-denominated features. Returns are decimal ratios; dd_60 is close divided by its trailing 60-minute high. Alert is absent unless separately authorized. Reserve is quote-side SOL, not executable depth."
      },
      "ExperimentalRow": {
        "type": "object",
        "properties": {
          "mint": {
            "type": "string",
            "minLength": 32,
            "maxLength": 44,
            "pattern": "^[1-9A-HJ-NP-Za-km-z]+$"
          },
          "quote_mint": {
            "type": "string",
            "minLength": 32,
            "maxLength": 44,
            "pattern": "^[1-9A-HJ-NP-Za-km-z]+$"
          },
          "quote_symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "rank": {
            "type": "integer",
            "minimum": 1
          },
          "experimental_score": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "band": {
            "$ref": "#/components/schemas/Band"
          },
          "caveat": {
            "type": "string"
          },
          "confidence": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Confidence"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "mint",
          "quote_mint",
          "rank",
          "experimental_score",
          "band",
          "caveat"
        ],
        "additionalProperties": false,
        "description": "Non-SOL ranking only. Score is not a validated probability. Historical observed and n in band are null; confidence, if present, is experimental."
      },
      "RiskAnswer": {
        "type": "object",
        "properties": {
          "schema": {
            "const": "hodlodds.answer.v1"
          },
          "covered": {
            "const": true
          },
          "as_of": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds at the completed-bar cutoff and start of the 60-minute forecast; scoring runs every 60 seconds starting about 20 seconds after each minute closes. Valid only until the next update; publication can take longer and the request time does not restart the window."
          },
          "issued_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "expires_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds of the original API freshness cutoff, 120 seconds after issued_at; this does not extend validity past the next score update."
          },
          "horizon_end": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "definition": {
            "type": "string"
          },
          "model": {
            "$ref": "#/components/schemas/Model"
          },
          "coverage": {
            "$ref": "#/components/schemas/Coverage"
          },
          "row": {
            "$ref": "#/components/schemas/RiskRow"
          }
        },
        "required": [
          "schema",
          "covered",
          "as_of",
          "issued_at",
          "expires_at",
          "horizon_end",
          "definition",
          "model",
          "coverage",
          "row"
        ],
        "additionalProperties": false
      },
      "BoardAnswer": {
        "type": "object",
        "properties": {
          "schema": {
            "const": "hodlodds.board.v1"
          },
          "covered": {
            "const": true
          },
          "as_of": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds at the completed-bar cutoff and start of the 60-minute forecast; scoring runs every 60 seconds starting about 20 seconds after each minute closes. Valid only until the next update; publication can take longer and the request time does not restart the window."
          },
          "issued_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "expires_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds of the original API freshness cutoff, 120 seconds after issued_at; this does not extend validity past the next score update."
          },
          "horizon_end": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "definition": {
            "type": "string"
          },
          "model": {
            "$ref": "#/components/schemas/Model"
          },
          "coverage": {
            "$ref": "#/components/schemas/Coverage"
          },
          "rows": {
            "type": "array",
            "maxItems": 500,
            "minItems": 0,
            "items": {
              "$ref": "#/components/schemas/RiskRow"
            }
          },
          "sort": {
            "type": "string",
            "enum": [
              "safest",
              "riskiest",
              "liquidity",
              "newest",
              "active"
            ]
          },
          "filters": {
            "$ref": "#/components/schemas/BoardFilters"
          },
          "limit": {
            "type": "integer",
            "minimum": 10,
            "maximum": 500,
            "default": 50
          },
          "returned": {
            "type": "integer",
            "minimum": 0,
            "maximum": 500
          },
          "total_matches": {
            "type": "integer",
            "minimum": 0
          },
          "price_usdc": {
            "type": "string",
            "pattern": "^\\d+(?:\\.\\d{1,6})?$",
            "description": "Exact total for delivered rows; returned × 0.005, or 0 when empty."
          },
          "unit_price_usdc": {
            "const": "0.005"
          }
        },
        "required": [
          "schema",
          "covered",
          "as_of",
          "issued_at",
          "expires_at",
          "horizon_end",
          "definition",
          "model",
          "coverage",
          "rows",
          "sort",
          "filters",
          "limit",
          "returned",
          "total_matches",
          "price_usdc",
          "unit_price_usdc"
        ],
        "additionalProperties": false
      },
      "Incident": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number"
          },
          "end": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "duration_s": {
            "type": "number",
            "minimum": 0
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "start",
          "end",
          "duration_s",
          "reason"
        ],
        "additionalProperties": false
      },
      "FeedStatus": {
        "type": "object",
        "properties": {
          "state": {
            "enum": [
              "live",
              "stale",
              "down"
            ]
          },
          "last_issued_at": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "description": "UTC Unix seconds"
              },
              {
                "type": "null"
              }
            ]
          },
          "age_s": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "as_of": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "description": "UTC Unix seconds"
              },
              {
                "type": "null"
              }
            ]
          },
          "model": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Model"
              },
              {
                "type": "null"
              }
            ]
          },
          "counts": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Coverage"
              },
              {
                "type": "null"
              }
            ]
          },
          "incidents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Incident"
            }
          },
          "uptime_30d_pct": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 100
              },
              {
                "type": "null"
              }
            ]
          },
          "uptime_observed_s": {
            "type": "number",
            "minimum": 0
          },
          "uptime_window_start": {
            "type": "number"
          },
          "public_beta": {
            "type": "boolean"
          },
          "payments_ready": {
            "type": "boolean"
          }
        },
        "required": [
          "state",
          "last_issued_at",
          "age_s",
          "as_of",
          "model",
          "counts",
          "incidents",
          "uptime_30d_pct",
          "uptime_observed_s",
          "uptime_window_start"
        ],
        "additionalProperties": false
      },
      "Payments": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "ready": {
            "type": "boolean"
          },
          "network": {
            "type": "string"
          },
          "asset": {
            "type": "string",
            "pattern": "^(?:[1-9A-HJ-NP-Za-km-z]{32,44}|0x[0-9a-fA-F]{40})$",
            "description": "Solana base58 address or EVM 20-byte hex address, according to the explicitly selected payment network."
          },
          "currency": {
            "const": "USDC"
          },
          "decimals": {
            "const": 6
          },
          "prices": {
            "type": "object",
            "properties": {
              "risk": {
                "type": "string"
              },
              "board": {
                "type": "object",
                "properties": {
                  "unit_price_usdc": {
                    "const": "0.005"
                  },
                  "min_limit": {
                    "const": 10
                  },
                  "max_limit": {
                    "const": 500
                  },
                  "default_limit": {
                    "const": 50
                  }
                },
                "required": [
                  "unit_price_usdc",
                  "min_limit",
                  "max_limit",
                  "default_limit"
                ],
                "additionalProperties": false
              },
              "last": {
                "type": "string",
                "description": "Last-known risk price in USDC; default 0.002."
              }
            },
            "required": [
              "risk",
              "board",
              "last"
            ],
            "additionalProperties": false
          },
          "payment_flow": {
            "const": "authorization"
          },
          "protocol": {
            "const": "x402 v2"
          },
          "last_error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "networks": {
            "type": "array",
            "description": "Enabled payment options; Solana is advertised first when both families are configured. Payment chain does not expand token/model coverage. Legacy network/asset describe the first option.",
            "items": {
              "$ref": "#/components/schemas/PaymentNetwork"
            }
          }
        },
        "required": [
          "enabled",
          "ready",
          "network",
          "asset",
          "currency",
          "decimals",
          "prices",
          "payment_flow",
          "protocol",
          "last_error"
        ],
        "additionalProperties": false
      },
      "Meta": {
        "type": "object",
        "properties": {
          "schema": {
            "const": "hodlodds.meta.v1"
          },
          "definition": {
            "type": "string"
          },
          "universe": {
            "type": "string"
          },
          "model": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Model"
              },
              {
                "type": "null"
              }
            ]
          },
          "payments": {
            "$ref": "#/components/schemas/Payments"
          },
          "confidence": {
            "type": "object",
            "description": "Full deterministic rule, reference metadata hash and bands. Counts are dependent landmarks, not independent incidents.",
            "additionalProperties": true
          },
          "public_beta": {
            "type": "boolean"
          },
          "disclaimer": {
            "type": "string"
          },
          "model_card": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string"
              },
              "evidence": {
                "type": "string"
              },
              "limitations": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "status",
              "evidence",
              "limitations"
            ],
            "additionalProperties": false
          },
          "conflicts": {
            "type": "string"
          },
          "last_known": {
            "type": "object",
            "properties": {
              "route": {
                "const": "/v1/risk/{mint}/last"
              },
              "max_age_s": {
                "const": 1800
              },
              "inclusive": {
                "const": true
              },
              "fresh_max_age_s": {
                "type": "integer",
                "minimum": 1
              },
              "freshness": {
                "type": "string"
              },
              "confidence_downgrade": {
                "type": "object",
                "properties": {
                  "high": {
                    "const": "medium"
                  },
                  "medium": {
                    "const": "low"
                  },
                  "low": {
                    "const": "low"
                  },
                  "experimental": {
                    "const": "experimental"
                  }
                },
                "required": [
                  "high",
                  "medium",
                  "low",
                  "experimental"
                ],
                "additionalProperties": false
              },
              "live_allowed": {
                "const": true
              },
              "board_available": {
                "const": false
              }
            },
            "required": [
              "route",
              "max_age_s",
              "inclusive",
              "fresh_max_age_s",
              "freshness",
              "confidence_downgrade",
              "live_allowed",
              "board_available"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "schema",
          "definition",
          "universe",
          "model",
          "payments",
          "confidence",
          "public_beta",
          "disclaimer",
          "model_card",
          "conflicts",
          "last_known"
        ],
        "additionalProperties": false
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          },
          "covered": {
            "const": false
          },
          "status": {
            "$ref": "#/components/schemas/FeedStatus"
          },
          "experimental": {
            "$ref": "#/components/schemas/ExperimentalRow"
          },
          "as_of": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "issued_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "experimental_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "payments": {
            "$ref": "#/components/schemas/Payments"
          },
          "docs": {
            "type": "string"
          },
          "age_s": {
            "type": "number",
            "minimum": 0
          },
          "hint": {
            "type": "string",
            "description": "Eligible last-known risk route; not an automatic payment authorization."
          },
          "last_known_age_s": {
            "type": "number",
            "minimum": 0,
            "maximum": 1800
          }
        },
        "required": [
          "error"
        ],
        "additionalProperties": true
      },
      "PaymentRequirement": {
        "type": "object",
        "properties": {
          "scheme": {
            "const": "exact"
          },
          "network": {
            "type": "string"
          },
          "asset": {
            "type": "string",
            "pattern": "^(?:[1-9A-HJ-NP-Za-km-z]{32,44}|0x[0-9a-fA-F]{40})$",
            "description": "Solana base58 address or EVM 20-byte hex address, according to the explicitly selected payment network."
          },
          "amount": {
            "type": "string",
            "pattern": "^[0-9]+$"
          },
          "payTo": {
            "type": "string",
            "pattern": "^(?:[1-9A-HJ-NP-Za-km-z]{32,44}|0x[0-9a-fA-F]{40})$",
            "description": "Solana base58 address or EVM 20-byte hex address, according to the explicitly selected payment network."
          },
          "maxTimeoutSeconds": {
            "type": "integer",
            "minimum": 0
          },
          "extra": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "scheme",
          "network",
          "asset",
          "amount",
          "payTo",
          "maxTimeoutSeconds"
        ],
        "additionalProperties": true
      },
      "PaymentRequired": {
        "type": "object",
        "properties": {
          "x402Version": {
            "const": 2
          },
          "error": {
            "type": "string"
          },
          "resource": {
            "type": "object",
            "additionalProperties": true
          },
          "accepts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentRequirement"
            },
            "description": "One exact/authorization offer is selected for payment. Multiple payment networks are alternatives for the same answer at the same USDC amount; multiple offers are not combined."
          },
          "extensions": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "x402Version",
          "accepts"
        ],
        "additionalProperties": true
      },
      "PaymentReceipt": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "transaction": {
            "type": "string"
          },
          "network": {
            "type": "string"
          },
          "payer": {
            "type": "string"
          },
          "amount": {
            "type": "string"
          },
          "errorReason": {
            "type": "string"
          },
          "errorMessage": {
            "type": "string"
          }
        },
        "required": [
          "success",
          "transaction",
          "network"
        ],
        "additionalProperties": true,
        "description": "Decoded PAYMENT-RESPONSE header with the transaction identifier for reconciliation. Failure or timeout after a broadcast can be ambiguous; on-chain confirmation resolves it before a new payment. Solana transactions use base58 signatures; Base transactions use 0x-prefixed hashes. Payment chain does not change the scored token universe."
      },
      "LastRiskAnswer": {
        "type": "object",
        "properties": {
          "schema": {
            "const": "hodlodds.answer.v1"
          },
          "covered": {
            "const": true
          },
          "as_of": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds at the completed-bar cutoff and start of the 60-minute forecast; scoring runs every 60 seconds starting about 20 seconds after each minute closes. Valid only until the next update; publication can take longer and the request time does not restart the window."
          },
          "issued_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "expires_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds of the original API freshness cutoff, 120 seconds after issued_at; this does not extend validity past the next score update."
          },
          "horizon_end": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "definition": {
            "type": "string"
          },
          "model": {
            "$ref": "#/components/schemas/Model"
          },
          "coverage": {
            "$ref": "#/components/schemas/Coverage"
          },
          "row": {
            "$ref": "#/components/schemas/RiskRow"
          },
          "stale": {
            "type": "boolean",
            "description": "True when the original snapshot no longer qualifies as fresh."
          },
          "age_s": {
            "type": "number",
            "minimum": 0,
            "maximum": 1800,
            "description": "now - issued_at at response preparation; eligibility is checked again before settlement."
          },
          "freshness": {
            "enum": [
              "live",
              "stale"
            ]
          },
          "horizon_remaining_s": {
            "type": "number",
            "minimum": 0,
            "maximum": 3600,
            "description": "max(0, horizon_end - now); horizon_end remains as_of + 3600."
          }
        },
        "required": [
          "schema",
          "covered",
          "as_of",
          "issued_at",
          "expires_at",
          "horizon_end",
          "definition",
          "model",
          "coverage",
          "row",
          "stale",
          "age_s",
          "freshness",
          "horizon_remaining_s"
        ],
        "additionalProperties": false,
        "description": "Explicit last-known forecast. The probability and historical evidence are unchanged. Original expires_at is the fresh expiry and may already be past; requesting this answer does not reset the horizon. Live responses retain confidence. Stale responses downgrade high to medium, medium to low, and retain low or experimental, adding a whole-minute age reason; legacy missing confidence remains missing."
      },
      "LastKnownTooOld": {
        "type": "object",
        "properties": {
          "error": {
            "const": "Last known odds too old"
          },
          "age_s": {
            "type": "number",
            "exclusiveMinimum": 1800
          },
          "as_of": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          }
        },
        "required": [
          "error",
          "age_s",
          "as_of"
        ],
        "additionalProperties": false
      },
      "CoverageAnswer": {
        "type": "object",
        "properties": {
          "schema": {
            "const": "hodlodds.coverage.v1"
          },
          "mint": {
            "type": "string",
            "description": "Requested Solana mint; a response does not authenticate an unknown address."
          },
          "stage": {
            "type": "string",
            "enum": [
              "covered",
              "experimental_non_sol",
              "graduated_inactive",
              "bonding_curve",
              "unknown"
            ]
          },
          "reason": {
            "type": "string",
            "description": "One English sentence explaining the observed coverage, including stale observations when relevant."
          },
          "last_trade_at": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ],
            "description": "Last observed completed trade-minute start, in UTC epoch seconds, or null when unknown; not a precise transaction timestamp."
          },
          "graduated": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "quote_symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "as_of": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ],
            "description": "UTC epoch seconds of the coverage observation, not the request time; null if no observation is available."
          }
        },
        "required": [
          "schema",
          "mint",
          "stage",
          "reason",
          "last_trade_at",
          "graduated",
          "quote_symbol",
          "as_of"
        ],
        "additionalProperties": false
      },
      "CoverageRefusal": {
        "type": "object",
        "properties": {
          "schema": {
            "const": "hodlodds.coverage.v1"
          },
          "mint": {
            "type": "string",
            "description": "Requested Solana mint; a response does not authenticate an unknown address."
          },
          "stage": {
            "type": "string",
            "enum": [
              "covered",
              "experimental_non_sol",
              "graduated_inactive",
              "bonding_curve",
              "unknown"
            ]
          },
          "reason": {
            "type": "string",
            "description": "One English sentence explaining the observed coverage, including stale observations when relevant."
          },
          "last_trade_at": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ],
            "description": "Last observed completed trade-minute start, in UTC epoch seconds, or null when unknown; not a precise transaction timestamp."
          },
          "graduated": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "quote_symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "as_of": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0
              },
              {
                "type": "null"
              }
            ],
            "description": "UTC epoch seconds of the coverage observation, not the request time; null if no observation is available."
          },
          "error": {
            "type": "string"
          },
          "covered": {
            "const": false
          },
          "experimental": {
            "$ref": "#/components/schemas/ExperimentalRow"
          },
          "issued_at": {
            "type": "integer",
            "minimum": 0,
            "description": "UTC Unix seconds"
          },
          "experimental_model": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "schema",
          "mint",
          "stage",
          "reason",
          "last_trade_at",
          "graduated",
          "quote_symbol",
          "as_of",
          "error",
          "covered"
        ],
        "additionalProperties": true
      },
      "BoardFilters": {
        "type": "object",
        "properties": {
          "max_risk": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "min_risk": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "min_liquidity_sol": {
            "type": "number",
            "minimum": 0
          },
          "min_age_min": {
            "type": "number",
            "minimum": 0
          },
          "max_age_min": {
            "type": "number",
            "minimum": 0
          },
          "min_trades_5": {
            "type": "integer",
            "minimum": 0
          },
          "min_confidence": {
            "type": "string",
            "enum": [
              "high",
              "medium",
              "low"
            ]
          }
        },
        "additionalProperties": false
      },
      "PaymentNetwork": {
        "type": "object",
        "properties": {
          "family": {
            "enum": [
              "solana",
              "base"
            ]
          },
          "network": {
            "type": "string",
            "description": "SDK CAIP-2 network: Solana mainnet/devnet or Base 8453/Base Sepolia 84532."
          },
          "asset": {
            "type": "string",
            "pattern": "^(?:[1-9A-HJ-NP-Za-km-z]{32,44}|0x[0-9a-fA-F]{40})$",
            "description": "Solana base58 address or EVM 20-byte hex address, according to the explicitly selected payment network."
          },
          "payTo": {
            "type": "string",
            "pattern": "^(?:[1-9A-HJ-NP-Za-km-z]{32,44}|0x[0-9a-fA-F]{40})$",
            "description": "Solana base58 address or EVM 20-byte hex address, according to the explicitly selected payment network."
          },
          "currency": {
            "const": "USDC"
          },
          "decimals": {
            "const": 6
          }
        },
        "required": [
          "family",
          "network",
          "asset",
          "payTo",
          "currency",
          "decimals"
        ],
        "additionalProperties": false
      }
    },
    "examples": {
      "RiskAnswer": {
        "summary": "Illustrative example data; not a current token or prediction",
        "value": {
          "schema": "hodlodds.answer.v1",
          "covered": true,
          "as_of": 1792249200,
          "issued_at": 1792249230,
          "expires_at": 1792249350,
          "horizon_end": 1792252800,
          "definition": "A crash is a completed 1-minute close in SOL at least 90% below the reference price within 60 minutes.",
          "model": {
            "id": "example-bf-frozen",
            "hashes": {
              "model": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
              "meta": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
            }
          },
          "coverage": {
            "universe": "Illustrative active SOL-quoted pump.fun graduates",
            "active": 660,
            "scored": 650,
            "abstained": 10,
            "experimental_scored": 75,
            "experimental_abstained": 4,
            "experimental_quotes": [
              "USDC",
              "PUMP"
            ]
          },
          "row": {
            "mint": "11111111111111111111111111111111pump",
            "p_crash_60m": 0.031,
            "band": {
              "lo": 0.02,
              "hi": 0.05,
              "historical_observed": 0.038,
              "n": 77515,
              "basis": "Historical weekly BF refits, Sep 1–Oct 14 excluding Sep 20; already-seen evidence, not this frozen fit."
            },
            "resq_sol": 125.5,
            "age_min": 240.0,
            "ret_5": -0.014,
            "ret_60": 0.023,
            "dd_60": 0.96,
            "trades_5": 32.0,
            "symbol": "EXAMPLE",
            "name": "Illustrative token",
            "confidence": {
              "rule_version": "hodlodds.confidence.v1",
              "level": "high",
              "basis": "Historical validation of weekly BF refits, September 1 through October 14, 2026 excluding September 20; already-seen data, not measured calibration of the frozen serving fit.",
              "band": {
                "lo": 0.02,
                "hi": 0.05,
                "n": 77515,
                "pred": 0.0337,
                "obs": 0.038,
                "positives": 2945.5699999999997
              },
              "direction": null,
              "reasons": []
            }
          }
        }
      },
      "BoardAnswer": {
        "summary": "Illustrative example data; not a current ranking",
        "value": {
          "schema": "hodlodds.board.v1",
          "covered": true,
          "as_of": 1792249200,
          "issued_at": 1792249230,
          "expires_at": 1792249350,
          "horizon_end": 1792252800,
          "definition": "A crash is a completed 1-minute close in SOL at least 90% below the reference price within 60 minutes.",
          "model": {
            "id": "example-bf-frozen",
            "hashes": {
              "model": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
              "meta": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
            }
          },
          "coverage": {
            "universe": "Illustrative active SOL-quoted pump.fun graduates",
            "active": 660,
            "scored": 650,
            "abstained": 10,
            "experimental_scored": 75,
            "experimental_abstained": 4,
            "experimental_quotes": [
              "USDC",
              "PUMP"
            ]
          },
          "rows": [
            {
              "mint": "11111111111111111111111111111111pump",
              "p_crash_60m": 0.031,
              "band": {
                "lo": 0.02,
                "hi": 0.05,
                "historical_observed": 0.038,
                "n": 77515,
                "basis": "Historical weekly BF refits, Sep 1–Oct 14 excluding Sep 20; already-seen evidence, not this frozen fit."
              },
              "resq_sol": 125.5,
              "age_min": 240.0,
              "ret_5": -0.014,
              "ret_60": 0.023,
              "dd_60": 0.96,
              "trades_5": 32.0,
              "symbol": "EXAMPLE",
              "name": "Illustrative token",
              "confidence": {
                "rule_version": "hodlodds.confidence.v1",
                "level": "high",
                "basis": "Historical validation of weekly BF refits, September 1 through October 14, 2026 excluding September 20; already-seen data, not measured calibration of the frozen serving fit.",
                "band": {
                  "lo": 0.02,
                  "hi": 0.05,
                  "n": 77515,
                  "pred": 0.0337,
                  "obs": 0.038,
                  "positives": 2945.5699999999997
                },
                "direction": null,
                "reasons": []
              }
            }
          ],
          "sort": "safest",
          "filters": {
            "min_liquidity_sol": 100
          },
          "limit": 50,
          "returned": 1,
          "total_matches": 1,
          "price_usdc": "0.005",
          "unit_price_usdc": "0.005"
        }
      },
      "FeedStatus": {
        "summary": "Illustrative example data; live feed does not mean beta is enabled",
        "value": {
          "state": "live",
          "last_issued_at": 1792249230,
          "age_s": 10.0,
          "as_of": 1792249200,
          "model": {
            "id": "example-bf-frozen",
            "hashes": {
              "model": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
              "meta": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
            }
          },
          "counts": {
            "universe": "Illustrative active SOL-quoted pump.fun graduates",
            "active": 660,
            "scored": 650,
            "abstained": 10,
            "experimental_scored": 75,
            "experimental_abstained": 4,
            "experimental_quotes": [
              "USDC",
              "PUMP"
            ]
          },
          "incidents": [],
          "uptime_30d_pct": 99.6,
          "uptime_observed_s": 86400.0,
          "uptime_window_start": 1792162840.0,
          "public_beta": false,
          "payments_ready": false
        }
      },
      "LastRiskAnswer": {
        "summary": "Illustrative example data; ten-minute-old forecast, not current odds",
        "value": {
          "schema": "hodlodds.answer.v1",
          "covered": true,
          "as_of": 1792249200,
          "issued_at": 1792249230,
          "expires_at": 1792249350,
          "horizon_end": 1792252800,
          "definition": "A crash is a completed 1-minute close in SOL at least 90% below the reference price within 60 minutes.",
          "model": {
            "id": "example-bf-frozen",
            "hashes": {
              "model": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
              "meta": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
            }
          },
          "coverage": {
            "universe": "Illustrative active SOL-quoted pump.fun graduates",
            "active": 660,
            "scored": 650,
            "abstained": 10,
            "experimental_scored": 75,
            "experimental_abstained": 4,
            "experimental_quotes": [
              "USDC",
              "PUMP"
            ]
          },
          "row": {
            "mint": "11111111111111111111111111111111pump",
            "p_crash_60m": 0.031,
            "band": {
              "lo": 0.02,
              "hi": 0.05,
              "historical_observed": 0.038,
              "n": 77515,
              "basis": "Historical weekly BF refits, Sep 1–Oct 14 excluding Sep 20; already-seen evidence, not this frozen fit."
            },
            "resq_sol": 125.5,
            "age_min": 240.0,
            "ret_5": -0.014,
            "ret_60": 0.023,
            "dd_60": 0.96,
            "trades_5": 32.0,
            "symbol": "EXAMPLE",
            "name": "Illustrative token",
            "confidence": {
              "rule_version": "hodlodds.confidence.v1",
              "level": "medium",
              "basis": "Historical validation of weekly BF refits, September 1 through October 14, 2026 excluding September 20; already-seen data, not measured calibration of the frozen serving fit.",
              "band": {
                "lo": 0.02,
                "hi": 0.05,
                "n": 77515,
                "pred": 0.0337,
                "obs": 0.038,
                "positives": 2945.5699999999997
              },
              "direction": null,
              "reasons": [
                "stale data: 10 min old"
              ]
            }
          },
          "stale": true,
          "age_s": 600.0,
          "freshness": "stale",
          "horizon_remaining_s": 2970.0
        }
      },
      "LastKnownTooOld": {
        "summary": "Illustrative example data; snapshot one second beyond the last-known limit",
        "value": {
          "error": "Last known odds too old",
          "age_s": 1801.0,
          "as_of": 1792249200
        }
      },
      "CoverageAnswer": {
        "summary": "Illustrative coverage answer; synthetic example data, not a mint assessment.",
        "value": {
          "schema": "hodlodds.coverage.v1",
          "mint": "11111111111111111111111111111111",
          "stage": "unknown",
          "reason": "This mint has not been observed in the current coverage directory.",
          "last_trade_at": null,
          "graduated": null,
          "quote_symbol": null,
          "as_of": 1792238400
        }
      },
      "CoverageRefusal": {
        "summary": "Illustrative free risk refusal; synthetic example data, not a mint assessment.",
        "value": {
          "schema": "hodlodds.coverage.v1",
          "mint": "11111111111111111111111111111111",
          "stage": "unknown",
          "reason": "This mint has not been observed in the current coverage directory.",
          "last_trade_at": null,
          "graduated": null,
          "quote_symbol": null,
          "as_of": 1792238400,
          "error": "Mint is not currently covered",
          "covered": false
        }
      }
    }
  },
  "externalDocs": {
    "url": "https://api.hodlodds.com/docs",
    "description": "Integration, payment, calibration and uncertainty notes"
  }
}
