{
  "rules_version": "2026-10-15",
  "page": "https://402xagent.com/rules",
  "verdicts": {
    "pay": "safe to pay these exact terms now",
    "skip": "do not pay (we saw a concrete problem)",
    "recheck": "no decision yet: try again later"
  },
  "reason_codes": [
    {
      "code": "price_ok",
      "verdict": "pay",
      "confidence": "high",
      "rule": "Live 402 offers canonical USDC on a supported mainnet, to the listed wallet and network, at the listed price (within 1%).",
      "text": "payment request matches the listed price"
    },
    {
      "code": "price_below_listing",
      "verdict": "pay",
      "confidence": "high",
      "rule": "As price_ok, but the live price is more than 1% below the listed price.",
      "text": "live price lower than listed"
    },
    {
      "code": "price_mismatch",
      "verdict": "skip",
      "confidence": "high",
      "rule": "Live price is more than 1% above the listed or claimed price.",
      "text": "asks a different price than listed"
    },
    {
      "code": "pay_to_mismatch",
      "verdict": "skip",
      "confidence": "high",
      "rule": "The 402 pays a different wallet than listed.",
      "text": "pays a different wallet than listed"
    },
    {
      "code": "network_mismatch",
      "verdict": "skip",
      "confidence": "high",
      "rule": "The 402 asks for payment on a different network than listed.",
      "text": "asks for payment on a different network than listed"
    },
    {
      "code": "asset_not_usdc",
      "verdict": "skip",
      "confidence": "high",
      "rule": "The 402 asks for a token other than canonical USDC.",
      "text": "asks for a token other than USDC"
    },
    {
      "code": "network_unsupported",
      "verdict": "skip",
      "confidence": "high",
      "rule": "The 402 only offers a testnet or a network we do not support.",
      "text": "wants payment on a testnet or a network we don't support"
    },
    {
      "code": "ssrf_blocked",
      "verdict": "skip",
      "confidence": "high",
      "rule": "Private, local or otherwise unsafe address; never fetched.",
      "text": "private or local address, not checked"
    },
    {
      "code": "no_paywall",
      "verdict": "skip",
      "confidence": "medium",
      "rule": "The endpoint answered without an x402 payment request (one probe; a route may need another method or path).",
      "text": "no x402 payment request at this URL"
    },
    {
      "code": "bad_challenge",
      "verdict": "skip",
      "confidence": "medium",
      "rule": "A 402 came back but its payment request has no readable USDC price.",
      "text": "payment request has no readable USDC price"
    },
    {
      "code": "challenge_expired",
      "verdict": "skip",
      "confidence": "high",
      "rule": "Opt-in only (&check_expiry=1): every Base USDC option has an absolute expiry (extra.validBefore/expiresAt/expiry/deadline) at or within skew_s (default 30, max 300) of now, or maxTimeoutSeconds <= 5.",
      "text": "payment terms are expired or expire within seconds (opt-in check)"
    },
    {
      "code": "ambiguous",
      "verdict": "skip",
      "confidence": "medium",
      "rule": "The payment request is unclear (several incompatible offers).",
      "text": "payment request is unclear"
    },
    {
      "code": "free_trial_active",
      "verdict": "recheck",
      "confidence": "low",
      "rule": "The seller says a free trial is active, so there is no price to check yet.",
      "text": "seller says a free trial is active, so there is no price to check yet, try again later"
    },
    {
      "code": "timeout",
      "verdict": "recheck",
      "confidence": "low",
      "rule": "The endpoint did not answer in time.",
      "text": "endpoint did not answer in time, try again shortly"
    },
    {
      "code": "unreachable",
      "verdict": "recheck",
      "confidence": "low",
      "rule": "Could not connect (DNS, TLS or network error).",
      "text": "could not reach the endpoint, try again shortly"
    },
    {
      "code": "server_error",
      "verdict": "recheck",
      "confidence": "low",
      "rule": "The endpoint returned a 5xx.",
      "text": "endpoint returned a server error, try again shortly"
    }
  ],
  "confidence": {
    "levels": [
      "high",
      "medium",
      "low"
    ],
    "rules": [
      "high: the verdict follows from terms we read in the live 402 and compared with the listing (or a definite safety block).",
      "medium: one probe without readable terms (no_paywall, bad_challenge, ambiguous); or a pay with no listed price to compare; or a pay whose terms changed since the previous observation (history.drift true).",
      "low: every recheck (timeouts, 5xx, network errors, free trials), and any code not in this list."
    ]
  },
  "quality_codes": [
    {
      "code": "quality_ok",
      "reputation_value": 1,
      "rule": "Reachable, answered HTTP 402 with a well-formed payment request (JSON body or PAYMENT-REQUIRED header), declares an output schema, and the response sample it publishes validates against that schema."
    },
    {
      "code": "quality_unverified",
      "reputation_value": 0.7,
      "rule": "Reachable, HTTP 402 with a well-formed content type, but there is nothing to validate: no output schema declared, or a schema without a sample. Not a fault; we never pay the seller to capture a real response."
    },
    {
      "code": "quality_bad_content_type",
      "reputation_value": 0.4,
      "rule": "HTTP 402 whose terms are only in the body, and the body is not JSON (content-type is not application/json or +json)."
    },
    {
      "code": "quality_schema_mismatch",
      "reputation_value": 0.3,
      "rule": "The listing declares an output schema (bazaar extension or v1 outputSchema) and the sample it publishes does not validate against it."
    },
    {
      "code": "quality_bad_status",
      "reputation_value": 0.2,
      "rule": "Reachable, but the response is not an HTTP 402 payment request (e.g. 200 without a paywall, 404, 5xx)."
    },
    {
      "code": "quality_unreachable",
      "reputation_value": 0,
      "rule": "No response: timeout, DNS/TLS/network error, or an address we refuse to fetch."
    }
  ],
  "reputation": {
    "version": "2026-10-15",
    "scope": "one score per seller host (scheme://host); every endpoint we have checked on that host counts",
    "formula": "score = round(100 * sum(w_i * c_i) / sum(w_i)), over the components c_i (each 0..1) that have data; a component with no data is left out and the remaining weights are renormalized. Cap: with at least 5 pay/skip checks in 30 days and pay_share under 0.2, score = min(score, 49).",
    "weights": {
      "stability": 25,
      "drift": 20,
      "verdicts": 30,
      "freshness": 10,
      "quality": 15
    },
    "components": {
      "stability": "per endpoint: time the current payment terms (price, network, asset, pay_to) have held / time we have observed the endpoint (endpoint_history, last 30 observations); mean over endpoints. Observations without terms (timeouts) do not reset it.",
      "drift": "1 - min(1, 2 * penalty / transitions) over consecutive term-bearing observations of every endpoint; penalty per transition: pay_to change 1, network or asset change 1, price-only change 0.5. No transitions -> no data.",
      "verdicts": "last 30 days of checks: pay_share * (0.5 + 0.5 * consistency). pay_share = pay / (pay + skip); consistency = share of checks that agree with their endpoint's latest verdict. Recheck verdicts (timeouts, 5xx) are left out.",
      "freshness": "1 if the newest check is under 24 h old, then linear down to 0 at 14 days.",
      "quality": "mean over endpoints of the latest quality code's value: quality_ok=1, quality_unverified=0.7, quality_bad_content_type=0.4, quality_schema_mismatch=0.3, quality_bad_status=0.2, quality_unreachable=0. No quality data -> no data."
    },
    "insufficient_data": "fewer than 5 observations, or first seen less than 2 days ago: band insufficient_data and score null (paid answers still show provisional_score and the breakdown). A new host is never given a low score for being new.",
    "bands": "high >= 75, medium 50..74, low < 50, or insufficient_data",
    "confidence": "high: >= 20 observations, tracked >= 14 days and quality data; medium: >= 10 observations and tracked >= 5 days; else low",
    "tiers": "paid, router and exempt answers: reputation {host, score, band, confidence, breakdown, inputs}; free answers and dry runs: reputation {host, band} only",
    "note": "reputation never changes verdict, reason_code or confidence; it is extra context, refreshed on every read"
  },
  "fields": {
    "reason_code": "stable machine code (this list); never renamed, new codes may be added",
    "reason": "free answers: one plain-words line; paid answers: the code (unchanged since 0.6)",
    "confidence": "high | medium | low (rules above)",
    "history": "summary of the last 30 observations: stable_for_days, stable_since, last_changed, drift",
    "history_observations": "paid, router and exempt answers only: the last 30 observations (time, price, network, pay_to, asset, status)",
    "quality": "0.37.0: paid, router and exempt answers: {code, checks {reachable, http_status, status_is_402, content_type, content_type_ok, body_bytes, schema_declared, schema_source, schema_match}}; free answers and dry runs: {code} only. Metadata of the unpaid 402 response; never changes verdict or reason_code.",
    "reputation": "0.37.0: seller host reputation. Paid, router and exempt answers: {host, score 0..100 or null, band, confidence, low_data, provisional_score?, breakdown, inputs}; free answers and dry runs: {host, band} only. Free page: /reputation/<host>."
  },
  "price_tolerance": "within 1% of the listed price counts as the listed price",
  "limits": {
    "free_live_checks": "5 per client name per UTC day, and at most 25 per network (IP; IPv6 /64) per UTC day across all client names; over the network cap: HTTP 429 with Retry-After until 00:00 UTC. The IP is only kept as a salted hash.",
    "dry_runs": "separate caps per caller and per network; never an approval to pay",
    "paid": "$0.02 USDC per check (flat); router tier $0.20 for 10 checks; rate limited per payer per hour"
  }
}