{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/therankingfactory-com/json-schema/therankingfactory-com-site-check-result-schema.json",
  "title": "SiteCheckResult",
  "description": "What one check found. Titles and tiers only; the working is in the emailed report.",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/therankingfactory-com-openapi.json#/components/schemas/SiteCheckResult",
  "type": "object",
  "required": [
    "site",
    "checkedAt",
    "scores",
    "findings",
    "checks",
    "fullReport",
    "note"
  ],
  "properties": {
    "site": {
      "type": "string",
      "description": "The address that was checked, after redirects."
    },
    "checkedAt": {
      "type": "string",
      "format": "date-time",
      "description": "When the check ran, UTC."
    },
    "scores": {
      "$ref": "#/$defs/Scores"
    },
    "findings": {
      "type": "array",
      "description": "What it found, most urgent first.",
      "items": {
        "$ref": "#/$defs/Finding"
      }
    },
    "checks": {
      "type": "array",
      "description": "Every check made, passed included.",
      "items": {
        "$ref": "#/$defs/Check"
      }
    },
    "fullReport": {
      "type": "string",
      "format": "uri",
      "description": "Where the person can have the full report emailed, free."
    },
    "note": {
      "type": "string",
      "description": "What this answer does and does not cover."
    }
  },
  "additionalProperties": false,
  "$defs": {
    "Check": {
      "type": "object",
      "description": "One check made.",
      "required": [
        "group",
        "name",
        "result"
      ],
      "properties": {
        "group": {
          "type": "string",
          "description": "Which question it answers.",
          "enum": [
            "Can AI reach the page",
            "Can AI read it",
            "Does it say who you are",
            "Is it ready for AI agents",
            "Does AI name and cite you",
            "What this check does not measure"
          ]
        },
        "name": {
          "type": "string",
          "description": "The check."
        },
        "result": {
          "type": "string",
          "description": "What happened.",
          "enum": [
            "Passed",
            "Problem",
            "Missing",
            "NotChecked",
            "NotMeasured",
            "Info",
            "NotOffered"
          ]
        }
      },
      "additionalProperties": false
    },
    "Finding": {
      "type": "object",
      "description": "One finding.",
      "required": [
        "tier",
        "title",
        "locked",
        "lockedReason"
      ],
      "properties": {
        "tier": {
          "type": "string",
          "description": "How urgent: Blocker first.",
          "enum": [
            "Blocker",
            "NotFound",
            "NotChosen",
            "Legibility",
            "Emerging"
          ]
        },
        "title": {
          "type": "string",
          "description": "What was found, in a sentence."
        },
        "locked": {
          "type": "boolean",
          "description": "True when measuring it needs an account (an AI engine asked, a Google account read)."
        },
        "lockedReason": {
          "type": [
            "string",
            "null"
          ],
          "description": "What it needs, when locked."
        }
      },
      "additionalProperties": false
    },
    "Scores": {
      "type": "object",
      "description": "Each 0-100, or null when the audit behind it could not read the page.",
      "required": [
        "seo",
        "geo",
        "agentReadiness"
      ],
      "properties": {
        "seo": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "maximum": 100
        },
        "geo": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "maximum": 100
        },
        "agentReadiness": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "maximum": 100
        }
      },
      "additionalProperties": false
    }
  }
}