{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/duskly-ai/json-schema/duskly-ai-verification-report-schema.json",
  "title": "VerificationReport",
  "description": "What was found. Every field describes evidence, never a verdict. Mirrors VerificationReport in src/domain/marking/verify.ts.",
  "x-generated": "2026-11-06",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/duskly-ai-openapi.json#/components/schemas/VerificationReport",
  "type": "object",
  "required": [
    "marked",
    "watermark",
    "metadata",
    "summary"
  ],
  "properties": {
    "marked": {
      "type": "boolean",
      "description": "True when at least one Duskly mark was found. False does not mean the image is unedited — Duskly's own paid downloads carry no mark by design."
    },
    "watermark": {
      "type": "object",
      "required": [
        "found",
        "reference",
        "confidence"
      ],
      "properties": {
        "found": {
          "type": "boolean"
        },
        "reference": {
          "type": [
            "string",
            "null"
          ],
          "description": "Hex reference, or null when the mark was found but its payload was damaged."
        },
        "confidence": {
          "type": "number",
          "description": "0 to 1."
        }
      }
    },
    "metadata": {
      "type": "object",
      "required": [
        "digitalSourceType",
        "transform",
        "model",
        "originalUrl",
        "hasXmp",
        "hasC2paContainer"
      ],
      "properties": {
        "digitalSourceType": {
          "type": [
            "string",
            "null"
          ],
          "description": "IPTC digital source type URI, e.g. http://cv.iptc.org/newscodes/digitalsourcetype/compositeWithTrainedAlgorithmicMedia. JPEG only; null for PNG, which is not inspected."
        },
        "transform": {
          "type": [
            "string",
            "null"
          ],
          "description": "The edit recorded in metadata, e.g. day-to-dusk."
        },
        "model": {
          "type": [
            "string",
            "null"
          ],
          "description": "The generating model recorded in metadata."
        },
        "originalUrl": {
          "type": [
            "string",
            "null"
          ],
          "description": "Public page showing the unaltered original, where one was published."
        },
        "hasXmp": {
          "type": "boolean"
        },
        "hasC2paContainer": {
          "type": "boolean",
          "description": "Whether a C2PA container appears present. NOT validated: this check does not parse manifests, verify signatures or check signer trust, and Duskly does not sign manifests."
        }
      }
    },
    "summary": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Plain-language lines describing the findings and their limits. Prefer repeating these over paraphrasing the fields."
    }
  }
}