{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "schema_version": {
      "type": "number",
      "const": 1
    },
    "read_at": {
      "type": "string",
      "description": "UTC timestamp the read used for freshness."
    },
    "freshness_basis": {
      "type": "object",
      "properties": {
        "now": {
          "type": "string"
        },
        "window_days": {
          "type": "number",
          "const": 90
        },
        "aging_from_day": {
          "type": "number",
          "const": 60
        }
      },
      "required": [
        "now",
        "window_days",
        "aging_from_day"
      ],
      "additionalProperties": {}
    },
    "absence_claim": {
      "type": "string",
      "const": "not_supported",
      "description": "not_supported: missing dataset rows cannot prove link absence."
    },
    "whole_web_coverage": {
      "type": "boolean",
      "const": false,
      "description": "False: these results do not measure the whole web."
    },
    "absence_note": {
      "type": "string",
      "description": "Plain statement that a surface missing from this result was not read; it is never evidence that no opportunity exists."
    },
    "coverage": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "schema_version": {
            "type": "number",
            "const": 1
          },
          "niche": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "maxLength": 64,
                "pattern": "^[a-z0-9-]+$",
                "description": "Resource identifier returned by the operation."
              },
              "label": {
                "type": "string",
                "maxLength": 120
              }
            },
            "required": [
              "id",
              "label"
            ],
            "additionalProperties": false
          },
          "source_class": {
            "type": "string",
            "enum": [
              "owned_corpus",
              "directory_inventory",
              "cc_host_graph_seed",
              "consented_project_lane",
              "owned_submission"
            ]
          },
          "run_id": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 128
              },
              {
                "type": "null"
              }
            ]
          },
          "generated_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "scope": {
            "type": "string",
            "maxLength": 600
          },
          "pages_read": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "hosts_read": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "records_emitted": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "absence_claim": {
            "type": "string",
            "const": "not_supported",
            "description": "not_supported: missing dataset rows cannot prove link absence."
          },
          "whole_web_coverage": {
            "type": "boolean",
            "const": false,
            "description": "False: these results do not measure the whole web."
          }
        },
        "required": [
          "schema_version",
          "niche",
          "source_class",
          "run_id",
          "generated_at",
          "scope",
          "pages_read",
          "hosts_read",
          "records_emitted",
          "absence_claim",
          "whole_web_coverage"
        ],
        "additionalProperties": false,
        "description": "Dataset scope and completeness, including limits on what these results establish."
      },
      "description": "Dataset scope and completeness, including limits on what these results establish."
    },
    "format": {
      "type": "string",
      "enum": [
        "jsonl",
        "csv"
      ]
    },
    "filters": {
      "type": "object",
      "properties": {
        "niche": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "opportunityType": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "status": {
          "anyOf": [
            {
              "type": "string",
              "description": "Resource lifecycle status."
            },
            {
              "type": "null"
            }
          ],
          "description": "Resource lifecycle status."
        },
        "routeState": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "freshness": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "sourceClass": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "updatedSince": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "niche",
        "opportunityType",
        "status",
        "routeState",
        "freshness",
        "sourceClass",
        "updatedSince"
      ],
      "additionalProperties": {}
    },
    "ordering": {
      "type": "string",
      "description": "How the page is ordered: by update time then record id, never by authority, traffic or rel tokens."
    },
    "limit": {
      "type": "number"
    },
    "columns": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "rows": {
      "type": "number",
      "description": "Records in this export call, bounded by limit; continue with next_cursor."
    },
    "content": {
      "type": "string",
      "description": "The exported text: one JSON record per line for jsonl, or header plus one row per record for csv."
    },
    "has_more": {
      "type": "boolean",
      "description": "True when another page is available."
    },
    "next_cursor": {
      "anyOf": [
        {
          "type": "string",
          "description": "Opaque continuation for the same listing; null means no further page."
        },
        {
          "type": "null"
        }
      ],
      "description": "Opaque continuation for the same listing; null means no further page."
    },
    "fields_note": {
      "type": "string",
      "description": "Statement that the export carries exactly the fields the read returns for the same filters."
    }
  },
  "required": [
    "schema_version",
    "read_at",
    "freshness_basis",
    "absence_claim",
    "whole_web_coverage",
    "absence_note",
    "coverage",
    "format",
    "filters",
    "ordering",
    "limit",
    "columns",
    "rows",
    "content",
    "has_more",
    "next_cursor",
    "fields_note"
  ],
  "additionalProperties": {}
}
